但是,在前面的章节中,我们一直在训练过程中使用随机梯度下降,但没有解释它为什么起作用。为了澄清这一点,我们刚在11.3节中描述了梯度下降的基本原则。在本节中,我们继续更详细地说明随机梯度下降(stochastic gradient descent)。

In [ ]
%matplotlib inline
from d2l import paddle as d2l
import math
import paddle
随机梯度更新
在深度学习中,目标函数通常是训练数据集中每个样本的损失函数的平均值。给定nnn个样本的训练数据集,我们假设fi(x)f_i(\mathbf{x})f
i

(x)是关于索引iii的训练样本的损失函数,其中x\mathbf{x}x是参数向量。然后我们得到目标函数

f(x)=1n∑i=1nfi(x). (11.4.1)f(\mathbf{x}) = \frac{1}{n} \sum_{i = 1}^n f_i(\mathbf{x}).~~~~~~~~~~~(11.4.1)
f(x)=
n
1

i=1

n

f
i

(x). (11.4.1)

x\mathbf{x}x的目标函数的梯度计算为

∇f(x)=1n∑i=1n∇fi(x). (11.4.2)\nabla f(\mathbf{x}) = \frac{1}{n} \sum_{i = 1}^n \nabla f_i(\mathbf{x}).~~~~~~~~~~~(11.4.2)
∇f(x)=
n
1

i=1

n

∇f
i

(x). (11.4.2)

如果使用梯度下降法,则每个自变量迭代的计算代价为O(n)\mathcal{O}(n)O(n),它随nnn线性增长。因此,当训练数据集较大时,每次迭代的梯度下降计算代价将较高。

随机梯度下降(SGD)可降低每次迭代时的计算代价。在随机梯度下降的每次迭代中,我们对数据样本随机均匀采样一个索引iii,其中i∈{1,…,n}i\in{1,\ldots, n}i∈{1,…,n},并计算梯度∇fi(x)\nabla f_i(\mathbf{x})∇f
i

(x)以更新x\mathbf{x}x:

x←x−η∇fi(x), (11.4.3)\mathbf{x} \leftarrow \mathbf{x} - \eta \nabla f_i(\mathbf{x}),~~~~~~~~~~~(11.4.3)
x←x−η∇f
i

(x), (11.4.3)

其中η\etaη是学习率。我们可以看到,每次迭代的计算代价从梯度下降的O(n)\mathcal{O}(n)O(n)降至常数O(1)\mathcal{O}(1)O(1)。此外,我们要强调,随机梯度∇fi(x)\nabla f_i(\mathbf{x})∇f
i

(x)是对完整梯度∇f(x)\nabla f(\mathbf{x})∇f(x)的无偏估计,因为

Ei∇fi(x)=1n∑i=1n∇fi(x)=∇f(x). (11.4.4)\mathbb{E}i \nabla f_i(\mathbf{x}) = \frac{1}{n} \sum{i = 1}^n \nabla f_i(\mathbf{x}) = \nabla f(\mathbf{x}).~~~~~~~~~~~(11.4.4)
E
i

∇f
i

(x)=
n
1

i=1

n

∇f
i

(x)=∇f(x). (11.4.4)

这意味着,平均而言,随机梯度是对梯度的良好估计。

现在,我们将把它与梯度下降进行比较,方法是向梯度添加均值为0、方差为1的随机噪声,以模拟随机梯度下降。

In [ ]
def f(x1, x2): # 目标函数
return x1 ** 2 + 2 * x2 ** 2

def f_grad(x1, x2): # 目标函数的梯度
return 2 * x1, 4 * x2
In [ ]
def sgd(x1, x2, s1, s2, f_grad):
g1, g2 = f_grad(x1, x2)
# 模拟有噪声的梯度
g1 += d2l.normal(0.0, 1, (1,))
g2 += d2l.normal(0.0, 1, (1,))
eta_t = eta * lr()
return (x1 - eta_t * g1, x2 - eta_t * g2, 0, 0)
In [ ]
def constant_lr():
return 1

