梯度下降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ηt?gt 其中,
σ
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+11?i=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+∑wi?xin?))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+∑wi?xin?))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+w1?x1?+w2?x2? 两个输入的分布的范围很不一样,建议把他们的范围缩放,使得不同输入的范围是一样的。 如果两个输入的分布范围差别比较大,如下图 对于左边的情况,上面讲过这种狭长的情形不过不用Adagrad的话是比较难处理的,两个方向上需要不同的学习率,同一组学习率会搞不定它。而右边情形更新参数就会变得比较容易。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以向着圆心(最低点)走,这样做参数更新也是比较有效率。 做法: 【有点类似于标准正态分布的过程 ~ (0, 1)】
|