【李宏毅机器学习笔记】1、回归问题(Regression)
【李宏毅机器学习笔记】2、error产生自哪里?
【李宏毅机器学习笔记】3、gradient descent
【李宏毅机器学习笔记】4、Classification
【李宏毅机器学习笔记】5、Logistic Regression
【李宏毅机器学习笔记】6、简短介绍Deep Learning
【李宏毅机器学习笔记】7、反向传播(Backpropagation)
【李宏毅机器学习笔记】8、Tips for Training DNN
【李宏毅机器学习笔记】9、Convolutional Neural Network(CNN)
【李宏毅机器学习笔记】10、Why deep?(待填坑)
【李宏毅机器学习笔记】11、 Semi-supervised
【李宏毅机器学习笔记】 12、Unsupervised Learning - Linear Methods
【李宏毅机器学习笔记】 13、Unsupervised Learning - Word Embedding(待填坑)
【李宏毅机器学习笔记】 14、Unsupervised Learning - Neighbor Embedding(待填坑)
【李宏毅机器学习笔记】 15、Unsupervised Learning - Auto-encoder(待填坑)
【李宏毅机器学习笔记】 16、Unsupervised Learning - Deep Generative Model(待填坑)
【李宏毅机器学习笔记】 17、迁移学习(Transfer Learning)
【李宏毅机器学习笔记】 18、支持向量机(Support Vector Machine,SVM)
【李宏毅机器学习笔记】 19、Structured Learning - Introduction(待填坑)
【李宏毅机器学习笔记】 20、Structured Learning - Linear Model(待填坑)
【李宏毅机器学习笔记】 21、Structured Learning - Structured SVM(待填坑)
【李宏毅机器学习笔记】 22、Structured Learning - Sequence Labeling(待填坑)
【李宏毅机器学习笔记】 23、循环神经网络(Recurrent Neural Network,RNN)
【李宏毅机器学习笔记】 24、集成学习(Ensemble)
------------------------------------------------------------------------------------------------------
【李宏毅深度强化学习】视频地址:https://www.bilibili.com/video/av10590361?p=6
课件地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17_2.html
-------------------------------------------------------------------------------------------------------
在之前的课程讲了机器学习分为这三步。而在第三步中需要使用gradient descent来选择最好的function。
是model的参数,我们的目标就是找出能使loss function的loss值最低的。通过求此处的偏导并乘上学习率来更新参数。这个之前讲过了,具体看这一篇博文中间部分有讲gradient descent 更具体的过程。
接下来会讲3个gradient descent 能用到的tip 和 gradient descent的一些理论知识。
Learing rate的设定关系最后的loss值。如图,当Learing rate设定太大的话,“跨的步”太大,就会像黄线一样直接跨过最低点,导致loss值暴增。而当Learing rate设定太小的话,虽然也能到达最低点,但是速度就会太慢了。所以需要设定一个合适的Learing rate。
那有没有办法,能自动调Learing rate呢?有的,如下:
这里一个比较笼统的做法就是:由于一开始可能是在离最低点比较远的地方,所以一开始Learing rate一开始比较大,随着迭代次数的进行,learing rate会慢慢变小。具体的Learing rate的公式为。
但是,这样是不够的。我们要给不同的参数给它不同的learning rate,一个比较简单的方法是Adagrad:
这个方法是在之前的基础上,再除以变成。代表之前参数的均方根(root mean square)。由于不同参数比如,,他们更新过程中的值不一定相等,所以它们均方根也不一定相等,所以除以就能区分开不同参数,使得不同参数有不同的learning rate。举个具体例子如下:
上图就是整个更新的过程。
这里可能有个你觉得矛盾的地方。
无论是图中的Vanilla Gradient Descent还是Adagrad,参数的更新大小是和 成正比的,但是随着 变大你会发现这一项会变小,这是不是和原来的想法(斜率越大,更新参数时所“跨的步”越大)冲突呢 ?
不会,因为如果是多参数的情况下,更新参数时所“跨的步”不仅取决于一次微分 的绝对值的大小,还取决于二次微分的大小。下面看具体例子:
假设图中上部分是函数的图像,下部分是它的导函数的图像。
由数学知识可以知道的最低点是。所以在要到达最低点,best step 就是,同分后得到,此时可以看到,分子部分就是一阶微分的结果,所以说明参数“踏出去的步伐”有多大和一阶微分(gradient)是成正比的,也可以说gradient越大,说明此时离最低点越远。
但是,这个结论只对一个参数的时候有效。如下图:
根据左图的横竖方向,各自画出图像,如右图两个图像。蓝色图像比较“缓”,绿色图像比较“陡”。
这里有多个参数,按照刚才的结论(gradient越大,说明此时离最低点越远)来看,就不成立了。因为 c 的 gradient 比 a 大,但是 c 离最低点的距离是小于 a 的。所以不能直接套刚才的结论。而应该要将二阶微分也考虑进来。
此时的 best step 变为:一阶微分的绝对值 除以 二阶微分。best step和一阶微分成正比,和二阶微分成反比。
回到刚才的图,a点虽然一阶微分(gradient)小,但是由于二阶微分比较小,而best step和二阶微分成反比。所以最终“跨的步”就被变大。而c点虽然一阶微分(gradient)大,但是由于二阶微分也大,所以最终“跨的步”就被缩小了。
现在知道best step 是 一阶微分的绝对值 除以 二阶微分。但是Adagra的分母却不是二阶微分。因为如果要算一阶微分还要算二阶微分的话,太麻烦。所以直接拿一阶微分去估测二阶微分的大小。
如图,上部分2图是原图像,下部分2图是一阶导数的绝对值的图像。
从上面的原图像可以直接看出左图的一阶导数会小于右图的一阶导数,所以拿左图的一阶导函数上的点拿去求方根的结果肯定会小于右图一阶导函数上的点去求方根的结果。
这个比较结果和左图的二阶导数也会小于右图的二阶导数有一样的效果。
在原来的gradient descent 的Loss function是累加所有,然后再去做gradient descent。
而在SGD里是随机抽取一个样本 ,计算它的(由于只有一个样本,所以相比之前少了累加这一步),然后再去做gradient descent。
SGD相比原来的gradient descent 会更新得更快,以下面为例子:
左图是GD,它从起点开始,看完所有的examples后,更新到下一个点。
右图是SGD,它从起点开始,看一个example就更新一个点。
所以同样看完一遍数据,GD只更新一个点,而SGD更新了二十个点,会取得更好地效果。
但是SGD由于每次只看一个example,所以它相比看完整个examples再更新的SD会有更新点比较混乱的情况。不过瑕不掩瑜,SGD还是一个靠谱的方法。
假设现在的input 、 的分布如左图所示,可以看出的分布比的分布要大很多。为了后续参数的update更有效率,可以使用Feature Scaling,使 、 的分布变为右图那样比较接近。
为什么要这么做呢?
假设现在还没做 Feature Scaling ,的数值比较小,的数值比较大。这样的话即使,都增加,但是 这边的变化远大于。所以在update的时候由于这边的变化大(gradient大),这边的变化小(gradient大),所以需要多组learning rate来适应,,比较复杂。
而做了Feature Scaling 后,它的图会变得更像圆形。不仅不用多组learning rate适应不同的参数,而且它的更新方向直接指向最低点,不像左图先沿着“最陡”的方向更新然后再慢慢靠近最低点这样比较麻烦,所以做了Feature Scaling 后再做update更有效率。
现在假设有R个sample,每个sample又包含一组feature。
做完这个变换后,所有行的mean就都会等于0,variance也都等于1。
这就是一个比较常见的Feature Scaling的做法。