eta = 0.1
lr = constant_lr # 常数学习速度
d2l.show_trace_2d(f, d2l.train_2d(sgd, steps=50, f_grad=f_grad))
正如我们所看到的,随机梯度下降中变量的轨迹比我们在11.3节中观察到的梯度下降中观察到的轨迹嘈杂得多。这是由于梯度的随机性质。也就是说,即使我们接近最小值,我们仍然受到通过η∇fi(x)\eta \nabla f_i(\mathbf{x})η∇f
i

(x)的瞬间梯度所注入的不确定性的影响。即使经过50次迭代,质量仍然不那么好。更糟糕的是,经过额外的步骤,它不会得到改善(我们鼓励你尝试更多的步骤来确认这一点)。这给我们留下了唯一的选择:改变学习率η\etaη。但是,如果我们选择的学习率太小,我们一开始就不会取得任何有意义的进展。另一方面,如果我们选择的学习率太大,我们将无法获得一个好的解决方案,如上所示。解决这些相互冲突的目标的唯一方法是在优化过程中动态降低学习率。

这也是在sgd步长函数中添加学习率函数lr的原因。在上面的示例中,学习率调度的任何功能都处于休眠状态,因为我们将相关的lr函数设置为常量。

动态学习率
用与时间相关的学习率η(t)\eta(t)η(t)取代η\etaη增加了控制优化算法收敛的复杂性。特别是,我们需要弄清η\etaη的衰减速度。如果太快,我们将过早停止优化。如果减少的太慢,我们会在优化上浪费太多时间。以下是随着时间推移调整η\etaη时使用的一些基本策略(稍后我们将讨论更高级的策略):

η(t)=ηi if ti≤t≤ti+1分段常数η(t)=η0⋅e−λt指数衰减η(t)=η0⋅(βt+1)−α多项式衰减 (11.4.5)\begin{aligned} \eta(t) & = \eta_i \text{ if } t_i \leq t \leq t_{i+1} && \text{分段常数} \ \eta(t) & = \eta_0 \cdot e^{-\lambda t} && \text{指数衰减} \ \eta(t) & = \eta_0 \cdot (\beta t + 1)^{-\alpha} && \text{多项式衰减} \end{aligned}~~~~~~~~~~~(11.4.5)
η(t)
η(t)
η(t)


i

if t
i

≤t≤t
i+1


0

⋅e
−λt


0

⋅(βt+1)
−α

分段常数
指数衰减
多项式衰减

(11.4.5)

在第一个分段常数(piecewise constant)场景中,我们会降低学习率,例如,每当优化进度停顿时。这是训练深度网络的常见策略。或者,我们可以通过指数衰减(exponential decay)来更积极地减低它。不幸的是,这往往会导致算法收敛之前过早停止。一个受欢迎的选择是α=0.5\alpha = 0.5α=0.5的多项式衰减(polynomial decay)。在凸优化的情况下,有许多证据表明这种速率表现良好。

让我们看看指数衰减在实践中是什么样子。

In [ ]
def exponential_lr():
# 在函数外部定义,而在内部更新的全局变量
global t
t += 1
return math.exp(-0.1 * t)

t = 1
lr = exponential_lr
d2l.show_trace_2d(f, d2l.train_2d(sgd, steps=1000, f_grad=f_grad))
正如预期的那样,参数的方差大大减少。但是,这是以未能收敛到最优解x=(0,0)\mathbf{x} = (0, 0)x=(0,0)为代价的。即使经过1000个迭代步骤,我们仍然离最优解很远。事实上,该算法根本无法收敛。另一方面,如果我们使用多项式衰减,其中学习率随迭代次数的平方根倒数衰减,那么仅在50次迭代之后,收敛就会更好。

In [ ]
def polynomial_lr():
# 在函数外部定义,而在内部更新的全局变量
global t
t += 1
return (1 + 0.1 * t) ** (-0.5)

t = 1
lr = polynomial_lr
d2l.show_trace_2d(f, d2l.train_2d(sgd, steps=50, f_grad=f_grad))
关于如何设置学习率,还有更多的选择。例如,我们可以从较小的学习率开始,然后迅速上涨,然后再次降低,尽管速度更慢。我们甚至可以在较小和较大的学习率之间切换。这样的计划有各种各样。现在,让我们专注于可以进行全面理论分析的学习率计划,即凸环境下的学习率。对于一般的非凸问题,很难获得有意义的收敛保证,因为总的来说,最大限度地减少非线性非凸问题是NP困难的。有关调查,例如,请参阅Tibshirani的讲义笔记。

