梯度消失 & 梯度爆炸

神经网络(DNN)其实就是人工神经网络(ANN)的多层实现,一个ANN有2个或者2个以上的隐藏层,则被称为深度神经网络(DNN),下面的内容我们会针对神经网络反向微分过程中产生的梯度爆炸和梯度消失,以及当前有效的缓和方法做一些具体的论述;

**当然有兴趣的同学建议自己去推导神经网络反向传播BP算法的推导 **

1.神经网络

2.梯度消失 & 梯度爆炸

3.缓和梯度消失 & 爆炸

1.神经网络

神经网络其实就是一个多层的感知器,我们下面来看下其结构:(当然了解这一部分的可以直接跳到2.梯度消失 & 梯度爆炸)(激活函数是sigmod)

神经网络主要分为3种网络层

  • 输入层:就是数据输入神经网络的入口,比如MNIST是2828的像素点集,则输入层就需要有2828个输入神经元 + 一个代表偏移量的输入神经元(如图:左侧常量的神经元)
  • 隐藏层:就是神经网络的中间层,可能有一点抽象,举个例子:一个人脸识别系统,假设有3个隐藏层
    --------- 隐藏层1: 识别眼睛和眉毛的特征 & 隐藏层2: 识别嘴巴和耳朵的特征 & 隐藏层3: 识别肤色即全部人脸
    看的出来隐藏层就是从低到高逐层抽象的网络层
  • 输出层:就是模型预测值的输出口,这里我们使用常用的softmax,用于分类MNIST的图像类别

那么,可以看出来:

  1. 从下到上(输出层 -> 隐藏层 -> 输出层),就是训练模型的过程: 小批量/全量数据逐步调节权重,基于loss函数寻求最优loss的过程
  2. 自上而下,进行反向微分调参,下面我们会基于此来进行梯度爆炸和消失的问题剖析

到这里我们对神经网络有了一个初步的认识,下面来进入重点 梯度消失 & 梯度爆炸

2.梯度消失 & 梯度爆炸

正如之前所说,反向传播算法(即BP算法)是从输出层反向传到输入层,逐层传递误差梯度,进而进行权重的更新;
** 我们应该知道无论是机器学习还是深度学习(DNN)都是在一次次训练中根据前一次的误差进行梯度下降更行权重**
这时候随着网络层的增加,我们会暴露两个问题: 梯度消失 和 梯度爆炸

2.1 首先来看softmax以及其导函数:

y ( s i g m o d ) = ( 1 + e − t ) − 1 y(sigmod) = (1 + e ^ {-t})^{-1} y(sigmod)=(1+et)1
t = w x t = wx t=wx
下面我们来看其函数图像:
在这里插入图片描述
接着我们看其导函数:
在这里插入图片描述
从上面两个图中可以看到:

  1. softmax在 y = 1 and y = 0 时会接近饱和
  2. t = 0 时,y = 0.5,那么我们可以认为这是逻辑回归的决策边界
  3. 接着看其导函数,是一个钟形的曲线,且最大值是1/4,注意这一点很重要;之后的梯度爆炸 & 梯度消失会用到这个特点
2.2 梯度爆炸 & 梯度消失:

