随机梯度下降(Stochastic Gradient Descent, SGD)计算实例详解,帮助你理解SGD算法!
一、算法原理:
网上可以参见的关于SGD算法的原理已经有很多,建议大家先搞懂梯度这个概念,再去理解,这里就不再赘述。
我们主要结合公式和具体的案例来分析,SGD到底是如何计算梯度并对参数进行更新的,在此之前,需要大家对复合函数求偏导、链式求导法则有一定了解,否则在计算过程中可能会难以理解。
二、计算实例:
1.数据集
假设我们有如下的数据集,共包含了三个数据:
( x , y ) = [ ( 1 , 2 ) , ( 2 , 3 ) , ( 3 , 4 ) ] (x, y)=[{(1, 2), (2, 3), (3, 4)}] (x,y)=[(1,2),(2,3),(3,4)]
不难看出, y = x + 1 y=x+1 y=x+1,下面我们来看SGD在网络训练中是如何做的。
2.模型构建
为了得到输入数据和输出数据之间的关系,我们需要构建一个简单的线性回归模型:
y = θ 0 + θ 1 x y = \theta_0 + \theta_1 x y=θ0+θ1x
x x x, y y y分别是模型的输入和输出, θ 0 \theta_0 θ0 和 θ 1 \theta_1 θ1则是网络需要通过训练学习的参数。
我们的目标是通过随机梯度下降来找到最佳的参数 θ 0 \theta_0 θ0 和 θ 1 \theta_1 θ1,使得模型预测的结果与真实数据尽可能接近。
3.损失函数
在这里我们选择均方误差(MSE)作为损失函数:
J = 1 2 n ∑ i = 1 n ( y ^ ( i ) − y ( i ) ) 2 = 1 2 n ∑ i = 1 n ( θ 0 + θ 1 x ( i ) − y ( i ) ) 2 J =\frac{1}{2n} \sum_{i=1}^{n} (\hat{y}^{(i)} - y^{(i)})^2= \frac{1}{2n} \sum_{i=1}^{n} (\theta_0 + \theta_1 x^{(i)} - y^{(i)})^2 J=2n1∑i=1n(y^(i)−y(i))2=2n1∑i=1n(θ0+θ1x(i)−y(i))2
其中 y ^ ( i ) \hat{y}^{(i)} y^(i)是网络预测输出, y ( i ) y^{(i)} y(i)是真实值,n是样本数量。(注意:公式中的分母我这里采用 2 n 2n 2n是为了方便后续求导计算)
4.SGD计算过程
4.1 初始化
θ 0 = 0 \theta_0 = 0 θ0=0 和 θ 1 = 0 \theta_1 = 0 θ1=0,选择学习率 η = 0.01 \eta = 0.01 η=0.01。
4.2 选择一个样本计算预测值
假设我们选择的样本是 ( 1 , 2 ) (1, 2) (1,2)
y ^ = θ 0 + θ 1 ⋅ 1 = θ 0 + θ 1 \hat{y} = \theta_0 + \theta_1 \cdot 1 = \theta_0 + \theta_1 y^=θ0+θ1⋅1=θ0+θ1
4.3 计算损失
J ( θ 0 , θ 1 ) = 1 2 ( θ 0 + θ 1 x − y ) 2 = 1 2 ( θ 0 + θ 1 − 2 ) 2 J(\theta_0, \theta_1) = \frac{1}{2} (\theta_0 + \theta_1 x - y)^2= \frac{1}{2} (\theta_0 + \theta_1 - 2)^2 J(θ0,θ1)=21(θ0+θ1x−y)2=21(θ0+θ1−2)2
4.4 计算梯度
∂ J ( θ 0 , θ 1 ) ∂ θ 0 = ( θ 0 + θ 1 x − y ) = θ 0 + θ 1 − 2 \frac{\partial J(\theta_0, \theta_1)}{\partial \theta_0} = (\theta_0 + \theta_1 x - y)=\theta_0 + \theta_1 - 2 ∂θ0∂J(θ0,θ1)=(θ0+θ1x−y)=θ0+θ1−2
∂ J ( θ 0 , θ 1 ) ∂ θ 1 = ( θ 0 + θ 1 x − y ) ⋅ x = ( θ 0 + θ 1 − 2 ) ⋅ 1 \frac{\partial J(\theta_0, \theta_1)}{\partial \theta_1} = (\theta_0 + \theta_1 x - y) \cdot x=(\theta_0 + \theta_1 - 2) \cdot 1 ∂θ1∂J(θ0,θ1)=(θ0+θ1x−y)⋅x=(θ0+θ1−2)⋅1
4.5 更新参数
θ 0 n e x t = θ 0 − 0.01 ⋅ ( θ 0 + θ 1 − 2 ) = 0.02 \theta_0next= \theta_0 - 0.01 \cdot (\theta_0 + \theta_1 - 2)=0.02 θ0next=θ0−0.01⋅(θ0+θ1−2)=0.02
θ 1 n e x t : = θ 1 − 0.01 ⋅ ( θ 0 + θ 1 − 2 ) ⋅ 1 = 0.02 \theta_1next := \theta_1 - 0.01 \cdot (\theta_0 + \theta_1 - 2) \cdot 1=0.02 θ1next:=θ1−0.01⋅(θ0+θ1−2)⋅1=0.02
继续选择下一个样本,重复以上步骤,直到达到停止条件。
通过这样的迭代过程,随机梯度下降会逐步调整 θ 0 \theta_0 θ0 和 θ 1 \theta_1 θ1,使得模型的预测结果与真实值更加接近,从而实现对线性模型的优化训练。
5.带有动量的SGD计算过程
通过第4小节,我们通过一个简单的回归分析,了解了SGD算法是怎么更新网络参数的,接下来我们继续通过上一个小节中的回归分析例子看一下带有动量的SGD算法是如何更新网络参数的。
5.1初始化参数和动量变量:
初始化参数
θ
0
\theta_0
θ0 和
θ
1
\theta_1
θ1 为任意值,例如
θ
0
=
0
\theta_0 = 0
θ0=0,
θ
1
=
0
\theta_1 = 0
θ1=0
初始化动量变量
v
0
=
0
v_0 = 0
v0=0 和
v
1
=
0
v_1 = 0
v1=0,这些变量将存储之前的梯度信息。
选择一个学习率
η
\eta
η,例如
η
=
0.01
\eta = 0.01
η=0.01
选择动量系数
β
\beta
β,通常选择一个介于 0 到 1 之间的值,例如
β
=
0.9
\beta = 0.9
β=0.9
5.2选择一个样本计算预测值
假设我们选择的样本是
(
1
,
2
)
(1, 2)
(1,2)
y
^
=
θ
0
+
θ
1
⋅
1
=
θ
0
+
θ
1
\hat{y} = \theta_0 + \theta_1 \cdot 1 = \theta_0 + \theta_1
y^=θ0+θ1⋅1=θ0+θ1
5.3计算损失
J ( θ 0 , θ 1 ) = 1 2 ( θ 0 + θ 1 x − y ) 2 = 1 2 ( θ 0 + θ 1 − 2 ) 2 J(\theta_0, \theta_1) = \frac{1}{2} (\theta_0 + \theta_1 x - y)^2= \frac{1}{2} (\theta_0 + \theta_1 - 2)^2 J(θ0,θ1)=21(θ0+θ1x−y)2=21(θ0+θ1−2)2
5.4计算梯度
计算损失函数对参数 θ 0 \theta_0 θ0 和 θ 1 \theta_1 θ1 的梯度:
∂ J ( θ 0 , θ 1 ) ∂ θ 0 = ( θ 0 + θ 1 x − y ) = θ 0 + θ 1 − 2 \frac{\partial J(\theta_0, \theta_1)}{\partial \theta_0} = (\theta_0 + \theta_1 x - y)=\theta_0 + \theta_1 - 2 ∂θ0∂J(θ0,θ1)=(θ0+θ1x−y)=θ0+θ1−2
∂ J ( θ 0 , θ 1 ) ∂ θ 1 = ( θ 0 + θ 1 x − y ) ⋅ x = ( θ 0 + θ 1 − 2 ) ⋅ 1 \frac{\partial J(\theta_0, \theta_1)}{\partial \theta_1} = (\theta_0 + \theta_1 x - y) \cdot x=(\theta_0 + \theta_1 - 2) \cdot 1 ∂θ1∂J(θ0,θ1)=(θ0+θ1x−y)⋅x=(θ0+θ1−2)⋅1
5.5更新动量变量
使用动量来更新参数,动量变量的更新规则为:
v 0 : = β v 0 + ( 1 − β ) ∂ J ( θ 0 , θ 1 ) ∂ θ 0 v_0 := \beta v_0 + (1 - \beta) \frac{\partial J(\theta_0, \theta_1)}{\partial \theta_0} v0:=βv0+(1−β)∂θ0∂J(θ0,θ1)
v 1 : = β v 1 + ( 1 − β ) ∂ J ( θ 0 , θ 1 ) ∂ θ 1 v_1 := \beta v_1 + (1 - \beta) \frac{\partial J(\theta_0, \theta_1)}{\partial \theta_1} v1:=βv1+(1−β)∂θ1∂J(θ0,θ1)
5.6更新参数
根据动量变量更新参数
θ
0
\theta_0
θ0 和
θ
1
\theta_1
θ1:
θ
0
n
e
x
t
=
θ
0
−
η
v
0
\theta_0next = \theta_0 - \eta v_0
θ0next=θ0−ηv0
θ
1
n
e
x
t
=
θ
1
−
η
v
1
\theta_1next = \theta_1 - \eta v_1
θ1next=θ1−ηv1
重复:
对数据集中的每个样本重复以上步骤,直到达到预定的迭代次数或损失函数达到满意的水平。
动量的作用
动量项 v 0 v_0 v0 和 v 1 v_1 v1 的引入使得梯度更新不再完全依赖于当前的梯度值,而是结合了之前的梯度信息。这样可以减少梯度更新的波动,特别是在梯度方向变化较快或者样本存在噪声的情况下,带来更为稳定和有效的参数更新,加速模型的收敛速度。
通过动量的引入,带有动量的随机梯度下降可以更快地找到全局最优解或者局部最优解,从而提高了优化算法的性能和效率。