凸目标的收敛性分析
以下对凸目标函数的随机梯度下降的收敛性分析是可选的,主要用于传达对问题的更多直觉。我们只限于最简单的证明之一Nesterov.Vial.2000。存在着明显更先进的证明技术,例如,当目标函数表现特别好时。

假设所有ξ\boldsymbol{\xi}ξ的目标函数f(ξ,x)f(\boldsymbol{\xi}, \mathbf{x})f(ξ,x)在x\mathbf{x}x中都是凸的。更具体地说,我们考虑随机梯度下降更新:

xt+1=xt−ηt∂xf(ξt,x), (11.4.6)\mathbf{x}{t+1} = \mathbf{x}{t} - \eta_t \partial_\mathbf{x} f(\boldsymbol{\xi}_t, \mathbf{x}),~~~~~~~~~~~(11.4.6)
x
t+1

=x
t

−η
t


x

f(ξ
t

,x), (11.4.6)

其中f(ξt,x)f(\boldsymbol{\xi}_t, \mathbf{x})f(ξ
t

,x)是训练样本f(ξt,x)f(\boldsymbol{\xi}_t, \mathbf{x})f(ξ
t

,x)的目标函数:ξt\boldsymbol{\xi}_tξ
t

从第ttt步的某个分布中提取,x\mathbf{x}x是模型参数。表示为

R(x)=Eξ[f(ξ,x)] (11.4.7)R(\mathbf{x}) = E_{\boldsymbol{\xi}}[f(\boldsymbol{\xi}, \mathbf{x})]~~~~~~~~~~~(11.4.7)
R(x)=E
ξ

[f(ξ,x)] (11.4.7)

预期风险和R∗R^*R

相对于x\mathbf{x}x的最低风险。最后让x∗\mathbf{x}^*x

成为最小值(我们假设它存在于定义x\mathbf{x}x的域中)。在这种情况下,我们可以跟踪时间ttt处的当前参数xt\mathbf{x}_tx
t

和风险最小化器x∗\mathbf{x}^*x

之间的距离,看看它是否随着时间的推移而改善:

∥xt+1−x∗∥2=∥xt−ηt∂xf(ξt,x)−x∗∥2=∥xt−x∗∥2+ηt2∥∂xf(ξt,x)∥2−2ηt⟨xt−x∗,∂xf(ξt,x)⟩. (11.4.8)\begin{aligned} &|\mathbf{x}{t+1} - \mathbf{x}*|2 \ =& |\mathbf{x}{t} - \eta_t \partial_\mathbf{x} f(\boldsymbol{\xi}t, \mathbf{x}) - \mathbf{x}*|2 \ =& |\mathbf{x}{t} - \mathbf{x}*|2 + \eta_t^2 |\partial_\mathbf{x} f(\boldsymbol{\xi}_t, \mathbf{x})|^2 - 2 \eta_t \left\langle \mathbf{x}t - \mathbf{x}^*, \partial\mathbf{x} f(\boldsymbol{\xi}_t, \mathbf{x})\right\rangle. \end{aligned}~~~~~~~~~~~(11.4.8)

=

∥x
t+1

−x


2

∥x
t

−η
t


x

f(ξ
t

,x)−x


2

∥x
t

−x


2

t
2

∥∂
x

f(ξ
t

,x)∥
2
−2η
t

⟨x
t

−x

,∂
x

f(ξ
t

,x)⟩.

(11.4.8)

我们假设随机梯度∂xf(ξt,x)\partial_\mathbf{x} f(\boldsymbol{\xi}_t, \mathbf{x})∂
x

f(ξ
t

,x)的L2L_2L
2

范数受到某个常数LLL的限制,因此我们有

ηt2∥∂xf(ξt,x)∥2≤ηt2L2. (11.4.9)\eta_t^2 |\partial_\mathbf{x} f(\boldsymbol{\xi}_t, \mathbf{x})|^2 \leq \eta_t^2 L^2.~~~~~~~~~~~(11.4.9)
η
t
2

∥∂
x

f(ξ
t

,x)∥
2
≤η
t
2

L
2
. (11.4.9)

我们最感兴趣的是xt\mathbf{x}_tx
t

和x∗\mathbf{x}^*x

