文章目录
一、数值稳定性
1.1 引入
数值稳定性是深度学习中非常重要的内容,特别是在网络层数很深的时候,数值很容易变得不稳定。
神经网络的梯度
- 考虑如下有d层的神经网络:
h ⃗ t = f t ( h ⃗ t − 1 ) and y = l ∘ f d ∘ ⋯ ∘ f 1 ( x ⃗ ) \vec h^t=f_t(\vec h^{t-1}) \qquad \text{and} \qquad y = \mathscr{l} \circ f_d \circ \cdots \circ f_1(\vec x) ht=ft(ht−1)andy=l∘fd∘⋯∘f1(x) - 计算损失 l l l关于参数 W t W_t Wt的梯度:
∂ l ∂ W t = ∂ l ∂ h ⃗ d ∂ h ⃗ d ∂ h ⃗ d − 1 ⋯ ∂ h ⃗ t + 1 ∂ h ⃗ t ⏟ d − t 次矩阵乘法 ∂ h ⃗ t ∂ W t \frac{\partial l}{\partial W^t} = \frac{\partial l}{\partial \vec h^d} \underbrace{ \frac{\partial \vec h^d}{\partial \vec h^{d-1}} \cdots \frac{\partial \vec h^{t+1}}{\partial \vec h^t} }_{d-t \text{ 次矩阵乘法}} \frac{\partial \vec h^t}{\partial W^t} ∂Wt∂l=∂hd∂ld−t 次矩阵乘法 ∂hd−1∂hd⋯∂ht∂ht+1∂Wt∂ht由于向量关于向量的导数是一个矩阵,所以我们会做 d − t d-t d−t次的矩阵乘法。而过多的矩阵乘法会导致数值稳定性出现问题。
1.2 常见的两个问题
-
数值稳定性所导致的两个最常见的问题是 梯度爆炸 和 梯度消失,例如:
1. 5 100 ≈ 4 × 1 0 17 0. 8 100 ≈ 2 × 1 0 − 10 1.5^{100} \approx 4 \times 10^{17} \\ 0.8^{100} \approx 2 \times 10^{-10} 1.5100≈4×10170.8100≈2×10−10 -
例如: MLP
假如如下MLP(为了简单省略了偏移)。第 t t t 层的输出等于第 t t t 层的输入乘以权重,再经过激活函数:
f t ( h ⃗ t − 1 ) = σ ( W t h ⃗ t − 1 ) σ 是激活函数 f_t(\vec h^{t-1}) = \sigma(W^t \vec h^{t-1}) \qquad \sigma \text{是激活函数} ft(ht−1)=σ(Wtht−1)σ是激活函数第 t t t 层输出对第 t t t 层输入的导数为先对激活函数求导,再乘以权重矩阵的转置:
∂ h ⃗ t ∂ h ⃗ t − 1 = d i a g ( σ ′ ( W t h ⃗ t − 1 ) ) ( W t ) T σ ′ 是 σ 的导数函数 \frac{\partial \vec h^{t}}{\partial \vec h^{t-1}} = \mathop{diag} (\sigma'(W^t\vec h^{t-1}))(W^t)^T \qquad \sigma'\text{是}\sigma \text{的导数函数} ∂ht−1∂ht=diag(σ′(Wtht−1))(Wt)Tσ′是σ的导数函数因此,第 t t t 层输出对原始输入的导数为一系列导数和转置矩阵的 连乘:
∏ i = t d − 1 ∂ h ⃗ i + 1 ∂ h ⃗ i = ∏ i = t d − 1 d i a g ( σ ′ ( W i h ⃗ i − 1 ) ) ( W i ) T \prod_{i=t}^{d-1}\frac{\partial \vec h^{i+1}}{\partial \vec h^i}=\prod_{i=t}^{d-1}\mathop{diag}\big(\sigma'(W^i\vec h^{i-1})\big)(W^i)^T i=t∏d−1∂hi∂hi+1=i=t∏d−1diag(σ′(Wihi−1))(Wi)T
1.3 梯度爆炸
1.3.1 产生原因
- 如果我们使用ReLU函数作为激活函数。
σ ( x ) = max ( 0 , x ) and σ ′ ( x ) = { 1 if x > 0 0 otherwise \sigma(x)=\max(0, x) \qquad \text{and} \qquad \sigma'(x) = \begin{cases}1 \quad \text{if } x > 0 \\ 0 \quad \text{otherwise}\end{cases} σ(x)=max(0,x)andσ′(x)={ 1if x>00otherwise - ∏ i = t d − 1 ∂ h ⃗ i + 1 ∂ h ⃗ i = ∏ i = t d − 1 d i a g ( σ ′ ( W i h ⃗ i − 1 ) ) ( W i ) T \prod_{i=t}^{d-1}\frac{\partial \vec h^{i+1}}{\partial \vec h^i} = \prod_{i=t}^{d-1}\mathop{diag}\big(\sigma'(W^i\vec h^{i-1})\big)(W^i)^T ∏i=td−1∂hi∂hi+1=∏i=td−1diag(σ′(Wihi−1))(Wi)T的一些元素会来自于 ∏ i = t d − 1 ( W i ) T \prod_{i=t}^{d-1} (W^i)^T ∏i=td−1(Wi)T
- 如果 d − t d-t d−t 很大,这个连乘的值将会非常大。
1.3.2 导致问题
- 值超出值域(infinity)
- 对于16位浮点数尤为严重(数值区间 ( 6 − 5 , 6 4 ) (6^{-5}, 6^4) (6−5,64))
- 对学习率敏感
- 如果学习率太大,会导致大参数值,从而导致更大的梯度。
- 如果学习率太小,会导致训练无进展。
- 我们可能需要再训练过程中不断调整学习率。
1.4 梯度消失
1.4.1 产生原因
- 如果我们使用 sigmoid 函数作为激活函数。
σ ( x ) = 1 1 + e − x σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma(x)=\frac{1}{1+e^{-x}} \qquad \sigma'(x)=\sigma(x)(1-\sigma(x)) σ(x)=1+e−x1σ′(x)=σ(x)(1−σ(x)) - 当输入比较大的时候,梯度会很小(接近0)。
- ∏ i = t d − 1 ∂ h ⃗ i + 1 ∂ h ⃗ i = ∏ i = t d − 1 d i a g ( σ ′ ( W i h ⃗ i − 1 ) ) ( W i ) T \prod_{i=t}^{d-1}\frac{\partial \vec h^{i+1}}{\partial \vec h^i} = \prod_{i=t}^{d-1}\mathop{diag}\big(\sigma'(W^i\vec h^{i-1})\big)(W^i)^T ∏i=td−1∂hi∂hi+1=∏i=td−1diag(σ′(Wihi−1))(Wi)T的元素值将会是 d − t d-t d−t 个小数值的乘积。
- 就像是 0. 8 100 ≈ 2 × 1 0 − 10 0.8^{100} \approx 2 \times 10^{-10} 0.8100≈2×10−10
1.4.2 导致问题
- 梯度值变为0。
- 对 16 位浮点数尤为严重。
- 训练没有进展。
- 不管如何选择学习率。
- 对于底层尤为严重。
- 仅仅顶部层训练的较好。
- 无法让神经网络更深。
1.5 总结
- 当数值过大或者过小时,都会导致数值问题。
- 常发生在深度模型中,因为其会对 n 个数累乘。
二、让训练更加稳定
2.1 概述
- 目标: 让梯度值在合理的范围内,例如: [ 1 − 6 , 1 3 ] [1^{-6}, 1^3] [1−6,13]
- 方法:
- 将乘法变加法,例如:ResNet,LSTM
- 归一化
- 梯度归一化,梯度裁剪
- 合理的权重初始和激活函数
本文中主要讲解如何对权重进行合理的初始化,以及采用合适的激活函数。
2.2 权重初始化
2.2.1 目标:让每一层的方差是一个常数。
- 将每层的输出和梯度都看做随机变量。
- 让它们的均值和方差都保持一致。
正向 | 反向 |
---|---|
E [ h i t ] = 0 V a r [ h i t ] = a \mathbb{E}[h_i^t]=0 \\ Var[h_i^t]=a E[hit]=0Var[hit]=a a a a为常数 | E [ ∂ l ∂ h i t ] = 0 V a r [ ∂ l ∂ h i t ] = b ∀ i , t \mathbb{E}\Bigg[\frac{\partial l}{\partial h_i^t}\Bigg]=0 \qquad Var\Bigg[\frac{\partial l}{\partial h_i^t}\Bigg]=b \qquad \forall i,t E[∂hit∂l]=0Var[∂hit∂l]=b∀i,t b b b为常数 |
2.2.2 问题分析
- 在合理值区间里随机初始参数。
- 训练开始的时候更容易有数值不稳定
- 远离最优解的地方损失函数表面可能很复杂。
- 最优解附近表面会比较平。
- 使用 N ( 0 , 0.01 ) \mathcal{N}(0, 0.01) N(0,0.01)来初始可能对小网络没问题,但不能保证深度神经网络。
如果要满足之前的目标,使得方差和均值都是一个常数,我们应该怎样做呢?
我们不妨先来看一个例子:MLP
- 假设
- w i , j t w^t_{i, j} wi,jt 是 i . i . d i.i.d i.i.d(独立同分布),那么 E [ w i , j t ] = 0 , V a r [ w i , j t ] = γ t \mathbb{E}[w^t_{i, j}]=0, Var[w^t_{i, j}]=\gamma_t E[wi,jt]=0,Var[wi,jt]=γt
- h i t − 1 h^{t-1}_i hit−1 独立于 w i , j t w^t_{i, j} wi,jt
- 假设没有激活函数,则 h ⃗ t = W t h ⃗ t − 1 \vec h^t = W^t\vec h^{t-1} ht=Wtht−1,这里 W t ∈ R n t × n t − 1 W^t\in \mathbb{R}^{n_t\times n_{t-1}} Wt∈Rnt×nt−1
- 此时,正向均值为: E [ h i t ] = E [ ∑ j w i , j t h j t − 1 ] = ∑ j E [ w i , j t ] E [ h j t − 1 ] = 0 \mathbb{E}[h^t_i]=\mathbb{E}\Bigg[\sum_jw^t_{i, j} h^{t-1}_j\Bigg]=\sum_j\mathbb{E}[w^t_{i, j}]\mathbb{E}[h^{t-1}_j]=0 E[hit]=E[j∑wi,jthjt−1]=j∑E[wi,jt]E[hjt−1]=0
- 正向方差: V a r [ h i t ] = E [ ( h i t ) 2 ] − ( E [ h i t ] ) 2 = E [ ( ∑ j w i , j t h j t − 1 ) 2 ] = E [ ∑ j ( w i , j t ) 2 ( h j t − 1 ) 2 + ∑ j ≠ k w i , j t w i , k t h j t − 1 h k t − 1 ⏟ 独立同分布,此项的期望为0 ] = ∑ j E [ ( w i , j t ) 2 ] E [ ( h j t − 1 ) 2 ] = ∑ j V a r [ w i , j t ] V a r [ h j t − 1 ] = n t − 1 γ t V a r [ h j t − 1 ] \begin{aligned} Var[h^t_i]&=\mathbb{E}[(h^t_i)^2]-(\mathbb{E}[h^t_i])^2 =\mathbb{E}\Bigg[\bigg(\sum_jw^t_{i, j}h^{t-1}_j\bigg)^2\Bigg] \\ &=\mathbb{E}\Bigg[\sum_j(w^t_{i, j})^2(h^{t-1}_j)^2+\underbrace{\sum_{j\neq k}w^t_{i, j}w^t_{i, k}h^{t-1}_j h^{t-1}_k}_{\text{独立同分布,此项的期望为0}}\Bigg] \\ &=\sum_j\mathbb{E}\big[(w^t_{i, j})^2\big]\mathbb{E}\big[(h^{t-1}_j)^2\big] \\ &=\sum_jVar[w^t_{i, j}]Var[h^{t-1}_j] \\ &=n_{t-1}\gamma_t Var[h^{t-1}_j] \end{aligned} Var[hit]=E[(hit)2]−(E[hit])2=E[(j∑wi,jthjt−1)2]=E[j∑(wi,jt)2(hjt−1)2+独立同分布,此项的期望为0 j=k∑wi,jtwi,kthjt−1hkt−1]=j∑E[(wi,jt)2]E[(hjt−1)2]=j∑Var[wi,jt]Var[hjt−1]=nt−1γtVar[hjt−1]由此可知,若想使得正向方差都相同,则需满足: n t − 1 γ t = 1 n_{t-1}\gamma_t=1 nt−1γt=1
- 反向均值:
跟正向情况相似 ∂ l ∂ h ⃗ t − 1 = ∂ l ∂ h ⃗ t W t ⇒ ( ∂ l ∂ h ⃗ t − 1 ) T = ( W t ) T ( ∂ l ∂ h ⃗ t ) T \frac{\partial l}{\partial \vec h^{t-1}}=\frac{\partial l}{\partial \vec h^t}W^t \qquad \Rightarrow \qquad \Big(\frac{\partial l}{\partial \vec h^{t-1}}\Big)^T=(W^t)^T\Big(\frac{\partial l}{\partial \vec h^t}\Big)^T ∂ht−1∂l=∂ht∂lWt⇒(∂ht−1∂l)T=(Wt)T(∂ht∂l)T E [ ∂ l ∂ h i t − 1 ] = 0 \mathbb{E}\bigg[\frac{\partial l}{\partial h^{t-1}_i}\bigg]=0 E[∂hit−1∂l]=0 - 反向方差:
V a r [ ∂ l ∂ h i t − 1 ] = n t γ t V a r [ ∂ l ∂ h j t ] Var\bigg[\frac{\partial l}{\partial h^{t-1}_i}\bigg]=n_t\gamma_tVar\bigg[\frac{\partial l}{\partial h^{t}_j}\bigg] Var[∂hit−1∂l]=ntγtVar[∂hjt∂l]与正向情况类似,若想使得反向方差都相同,则需满足: n t γ t = 1 n_{t}\gamma_t=1 ntγt=1 - 可以采用Xavier初始来解决,详见下文 “2.2.3 Xavier初始”。
2.2.3 Xavier初始
- 难以满足 n t − 1 γ t = 1 n_{t-1}\gamma_t=1 nt−1γt=1 和 n t γ t = 1 n_{t}\gamma_t=1 ntγt=1。
- Xavier使得 γ t ( n t − 1 + n t ) / 2 = 1 → γ t = 2 / ( n t − 1 + n t ) \gamma_t(n_{t-1}+n_t)/2=1 \quad \rightarrow \quad \gamma_t=2/(n_{t-1}+n_t) γt(nt−1+nt)/2=1→γt=2/(nt−1+nt)
- 正态分布: N ( 0 , 2 / ( n t − 1 + n t ) ) \mathcal{N}\big(0, \sqrt{2/(n_{t-1}+n_t)}\big) N(0,2/(nt−1+nt))
- 均匀分布: U ( − 6 / ( n t − 1 + n t ) , 6 / ( n t − 1 + n t ) ) \mathcal{U}\big(-\sqrt{6/(n_{t-1}+n_t)}, \sqrt{6/(n_{t-1}+n_t)}\big) U(−6/(nt−1+nt),6/(nt−1+nt))
- 分布 U [ − a , a ] \mathcal{U}[-a, a] U[−a,a] 的方差是 a 2 / 3 a^2/3 a2/3
- 适配权重形状变换,特别是 n t n_t nt。
2.3 激活函数
2.3.1 问题分析
承接上文“2.2.2 问题分析”中的假设:
- 假设线性的激活函数
- 假设 σ ( x ) = α x + β \sigma(x)=\alpha x+\beta σ(x)=αx+β
h ⃗ ′ = W t h ⃗ t − 1 and h ⃗ t = σ ( h ⃗ ′ ) \vec h'=W^t \vec h^{t-1} \quad \text{and} \quad \vec h^t=\sigma(\vec h') h′=Wtht−1andht=σ(h′) - 正向期望: E [ h i t ] = E [ α h i ′ + β ] = β \mathbb{E}[h^t_i] = \mathbb{E}[\alpha h_i'+\beta] = \beta E[hit]=E[αhi′+β]=β这意味着,若要使得期望为0,则需满足 β = 0 \beta=0 β=0
- 正向方差: V a r [ h i t ] = E [ ( h i t ) 2 ] − ( E [ h i t ] ) 2 = E [ ( α h i ′ + β ) 2 ] − β 2 = E [ α 2 ( h i ′ ) 2 + 2 α β h i ′ + β 2 ] − β 2 = α 2 V a r [ h i ′ ] \begin{aligned} Var[h^t_i] &= \mathbb{E}[(h^t_i)^2]-(\mathbb{E}[h^t_i])^2 \\ &= \mathbb{E}[(\alpha h_i'+\beta)^2]-\beta^2 \\ &= \mathbb{E}[\alpha^2(h_i')^2+2\alpha\beta h_i'+\beta^2]-\beta^2\\ &=\alpha^2Var[h_i'] \end{aligned} Var[hit]=E[(hit)2]−(E[hit])2=E[(αhi′+β)2]−β2=E[α2(hi′)2+2αβhi′+β2]−β2=α2Var[hi′]如果使得方差相同,则需满足 α = 1 \alpha=1 α=1
- 反向期望:
假设 σ ( x ) = α x + β \sigma(x)=\alpha x+\beta σ(x)=αx+β ∂ l ∂ h ⃗ ′ = ∂ l ∂ h ⃗ t ( W t ) T and ∂ l ∂ h ⃗ t − 1 = α ∂ l ∂ h ⃗ ′ \frac{\partial l}{\partial \vec h'}=\frac{\partial l}{\partial \vec h^t}(W^t)^T \quad \text{and} \quad \frac{\partial l}{\partial \vec h^{t-1}}=\alpha\frac{\partial l}{\partial \vec h'} ∂h′∂l=∂ht∂l(Wt)Tand∂ht−1∂l=α∂h′∂l E [ ∂ l ∂ h i t − 1 ] = 0 \mathbb{E}\bigg[\frac{\partial l}{\partial h^{t-1}_i}\bigg]=0 E[∂hit−1∂l]=0若要使得期望为0,则需满足 β = 0 \beta=0 β=0 - 反向方差:
V a r [ ∂ l ∂ h i t − 1 ] = α 2 V a r [ ∂ l ∂ h j ′ ] Var\bigg[\frac{\partial l}{\partial h^{t-1}_i}\bigg]=\alpha^2Var\bigg[\frac{\partial l}{\partial h_j'}\bigg] Var[∂hit−1∂l]=α2Var[∂hj′∂l]如果使得方差相同,则需满足 α = 1 \alpha=1 α=1 - 这就意味着我们的激活函数必须是 σ ( x ) = x \sigma(x)=x σ(x)=x
- 假设 σ ( x ) = α x + β \sigma(x)=\alpha x+\beta σ(x)=αx+β
2.3.2 检查常用激活函数
- 使用泰勒展开:
s i g m o i d ( x ) = 1 2 + x 4 − x 3 48 + O ( x 5 ) sigmoid(x)=\frac 12+\frac x4-\frac{x^3}{48}+O(x^5) sigmoid(x)=21+4x−48x3+O(x5) t a n h ( x ) = 0 + x − x 3 3 + O ( x 5 ) tanh(x)=0+x-\frac{x^3}{3}+O(x^5) tanh(x)=0+x−3x3+O(x5) r e l u ( x ) = 0 + x for x ≥ 0 relu(x)=0+x \qquad \text{ for }x \geq 0 relu(x)=0+x for x≥0我们发现,对于 t a n h ( x ) tanh(x) tanh(x) 和 r e l u ( x ) relu(x) relu(x) 函数,在零点附近可以近似为线性函数 y = x y=x y=x;而 s i g m o i d ( x ) sigmoid(x) sigmoid(x) 不行。 - 因此,我们对 s i g m o i d ( x ) sigmoid(x) sigmoid(x) 进行调整:
4 × s i g m o i d ( x ) − 2 4\times sigmoid(x)-2 4×sigmoid(x)−2调整后的 s i g m o i d ( x ) sigmoid(x) sigmoid(x) 在零点附件也可以近似为 y = x y=x y=x
2.5 总结
- 合理的权重初始值和激活函数的选取可以提升数值稳定性。