深度学习笔记之优化算法——随机梯度下降
- 引言
- 回顾:梯度下降法
- 梯度下降法在机器学习中的问题
- 随机梯度下降
- 随机梯度下降方法的思想
- 随机梯度下降方法的步骤描述
- 关于学习率
引言
本节将介绍随机梯度下降 (Stochastic Gradient Descent,SGD) \text{(Stochastic Gradient Descent,SGD)} (Stochastic Gradient Descent,SGD)
回顾:梯度下降法
从最速下降法的角度观察,下降方向
P
k
\mathcal P_k
Pk的判定逻辑是:满足目标函数
f
(
x
k
+
1
)
=
f
(
x
k
+
α
k
⋅
P
k
)
f(x_{k+1}) = f(x_k + \alpha_k \cdot \mathcal P_k)
f(xk+1)=f(xk+αk⋅Pk)的一阶泰勒展开式与
f
(
x
k
)
f(x_k)
f(xk)之间存在严格的单调性;
其中
O
(
∥
α
k
P
k
∥
)
\mathcal O(\|\alpha_k\mathcal P_k\|)
O(∥αkPk∥)表示关于
α
k
P
k
\alpha_k\mathcal P_k
αkPk的高阶无穷小;
f
(
x
k
+
1
)
−
f
(
x
k
)
=
α
k
⋅
(
P
k
)
T
∇
f
(
x
k
)
+
O
(
∥
α
k
P
k
∥
)
≈
α
k
⋅
(
P
k
)
T
∇
f
(
x
k
)
<
0
⇒
(
P
k
)
T
∇
f
(
x
k
)
<
0
\begin{aligned} f(x_{k+1}) - f(x_k) & = \alpha_k \cdot (\mathcal P_k)^T \nabla f(x_k) + \mathcal O(\|\alpha_k \mathcal P_k\|) \\ & \approx \alpha_k \cdot (\mathcal P_k)^T \nabla f(x_{k}) < 0 \\ & \Rightarrow (\mathcal P_k)^T \nabla f(x_k) < 0 \end{aligned}
f(xk+1)−f(xk)=αk⋅(Pk)T∇f(xk)+O(∥αkPk∥)≈αk⋅(Pk)T∇f(xk)<0⇒(Pk)T∇f(xk)<0
对上式进行展开,如果使用欧式范数对
P
k
\mathcal P_k
Pk的大小进行描述,即:
(
P
k
)
T
∇
f
(
x
k
)
=
∥
P
k
∥
2
⋅
∥
∇
f
(
x
k
)
∥
2
⋅
cos
θ
(\mathcal P_k)^T \nabla f(x_k) = \|\mathcal P_k\|_2 \cdot \|\nabla f(x_k)\|_2 \cdot \cos \theta
(Pk)T∇f(xk)=∥Pk∥2⋅∥∇f(xk)∥2⋅cosθ
关于更新方向
P
k
\mathcal P_k
Pk,我们更关注它的方向朝向,而不是它的大小。因而对更新方向
P
k
\mathcal P_k
Pk的大小进行约束。例如:
∥
P
k
∥
≤
1
\|\mathcal P_k\| \leq 1
∥Pk∥≤1。由于
∇
f
(
x
k
)
\nabla f(x_k)
∇f(xk)是大小恒正的已知项,因而真正影响
(
P
k
)
T
∇
f
(
x
k
)
(\mathcal P_k)^T \nabla f(x_k)
(Pk)T∇f(xk)结果的只有梯度向量
∇
f
(
x
k
)
\nabla f(x_k)
∇f(xk)与更新方向
P
k
\mathcal P_k
Pk之间的夹角
θ
\theta
θ。
由于
cos
θ
∈
[
−
1
,
1
]
\cos \theta \in [-1,1]
cosθ∈[−1,1],因而当
θ
=
π
2
\begin{aligned}\theta = \frac{\pi}{2}\end{aligned}
θ=2π时,即更新方向与梯度方向相反时,
cos
θ
=
−
1
\cos \theta = -1
cosθ=−1,
(
P
k
)
T
∇
f
(
x
k
)
(\mathcal P_k)^T \nabla f(x_k)
(Pk)T∇f(xk)达到最小:
P
k
=
−
∇
f
(
x
k
)
\mathcal P_k = - \nabla f(x_k)
Pk=−∇f(xk)
此时的最速下降法就是梯度下降法。但如果对
P
k
\mathcal P_k
Pk的约束方式不是欧式范数,如:
L
1
\mathcal L_1
L1范数或者矩阵
2
2
2-范数,它们在范数范围内,不同方向的最大值可能不相等。见下图:
其中最左侧的是
欧式范数 ∥ P ∥ 2 ≤ ϵ \|\mathcal P\|_2 \leq \epsilon ∥P∥2≤ϵ,可以看出,特征空间原点到范数边界的距离均相等,这使得
上式唯一的可变信息取决于 θ \theta θ的取值;中间与右侧分别是
L 1 \mathcal L_1 L1范数 ∥ P ∥ 1 ≤ ϵ \|\mathcal P\|_1 \leq \epsilon ∥P∥1≤ϵ与矩阵 2 2 2-范数 ∥ A ∥ 2 ≤ ϵ \|\mathcal A\|_2 \leq \epsilon ∥A∥2≤ϵ,可以看出:由于特征空间原点到范数边界之间的距离可能不相等,这使得
上式的可变信息取决于 θ \theta θ、范数长度的共同作用,最终可能导致:
某方向即便不是负梯度方向,但它有可能使 ( P k ) T ∇ f ( x k ) (\mathcal P_k)^T \nabla f(x_k) (Pk)T∇f(xk)达到最小。
梯度下降法在机器学习中的问题
在本节中,这里暂时模糊掉最速下降法与梯度下降法之间的区别。在无约束优化问题——最速下降法以及梯度下降法在强凸函数的收敛性分析中介绍过,如:
- 梯度下降法收敛速度慢,即便目标函数是强凸函数最快也仅能达到线性收敛;
- Hessian Matrix ⇒ ∇ 2 f ( ⋅ ) \text{Hessian Matrix} \Rightarrow \nabla^2 f(\cdot) Hessian Matrix⇒∇2f(⋅)以及条件数 ( Condition Number ) (\text{Condition Number}) (Condition Number)对收敛速度的影响。当条件数越大时,收敛速度随之减缓,极限时可退化至次线性收敛;
- 关于收敛方向:可能出现 ZigZag \text{ZigZag} ZigZag现象。底层原因在于:每次迭代过程,负梯度方向只是当前迭代步骤的最优解;再宽泛一点:负梯度方向只是某迭代位置小范围内的局部最优解。
- 不具备二次终止性:在凸二次函数的凸优化问题,仅通过有限次迭代步骤,无法收敛至最优解。
在机器学习过程中,梯度下降法的时间复杂度同样不低。例如:
- 已知数据集
D
=
{
x
(
i
)
,
y
(
i
)
}
i
=
1
N
\mathcal D = \{x^{(i)},y^{(i)}\}_{i=1}^N
D={x(i),y(i)}i=1N,使用极大似然估计作为目标函数进行描述,具体表示为:
其中
L ( ⋅ ) \mathcal L(\cdot) L(⋅)表示关于样本的
损失函数;而
J ( ⋅ ) \mathcal J(\cdot) J(⋅)才是最终的目标函数结果。
{ L [ x ( i ) , y ( i ) ; θ ] = − log P ( y ( i ) ∣ x ( i ) ; θ ) J ( θ ) = E ( x ( i ) , y ( i ) ) ∈ D L [ x ( i ) , y ( i ) ; θ ] = 1 N ∑ i = 1 N − log P ( y ( i ) ∣ x ( i ) ; θ ) \begin{cases} \mathcal L[x^{(i)},y^{(i)};\theta] = -\log \mathcal P(y^{(i)} \mid x^{(i)};\theta) \\ \quad \\ \begin{aligned} \mathcal J(\theta) & = \mathbb E_{(x^{(i)},y^{(i)}) \in \mathcal D} \mathcal L[x^{(i)},y^{(i)};\theta] \\ & = \frac{1}{N} \sum_{i=1}^N -\log \mathcal P(y^{(i)} \mid x^{(i)};\theta) \end{aligned} \end{cases} ⎩ ⎨ ⎧L[x(i),y(i);θ]=−logP(y(i)∣x(i);θ)J(θ)=E(x(i),y(i))∈DL[x(i),y(i);θ]=N1i=1∑N−logP(y(i)∣x(i);θ) - 对目标函数
J
(
θ
)
\mathcal J(\theta)
J(θ)使用梯度下降法进行运算:
牛顿-莱布尼兹公式~
∇ θ J ( θ ) = ∇ θ [ 1 N ∑ i = 1 N − log P ( y ( i ) ∣ x ( i ) ; θ ) ] = 1 N ∑ i = 1 N ∇ θ [ − log P ( y ( i ) ∣ x ( i ) ; θ ) ] \begin{aligned} \nabla_{\theta} \mathcal J(\theta) & = \nabla_{\theta} \left[\frac{1}{N} \sum_{i=1}^N -\log \mathcal P(y^{(i)} \mid x^{(i)};\theta)\right] \\ & = \frac{1}{N} \sum_{i=1}^N \nabla_{\theta} \left[-\log \mathcal P(y^{(i)} \mid x^{(i)};\theta)\right] \end{aligned} ∇θJ(θ)=∇θ[N1i=1∑N−logP(y(i)∣x(i);θ)]=N1i=1∑N∇θ[−logP(y(i)∣x(i);θ)]
很明显,可以发现:需要对每一个样本的目标函数结果对参数 θ \theta θ计算梯度。该公式计算的时间复杂度为 O ( N ) \mathcal O(N) O(N),其中 N N N表示数据集内样本数量。 - 但样本数量自身同样也是不可忽视的重要条件。机器学习反复出现的一个问题是:好的泛化需要大的训练集,但大的训练集的计算代价也很大。
上述红色部分抄自
《深度学习(花书)》 P 94 P_{94} P94下端。
这明显出现了矛盾:既然想要降低梯度下降法的时间复杂度,就需要减少训练集样本数量 N N N;但训练集样本数量的减少,也会导致该数据集对概率模型的泛化效果较差。
随机梯度下降
随机梯度下降方法的思想
随机梯度下降的核心在于,目标函数的梯度
∇
θ
J
(
θ
)
\nabla_{\theta} \mathcal J(\theta)
∇θJ(θ)自身同样也是期望:
∇
θ
J
(
θ
)
=
1
N
∑
i
=
1
N
∇
θ
[
−
log
P
(
y
(
i
)
∣
x
(
i
)
;
θ
)
]
=
E
(
x
(
i
)
,
y
(
i
)
)
∈
D
[
−
log
P
(
y
(
i
)
∣
x
(
i
)
;
θ
)
]
\begin{aligned} \nabla_{\theta} \mathcal J(\theta) & = \frac{1}{N} \sum_{i=1}^N \nabla_{\theta} \left[-\log \mathcal P(y^{(i)} \mid x^{(i)};\theta)\right] \\ & = \mathbb E_{(x^{(i)},y^{(i)}) \in \mathcal D} \left[-\log \mathcal P(y^{(i)} \mid x^{(i)};\theta) \right] \end{aligned}
∇θJ(θ)=N1i=1∑N∇θ[−logP(y(i)∣x(i);θ)]=E(x(i),y(i))∈D[−logP(y(i)∣x(i);θ)]
但期望同样可以使用小规模样本进行近似估计。在每一次迭代过程中,从训练集
D
\mathcal D
D中均匀地抽取若干个独立同分布的小批量
(
Mini-Batch
)
(\text{Mini-Batch})
(Mini-Batch)样本,通过计算批量内样本的梯度均值,并替代
∇
θ
J
(
θ
)
\nabla_{\theta} \mathcal J(\theta)
∇θJ(θ)作为当前迭代步骤的梯度结果:
∇
θ
J
(
θ
)
≈
G
=
1
m
′
∑
j
=
1
m
′
∇
θ
L
[
x
(
i
)
,
y
(
i
)
;
θ
]
\nabla_{\theta} \mathcal J(\theta) \approx\mathcal G = \frac{1}{m'} \sum_{j=1}^{m'}\nabla_{\theta} \mathcal L[x^{(i)},y^{(i)};\theta]
∇θJ(θ)≈G=m′1j=1∑m′∇θL[x(i),y(i);θ]
我们发现:这种方法与随机森林中的
Boostrapping
\text{Boostrapping}
Boostrapping采样方法有着异曲同工之妙。其中
Boostrapping
\text{Boostrapping}
Boostrapping采样方法的采样集合
D
′
\mathcal D'
D′与原式集合
D
\mathcal D
D中,如果
D
\mathcal D
D中的样本数量趋近于无穷大,那么
D
‘
\mathcal D‘
D‘中始终不会从
D
\mathcal D
D采样的概率是:
lim
N
⇒
∞
(
1
−
1
N
)
N
=
1
e
≈
0.368
\mathop{\lim}\limits_{N \Rightarrow \infty} (1 - \frac{1}{N})^N = \frac{1}{e} \approx 0.368
N⇒∞lim(1−N1)N=e1≈0.368
虽然在随机梯度下降中仅使用随机采样以获取小批量样本,但由于各迭代步骤产生的小批量样本均服从独立同分布,因而同样可以得到梯度的无偏估计。
随机梯度下降方法的步骤描述
关于随机梯度下降在第 k k k个训练迭代的更新步骤表示如下:
初始化步骤:学习率 ϵ k \epsilon_k ϵk;初始参数 θ \theta θ;
迭代过程:
- 事先判断准则是否满足条件(如目标函数结果小于某阈值 δ \delta δ) ? ? ?是,则算法终止;
- 从训练集
D
\mathcal D
D中采出包含
m
m
m个样本的小批量,记作
D
′
\mathcal D'
D′:
D ′ = { ( x ( j ) , y ( j ) ) } j = 1 m \mathcal D' = \{(x^{(j)},y^{(j)})\}_{j=1}^m D′={(x(j),y(j))}j=1m - 针对该小批量的梯度
G
\mathcal G
G进行估计:
其中
f ( ⋅ ) f(\cdot) f(⋅)则表示模型,那么
f ( x ( j ) ; θ ) f(x^{(j)};\theta) f(x(j);θ)则表示模型关于
x ( i ) x^{(i)} x(i)预测结果。
G ⇐ E ( x ( j ) , y ( j ) ) ∈ D ′ [ ∇ θ L [ f ( x ( j ) ; θ ) , y ( j ) ] ] = 1 m ∑ j = 1 m ∇ θ L [ f ( x ( j ) ; θ ) , y ( j ) ] \begin{aligned} \mathcal G & \Leftarrow \mathbb E_{(x^{(j)},y^{(j)}) \in \mathcal D'} \left[\nabla_{\theta} \mathcal L[f(x^{(j)};\theta),y^{(j)}]\right] \\ & = \frac{1}{m} \sum_{j=1}^m \nabla_{\theta} \mathcal L[f(x^{(j)};\theta),y^{(j)}] \end{aligned} G⇐E(x(j),y(j))∈D′[∇θL[f(x(j);θ),y(j)]]=m1j=1∑m∇θL[f(x(j);θ),y(j)] - 对参数
θ
\theta
θ进行更新:
θ ⇐ θ − ϵ ⋅ G \theta \Leftarrow \theta - \epsilon \cdot \mathcal G θ⇐θ−ϵ⋅G - 返回步骤 1 1 1重新进行判断,直到算法终止为止。
关于学习率
一般情况下,随机梯度下降算法使用使用固定的学习率,在真实迭代过程中:有必要随着迭代步骤的推移逐渐降低学习率。我们记第
k
k
k次迭代步骤的学习率结果为
ϵ
k
\epsilon_k
ϵk;在实践过程中,给定初始学习率
ϵ
0
\epsilon_0
ϵ0,学习率衰减的迭代次数
τ
\tau
τ;衰减系数
α
\alpha
α,第
k
k
k次迭代步骤的学习率
ϵ
k
\epsilon_k
ϵk可表示为:
在该公式中,迭代步骤
k
<
τ
k < \tau
k<τ;
ϵ
k
=
(
1
−
α
)
ϵ
0
+
α
⋅
ϵ
τ
α
=
k
τ
\epsilon_k = (1 - \alpha) \epsilon_0 + \alpha \cdot \epsilon_{\tau} \quad \alpha = \frac{k}{\tau}
ϵk=(1−α)ϵ0+α⋅ϵτα=τk
这样得到学习率的效果是:在
τ
\tau
τ次迭代步骤之前,学习率会呈现线性衰减;当迭代步骤
k
>
τ
k > \tau
k>τ时,学习率呈现稳定状态。