随机梯度下降算法(Stochastic gradient descent,SGD)在神经网络模型训练中,是一种很常见的优化算法。这种算法是基于梯度下降算法产生的,所以要理解随机梯度下降算法,必须要对梯度下降算法有一个全面的理解。
梯度下降:
这个算法我在之前的博文Logistic Regression的数学推导过程以及Python实现 中有详细的说明介绍,这里我们再来简单回顾一下梯度下降算法:假设在逻辑斯蒂回归中,预测函数为
h
θ
(
x
)
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
{h_\theta }(x) = {\theta _0} + {\theta _1}{x_1} + {\theta _2}{x_2} + ... + {\theta _n}{x_n}
hθ(x)=θ0+θ1x1+θ2x2+...+θnxn,我们用平方损失函数可以得到这个函数的损失函数:
J
(
θ
)
=
1
2
∑
i
=
1
m
(
h
θ
(
x
)
−
y
)
2
J(\theta ) = \frac{1}{2}\sum\limits_{i = 1}^m {{{({h_\theta }(x) - y)}^2}}
J(θ)=21i=1∑m(hθ(x)−y)2
我们的目标就是最小化函数的损失函数,我们就对每一个
θ
i
{\theta _i}
θi 超参数求偏导,就可以得到当前这一轮的梯度,然后损失函数向梯度的反方向进行更新,不断这样进行迭代更新,就可以得到超参数的全局最优解。运用链式求导方法,数学过程可以表示成:
∂
∂
θ
j
J
(
θ
)
=
∂
∂
θ
j
1
2
(
h
θ
(
x
)
−
y
)
2
=
(
h
θ
(
x
)
−
y
)
⋅
∂
∂
θ
j
(
h
θ
(
x
)
−
y
)
=
(
h
θ
(
x
)
−
y
)
⋅
∂
∂
θ
j
(
∑
i
=
0
n
θ
i
x
i
−
y
)
=
(
h
θ
(
x
)
−
y
)
x
j
\frac{\partial }{{\partial {\theta _j}}}J(\theta ) = \frac{\partial }{{\partial {\theta _j}}}\frac{1}{2}{({h_\theta }(x) - y)^2} = ({h_\theta }(x) - y) \cdot \frac{\partial }{{\partial {\theta _j}}}({h_\theta }(x) - y) \\= ({h_\theta }(x) - y) \cdot \frac{\partial }{{\partial {\theta _j}}}(\sum\limits_{i = 0}^n {{\theta _i}{x_i}} - y) = ({h_\theta }(x) - y){x_j}
∂θj∂J(θ)=∂θj∂21(hθ(x)−y)2=(hθ(x)−y)⋅∂θj∂(hθ(x)−y)=(hθ(x)−y)⋅∂θj∂(i=0∑nθixi−y)=(hθ(x)−y)xj
这是每一轮迭代的梯度,我们加上
l
e
a
r
n
i
n
g
learning
learning
r
a
t
e
rate
rate
α
\alpha
α,就可以得到完整的梯度下降的公式:
θ
j
:
=
θ
j
−
α
(
h
θ
(
x
)
−
y
)
x
j
{\theta _j}: = {\theta _j} - \alpha ({h_\theta }(x) - y){x_j}
θj:=θj−α(hθ(x)−y)xj
这个过程就像是在一个山脉中寻找一个最低的山谷,我们用学习率为
α
\alpha
α 的步长一步步地向山谷的大致方向移动,我们每一步只能向山谷的方向靠近,每一步都在进步,整个过程可以参考下面的动图(图片来自知乎-量子位):
在图中可见,小球从山顶从不同的方向梯度滚下山,这就是梯度下降的过程。但是梯度下降算法每一步的更新都需要计算所有超参数的梯度,迭代速度必然会很慢,我们有没有比较快速的梯度下降算法呢,这里就可以用到我们的随机梯度下降算法:
这个算法的流程就是在每次更新的时候使用一个样本进行梯度下降,所谓的随机二字,就是说我们可以随机用一个样本来表示所有的样本,来调整超参数
θ
\theta
θ ,算法的公式如下所示:
L
o
o
p
Loop
Loop {
f
o
r
for
for
i
i
i
i
n
in
in
r
a
n
g
e
(
m
)
:
range(m):
range(m): {
θ
j
:
=
θ
j
+
α
(
y
(
i
)
−
h
θ
(
x
(
i
)
)
)
x
j
(
i
)
{\theta _j}: = {\theta _j}{\text{ + }}\alpha ({y^{(i)}} - {h_\theta }({x^{(i)}}))x_j^{(i)}
θj:=θj + α(y(i)−hθ(x(i)))xj(i)
}
}
因为这个样本是随机的,所以每次迭代没有办法得到一个准确的梯度,这样一来虽然每一次迭代得到的损失函数不一定是朝着全局最优方向,但是大体的方向还是朝着全局最优解的方向靠近,直到最后,得到的结果通常就会在全局最优解的附近。这种算法相比普通的梯度下降算法,收敛的速度更快,所以在一般神经网络模型训练中,随机梯度下降算法 SGD 是一种非常常见的优化算法。
这就是大家在训练神经网络模型中常见的随机梯度下降SGD算法,希望可以帮助大家在理解优化算法上有所帮助,谢谢。