梯度消失

1、梯度消失产生的原因

我们先来看一个最简单的神经网络,如上图:
c = σ ( σ ( σ ( x ⋅ w 1 + b 1 ) ⋅ w 2 + b 2 ) ⋅ w 3 + b 3 ) c = \sigma(\sigma(\sigma(x·w_1+b_1)·w_2+b_2)·w_3+b_3) c=σ(σ(σ(xw1+b1)w2+b2)w3+b3)

接下来我们来看看b1的梯度,假设 A = x ⋅ w 1 + b 1 , B = σ ( A ) ⋅ w 2 + b 2 , D = σ ( B ) ⋅ w 3 + b 3 A = x·w_1+b_1,B=\sigma(A)·w_2+b_2,D=\sigma(B)·w_3+b_3 A=xw1+b1,B=σ(A)w2+b2,D=σ(B)w3+b3,那么 c = σ ( D ) c = \sigma(D) c=σ(D),则有:

d c d b 1 = d σ ( D ) d D ⋅ d D d σ ( B ) ⋅ d σ ( B ) d B ⋅ d B d σ ( A ) ⋅ d σ ( A ) d A ⋅ d A d b 1 \frac{dc}{db_1} = \frac{d\sigma(D)}{dD}·\frac{dD}{d\sigma(B)}·\frac{d\sigma(B)}{dB}·\frac{dB}{d\sigma(A)}·\frac{d\sigma(A)}{dA}·\frac{dA}{db_1} db1dc=dDdσ(D)dσ(B)dDdBdσ(B)dσ(A)dBdAdσ(A)db1dA

= σ D ′ ⋅ w 3 ⋅ σ B ′ ⋅ w 2 ⋅ σ A ′ ⋅ 1 =\sigma^{'}_D·w_3·\sigma^{'}_B·w_2·\sigma^{'}_A·1 =σDw3σBw2σA1

= σ D ′ ⋅ w 3 ⋅ σ B ′ ⋅ w 2 ⋅ σ A ′ =\sigma^{'}_D·w_3·\sigma^{'}_B·w_2·\sigma^{'}_A =σDw3σBw2σA

我们知道,卷积层都使用relu、leakrelu、elu等激活函数,但为什么不使用sigmoid作为卷积层的激活函数呢?我们假设 σ ( x ) \sigma(x) σ(x)是sigmoid激活函数。
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1
sigmoid函数值区间是(0,1),导数值区间是 ( − ∞ , 1 4 ) (-\infty,\frac{1}{4}) (41),这里就不做证明了。

那现在,如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为0 标准差为1 的高斯分布。因此所有的权重通常会满足 ∣ w i ∣ &lt; 1 |w_i|&lt;1 wi<1。从而有 w i σ ′ &lt; 1 4 w_i\sigma^{&#x27;} &lt; \frac{1}{4} wiσ<41。随着层数的增加,梯度越来越小,这就是消失的梯度出现的本质原因。

2、解决方案

上述说明梯度消失中有两个假设:
假设一:激活函数是sigmoid;
假设二:权重是均值为0,标准差为1的标准高斯分布;
那解决方案自然就是从这两个假设入手了。

2.1、relu、leakrelu、elu等激活函数

该解决方案是从假设一入手的,使用relu等激活函数,使得 σ ′ &gt; = 1 \sigma^{&#x27;} &gt;= 1 σ>=1

relu激活函数: r e l u ( x ) = m a x ( x , 0 ) relu(x) = max(x,0) relu(x)=max(x,0),即 r e l u ( x ) = { 0 , x &lt; 0 x , x &gt; = 0 relu(x) = \begin{cases} 0, &amp; x&lt;0 \\ x, &amp; x&gt;=0 \end{cases} relu(x)={0,x,x<0x>=0

优点:

  1. 解决了梯度消失、爆炸的问题 – 计算方便,计算速度快;
  2. 加速了网络的训练。

缺点:

  1. 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决);
  2. 输出不是以0为中心的。

leakRelu激活函数: l e a k R e l u ( x ) = m a x ( 0 , x ) + l e a k ∗ m i n ( 0 , x ) leakRelu(x) = max(0, x) + leak*min(0,x) leakRelu(x)=max(0,x)+leakmin(0,x)
l e a k R e l u ( x ) = { l e a k ∗ x , x &lt; 0 x , x &gt; = 0 leakRelu(x) = \begin{cases} leak*x, &amp; x&lt;0 \\ x, &amp; x&gt;=0 \end{cases} leakRelu(x)={leakx,x,x<0x>=0

leakRelu解决了relu的0区间带来的影响,leak系数一般选择0.01或者0.02,或者通过学习而来。根据leak的选择,又可以分为LeakyReLU、PReLU和RReLU:
LeakyReLU:leak值固定;
PReLU:leak值根据数据变化;
RReLU:在指定范围内根据数据变化。

elu激活函数: e l u ( x ) = { a ⋅ ( e x − 1 ) , x &lt; 0 x , x &gt; = 0 elu(x) = \begin{cases} a·(e^x-1), &amp; x&lt;0 \\ x, &amp; x&gt;=0 \end{cases} elu(x)={a(ex1),x,x<0x>=0

elu也是为了解决relu的0区间带来的影响。

2.2、预训练+微调

该解决方案是从假设二入手的,使用预训练模型,预训练模型的权重已经非常接近真实权重了,然后再微调,从而不用担心梯度消失。

2.3、LSTM

LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates),LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值