在分析梯度爆炸和梯度消失之前我们需要看下神经网络的梯度反向传播:
同机器学习调节 θ \theta θ一样,我们是根据误差梯度来进行梯度下降,调节权重:
θ n e x t = θ − η ∂ l o s s ∂ θ \theta^{next} = \theta - \eta\frac{\partial loss}{\partial \theta} θnext=θηθloss
在这里插入图片描述
看上面的图例----包含3个隐藏层,我们假设每一层都使用softmax来做为激活函数:
接下来我们来看每一个网络层的梯度下降:
我们这里这样定义,方便之后的计算,output的输出是f(o),隐藏层3的输出是f(3),隐藏层2的输出是f(2)…依次类推
softmax函数表示:softmax=f(t); t = w x wx wx

  1. 首先来看隐藏层3的权重更新,这是最接近optputs的隐藏层,所以是直接可以求出来的
    ∂ l o s s ∂ θ 3 = ∂ l o s s ∂ f ( 3 ) ∂ f ( 3 ) ∂ t ( 3 ) ∂ t ( 3 ) ∂ θ 3 = ∂ l o s s ∂ f ( 3 ) σ ( 3 ) X 3 = ζ σ ( 3 ) X 3 \frac{\partial loss}{\partial \theta_3} = \frac{\partial loss}{\partial f(3)} \frac{\partial f(3)}{\partial t(3)} \frac{\partial t(3)}{\partial \theta_3}=\frac{\partial loss}{\partial f(3)} \sigma(3) X_3 = \zeta\sigma(3) X_3 θ3loss=f(3)losst(3)f(3)θ3t(3)=f(3)lossσ(3)X3=ζσ(3)X3

  2. 然后看隐藏层2的误差梯度:
    ∂ l o s s ∂ θ 2 = ∂ l o s s ∂ f ( 3 ) ∂ f ( 3 ) ∂ t ( 3 ) ∂ t ( 3 ) ∂ f ( 2 ) ∂ f ( 2 ) ∂ t ( 2 ) ∂ t ( 2 ) ∂ θ 2 \frac{\partial loss}{\partial \theta_2} = \frac{\partial loss}{\partial f(3)}\frac{\partial f(3)}{\partial t(3)}\frac{\partial t(3)}{\partial f(2)}\frac{\partial f(2)}{\partial t(2)} \frac{\partial t(2)}{\partial \theta_2} θ2loss=f(3)losst(3)f(3)f(2)t(3)t(2)f(2)θ2t(2)
    上面函数只是一个公式的同等转换,分子分母前后交叉消除即可还原,继续往下看:
    需要注意:f(3)是output的输入神经元,而f(2)又是f(3)的输入神经元
    ∂ l o s s ∂ f ( 3 ) 是 成 本 函 数 对 输 入 神 经 元 的 偏 导 , 这 是 一 个 定 值 , 所 以 我 们 这 里 使 用 ζ 表 示 \frac{\partial loss}{\partial f(3)}是成本函数对输入神经元的偏导,这是一个定值,所以我们这里使用\zeta表示 f(3)loss,,使ζ
    ∂ f ( 3 ) ∂ t ( 2 ) \frac{\partial f(3)}{\partial t(2)} t(2)f(3)是激活函数softmax的偏导数所以我们用 σ ( 3 ) \sigma(3) σ(3)表示
    ∂ t ( 3 ) ∂ f ( 3 ) \frac{\partial t(3)}{\partial f(3)} f(3)t(3) ω \omega ω x x x x x x求偏导,结果是 ω \omega ω
    所以:
    ∂ l o s s ∂ θ 2 = ζ σ ( 3 ) ω 3 σ ( 2 ) X 2 \frac{\partial loss}{\partial \theta_2} = \zeta\sigma(3)\omega_3\sigma(2)X_2 θ2loss=ζσ(3)ω3σ(2)X2

  3. 同理隐藏层1的误差梯度:
    ∂ l o s s ∂ θ 1 = ∂ l o s s ∂ f ( 3 ) ∂ f ( 3 ) ∂ t ( 2 ) ∂ t ( 2 ) ∂ f ( 1 ) ∂ f ( 1 ) ∂ t ( 1 ) ∂ t ( 1 ) ∂ θ 1 \frac{\partial loss}{\partial \theta_1} = \frac{\partial loss}{\partial f(3)}\frac{\partial f(3)}{\partial t(2)}\frac{\partial t(2)}{\partial f(1)}\frac{\partial f(1)}{\partial t(1)}\frac{\partial t(1)}{\partial \theta_1} θ1loss=f(3)losst(2)f(3)f(1)t(2)t(1)f(1)θ1t(1)
    ∂ l o s s ∂ θ 1 = ζ σ ( 3 ) ω 3 σ ( 2 ) ω 2 σ ( 1 ) X 1 \frac{\partial loss}{\partial \theta_1} = \zeta\sigma(3)\omega_3\sigma(2)\omega_2\sigma(1)X_1 θ1loss=ζσ(3)ω3σ(2)ω2σ(1)X1

这样来看自上而下反向传播误差梯度是链式相乘的,即 σ ω \sigma\omega σω
由sigmod的导函数可知最大值位1/4 所以:

  • ω > 4 梯 度 会 自 上 而 下 越 来 越 大 , 有 梯 度 爆 炸 的 隐 患 \omega>4梯度会自上而下越来越大,有梯度爆炸的隐患 ω>4,
  • ω < 4 梯 度 会 自 上 而 下 越 来 越 小 , 有 梯 度 消 失 的 隐 患 \omega<4梯度会自上而下越来越小,有梯度消失的隐患 ω<4,
3.缓和梯度消失 & 爆炸

3.1: 权重 ω \omega ω初始化
Xavier初始化和He初始化;

3.2: 选择合适的激活函数

使用ReLU代替softmax

  • ReLU的好处是不会稀释正值,而且可以提升训练速度
  • 缺点:在小于0时候,仅仅输出0,是让一些神经元dying
    可以使用其变种:RReLU & PReLU & ELU

3.3: 批量归一化
在2015年的论文中,Sergey loffe和Christian Szegedy提出了一个批量归一化,用他来解决梯度消失和爆炸的问题:
即在每一层激活函数之前在模型中加一个操作:简单零中心化和归一化输入;
之后再通过每层的两个新参数(一个为了缩放,一个为了偏移)

3.4: 复杂的优化器

  • Momentum优化
  • Nesterrov优化
  • AdaGrad优化
  • RMSProp优化
  • Adam优化

缓和梯度爆炸和梯度消失的原理之后会有更新博文,感谢阅读

  • 14
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值