上一篇的(链接)step3中寻找最优化函数时简单提到了Gradient Descent,本次讲解它的几个注意事项,以及更深入的探讨
文章目录
1.Tuning your learning rates
当参数为3个以下的时候,不同learning rate可能导致的损失函数如下
不过对于更多的参数,总是可以观测到这样的现象
调整Learning Rates的建议
- 最开始的几轮epochs,离目标很远可以使用较大的学习率
- 几轮epochs后,可以减小学习率使其细化
- 针对不同参数的学习率往往也不同
- 使用Adagrad技巧,详情如下:
对于一个参数w,使用Vanilla Gradient descent(原始的)更新如下:
w
t
+
1
←
w
t
−
η
t
g
t
w^{t+1}\leftarrow w^t-\eta^tg^t
wt+1←wt−ηtgt
使用Adagrad更新如下:
w
t
+
1
←
w
t
−
η
t
σ
t
g
t
w^{t+1}\leftarrow w^t-\frac{\eta^t}{\sigma^t}g^t
wt+1←wt−σtηtgt
其中,
η
t
\eta^t
ηt一般选择
η
t
+
1
\frac{\eta}{\sqrt{t+1}}
t+1η,
σ
t
\sigma^t
σt表示参数w之前偏导数(
g
i
g^i
gi)的均方根,所以可以化简:
w
t
+
1
←
w
t
−
η
t
+
1
1
t
+
1
∑
i
=
0
t
(
g
i
)
2
g
t
=
w
t
−
η
∑
i
=
0
t
(
g
i
)
2
g
t
w^{t+1}\leftarrow w^t-\frac{\frac{\eta}{\sqrt {t+1}}}{\sqrt{\frac{1}{t+1}\sum_{i=0}^{t}(g^i)^2}}g^t\\ =w^t-\frac{\eta}{\sqrt{\sum_{i=0}^{t}(g^i)^2}}g^t
wt+1←wt−t+11∑i=0t(gi)2t+1ηgt=wt−∑i=0t(gi)2ηgt
这样做的好处是什么:
对于二次函数而言,最佳的间隔应该是
∣
一次微分
∣
二次微分
\frac{|一次微分|}{二次微分}
二次微分∣一次微分∣,所以让分子估算成二次微分可以提高效率。对于多个求得一次微分的点来说,
∑
i
=
0
t
(
g
i
)
2
\sqrt{\sum_{i=0}^{t}(g^i)^2}
∑i=0t(gi)2确实可以作为二次微分趋势的一个估计,而且不会增大计算量,效果图如下:
2.Stochastic Gradient Descent
这个可以加速模型的训练过程,它将之前每次迭代使用每个样本改为每次迭代只使用一个样本,但多次更新,效果对比如下:
可以看到,虽然不是每次都离终点更近,但多次更新确实加快了进程,公式如下:
L
n
=
(
y
^
n
−
(
b
+
∑
w
i
x
i
n
)
)
L^n=(\hat y^n-(b+\sum w_ix_i^n))
Ln=(y^n−(b+∑wixin))
3.Feature Scaling
将不同特征缩放至差不多的范围,减少迭代次数,直观影响如下:
常见缩放方式如下:
x
i
r
←
x
i
r
−
m
i
σ
i
x_i^r\leftarrow\frac{x_i^r-m_i}{\sigma_i}
xir←σixir−mi
其中,
m
i
m_i
mi表示维度i的平均值,
σ
i
\sigma _i
σi表示维度i的标准差,这样缩放对于每个维度i使最后均值为0,方差为1
Gradient Descent:Theory
对于如下的损失函数,如何判断
θ
0
\theta_0
θ0在某个范围的最佳的下个更新点?
其实这个问题非常简单,利用泰勒公式即可。但这个红圈范围足够小时,可以近似认为红圈内有:
L
(
θ
)
=
L
(
a
,
b
)
+
∂
L
(
a
,
b
)
∂
θ
1
(
θ
1
−
a
)
+
∂
L
(
a
,
b
)
∂
θ
2
(
θ
2
−
b
)
L(\theta)=L(a,b)+\frac{\partial L(a,b)}{\partial \theta_1}(\theta_1-a)+\frac{\partial L(a,b)}{\partial \theta_2}(\theta_2-b)
L(θ)=L(a,b)+∂θ1∂L(a,b)(θ1−a)+∂θ2∂L(a,b)(θ2−b)
此时就是最小化上面这个函数,可以将(
∂
L
(
a
,
b
)
∂
θ
1
\frac{\partial L(a,b)}{\partial \theta_1}
∂θ1∂L(a,b),
∂
L
(
a
,
b
)
∂
θ
2
\frac{\partial L(a,b)}{\partial \theta_2}
∂θ2∂L(a,b))看做是一个向量(u,v),(
θ
1
−
a
\theta_1-a
θ1−a,
θ
2
−
b
\theta_2-b
θ2−b)看做求解向量。要想让其最小,相反方向拉满即可,直观图如下:
θ
1
\theta_1
θ1,
θ
2
\theta_2
θ2表示如下:
[
θ
1
θ
2
]
=
[
a
b
]
−
η
[
u
v
]
=
[
a
b
]
−
η
[
∂
L
(
a
,
b
)
∂
θ
1
∂
L
(
a
,
b
)
∂
θ
2
]
\left [ \begin{matrix} \theta_1 \\ \theta_2 \\ \end{matrix} \right ]=\left [ \begin{matrix} a \\ b \\ \end{matrix} \right ]-\eta\left [ \begin{matrix} u \\ v \\ \end{matrix} \right ]=\left [ \begin{matrix} a \\ b \\ \end{matrix} \right ]-\eta\left [ \begin{matrix} \frac{\partial L(a,b)}{\partial \theta_1} \\ \frac{\partial L(a,b)}{\partial \theta_2} \\ \end{matrix} \right ]
[θ1θ2]=[ab]−η[uv]=[ab]−η[∂θ1∂L(a,b)∂θ2∂L(a,b)]
More Limitation of Gradient Descent
迭代除了可能找不到global minima 点外,还可能停止在saddle point(鞍点,某个方向稳定) 和 plateau(变化微小) 处。导致后面两个的原因就是一般只是设定一个很小的阈值,当更新变化后很小就停止。这是值得注意的问题!