之间的距离如何变化预期。事实上,对于任何具体的步骤序列,距离可能会增加,这取决于我们遇到的ξt\boldsymbol{\xi}_tξ
t

。因此我们需要绑定点积。因为对于任何凸函数fff,它认为所有x\mathbf{x}x和y\mathbf{y}y的f(y)≥f(x)+⟨f′(x),y−x⟩f(\mathbf{y}) \geq f(\mathbf{x}) + \langle f’(\mathbf{x}), \mathbf{y} - \mathbf{x} \ranglef(y)≥f(x)+⟨f

(x),y−x⟩和y\mathbf{y}y,按凸度我们有

f(ξt,x∗)≥f(ξt,xt)+⟨x∗−xt,∂xf(ξt,xt)⟩. (11.4.10)f(\boldsymbol{\xi}_t, \mathbf{x}^) \geq f(\boldsymbol{\xi}_t, \mathbf{x}_t) + \left\langle \mathbf{x}^ - \mathbf{x}t, \partial{\mathbf{x}} f(\boldsymbol{\xi}_t, \mathbf{x}_t) \right\rangle.~~~~~~~~~~~(11.4.10)
f(ξ
t

,x

)≥f(ξ
t

,x
t

)+⟨x

−x
t

,∂
x

f(ξ
t

,x
t

)⟩. (11.4.10)

将不等式(11.4.9)和 (11.4.10)代入(11.4.8)我们在时间t+1t+1t+1时获得参数之间距离的边界,如下所示:

∥xt−x∗∥2−∥xt+1−x∗∥2≥2ηt(f(ξt,xt)−f(ξt,x∗))−ηt2L2. (11.4.11)|\mathbf{x}{t} - \mathbf{x}*|2 - |\mathbf{x}{t+1} - \mathbf{x}*|2 \geq 2 \eta_t (f(\boldsymbol{\xi}_t, \mathbf{x}_t) - f(\boldsymbol{\xi}_t, \mathbf{x}^*)) - \eta_t^2 L^2.~~~~~~~~~~~(11.4.11)
∥x
t

−x


2
−∥x
t+1

−x


2
≥2η
t

(f(ξ
t

,x
t

)−f(ξ
t

,x

))−η
t
2

L
2
. (11.4.11)

这意味着,只要当前损失和最佳损失之间的差异超过ηtL2/2\eta_t L^2/2η
t

L
2
/2,我们就会取得进展。由于这种差异必然会收敛到零,因此学习率ηt\eta_tη
t

也需要消失。

接下来,我们根据公式(11.4.11)取期望。这会产生

E[∥xt−x∗∥2]−E[∥xt+1−x∗∥2]≥2ηt[E[R(xt)]−R∗]−ηt2L2. (11.4.12)E\left[|\mathbf{x}{t} - \mathbf{x}*|2\right] - E\left[|\mathbf{x}{t+1} - \mathbf{x}*|2\right] \geq 2 \eta_t [E[R(\mathbf{x}_t)] - R^*] - \eta_t^2 L^2.~~~~~~~~~~~(11.4.12)
E[∥x
t

−x


2
]−E[∥x
t+1

−x


2
]≥2η
t

[E[R(x
t

)]−R

]−η
t
2

L
2
. (11.4.12)

最后一步是对t∈{1,…,T}t \in {1, \ldots, T}t∈{1,…,T}的不等式求和。在求和过程中抵消中间项,然后舍去低阶项,可以得到

∥x1−x∗∥2≥2(∑t=1Tηt)[E[R(xt)]−R∗]−L2∑t=1Tηt2. (11.4.13)|\mathbf{x}1 - \mathbf{x}*|2 \geq 2 \left (\sum{t=1}^T \eta_t \right) [E[R(\mathbf{x}t)] - R^*] - L^2 \sum{t=1}^T \eta_t^2.~~~~~~~~~~~(11.4.13)
∥x
1

−x


2
≥2(
t=1

T

η
t

)[E[R(x
t

)]−R

]−L
2

t=1

T

η
t
2

. (11.4.13)

请注意,我们利用了x1\mathbf{x}_1x
1

给出了,因此预期可以下降。最后定义

