Datawhale学习打卡LeeML-Task03(梯度下降)
回顾梯度下降
我们需要解决如下优化问题:
θ
∗
=
arg
min
θ
L
(
θ
)
L: loss function
θ
:
parameters
\theta^{*}=\arg \min _{\theta} L(\theta) \quad \text { L: loss function } \theta: \text { parameters }
θ∗=argθminL(θ) L: loss function θ: parameters
假设t
θ
\theta
θ 有两个变量
{
θ
1
,
θ
2
}
\left\{\theta_{1}, \theta_{2}\right\}
{θ1,θ2}
随机初始化
θ
0
=
[
θ
1
0
θ
2
0
]
[
θ
1
1
θ
2
1
]
=
[
θ
1
0
θ
2
0
]
−
η
[
∂
L
(
θ
1
0
)
/
∂
θ
1
∂
L
(
θ
2
0
)
/
∂
θ
2
]
→
θ
1
=
θ
0
−
η
∇
L
(
θ
0
)
[
θ
1
2
θ
2
2
]
=
[
θ
1
1
θ
2
1
]
−
η
[
∂
L
(
θ
1
1
)
/
∂
θ
1
∂
L
(
θ
2
1
)
/
∂
θ
2
]
→
θ
2
=
θ
1
−
η
∇
L
(
θ
1
)
\begin{aligned} &\text { 随机初始化 } \theta^{0}=\left[\begin{array}{l} \theta_{1}^{0} \\ \theta_{2}^{0} \end{array}\right] \\ &{\left[\begin{array}{l} \theta_{1}^{1} \\ \theta_{2}^{1} \end{array}\right]=\left[\begin{array}{l} \theta_{1}^{0} \\ \theta_{2}^{0} \end{array}\right]-\eta\left[\begin{array}{l} \partial L\left(\theta_{1}^{0}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}^{0}\right) / \partial \theta_{2} \end{array}\right] \rightarrow \theta^{1}=\theta^{0}-\eta \nabla L\left(\theta^{0}\right)} \\ &{\left[\begin{array}{l} \theta_{1}^{2} \\ \theta_{2}^{2} \end{array}\right]=\left[\begin{array}{l} \theta_{1}^{1} \\ \theta_{2}^{1} \end{array}\right]-\eta\left[\begin{array}{l} \partial L\left(\theta_{1}^{1}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}^{1}\right) / \partial \theta_{2} \end{array}\right] \rightarrow \theta^{2}=\theta^{1}-\eta \nabla L\left(\theta^{1}\right)} \end{aligned}
随机初始化 θ0=[θ10θ20][θ11θ21]=[θ10θ20]−η[∂L(θ10)/∂θ1∂L(θ20)/∂θ2]→θ1=θ0−η∇L(θ0)[θ12θ22]=[θ11θ21]−η[∂L(θ11)/∂θ1∂L(θ21)/∂θ2]→θ2=θ1−η∇L(θ1)
其中梯度可以简写为:
∇
L
(
θ
)
=
[
∂
L
(
θ
1
)
/
∂
θ
1
∂
L
(
θ
2
)
/
∂
θ
2
]
\nabla L(\theta)=\left[\begin{array}{l} \partial L\left(\theta_{1}\right) / \partial \theta_{1} \\ \partial L\left(\theta_{2}\right) / \partial \theta_{2} \end{array}\right]
∇L(θ)=[∂L(θ1)/∂θ1∂L(θ2)/∂θ2]
梯度下降法的计算过程进行可视化:
Some Tips
Tip1:小心设置学习率
虽然这样的可视化可以很直观观察,但可视化也只是能在参数是一维或者二维的时候进行,更高维的情况已经无法可视化了。
解决方法就是上图右边的方案,将参数改变对损失函数的影响进行可视化。比如学习率太小(蓝色的线),损失函数下降的非常慢;学习率太大(绿色的线),损失函数下降很快,但马上就卡住不下降了;学习率特别大(黄色的线),损失函数就飞出去了;红色的就是差不多刚好,可以得到一个好的结果。
自适应学习率
随着次数的增加,通过一些因子来减少学习率
- 通常刚开始,初始点会距离最低点比较远,所以使用大一点的学习率
- 在一些 epochs后,比较靠近最低点,减少学习率 η t = η / t + 1 \eta^{t}=\eta / \sqrt{t+1} ηt=η/t+1 t t t是次数。随着次数的增加, η t \eta^t ηt减小
- 对于不同参数,要设置不同学习率
Adagrad 算法
每个参数的学习率都把它除上之前微分的均方根。
普通的梯度下降为:
w
t
+
1
←
w
t
−
η
t
g
t
η
t
=
η
t
t
+
1
\begin{gathered} w^{t+1} \leftarrow w^{t}-\eta^{t} g^{t} \\ \eta^{t}=\frac{\eta^{t}}{\sqrt{t+1}} \end{gathered}
wt+1←wt−ηtgtηt=t+1ηt
-
w
\mathrm{w}
w 是一个参数
Adagrad 可以做的更好:
w t + 1 ← w t − η t σ t g t g t = ∂ L ( θ t ) ∂ w \begin{aligned} \mathrm{w}^{\mathrm{t}+1} & \leftarrow \mathrm{w}^{\mathrm{t}}-\frac{\eta^{\mathrm{t}}}{\sigma^{\mathrm{t}}} \mathrm{g}^{\mathrm{t}} \\ \mathrm{g}^{\mathrm{t}} &=\frac{\partial \mathrm{L}\left(\theta^{\mathrm{t}}\right)}{\partial \mathrm{w}} \end{aligned} wt+1gt←wt−σtηtgt=∂w∂L(θt) -
σ
t
\sigma^{t}
σt :之前参数的所有微分的均方根, 对于每个参数都是不一样的。
举例:
w 1 ← w 0 − η 0 σ 0 g 0 σ 0 = ( g 0 ) 2 w 2 ← w 1 − η 1 σ 1 g 1 σ 1 = 1 2 [ ( g 0 ) 2 + ( g 1 ) 2 ] w 3 ← w 2 − η 2 σ 2 g 2 σ 2 = 1 3 [ ( g 0 ) 2 + ( g 1 ) 2 + ( g 2 ) 2 ] ⋮ w t + 1 ← w t − η t σ t g t σ t = 1 t + 1 ∑ i = 0 t ( g i ) 2 \begin{aligned} w^{1} \leftarrow w^{0}-\frac{\eta^{0}}{\sigma^{0}} g^{0} \quad & \sigma^{0}=\sqrt{\left(g^{0}\right)^{2}} \\ w^{2} \leftarrow w^{1}-\frac{\eta^{1}}{\sigma^{1}} g^{1} \quad & \sigma^{1}=\sqrt{\frac{1}{2}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}\right]} \\ w^{3} \leftarrow w^{2}-\frac{\eta^{2}}{\sigma^{2}} g^{2} \quad & \sigma^{2}=\sqrt{\frac{1}{3}\left[\left(g^{0}\right)^{2}+\left(g^{1}\right)^{2}+\left(g^{2}\right)^{2}\right]} \\ \vdots & \\ w^{t+1} \leftarrow w^{t}-\frac{\eta^{t}}{\sigma^{t}} g^{t} \quad & \sigma^{t}=\sqrt{\frac{1}{t+1} \sum_{i=0}^{t}\left(g^{i}\right)^{2}} \end{aligned} w1←w0−σ0η0g0w2←w1−σ1η1g1w3←w2−σ2η2g2⋮wt+1←wt−σtηtgtσ0=(g0)2σ1=21[(g0)2+(g1)2]σ2=31[(g0)2+(g1)2+(g2)2]σt=t+11i=0∑t(gi)2
将式子化简:
问题:在 Adagrad 中,当梯度越大的时候,步伐应该越大,但下面分母又导致当梯度越大的时候,步伐会越小。
解释:详细可以参考:LeeML-Chapter6
所以最好的步伐应该是: 最好的步伐是: ∣ 一次微分 ∣ 二次微分 \text { 最好的步伐是: } \frac{\mid \text { 一次微分 } \mid}{\text { 二次微分 }} 最好的步伐是: 二次微分 ∣ 一次微分 ∣
即不止和一次微分成正比,还和二次微分成反比。最好的step应该考虑到二次微分:
对于 ∑ i = 0 t ( g i ) 2 \sqrt{\sum_{i=0}^{t}\left(g^{i}\right)^{2}} ∑i=0t(gi)2就是希望再尽可能不增加过多运算的情况下模拟二次微分。(如果计算二次微分,在实际情况中可能会增加很多的时间消耗)
Tip2:随机梯度下降(Stochastic Gradient Descent)
之前的梯度下降:
L
=
∑
n
(
y
^
n
−
(
b
+
∑
w
i
x
i
n
)
)
2
θ
i
=
θ
i
−
1
−
η
∇
L
(
θ
i
−
1
)
\begin{gathered} \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} \\ \theta^{\mathrm{i}}=\theta^{\mathrm{i}-1}-\eta \nabla \mathrm{L}\left(\theta^{\mathrm{i}-1}\right) \end{gathered}
L=n∑(y^n−(b+∑wixin))2θi=θi−1−η∇L(θi−1)
而随机梯度下降法**更快**:
损失函数不需要处理训练集所有的数据, 选取一个例子
x
n
\mathrm{x}^{\mathrm{n}}
xn
L
=
(
y
^
n
−
(
b
+
∑
w
i
x
i
n
)
)
2
θ
i
=
θ
i
−
1
−
η
∇
L
n
(
θ
i
−
1
)
\begin{gathered} \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} \\ \theta^{\mathrm{i}}=\theta^{\mathrm{i}-1}-\eta \nabla \mathrm{L}^{\mathrm{n}}\left(\theta^{\mathrm{i}-1}\right) \end{gathered}
L=(y^n−(b+∑wixin))2θi=θi−1−η∇Ln(θi−1)
此时不需要像之前那样对所有的数据进行处理, 只需要计算某一个例子的损失函数
L
n
\mathrm{L_{n}}
Ln, 就可以赶紧更新梯度。
对比:
Tip3:特征缩放
让不同的特征有相同的分布
为什么?
上图左边是
x
1
\mathrm{x}_{1}
x1 的scale比
x
2
\mathrm{x}_{2}
x2 要小很多, 所以当
w
1
\mathrm{w}_{1}
w1 和
w
2
\mathrm{w}_{2}
w2 做同样的变化时,
w
1
\mathrm{w}_{1}
w1 对
y
\mathrm{y}
y 的变化影响是比较小的,
x
2
\mathrm{x}_{2}
x2 对
y
\mathrm{y}
y 的变化影响是比较大的。
坐标系中是两个参数的error surface (现在考虑左边蓝色), 因为 w 1 \mathrm{w}_{1} w1 对 y \mathrm{y} y 的变化影响比较小, 所以 w 1 \mathrm{w}_{1} w1 对损失函数的影响比较小, w 1 \mathrm{w}_{1} w1 对损失函数有比较小的微分, 所以 w 1 \mathrm{w}_{1} w1 方向上是比较平滑 的。同理 x 2 \mathrm{x}_{2} x2 对 y \mathrm{y} y 的影响比较大, 所以 x 2 \mathrm{x}_{2} x2 对损失函数的影响比较大, 所以在 x 2 \mathrm{x}_{2} x2 方向有比较尖的峡谷。
上图右边是两个参数scaling比较接近,右边的绿色图就比较接近圆形。
对于左边的情况,上面讲过这种狭长的情形不过不用Adagrad的话是比较难处理的,两个方向上需要不同的学习率,同一组学习率会搞不定它。而右边情形更新参数就会变得比较容易。左边的梯度下降并不是向着最低点方向走的,而是顺着等高线切线法线方向走的。但绿色就可以 向着圆心(最低点) 走,这样做参数更新也是比较有 效率。
相关理论基础
详见参考:LeeML-Chapter6
不断更新参数,不断得到更新的Loss,一定是越来越小的? 不正确
理论上每次更新参数都想要损失函数减小的话,就需要学习率足够足够小才可以。
梯度下降的限制
容易陷入局部极值 还有可能卡在不是极值,但微分值是0的地方 还有可能实际中只是当微分值小于某一个数值就停下来了,但这里只是比较平缓,并不是极值点