【动手学深度学习v2李沐】学习笔记09:数值稳定性、模型初始化、激活函数

前文回顾:丢弃法

一、数值稳定性

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) h t=ft(h t1)andy=lfdf1(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} Wtl=h dldt 次矩阵乘法 h d1h dh th t+1Wth t由于向量关于向量的导数是一个矩阵,所以我们会做 d − t d-t dt次的矩阵乘法。而过多的矩阵乘法会导致数值稳定性出现问题。

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.51004×10170.81002×1010

  • 例如: 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(h t1)=σ(Wth t1)σ是激活函数 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{的导数函数} h t1h t=diag(σ(Wth t1))(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=td1h ih i+1=i=td1diag(σ(Wih i1))(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=td1h ih i+1=i=td1diag(σ(Wih i1))(Wi)T的一些元素会来自于 ∏ i = t d − 1 ( W i ) T \prod_{i=t}^{d-1} (W^i)^T i=td1(Wi)T
    • 如果 d − t d-t dt 很大,这个连乘的值将会非常大。

1.3.2 导致问题

  • 值超出值域(infinity)
    • 对于16位浮点数尤为严重(数值区间 ( 6 − 5 , 6 4 ) (6^{-5}, 6^4) (65,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+ex1σ(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=td1h ih i+1=i=td1diag(σ(Wih i1))(Wi)T的元素值将会是 d − t d-t dt 个小数值的乘积。
    • 就像是 0. 8 100 ≈ 2 × 1 0 − 10 0.8^{100} \approx 2 \times 10^{-10} 0.81002×1010

1.4.2 导致问题

  • 梯度值变为0。
    • 对 16 位浮点数尤为严重。
  • 训练没有进展。
    • 不管如何选择学习率。
  • 对于底层尤为严重。
    • 仅仅顶部层训练的较好。
    • 无法让神经网络更深。

1.5 总结

  • 当数值过大或者过小时,都会导致数值问题。
  • 常发生在深度模型中,因为其会对 n 个数累乘。

二、让训练更加稳定

2.1 概述

  • 目标: 让梯度值在合理的范围内,例如: [ 1 − 6 , 1 3 ] [1^{-6}, 1^3] [16,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[hitl]=0Var[hitl]=bi,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 hit1 独立于 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} h t=Wth t1,这里 W t ∈ R n t × n t − 1 W^t\in \mathbb{R}^{n_t\times n_{t-1}} WtRnt×nt1
    • 此时,正向均值为: 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[jwi,jthjt1]=jE[wi,jt]E[hjt1]=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[(jwi,jthjt1)2]=E[j(wi,jt)2(hjt1)2+独立同分布,此项的期望为0 j=kwi,jtwi,kthjt1hkt1]=jE[(wi,jt)2]E[(hjt1)2]=jVar[wi,jt]Var[hjt1]=nt1γtVar[hjt1]由此可知,若想使得正向方差都相同,则需满足: n t − 1 γ t = 1 n_{t-1}\gamma_t=1 nt1γ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 h t1l=h tlWt(h t1l)T=(Wt)T(h tl)T E [ ∂ l ∂ h i t − 1 ] = 0 \mathbb{E}\bigg[\frac{\partial l}{\partial h^{t-1}_i}\bigg]=0 E[hit1l]=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[hit1l]=ntγtVar[hjtl]与正向情况类似,若想使得反向方差都相同,则需满足: 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 nt1γ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(nt1+nt)/2=1γt=2/(nt1+nt)
    • 正态分布: N ( 0 , 2 / ( n t − 1 + n t ) ) \mathcal{N}\big(0, \sqrt{2/(n_{t-1}+n_t)}\big) N(0,2/(nt1+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/(nt1+nt) ,6/(nt1+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 =Wth t1andh t=σ(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=h tl(Wt)Tandh t1l=αh l E [ ∂ l ∂ h i t − 1 ] = 0 \mathbb{E}\bigg[\frac{\partial l}{\partial h^{t-1}_i}\bigg]=0 E[hit1l]=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[hit1l]=α2Var[hjl]如果使得方差相同,则需满足 α = 1 \alpha=1 α=1
    • 这就意味着我们的激活函数必须是 σ ( x ) = x \sigma(x)=x σ(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+4x48x3+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+x3x3+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 x0我们发现,对于 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 总结

  • 合理的权重初始值和激活函数的选取可以提升数值稳定性。

猜你喜欢

转载自blog.csdn.net/weixin_45800258/article/details/127198243