xˉ=def∑t=1Tηtxt∑t=1Tηt. (11.4.14)\bar{\mathbf{x}} \stackrel{\mathrm{def}}{=} \frac{\sum_{t=1}^T \eta_t \mathbf{x}t}{\sum{t=1}^T \eta_t}.~~~~~~~~~~~(11.4.14)
x
ˉ

=
def


t=1
T

η
t


t=1
T

η
t

x
t


. (11.4.14)

E(∑t=1TηtR(xt)∑t=1Tηt)=∑t=1TηtE[R(xt)]∑t=1Tηt=E[R(xt)], (11.4.15)E\left(\frac{\sum_{t=1}^T \eta_t R(\mathbf{x}t)}{\sum{t=1}^T \eta_t}\right) = \frac{\sum_{t=1}^T \eta_t E[R(\mathbf{x}t)]}{\sum{t=1}^T \eta_t} = E[R(\mathbf{x}_t)],~~~~~~~~~~~(11.4.15)
E(

t=1
T

η
t


t=1
T

η
t

R(x
t

)

)=

t=1
T

η
t


t=1
T

η
t

E[R(x
t

)]

=E[R(x
t

)], (11.4.15)

根据延森的不平等性(设定为i=ti=ti=t,i=ti=ti=t,αi=ηt/∑t=1Tηt\alpha_i = \eta_t/\sum_{t=1}^T \eta_tα
i


t

/∑
t=1
T

η
t

)和RRR的凸度为RRR,因此,

∑t=1TηtE[R(xt)]≥∑t=1TηtE[R(xˉ)]. (11.4.16)\sum_{t=1}^T \eta_t E[R(\mathbf{x}t)] \geq \sum{t=1}^T \eta_t E\left[R(\bar{\mathbf{x}})\right].~~~~~~~~~~~(11.4.16)
t=1

T

η
t

E[R(x
t

)]≥
t=1

T

η
t

E[R(
x
ˉ
)]. (11.4.16)

将其代入不等式(11.4.13)得到边界

[E[xˉ]]−R∗≤r2+L2∑t=1Tηt22∑t=1Tηt, (11.4.17)\left[E[\bar{\mathbf{x}}]\right] - R^* \leq \frac{r^2 + L^2 \sum_{t=1}^T \eta_t^2}{2 \sum_{t=1}^T \eta_t},~~~~~~~~~~~(11.4.17)
[E[
x
ˉ
]]−R


2∑
t=1
T

η
t

r
2
+L
2

t=1
T

η
t
2


, (11.4.17)

其中r2=def∥x1−x∗∥2r^2 \stackrel{\mathrm{def}}{=} |\mathbf{x}_1 - \mathbf{x}*|2r
2

=
def
∥x
1

−x


2
受初始选择参数与最终结果之间的距离的约束。简而言之,收敛速度取决于随机梯度标准的限制方式(LLL)以及初始参数值与最优性(rrr)的距离(rrr)。请注意,约束是按xˉ\bar{\mathbf{x}}
x
ˉ
而不是xT\mathbf{x}_Tx
T

而不是xT\mathbf{x}_Tx
T

。情况就是这样,因为xˉ\bar{\mathbf{x}}
x
ˉ
是优化路径的平滑版本。只要知道r,Lr, Lr,L和TTT,我们就可以选择学习率η=r/(LT)\eta = r/(L \sqrt{T})η=r/(L
T

)。这个收益率为上限rL/TrL/\sqrt{T}rL/
T

。也就是说,我们将汇率O(1/T)\mathcal{O}(1/\sqrt{T})O(1/
T

)收敛到最佳解决方案。

随机梯度和有限样本
到目前为止,在谈论随机梯度下降时,我们玩得有点快而松散。我们假设我们绘制实例xix_ix
i

,通常使用来自某些发行版p(x,y)p(x, y)p(x,y)的标签yiy_iy
i

,并且我们用它来以某种方式更新模型参数。特别是,对于有限的样本数量,我们简单讨论了离散分布p(x,y)=1n∑i=1nδxi(x)δyi(y)p(x, y) = \frac{1}{n} \sum_{i=1}^n \delta_{x_i}(x) \delta_{y_i}(y)p(x,y)=
n
1


i=1
n

δ
x
i


(x)δ
y
i


(y),对于某些函数δxi\delta_{x_i}δ
x
i


