目录
梯度下降review
首先给定一个参数初始值,然后沿着参数梯度方向的反方向走
η
\eta
η距离更新参数,知道找到损失函数L的最小点为止。
学习率的调整
如果设置的学习率刚好的话,如红色的线,可以顺利高效地找到最低点;如果学习率设置的太小,如蓝色的线,会走得很慢,但是在足够多的迭代次数后也会找到最低点;如果学习率设置的太大,如绿色和黄色的线,永远无法到达最低点。所以学习率的设置至关重要。
虽然这样的可视化可以很直观观察,但可视化也只是能在参数是一维或者二维的时候进行,更高维的情况已经无法可视化了。
可视化设置学习率的大小
虽然参数在超过二位之后无法画出上图,但是可以画出损失函数随参数梯度下降的变化,如上图。如果学习率太小,如蓝色的线,损失函数变化缓慢;如果学习率太大,如绿色的图,损失函数下降很快,但是停止不动了;学习率刚刚好就如红色的图。根据可视化图来设置学习率的大小。
Adaptive learning rate(自适应学习率)
主要思想:随着update参数次数的增加,学习率会越来越小。如下:
η
t
=
η
t
t
+
1
,
g
t
=
∂
L
(
θ
t
)
∂
w
\eta^{\mathrm{t}}=\frac{\eta^{\mathrm{t}}}{\sqrt{\mathrm{t}+1}}, \mathrm{g}^{\mathrm{t}}=\frac{\partial \mathrm{L}\left(\theta^{\mathrm{t}}\right)}{\partial \mathrm{w}}
ηt=t+1ηt,gt=∂w∂L(θt)
w
t
+
1
←
w
t
−
η
t
g
t
\mathrm{w}^{\mathrm{t}+1} \leftarrow \mathrm{w}^{\mathrm{t}}-\eta^{\mathrm{t}} \mathrm{g}^{\mathrm{t}}
wt+1←wt−ηtgt
Adagrad
主要思想:不用参数应用不同的learning rate。
w
t
+
1
←
w
t
−
η
t
σ
t
g
t
\mathrm{w}^{\mathrm{t}+1} \leftarrow \mathrm{w}^{\mathrm{t}}-\frac{\eta^{\mathrm{t}}}{\sigma^{\mathrm{t}}} \mathrm{g}^{\mathrm{t}}
wt+1←wt−σtηtgt
其中,
σ
t
\sigma^{t}
σt是之前参数所有微分的均方根:
σ
t
=
1
t
+
1
∑
i
=
0
t
(
g
i
)
2
\sigma^{t}=\sqrt{\frac{1}{t+1} \sum_{i=0}^{t}\left(g^{i}\right)^{2}}
σt=t+11i=0∑t(gi)2
将
η
t
\eta^{\mathrm{t}}
ηt和
σ
t
\sigma^{t}
σt带入参数更新的式子,得到:
w
t
+
1
←
w
t
−
η
∑
i
=
0
t
(
g
i
)
2
g
t
w^{t+1} \leftarrow w^{t}-\frac{\eta}{\sqrt{\sum_{i=0}^{t}\left(g^{i}\right)^{2}}} g^{t}
wt+1←wt−∑i=0t(gi)2ηgt
【注】:对Adagrad矛盾点的解释(在梯度大的时候,走的步伐应该大,但是Adagrad除以均方根又使步伐变小)
对于
∑
i
=
0
t
(
g
i
)
2
\sqrt{\sum_{\mathrm{i}=0}^{\mathrm{t}}\left(\mathrm{g}^{\mathrm{i}}\right)^{2}}
∑i=0t(gi)2就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)
Stochastic gradient descent(随机梯度下降)
梯度下降 | 随机梯度下降 |
---|---|
L = ∑ n ( y ^ n − ( b + ∑ w i x i n ) ) 2 \mathrm{L}=\sum_{\mathrm{n}}\left(\hat{\mathrm{y}}^{\mathrm{n}}-\left(\mathrm{b}+\sum\mathrm{w}_{\mathrm{i}} \mathrm{x}_{\mathrm{i}}^{\mathrm{n}}\right)\right)^{2} L=n∑(y^n−(b+∑wixin))2 | L = ( y ^ n − ( b + ∑ w i x i n ) ) 2 \mathrm{L}=\left(\hat{\mathrm{y}}^{\mathrm{n}}-\left(\mathrm{b}+\sum \mathrm{w}_{\mathrm{i}}\mathrm{x}_{\mathrm{i}}^{\mathrm{n}}\right)\right)^{2} L=(y^n−(b+∑wixin))2 |
θ i = θ i − 1 − η ∇ L ( θ i − 1 ) \theta^{\mathrm{i}}=\theta^{\mathrm{i}-1}-\eta \nabla \mathrm{L}\left(\theta^{\mathrm{i}-1}\right) θi=θi−1−η∇L(θi−1) | θ i = θ i − 1 − η ∇ L ( θ i − 1 ) \theta^{\mathrm{i}}=\theta^{\mathrm{i}-1}-\eta \nabla \mathrm{L}\left(\theta^{\mathrm{i}-1}\right) θi=θi−1−η∇L(θi−1) |
损失函数不需要处理训练集所有的数据,选取一个例子,就可以赶紧update 梯度。特点是快,常规梯度下降法走一步要处理到所有二十个例子,但随机算法此时已经走了二十步(每处理一个例子就更新)。
Feature Scaling(特征缩放)
比如有个函数:
y
=
b
+
w
1
x
1
+
w
2
x
2
y=b+w_1x_1+w_2x_2
y=b+w1x1+w2x2
两个输入的分布的范围很不一样,建议把他们的范围缩放,使得不同输入的范围是一样的。
如果两个输入的分布范围差别比较大,如下图
对于左边的情况,上面讲过这种狭长的情形不过不用Adagrad的话是比较难处理的,两个方向上需要不同的学习率,同一组学习率会搞不定它。而右边情形更新参数就会变得比较容易。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以向着圆心(最低点)走,这样做参数更新也是比较有效率。
做法:
【有点类似于标准正态分布的过程 ~ (0, 1)】