8 深度模型中的优化
8.1 学习和纯优化有和不同
- 机器学习经常是间接作用的
我们关注某些度量 P P P,其定义于测试集上并且可能是不可理解的。因此,我们只是间接优化 P P P。我们希望通过降低代价函数 J ( θ ) J(\theta) J(θ)来提高 P P P。纯优化问题最小化目标本身。
通常 ,代价函数可写为训练集上的平均,如
J
(
θ
)
=
E
(
x
,
y
)
≈
p
^
d
a
t
a
L
(
f
(
x
;
θ
)
,
y
)
J(\theta)=E_{(x,y) \approx \hat{p}_{data}}L(f(x;\theta),y)
J(θ)=E(x,y)≈p^dataL(f(x;θ),y)
L
L
L是每个样本的损失函数,
f
(
x
;
θ
)
f(x;\theta)
f(x;θ)是输入
x
x
x时所预测的输出,
p
^
d
a
t
a
\hat{p}_{data}
p^data是经验分布。监督学习中,
y
y
y是目标输出。
上式定义了训练集上的目标函数,通常我们希望最小化取自数据生成分布
p
d
a
t
a
p_{data}
pdata的期望,而不仅仅是有限训练集上的对应目标函数:
J
(
θ
)
=
E
(
x
,
y
)
≈
p
d
a
t
a
L
(
f
(
x
;
θ
)
,
y
)
J(\theta)=E_{(x,y) \approx p_{data}}L(f(x;\theta),y)
J(θ)=E(x,y)≈pdataL(f(x;θ),y)
8.1.1 经验风险最小化
将一个机器学习问题转化成一个优化问题的最简单方法是最小化训练集上的期望损失。这意味着用训练集上的经验分布 p ^ ( x , y ) \hat{p}(x,y) p^(x,y)替代真是分布 p ( x , y ) p(x,y) p(x,y)。现在我们将最小化经验风险: E x , y ∼ p ^ d a t a [ L ( f ( x ; θ ) , y ) ] = 1 m ∑ i = 1 m L ( f ( x ( i ) ; θ ) , y ( i ) ) E_{x,y \sim \hat{p}_{data}}[L(f(x;\theta),y)]=\frac{1}{m}\sum_{i=1}^mL(f(x^{(i)};\theta),y^{(i)}) Ex,y∼p^data[L(f(x;θ),y)]=m1i=1∑mL(f(x(i);θ),y(i)) m m m代表样本数目。经验风险最小化容易过拟合。
8.1.2 代理损失函数和提前终止
有时候我们关注的损失函数(比如分类误差)并不能被高效的优化。例如,精确地最小化0-1损失函数通常是不可解的。在这种情况下,我们通常会优化代理损失函数。如负对数似然对0-1损失的代理。
机器学习通常优化代理损失函数,但是在基于提前终止的收敛条件满足时停止。通常,提前终止使用真实潜在损失函数,如验证集上的0-1损失,并设计为在过拟合发生之前终止。
8.1.3 批量算法和小批量算法
8.2 神经网络优化中的挑战
8.2.1 病态
病态体现在随机梯度下降会“卡”在某些情况,此时即使很小的更新步长也会增加代价函数。
8.2.2 局部极小值
8.2.3 高原、鞍点和其他平坦区域
鞍点附近某些点有更大的代价,有些点有更小的代价。多数随机函数表现如下性质:低维空间中,局部极小值很普遍。而在更高维空间中,局极小值很罕见,但是鞍点很常见。
8.2.4 悬崖和梯度爆炸
斜率较大的情况(多个较大的权重相乘导致),可以使用梯度截断来避免后果。
当
∣
g
∣
>
u
|g|>u
∣g∣>u时,用下面的梯度来替代原来的梯度值:
g
←
g
∣
∣
g
∣
∣
u
g\leftarrow\frac{g}{||g||}u
g←∣∣g∣∣gu
8.2.5 长期依赖
变深的结构使模型丧失了学习到先前信息的能力。
假设某个计算图中包含一条反复与矩阵
W
W
W相乘的路径。
t
t
t步后,相当于乘以
W
t
W^t
Wt。假设W有特征分解
W
=
V
Λ
V
−
1
W=V\Lambda V^{-1}
W=VΛV−1,则
W
t
=
(
V
Λ
V
−
1
)
t
=
V
Λ
t
V
−
1
W^t=(V\Lambda V^{-1})^t=V\Lambda^t V^{-1}
Wt=(VΛV−1)t=VΛtV−1当特征值
λ
i
\lambda_i
λi不在1附近时,若在量级上大于1会发生爆炸,小于1会发生梯度消失。梯度消失使得我们难以知道参数朝哪个方向移动能改进代价函数,梯度爆炸会使得学习不稳定。
8.2.6 非精确梯度
8.2.7 局部和全局结构间的弱对应
8.2.8 优化的理论限制
8.3 基本算法
8.3.1 随机梯度下降
按照数据生成分布抽取
m
m
m个小批量(独立同分布的)样本,通过计算它们梯度均值,我们可以得到梯度的无偏估计。
8.3.2 动量
动量主要解决两个问题:
H
e
s
s
i
a
n
Hessian
Hessian矩阵的病态条件和随机梯度的方差。更新式为
v
←
α
v
−
ϵ
∇
θ
(
1
m
∑
i
=
1
m
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
)
v \leftarrow \alpha v-\epsilon \nabla_\theta(\frac{1}{m}\sum_{i=1}^mL(f(x^{(i)};\theta),y^{(i)}))
v←αv−ϵ∇θ(m1i=1∑mL(f(x(i);θ),y(i)))
θ
←
θ
+
v
\theta \leftarrow \theta+v
θ←θ+v速度
v
v
v累积了梯度元素
∇
θ
(
1
m
∑
i
=
1
m
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
)
\nabla_\theta(\frac{1}{m}\sum_{i=1}^mL(f(x^{(i)};\theta),y^{(i)}))
∇θ(m1∑i=1mL(f(x(i);θ),y(i)))。相对于
ϵ
\epsilon
ϵ,
α
\alpha
α越大,之前梯度对现在方向的影响也越大。
之前步长只是梯度范数乘以学习率,现在,步长取决于梯度序列的大小和排列。当许多连续的梯度指向相同的方向时,步长最大。如果动量算法总是观测到梯度
g
g
g,那么它会在方向
−
g
-g
−g上不停加速,直到达到最终速度,其中步长大小为
ϵ
∣
∣
g
∣
∣
/
(
1
−
α
)
\epsilon ||g||/(1-\alpha)
ϵ∣∣g∣∣/(1−α)因此将动量的超参数设置为
1
/
(
1
−
α
)
1/(1-\alpha)
1/(1−α)有助于理解。例如,
α
=
0.9
\alpha=0.9
α=0.9对应着最大速度10倍于梯度下降算法。
吴恩达版本的动量描述和本书有所不同
v ← β v + ( 1 − β ) g v \leftarrow \beta v + (1-\beta)g v←βv+(1−β)g
w ← w − ϵ v w \leftarrow w-\epsilon v w←w−ϵv
8.3.3 Nesterov动量
更新规则如下
v
←
α
v
−
ϵ
∇
θ
[
1
m
∑
i
=
1
m
L
(
f
(
x
(
i
)
;
θ
+
α
v
)
,
y
(
i
)
)
]
v \leftarrow \alpha v-\epsilon \nabla_\theta[\frac{1}{m}\sum_{i=1}^mL(f(x^{(i)};\theta+\alpha v),y^{(i)})]
v←αv−ϵ∇θ[m1i=1∑mL(f(x(i);θ+αv),y(i))]
θ
←
θ
+
v
\theta \leftarrow \theta+v
θ←θ+v
在凸批量梯度的情况下,Nesterov动量将额外误差收敛率从
O
(
1
/
k
)
O(1/k)
O(1/k)(k步后)改进到
O
(
1
/
k
2
)
O(1/k^2)
O(1/k2)。但是在随机梯度的情况下,它没有改进收敛率。
8.4 参数初始化策略
8.5 自适应学习率算法
8.5.1 AdaGrad
g
←
1
m
∇
θ
∑
i
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
g \leftarrow \frac{1}{m} \nabla_\theta \sum_iL(f(x^{(i)};\theta),y^{(i)})
g←m1∇θi∑L(f(x(i);θ),y(i))
r
←
r
+
g
⊙
g
r \leftarrow r + g \odot g
r←r+g⊙g
Δ
θ
←
−
ϵ
δ
+
r
⊙
g
(
逐
元
素
)
\Delta \theta \leftarrow -\frac{\epsilon}{\delta+\sqrt{r}}\odot g(逐元素)
Δθ←−δ+rϵ⊙g(逐元素)
θ
←
θ
+
Δ
θ
\theta \leftarrow \theta+\Delta \theta
θ←θ+Δθ
A
d
a
m
G
r
a
d
AdamGrad
AdamGrad旨在应用于凸问题时快速收敛,当应用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一个局部是凸碗的区域。而且它根据整个平方梯度的历史收缩学习率,可能使得学习率在到达这样的凸结构之前就变得太小了。
R
M
S
P
r
o
p
RMSProp
RMSProp使用指数衰减平均以丢弃遥远过去的历史,使其能够在找到凸碗结构后快速收敛。
8.5.2 RMSProp
g
←
1
m
∇
θ
∑
i
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
g \leftarrow \frac{1}{m} \nabla_\theta \sum_iL(f(x^{(i)};\theta),y^{(i)})
g←m1∇θi∑L(f(x(i);θ),y(i))
r
←
ρ
r
+
(
1
−
ρ
)
g
⊙
g
r \leftarrow \rho r +(1-\rho)g \odot g
r←ρr+(1−ρ)g⊙g
Δ
θ
=
−
ϵ
r
+
δ
⊙
g
\Delta \theta=-\frac{\epsilon}{\sqrt{r+\delta}}\odot g
Δθ=−r+δϵ⊙g
θ
←
θ
+
Δ
θ
\theta \leftarrow \theta+\Delta \theta
θ←θ+Δθ
上面的算法相比较AdaGrad来说,将平方累积换成了指数累积,
ρ
\rho
ρ用来控制平均的历史数目。
r i = α r i − 1 + ( 1 − α ) v i = α ( 1 − α ) v i − 1 + α 2 ( 1 − α ) v i − 2 + . . . + α i − 1 ( 1 − α ) v 1 r_i=\alpha r_{i-1}+(1-\alpha)v_i=\alpha (1-\alpha)v_{i-1}+\alpha^2(1-\alpha)v_{i-2}+...+\alpha^{i-1}(1-\alpha)v_1 ri=αri−1+(1−α)vi=α(1−α)vi−1+α2(1−α)vi−2+...+αi−1(1−α)v1
α = 0.9 \alpha=0.9 α=0.9时, α 10 ≈ 1 / e \alpha^{10} \approx 1/e α10≈1/e, α = 0.98 \alpha=0.98 α=0.98时, α 50 ≈ 1 / e \alpha^{50} \approx1/e α50≈1/e
( 1 − α ) 1 / α ≈ 1 ( 1 − α ) − 1 / α = 1 / e (1-\alpha)^{1/\alpha}\approx \frac{1}{(1-\alpha)^{-1/\alpha}}=1/e (1−α)1/α≈(1−α)−1/α1=1/e
使用Nesterov动量的RMSProp算法
θ
^
←
θ
+
α
v
\hat{\theta} \leftarrow \theta +\alpha v
θ^←θ+αv
g
←
1
m
∇
θ
^
∑
i
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
g \leftarrow \frac{1}{m}\nabla_{\hat{\theta}}\sum_{i}L(f(x^{(i)};\theta),y^{(i)})
g←m1∇θ^i∑L(f(x(i);θ),y(i))
r
←
ρ
r
+
(
1
−
ρ
)
g
⊙
g
r \leftarrow \rho r+(1-\rho)g \odot g
r←ρr+(1−ρ)g⊙g
v
←
α
v
−
ϵ
r
⊙
g
(
1
r
逐
元
素
应
用
)
v \leftarrow \alpha v-\frac{\epsilon}{\sqrt{r}}\odot g (\frac{1}{\sqrt{r}}逐元素应用)
v←αv−rϵ⊙g(r1逐元素应用)
θ
←
θ
+
v
\theta \leftarrow \theta +v
θ←θ+v
8.5.3 Adam
g
←
1
m
∇
θ
^
∑
i
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
g \leftarrow \frac{1}{m}\nabla_{\hat{\theta}}\sum_{i}L(f(x^{(i)};\theta),y^{(i)})
g←m1∇θ^i∑L(f(x(i);θ),y(i))更新有偏一阶矩估计:
s
←
ρ
1
s
+
(
1
−
ρ
1
)
g
s \leftarrow \rho_1 s+(1-\rho_1)g
s←ρ1s+(1−ρ1)g更新有偏二阶矩估计:
r
←
ρ
2
r
+
(
1
−
ρ
2
)
g
⊙
g
r \leftarrow \rho_2 r+(1-\rho_2)g \odot g
r←ρ2r+(1−ρ2)g⊙g修正一阶矩的偏差:
s
^
←
s
1
−
ρ
1
t
\hat{s} \leftarrow \frac{s}{1-\rho_1^t}
s^←1−ρ1ts修正二阶矩的偏差:
r
^
←
r
1
−
ρ
2
t
\hat{r} \leftarrow \frac{r}{1-\rho_2^t}
r^←1−ρ2tr
计算更新:
Δ
θ
=
−
ϵ
s
^
r
^
+
δ
(
逐
元
素
应
用
)
\Delta \theta = -\epsilon\frac{\hat{s}}{\sqrt{\hat{r}}+\delta}(逐元素应用)
Δθ=−ϵr^+δs^(逐元素应用)应用更新:
θ
←
θ
+
Δ
θ
\theta \leftarrow \theta + \Delta \theta
θ←θ+Δθ
8.6 二阶近似方法
经验风险 J ( θ ) = E x , y ∼ p ^ d a t a ( x , y ) [ L ( f ( x ; θ ) , y ) ] = 1 m ∑ i = 1 m L ( f ( x ( i ) , θ ) , y ( i ) ) J(\theta)=E_{x,y \sim \hat{p}_{data}(x,y)}[L(f(x;\theta),y)]=\frac{1}{m}\sum_{i=1}^mL(f(x^{(i)},\theta),y^{(i)}) J(θ)=Ex,y∼p^data(x,y)[L(f(x;θ),y)]=m1i=1∑mL(f(x(i),θ),y(i))
8.6.1 牛顿法
牛顿法是基于二阶泰勒级数展开在某点 θ 0 \theta_0 θ0附近来近似 J ( θ ) J(\theta) J(θ)的优化方法,其忽略了高阶导数: J ( θ ) ≈ J ( θ 0 ) + ( θ − θ 0 ) T ∇ θ J ( θ ) + 1 2 ( θ − θ 0 ) T H ( θ − θ ) ) J(\theta) \approx J(\theta_0)+(\theta-\theta_0)^T \nabla_\theta J(\theta)+\frac{1}{2}(\theta-\theta_0)^TH(\theta-\theta_)) J(θ)≈J(θ0)+(θ−θ0)T∇θJ(θ)+21(θ−θ0)TH(θ−θ))其中 H H H是 J J J相对于 θ \theta θ的 H e s s i a n Hessian Hessian矩阵在 θ 0 \theta_0 θ0处的估计。如果我们再求解这个函数的临界点,将得到牛顿参数更新规则 θ ∗ = θ 0 − H − 1 ∇ θ J ( θ 0 ) \theta^*=\theta_0-H^{-1}\nabla_\theta J(\theta_0) θ∗=θ0−H−1∇θJ(θ0)
令 ∇ θ J ( θ ) = 0 \nabla_\theta J(\theta)=0 ∇θJ(θ)=0得到上面的结论
因此,对于局部的二次函数(具有正定的
H
H
H),用
H
−
1
H^{-1}
H−1重新调整梯度,牛顿法会直接跳到极小值。如果目标函数是凸的但非二次的(有高阶项),该更新将是迭代的,得到和牛顿法相关的算法。
对于非二次的表面,只要Hessian矩阵保持正定,牛顿法能够迭代地应用。这意味着一个两步迭代过程。首先更新或计算Hessian逆,其次更新参数。
牛顿法只适用于
H
e
s
s
i
a
n
Hessian
Hessian矩阵是正定的情况。在深度学习中,目标函数的表面通常是非凸的,如鞍点。如果H矩阵不都是正的,靠近鞍点处,牛顿法实际上会导致更新朝错误的方向移动。这种情况可以通过正则化
H
H
H矩阵来避免。常用的正则化策略包括在Hessian矩阵对角线上加上常数
α
\alpha
α。正则化更新变为
θ
∗
=
θ
0
−
[
H
(
f
(
θ
0
)
)
+
α
I
]
−
1
∇
θ
f
(
θ
0
)
\theta^*=\theta_0-[H(f(\theta_0))+\alpha I]^{-1}\nabla_\theta f(\theta_0)
θ∗=θ0−[H(f(θ0))+αI]−1∇θf(θ0)
缺点:
- 当负特征值很大时, α \alpha α需要足够大,但是 α \alpha α太大,求逆矩阵会变得由 α I \alpha I αI指导
- 计算复杂,对于大型神经网络H的逆很难求解
8.6.2 共轭梯度
8.6.3 BFGS
8.7 优化策略和元算法
8.7.1批标准化
非常深的模型会涉及多个函数或层组合。在其他层不变的假设下,梯度用于如何更新每一个参数。在实践中,我们同时更新所有层。当我们进行更新时,可能会发生一些意想不到的结果,这是因为许多组合在一起的函数同时改变时,计算更新的假设是其他函数保持不变。
对于输入而言,将输入进行归一化有利于神经网络的训练。类似的,在深层网络中,这一层的输出是下一层的输入,对输出值进行归一化有助于下一层的网络训练。
归一化公式:
u = 1 m ∑ i z i u=\frac{1}{m}\sum_i z^{i} u=m1∑izi, σ 2 = 1 m ∑ i ( z i − u ) 2 \sigma^2=\frac{1}{m}\sum_i(z^i - u)^2 σ2=m1∑i(zi−u)2
z n o r m i = z i − u σ 2 + ϵ z^i_{norm}=\frac{z^i-u}{\sqrt{\sigma^2+\epsilon}} znormi=σ2+ϵzi−u
z i ^ = γ ⋅ z n o r m i + β \hat{z^i}=\gamma \cdot z^i_{norm}+\beta zi^=γ⋅znormi+β
γ \gamma γ和 β \beta β用来学习神经网络在本层中学习到的特征,如果只进行batch norm,会破坏神经网络学习到的分布结构。
矩阵形式:
H ′ = H − u σ H'=\frac{H-u}{\sigma} H′=σH−u
u = 1 m ∑ i H i , : u=\frac{1}{m}\sum_i H_{i,:} u=m1∑iHi,:
σ = δ + 1 m ∑ i ( H − u ) i 2 \sigma=\sqrt{\delta+\frac{1}{m}\sum_i(H-u)^2_i} σ=δ+m1∑i(H−u)i2
( H i , j H_{i,j} Hi,j减去 u j u_j uj,再除以 σ j \sigma_j σj)