和δyi\delta_{y_i}δ
y
i


允许我们在其上执行随机梯度下降。

但是,这不是我们真正做的。在本节的玩具示例中,我们只是将噪声添加到其他非随机梯度上,也就是说,我们假装有成对的(xi,yi)(x_i, y_i)(x
i

,y
i

)。事实证明,这在这里是合理的(有关详细讨论,请参阅练习)。更令人不安的是,在以前的所有讨论中,我们显然没有这样做。相反,我们遍历了所有实例恰好一次。要了解为什么这更可取,可以反向考虑一下,即我们从带替换的离散分布中采样nnn个观测值。随机选择一个元素iii的概率是1/n1/n1/n。因此选择它至少一次就是

P(choose i)=1−P(omit i)=1−(1−1/n)n≈1−e−1≈0.63. (11.4.18)P(\mathrm{choose~} i) = 1 - P(\mathrm{omit~} i) = 1 - (1-1/n)^n \approx 1-e^{-1} \approx 0.63.~~~~~~~~~~~(11.4.18)
P(choose i)=1−P(omit i)=1−(1−1/n)
n
≈1−e
−1
≈0.63. (11.4.18)

类似的推理表明,挑选一些样本(即训练示例)恰好一次的概率是由

(n1)1n(1−1n)n−1=nn−1(1−1n)n≈e−1≈0.37. (11.4.19){n \choose 1} \frac{1}{n} \left(1-\frac{1}{n}\right)^{n-1} = \frac{n}{n-1} \left(1-\frac{1}{n}\right)^{n} \approx e^{-1} \approx 0.37.~~~~~~~~~~~(11.4.19)
(
1
n

)
n
1

(1−
n
1

)
n−1

n−1
n

(1−
n
1

)
n
≈e
−1
≈0.37. (11.4.19)

这导致与无替换采样相比,方差增加并降低数据效率。因此,在实践中我们执行后者(这是本书中的默认选择)。最后一点注意,重复穿过训练数据集会以不同的随机顺序遍历它。

小结
对于凸问题,我们可以证明,对于广泛的学习率选择,随机梯度下降将收敛到最优解。
对于深度学习而言,情况通常并非如此。但是,对凸问题的分析使我们能够深入了解如何进行优化,即逐步降低学习率,尽管不是太快。
如果学习率太小或太大,就会出现问题。实际上,通常只有经过多次实验后才能找到合适的学习率。
当训练数据集中有更多样本时,计算梯度下降的每次迭代的代价更高,因此在这些情况下,首选随机梯度下降。
随机梯度下降的最佳性保证在非凸情况下一般不可用,因为需要检查的局部最小值的数量可能是指数级的。
练习
尝试不同的随机梯度下降学习率计划和不同的迭代次数进行实验。特别是,根据迭代次数的函数来绘制与最佳解(0,0)(0, 0)(0,0)的距离。
证明对于函数f(x1,x2)=x12+2x22f(x_1, x_2) = x_1^2 + 2 x_2^2f(x
1

,x
2

)=x
1
2

+2x
2
2

而言,向梯度添加正常噪声等同于最小化损失函数f(x,w)=(x1−w1)2+2(x2−w2)2f(\mathbf{x}, \mathbf{w}) = (x_1 - w_1)^2 + 2 (x_2 - w_2)^2f(x,w)=(x
1

−w
1

)
2
+2(x
2

−w
2

)
2
,其中x\mathbf{x}x是从正态分布中提取的。
比较随机梯度下降的收敛性,当你从{(x1,y1),…,(xn,yn)}{(x_1, y_1), \ldots, (x_n, y_n)}{(x
1

,y
1

),…,(x
n

,y
n

)}使用替换方法进行采样时以及在不替换的情况下进行采样时
如果某些梯度(或者更确切地说与之相关的某些坐标)始终比所有其他梯度都大,你将如何更改随机梯度下降求解器?
假设是f(x)=x2(1+sin⁡x)f(x) = x^2 (1 + \sin x)f(x)=x
2
(1+sinx)。fff有多少局部最小值?你能改变fff以尽量减少它需要评估所有局部最小值的方式吗?
如果想系统性学习该项目,可前往“动手学AI”课程(https://aistudio.baidu.com/aistudio/course/introduce/25851)查看完整章节

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