First part(初识机器学习)
Function with unknown parameter
设定一个场景:
有365天的COVID-19数据,根据这些数据做一个预测模型(属于Regression应用范畴)。
define function A :
这个函数式的猜测来自于对这个问题本质上的了解,也就是Domain knowledge:准备预测的东西,此处表示预测当天的人数
:已知的数据,此处表示为要预测的天数的前一天的人数。
b、 w为未知参数:
b:bios 误差
w:weight 权重
Define loss from training data
loss is a function as well
·function A 可以根据数据得出不同的
值,即根据每一天的数据,对对后一天的数据进行预测。
define:每一天真实的数据叫Feature,training data中的实际结果叫Label
·label用来表示,feature用Y来表示,
表示每一次预测后
的值,则loss的其中一中定义方式为Loss:
,即求其算数平均数。n表示训练资料的个数。
·其中L越大表示所求的这一组b、w参数越不好。
·Loss有不同的计算方式,上述计算方式叫做mean absolute error,缩写是MAE,相减y平方算出来的,叫mean square error,又叫MSE,这个之后再表。
Error surface
以下的图表是真实的例子,是真实的数据计算出来的结果。根据输入的值,然后调整不同的w、b,组合起来以后,去计算它的Loss,然后就可以画出以下这一个等高线图.
越偏红色系,代表计算出来的Loss越大,就代表这一组w跟b越差,如果越偏蓝色系,就代表Loss越小,就代表这一组w跟b越好。试了不同的参数,然后计算它的Loss,画出来的这个等高线图,叫做Error Surface,这是机器学习的第二步。
Optimization
这是机器学习的第三步,第三步要做的事情,其实是解一个最佳化的问题,根据上述模型,找一个w跟b,把未知的参数带入,看带哪一组w、b数值进去,可以让Loss的值最小,那个要找的w跟b,就是可以让loss最小的目标值。
Gradient Descent
为了简化起见,先假设未知的参数只有w这个未知的参数.
当w带不同的数值的时候,会得到不同的Loss,这一条曲线就是error surface
现阶段寻找最合适的的点可以遵循以下步骤:
- 随机选取一个初始点
- 根据gradient dscent算法(误),计算在这一点处的梯度
,即
,若
为负,即向左L增大,向右L减少。
- 根据第二步令
,再次重新计算直至
。其中
的值取决下:
- 此处
的值,数值大则
大,以此类推。
- define:
叫做learning rate,在机器学习中,需要自己设定的东西,叫做hyperparameters。
- 此处
如果设大一点,每次参数update就会量大,学习可能就比较快,如果η设小一点,参数的update就很慢,每次只会改变一点点参数的数值,可以如下述公式描述起作用。
【注】:因为loss函数为自定,故error surface可以为负值
上述方法有一个重大的问题,即w会取在梯度为零的点,这个点可能是局部最小值(local minimum)而不是要求的全局最小值(global minimum)。这个问题后续再表
对于开头的双变量函数对于不同的b、w亦可以通过这种方法进行gradient descent。然后得到最合适的取值
最终得出预测结果图标如下:
Second part(对Part I优化处理)
Linear model
由上述第一部分结尾预测图表可知预测结果并不如人意,预测结果基本就是照搬前一天结果。现在是在已经知道答案的资料上去计算loss,这个过程叫做training(训练)。观察得知上述结果每隔七天一个循环,如果改变模型它参考前七天的资料,往往来自於你对这个问题的理解,也就是Domain Knowledge。修改后的模型如下:
同样经过gradient descent计算,得出不同的b、w的值,预测结果如下:
看起来又更好一点如果定28天,或者考虑56天会怎么样,在训练资料上是稍微再好一点,是0.32k,在没看过的资料上还是0.46k,看起来,考虑更多天没有办法再更进步了,看来考虑天数这件事,也许已经到了一个极限,好那这边这些模型,它们都是把输入x(feature)乘上一个weight,再加上一个bias就得到预测的结果,这样的模型有一个共同的名字,叫做Linear model。
Piecewise linear curves(分段线性曲线)
Linear model不管如何优化始终只是一条直线,而若要使其拥有解决问题的能力,单纯的直线必定不可行,故引入此概念,将不同的直线组合起来拟合成为近似曲线来解决问题。
这个蓝色的 Function,它的特性是
- x轴的值小于 Flash Hold 的时候,它是某一个定值,
- 大于另外一个 Flash Hold 的时候,又是另外一个定值,
- 中间有一个斜坡
通过对红色曲线分段,使得每一段都与蓝色曲线的斜坡吻合,则可以通过三个蓝色的曲线拟合出红色的曲线。
至于蓝色的曲线的函数式可以近似拟合如下图:
其函数式为:
也可表示为:
此函数性质为如下图:
即概括为:
- w影响函数图像中间斜坡的斜率
- b会使图像左右横移
- c会改变图像的高度
上述图像中曲线拟合过程可由右式表示:
Define:原本线性模型的模型会与实际情况产生很大的出入,这些出入叫做model bias(模型误差),减少model bias的方法就是如下述步骤所述,通过对问题本身的了解,修改模型使得模型更加贴近实际。
整个模型现在不是只用一个Feature,用 j 来代表 Feature 的编号
举例来说刚才如果要考虑前 28 天的话,j 就是 1 到 28,考虑前 56 天的话,j 就是 1 到 56,现在将原本的linear model扩展成sigmoid拟合后的这种比较有弹性的 Function,之前线性model的模型为:
修改后即为:
模型最终定型为*式,接下来模拟模型运行。
举例来说 我们只考虑前一天,前两天和前三天的 Case,
- 所以 j 等於 1、2、3,那所以输入就是
代表前一天的观看人数,
两天前观看人数,
三天前的观看人数
- 每一个 i 就代表了一个蓝色的 Function,每一个蓝色的 Function用一个 Sigmoid Function 来拟合
每一个 Sigmoid 都有一个括号,第一个 Sigmoid 中i 等于1 的 Case ,就是把
乘上一个 Weight 叫
乘上另外一个 Weight 叫
再乘上一个 Weight 叫做
- 全部把它加起来,再加一个b
代表在第 i 个 Sigmoid,乘给第 j 个 Feature 的 Weight
对于红色的第二段、第三段函数用同样的方法拟合,如下图:
最终我们会得到上图蓝色方框中的公式,很明显是一个线性方程组,即表示如下:
见下图:
上述蓝色框就是就是得出的过程,即由
得出
然后带入sigmoid函数。
怎么把这些未知的参数找出来之前,我们先再稍微重新定义一下我们的符号,如下图:
define loss from training data
由于实际情况中未知参数可能会很多,一个一个列出来会很繁杂,故直接用 θ 来统设所有的参数,所以现在的 Loss Function 就变成 。
上图即为Loss求法,与前面介绍的Loss求法大同小异。
Optimization
此处优化步骤与之前所讲原理相同,下图即为更换模型后的Optimization步骤:
现在的θ根据之前定义是一个很长的向量,将它表示成等,现在就是要找一组 θ,这个 θ 可以让 Loss 越小越好,可以让 Loss 最小的那一组 θ,我们叫做 θ 的 Start
- 一开始要随机选一个初始的数值叫做
,以后会讲到比较好的随机去随机初始值的方法。
- 接下来计算微分,对每一个未知的参数,都去计算它对 L 的微分,集合起来就是一个向量,用g来表示,假设有1000个参数,这个向量的长度就是 1000这个向量有一个名字叫做Gradient,Gradient 的表示方法为
,
就是表示把所有的参数
,通通拿去对 L 作微分,那后面放
的意思是说,我们这个算微分的位置,是在θ等於
的地方计算出Gradient
- 算出这个 g 以后,接下来Update 参数,更新的方法,跟之前只有两个参数的状况是一样的,只是从更新两个参数,可能换成更新成 1000 个参数,但更新的方法是一样的,本来有一个参数叫
,上标0代表它是一个起始的值,它是一个随机选的起始的值,把这个
减掉 η 乘上微分的值,得到
,代表
更新过一次的结果,
减掉微分乘以,减掉 η 乘上微分的值,得到
,以此类推,就可以把那 1000 个参数统统都更新了。
分包:
假设一开始的训练资料的数量为N,将这些训练资料分成一个一个的Batch(包),原本的Loss描述的是整个N的训练资料,现在分包以后,每个batch都可以得出一个相关的Loss,记作,然后计算Gradient,将所有的Batch算过一遍以后叫做一次Epoch。如下图:
【注】:假设我们有 10000 笔 Data,也就是N=10000,假设我们的 Batch 的大小是10,也就B =10
接下来问,我们在一个 Epoch 中,总共 Update 了几次参数?
算一下10000 笔 Example,总共形成了 10000 除以 10,也就是 1000 个 Batch,所以在一个 Epoch里,已经更新了参数 1000 次,所以一个 Epoch 并不是更新参数一次,在这个例子里一个Epoch,已经更新了参数 1000 次。
【补充】:之前的模型变更为sigmoid,其实在那之前也可以变更为曲线较为hard的sigmoid,即Rectified Linear Unit,它的缩写叫做ReLU,图像如下图:
在机器学习中,Sigmoid 或是 ReLU之类的叫它 Activation Function。
本实验实际模拟情况为ReLU更好一点。实际模拟中,同样的步骤可多做几次,之前我们把x乘上 w 加 b,通过 Sigmoid Function 得到 a,我们可以把 a 再乘上另外一个 w’,再加上另外一个 b’,再通过 Sigmoid Function,或 RuLU Function得到 a’,如下图:
- 第一列是如果是只做一次的结果。
- 做两次,Loss从0.28k 降到 0.18k,没看过的资料上也好了一些
- 三层,又有进步从 0.18k 降到 0.14k,所以从一层到从就是乘一次 w,到通过一次 ReLU,到通过三次 ReLU,我们可以从 0.28k 到 0.14k,在训练资料上,在没看过的资料上,从 0.43k 降到了 0.38k,看起来也是有一点进步的。
浅谈DeepLearning
这些Sigmoid或ReLU,它们叫做Neuron(神经元),Neuron叠加很多以后就叫做Neural Network(神经网络),有很多的 Neuron,每一排 Neuron叫作一个 Layer,也叫Hidden Layer(隐藏层),有很多的 Hidden Layer 就叫做 Deep,这整套技术就叫做 Deep Learning。Overfitting
如上图,并不是层数越深越好。机器学习会发生 Overfitting 的问题,指的就是在训练资料上有变好,但是在预测资料上没有变好这件事情。