一、 梯度下降过程
梯度下降法的核心是最小化目标函数
J
(
θ
)
J(\theta)
J(θ),其中
θ
\theta
θ是模型的参数,
θ
∈
R
d
\theta \in R^{d}
θ∈Rd。它的方法是在每次迭代中,对每个变量,按照目标函数在该变量梯度的相反反向,更新对应的参数值。其中,学习率
η
\eta
η决定了函数到达(局部)最小值的迭代次数。
采用梯度下降方法来实现优化问题:
我们的优化函数表达式为:
θ
∗
=
arg
min
θ
L
(
θ
)
\theta^*=\mathop{\arg\min}\limits_{\theta}L(\theta)
θ∗=θargminL(θ),
其中
L
L
L:代表损失函数,
θ
\theta
θ:代表参数。
假设参数个数为2,即
θ
=
{
θ
1
,
θ
2
}
\theta = \lbrace \theta_{1}, \theta_{2}\rbrace
θ={θ1,θ2}。
开始时的随机参数为:
θ
0
=
[
θ
1
0
θ
2
0
]
\theta_{0}=\begin{bmatrix} \theta_{1}^0 \\ \theta_{2}^{0} \\ \end{bmatrix}
θ0=[θ10θ20],这边的
θ
0
\theta_{0}
θ0为vector即向量。
则我们的优化过程为:
[
θ
1
1
θ
2
1
]
=
[
θ
1
0
θ
2
0
]
−
η
[
∂
L
(
θ
1
0
)
∂
θ
1
0
∂
L
(
θ
2
0
)
∂
θ
2
0
]
⟹
θ
1
=
θ
0
−
η
∇
L
(
θ
0
)
\begin{bmatrix} \theta_{1}^1 \\ \theta_{2}^{1} \\ \end{bmatrix} =\begin{bmatrix} \theta_{1}^0 \\ \theta_{2}^{0} \\ \end{bmatrix}-\eta\begin{bmatrix} \frac{\partial L(\theta_{1}^{0})}{\partial \theta_{1}^{0}} \\ \frac{\partial L(\theta_{2}^{0})}{\partial \theta_{2}^{0}} \\ \end{bmatrix}\implies \theta^{1}=\theta^{0}-\eta \nabla L(\theta^{0})
[θ11θ21]=[θ10θ20]−η⎣⎡∂θ10∂L(θ10)∂θ20∂L(θ20)⎦⎤⟹θ1=θ0−η∇L(θ0)
以此类推不断更新,知道得到最优的参数。如上图所示。
二、学习率
梯度下降时参数操作:
θ
i
=
θ
i
−
1
−
η
∇
L
(
θ
i
−
1
)
\theta^i = \theta^{i-1}-\eta \nabla L(\theta^{i-1})
θi=θi−1−η∇L(θi−1)
由上图我们可以清楚的看到,当学习率
η
\eta
η设置的太小时如蓝色线,其梯度下降的速度就会相对较慢,计算出结果需要花费较长时间。
然而当学习率设置的较大时,我们的梯度下降的步伐会由于太大在横沟两侧反复跨越,如图绿线所示。要是再设置大一点梯度下降很可能跳走,如图黄线所示。而红线状态则是学习率设置得最理想的状态。
三、学习率更新
我们为什么要更新学习率呢,这是因为学习率一定程度上决定着梯度下降的步伐,起初损失函数的斜率较陡时,我们可以让学习率较为大点,当梯度下降迭代到一定程度的时候,其斜率可能会越来越平换,此时要达到最低点显然要减小梯度下降的步伐即减小学习率。如下图所示:
因此,我们的学习率可以设置成:
η
t
=
η
t
+
1
\eta^{t}=\frac{\eta}{\sqrt{t+1}}
ηt=t+1η。
(一)Adagrad优化算法
Adagrad是一个基于梯度的优化算法,它对不同的参数调整学习率,具体而言,对低频出现的参数进行大的更新,对高频出现的参数进行小的更新。因此很适合于处理稀疏数据。Adagrad法大大提升了SGD的鲁棒性。
上图的
g
g
g表示目标函数对权值参数
w
w
w的微分。即
g
i
=
∂
J
(
θ
)
∂
w
i
g^i=\frac{\partial J(\theta)}{\partial w^i}
gi=∂wi∂J(θ)。
在李宏毅的视频中对Adagrad的式子有如下的解释:
然而对于如下的式子:
看起来是不是感觉有点矛盾呢?因为
g
t
g^{t}
gt取得较大值时,则后面的被减数部分就会很大,但是与此同时
g
i
g^{i}
gi就会特别小。
然而在李宏毅视频中对其的解释是
g
t
g^{t}
gt用于反应一次微分的绝对值,而
∑
i
=
0
t
(
g
i
)
2
\sqrt{\sum_{i=0}^{t}(g^{i})^{2}}
∑i=0t(gi)2则是反应一次微分的均方根误差,等价于二次微分的绝对值,它可以反应一次微分后图像的张开程度,在我们的梯度下降算法中则是间接反应出了梯度下降的跨度。
(二) 随机梯度下降算法(SGD)
上图解释了SGD算法和一般的梯度下降算法的区别在于,一般梯度下降算法是将所有的训练样本输入目标函数中后再对目标函数进行微分进行梯度更新。SGD算法则是将一个样本或一小批样本就更新一次参数,所SGD的loss函数
L
n
L^{n}
Ln才会有上标
n
n
n。
由上图我们可以知道,当前我们训练完所有example后,SGD的梯度下降速率比传统的gradient descent快了许多。
特征缩放(feature scaling)
如图所示,我们的模型有两个参数
x
1
,
x
2
x_{1},x_{2}
x1,x2,倘若两个参数的取值范围差异很大,如设定我们的
x
1
x_{1}
x1表示攻击力,其取值范围为(0,50),然而
x
2
x_{2}
x2表示生命值,其取值范围为(0,1000),显然额这样的话当
x
1
,
x
2
x_{1},x_{2}
x1,x2的取值范围处在同意范围时,其分散的程度是不一样的。
因此我们在训练模型时可以对其做feature scaling处理,使不同的feature,他们的scaling相同。
如图所示,左侧蓝色部分是未对feature做处理,右侧部分是经过feature scaling做处理。显然,当我们多不同特征做feature scaling处理之后,我们的gradient descent就会变得简单。
那么,我们要如何做feature scaling处理呢?常见的方法如下图:
假设我们R个example,第r个example的第i个维度数值表示为
x
i
r
x_{i}^{r}
xir,计算
x
i
r
x_{i}^{r}
xir的均值(就是前i个值得平均):
m
i
m_{i}
mi,再计算其标准差:
σ
i
\sigma_{i}
σi。让后对每个值做如下处理:
x
i
r
←
x
i
r
−
m
i
σ
i
x_{i}^r \leftarrow \frac{x_{i}^{r}-m_{i}}{\sigma_{i}}
xir←σixir−mi
得到feature scaling处理的结果为所有维度的mean=0,var=1。就相当于标准正态分布。
四、梯度下降算法的本质
梯度下降算法是一种迭代算法,梯度下降的参数更新本质上如图所示,可以表述为以每个要更新的
θ
\theta
θ为中心画小范围的红色圆,我们要在这个红色圆圈内找到合适的点对其进一步的更新。其数学本质涉及泰勒展开式:
然而,当我们存在多个参数时,其泰勒展开式同样有如下的表示:
接下来模拟下更新过程的数学计算:
上图展示的是具有两个参数的损失函数
L
(
θ
)
L(\theta)
L(θ)的一阶泰勒展开式。如图设
S
=
L
(
a
,
b
)
,
u
=
∂
L
(
a
,
b
)
∂
θ
1
S = L(a,b),u=\frac{\partial L(a,b)}{\partial \theta_{1}}
S=L(a,b),u=∂θ1∂L(a,b) ,
v
=
∂
L
(
a
,
b
)
∂
θ
2
v=\frac{\partial L(a,b)}{\partial \theta_{2}}
v=∂θ2∂L(a,b)来简化目标函数。
如图是对损失函数的进一步简化。
梯度下降的限制
上图描述了梯度下降的一些限制,即可能出现计算的梯度趋于0但是并未处于local minima位置,此时模型会停止训练,但是其结果并不是个很好。