提示:深度学习中常见的优化算法mini-batch SGD的学习总结
一、算法背景
- mini-batch SGD的基本思想是在每次迭代中只使用一个小批量的训练样本来估计梯度,并据此更新模型参数。
小批量梯度下降(Mini-batch Stochastic Gradient Descent, Mini-batch SGD)结合了批量梯度下降(Batch Gradient Descent)和随机梯度下降(Stochastic Gradient Descent, SGD)的优点,既保证了一定程度的计算效率,又提高了训练的稳定性和收敛速度。
二、算法步骤
1. 初始化参数
随机初始化:在开始之前,模型的参数(如权重和偏置)需要被随机初始化。常见的初始化方法包括零初始化、随机初始化和Xavier初始化等。
2. 抽取样本
将训练数据集划分为多个小批量(mini-batches)。每个小批量通常包含几十到几百个样本。小批量的大小是一个超参数,需要根据具体任务和计算资源进行调整。
3. 计算梯度
使用当前小批量中的所有样本计算模型的梯度。这意味着要计算损失函数相对于模型参数的偏导数。梯度指出了损失函数在当前参数值处增加最快的方向,而我们希望朝相反的方向移动,以减少损失。
4. 更新参数
根据计算出的梯度和预先设定的学习率来更新模型的参数。更新公式为:
θ
:
=
θ
−
η
⋅
∇
θ
J
(
θ
;
X
b
a
t
c
h
;
Y
b
a
t
c
h
)
\theta:=\theta-\eta\cdot\nabla_\theta J(\theta;X_{\mathrm{batch}};Y_{\mathrm{batch}})
θ:=θ−η⋅∇θJ(θ;Xbatch;Ybatch)
θ为模型参数,η为学习率,
J
(
θ
;
X
b
a
t
c
h
;
Y
b
a
t
c
h
)
\ J(\theta;X_{\mathrm{batch}};Y_{\mathrm{batch}})
J(θ;Xbatch;Ybatch)为使用当前小批量样本计算的梯度。
5. 迭代计算
重复步骤3至4,直到遍历完所有小批量,完成一次完整的周期(epoch)。一个周期是指所有小批量都被使用一次。
6. 多个周期
通常需要多次遍历整个数据集(多个周期),直到满足某个停止条件。这些条件可以是达到预定的迭代次数、损失函数的变化小于某个阈值,或是验证集上的性能不再提高等。
7. [可选] 调整学习率
在训练过程中,有时会动态调整学习率。例如,随着训练的进行逐渐降低学习率,这被称为学习率衰减。这样做可以帮助算法更稳定地收敛到最优解。
三、算法示例
以SGD为例,SGD与mini-batch SGD的区别在于再计算梯度时,
一个是采用单个样本估计梯度,一个是采用小批量样本来计算梯度。
假设有一个线性回归模型
y
=
w
x
+
b
y=wx+b
y=wx+b
其中 A 是权重,b 是偏置项,x 是输入特征,y 是输出。我们的目标是最小化损失函数 L,通常使用的是均方误差(Mean Squared Error, MSE),定义为:
L
(
w
,
b
)
=
1
2
(
w
x
+
b
−
y
)
2
L(w,b)=\frac12(wx+b-y)^2
L(w,b)=21(wx+b−y)2
1. 初始化参数
设定两个模型参数w,b均为0,假定学习率η为0.1(若是mini- batch还需指定batch大小,SGD默认为1)
2. 抽取样本
假设我们有一个简单的数据集,包含两个样本点:
(
x
1
,
y
1
)
=
(
1
,
2
)
和
(
x
2
,
y
2
)
=
(
2
,
4
)
(x_1,y_1)=(1,2)\text{和}(x_2,y_2)=(2,4)
(x1,y1)=(1,2)和(x2,y2)=(2,4)
3. 计算梯度
对w求偏导:
∂
L
∂
w
=
(
w
x
+
b
−
y
)
x
\frac{\partial L}{\partial w}=(wx+b-y)x
∂w∂L=(wx+b−y)x
对b求偏导:
∂
L
∂
b
=
(
w
x
+
b
−
y
)
\frac{\partial L}{\partial b}=(wx+b-y)
∂b∂L=(wx+b−y)
4. 更新参数
· 第1次迭代(使用第一个样本点)
计算预测值:
y
1
′
=
w
x
1
+
b
=
0
∗
1
+
0
=
0
y_1'=wx_1+b=0*1+0=0
y1′=wx1+b=0∗1+0=0
计算损失:
L
1
=
1
n
(
0
−
2
)
2
=
2
L_1=\frac1n(0-2)^2=2
L1=n1(0−2)2=2
计算梯度:
(1)对w的梯度:
∂
L
1
∂
w
=
(
0
−
2
)
∗
1
=
−
2
\frac{\partial L_1}{\partial w}=(0-2)*1=-2
∂w∂L1=(0−2)∗1=−2
(2)对b的梯度:
∂
L
1
∂
b
=
0
−
2
=
−
2
\frac{\partial L_1}{\partial b}=0-2=-2
∂b∂L1=0−2=−2
更新参数:
依据上述公式:
θ
:
=
θ
−
η
⋅
∇
θ
J
(
θ
;
X
b
a
t
c
h
;
Y
b
a
t
c
h
)
\theta:=\theta-\eta\cdot\nabla_\theta J(\theta;X_{\mathrm{batch}};Y_{\mathrm{batch}})
θ:=θ−η⋅∇θJ(θ;Xbatch;Ybatch)
w
=
w
−
0.1
∗
(
−
2
)
=
0
+
0.2
=
0.2
b
=
b
−
0.1
∗
(
−
2
)
=
0
+
0.2
=
0.2
w=w-0.1*(-2)=0+0.2=0.2\\b=b-0.1*(-2)=0+0.2=0.2
w=w−0.1∗(−2)=0+0.2=0.2b=b−0.1∗(−2)=0+0.2=0.2
· 第2次迭代(使用第二个样本点)
y
2
′
=
w
x
2
+
b
=
0.2
∗
2
+
0.2
=
0.6
y_2'=wx_2+b=0.2*2+0.2=0.6
y2′=wx2+b=0.2∗2+0.2=0.6
L
2
=
1
2
(
0.6
−
4
)
2
=
5.78
L_2=\frac12(0.6-4)^2=5.78
L2=21(0.6−4)2=5.78
∂
L
2
∂
w
=
(
0.6
−
4
)
∗
2
=
−
6.8
∂
L
2
∂
h
=
0.6
−
4
=
−
3.4
\begin{aligned}&\frac{\partial L_{2}}{\partial w}=(0.6-4)*2=-6.8\\&\frac{\partial L_{2}}{\partial h}=0.6-4=-3.4\end{aligned}
∂w∂L2=(0.6−4)∗2=−6.8∂h∂L2=0.6−4=−3.4
w
=
0.2
−
0.1
∗
(
−
6.8
)
=
0.2
+
0.68
=
0.88
b
=
0.2
−
0.1
∗
(
−
3.4
)
=
0.2
+
0.34
=
0.54
w=0.2-0.1*(-6.8)=0.2+0.68=0.88\\b=0.2-0.1*(-3.4)=0.2+0.34=0.54
w=0.2−0.1∗(−6.8)=0.2+0.68=0.88b=0.2−0.1∗(−3.4)=0.2+0.34=0.54
5. 迭代计算
后续采用更多的单个样本进行模型参数更新,使模型能够更好地拟合给定的数据集,直到损失函数达到一个满意的水平或者变化非常小为止。
四、小结
由于每次迭代,SGD仅采取一个样本进行模型参数更新,算法效率和收敛速度上是不如mini-batch SGD。
梯度下降的算法当中由于需要计算梯度,必须保证所选模型(示例中是线性回归模型)必须是可导的。