如果我们想找一个最好的function,我们就需要optimization
L:loss function 𝜃: parameters 来最小化 loss function
接下来的步骤就是偏导数来迭代parameters,推到步骤就不写了,网上很多。
下面引用李宏毅老师的ML课件

注意:
其实这里要注意的就是gradient 就是切线的法向量,切线就是slope,如果slope为负值,那么每次迭代的parameter值就应该是增加的,如果slope为正, 那么每次迭代的parameter值就应该是减小的。

Tipe1: Learning Rate
接下来说 Learning Rate 的设置问题:
1> 如果learning Rate 设置过小,那就会iteration很多次才可以得到想要的最小值,
2> 如果learning Rate 设置太大,很可能会就直接跨过我们想要的值。
下图黄线代表learning Rate设置过大,绿线较大,蓝线设置较小

如何解决这个问题呢?
在迭代的开始我们可以设置较大的learning Rate,随着迭代,我们缩小我们的learning Rate。
李宏毅老师给出一个方法叫做 Adagrad:
不同的参数我们设置不同learning Rate
g 是这个参数W的偏微分, 不同的参数 g 是不同的,从而导致learning Rate也不相同


但是 Adagrad 存在着矛盾

如何解释这个问题?

比如初始点在 x0,最低点为 −b/2a,最佳的步伐就是 x0 到最低点之间的距离 |x0+b2a|,也可以写成 |2ax0+b|/2a。而刚好 |2ax0+b| 就是方程绝对值在x0这一点的微分。
这样可以认为如果算出来的微分越大,则距离最低点越远。而且最好的步伐和微分的大小成正比。所以如果踏出去的步伐和微分成正比,它可能是比较好的。
结论1-1:梯度越大,就跟最低点的距离越远。
这个结论在多个参数的时候就不一定成立了。

上图左边是两个参数的损失函数,颜色代表损失函数的值。如果只考虑参数 w1w1,就像图中蓝色的线,得到右边上图结果;如果只考虑参数 w2,就像图中绿色的线,得到右边下图的结果。确实对于a和b,结论1-1是成立的,同理c和b也成立。但是如果对比a和c,就不成立了,c比a大,但c距离最低点是比较近的。
所以结论1-1是在没有考虑跨参数对比的情况下,才能成立的。所以还不完善。
之前说到的最佳距离|2ax0+b|/2a,还有个分母 2a 。对function进行二次微分刚好可以得到:
所以这才是最好的步伐。


Tip2: Stochastic Gradient Descent
SGD 是看到一个样本就取一个样本出来,然后计算loss, 接着计算这一个样本的参数的GD


Tip3: Feature Scaling
假设函数有两个特征值(Feature) 函数方程为: y = b + w1x1 +w2x2
如果x1的值都比较小,x2的值都比较大,那么 x2 对于 y 的值影响很大
坐标系中是两个参数的error surface(现在考虑左边蓝色),因为 w1 对y的变化影响比较小,所以 w1 对损失函数的影响比较小,w1对损失函数有比较小的微分,所以 w1 方向上是比较平滑的。同理 x2 对y 的影响比较大,所以 x2 对损失函数的影响比较大,所以在 x2 方向有比较尖的峡谷。
下图右边是两个参数scaling比较接近,右边的绿色图就比较接近圆形。
对于左边的情况,上面讲过这种狭长的情形不过不用Adagrad的话是比较难处理的,两个方向上需要不同的学习率,同一组学习率会搞不定它。而右边情形更新参数就会变得比较容易。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以向着圆心(最低点)走,这样做参数更新也是比较有效率(如果这里有问题请参考MIT多变量微积分的课程:梯度,方向导数)

那如何做 Feature Scaling 呢?

上图每一列都是一个例子,里面都有一组feature。
对每一个维度i(绿色框)都计算平均数,记做m(i);还要计算标准差,记做σ(i)。
然后用第r个例子中的第i个输入,减掉平均数mi,然后除以标准差σi,得到的结果是所有的维数都是0,所有的方差都是1
Tip 4: Warning of Math
假设函数有两个参数,如果做才能找出最优的参数呢?
首先给定一个起始的点和Error Function,我个人认为是以这个点为圆心,在其附近画圆,在这个圆里面找出最低点。就是沿着等高线的切线方向移动(不明白可以参考MIT多变量微积分第8讲),接下来重复这个动作,

如何在红色的圆圈内找到可以使 loss Function 最小的参数呢?好吧,我认为超级难的 泰勒展开式

k代表微分的次数,如果 x 接近 x0 时候,上图后面的高次方就可以删掉。这个式子只考虑只有一个参数。
如果我们有很多的参数呢?????
方法和第一个一样,只是倒数变成偏导数

回到第一个问题如何找到圆圈中的最优点呢??
我们可以把loss Function 写成 泰勒展开式的 形式,然后把点(a,b)带进去,就得出常数值 u 和 v
接着就得出圆圈内的式子

泰勒展开式只考虑了一次式,如果考虑二次式,learning rate就会变的更好一些
GD的限制
GD经常卡在local minimun,或者 鞍点(saddle)

网友评论