梯度消失和梯度爆炸

梯度消失和梯度爆炸本质上是一样的,都是因为网络层数太深而引发的梯度反向传播中的连乘效应。
梯度消失:好的参数初始化、批规范化、更换激活函数,使用残差结构
梯度爆炸:好的参数初始化、梯度截断,L2正则化

梯度消失

好的参数初始化方式

(1)不可全零初始化
全零初始化会导致所有参数无法更新,具体参考:https://www.cnblogs.com/chason95/articles/10711017.html
(2)不可初始化相同值:每个节点相当于等价的
节点输入权值完全相同,更新的时候其梯度也完全相同,无论进行多少轮训练,这两个节点都完全等价。

将参数按高斯分布或者均匀分布初始化成一个绝对值较小的数。
绝对值过小,容易产生梯度消失问题,绝对值过大,则容易产生梯度爆炸问题。

规范化

使用的原因 :由于神经网络的表达能力大多来自激活函数的非线性,所以让输入数据“适应于”激活函数是很重要的。
对于sigmod激活函数而言,由于函数两端过于平坦,为了不陷入梯度消失的情况,我们希望神经元的输入集中在函数的中央。
对于ReLU激活函数而言,由于函数在输入小于0的区域恒等于0,所以如果一个很大的梯度把某个神经元的输入拉到了小于0很多的区域,该神经元的输出以后永远是0了,会造成最后很多神经元处于死亡状态。
所以激活函数对输入数据的要求:(1)输入数据不要过大(2)输入数据带来的梯度不要过大。

几种归一化的流程:
计算批处理数据均值: μ B = 1 m ∑ i = 1 m x i \mu _{B}=\frac{1}{m}\sum_{i=1}^{m} x_{i} μB=m1i=1mxi
计算批处理数据方差
σ B 2 = 1 m ∑ i = 1 m ( x i − μ B ) 2 \sigma _{B}^{2}=\frac{1}{m}\sum_{i=1}^{m}\left ( x_{i}-\mu _{B}\right )^{2} σB2=m1i=1m(xiμB)2

规范化
x ^ i = x i − μ B σ B 2 + ε \hat{x}_{i}=\frac{x_{i}-\mu _{B}}{\sqrt{\sigma _{B}^{2}+\varepsilon }} x^i=σB2+ε xiμB

尺度变换和偏移
y i = γ x i + β = B N γ , β ( x i ) y_{i}=\gamma x^{i}+\beta =BN_{\gamma ,\beta }\left (x_{i} \right ) yi=γxi+β=BNγ,β(xi)
在这里插入图片描述

Batch Normalization:

(所有图的每个通道归一化)
1.BN的计算就是把每个通道的NHW单独拿出来归一化处理
2.针对每个channel我们都有一组γ,β,所以可学习的参数为2*C
3.当batch size越小,BN的表现效果也越不好,因为计算过程中所得到的均值和方差不能代表全局。

Layer Normalizaiton:

(每张图的整个归一化)
1.LN的计算就是把每个CHW单独拿出来归一化处理,不受batchsize 的影响
2.常用在RNN网络,但如果输入的特征区别很大,那么就不建议使用它做归一化处理

Instance Normalization:

(每张图的每一层归一化)
1.IN的计算就是把每个HW单独拿出来归一化处理,不受通道和batchsize 的影响
2.常用在风格化迁移,但如果特征图可以用到通道之间的相关性,那么就不建议使用它做归一化处理

Group Normalization:

(每张图都选几层归一化)
1.GN的计算就是把先把通道C分成G组,然后把每个gHW单独拿出来归一化处理,最后把G组归一化之后的数据合并成CHW
2.GN介于LN和IN之间,当然可以说LN和IN就是GN的特列,比如G的大小为1或者为C
如果显卡显存不够时,BN效果已经不好了,可以考虑gn

激活函数

Sigmod函数:

将取值为 (−∞,+∞) 的数映射到 (0,1) 之间:
g ( z ) = 1 1 + e − z g\left ( z \right )=\frac{1}{1+e^{-z}} g(z)=1+ez1

缺点:(1)当z值非常大或者非常小的时候,sigmod的导数几乎为0,这会导致权重的梯度接近0,使得梯度更新十分缓慢,造成梯度消失
sigmoid作为损失函数,其梯度是不可能超过0.25的,这样经过链式求导之后,很容易发生梯度消失。
一个很大的深度网络中,浅层基本不学习,权值变化小,后面几层一直在学习,结果就是,后面几层基本可以表示整个网络,失去了深度的意义

Tanh函数:

将取值为 (−∞,+∞)的数映射到 (−1,1) 之间,其公式为:
g ( z ) = e z − e − z e z + e − z g\left ( z \right )=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}} g(z)=ez+ezezez
缺点:和sigmoid函数的第一个缺点一样,当 z 很大或很小时,g′(z) 接近于 0 ,会导致梯度很小,权重更新非常缓慢,即梯度消失问题

ReLU函数:

优点:1)在输入为正数的时候(对于大多数输入 z 空间来说),不存在梯度消失问题。(2) 计算速度要快很多。ReLU函数只有线性关系,不管是前向传播还是反向传播,都比sigmod和tanh要快很多。(sigmod和tanh要计算指数,计算速度会比较慢)
缺点:当输入为负数的时候,梯度为0,会产生梯度消失问题
relu函数为分段线性函数,为什么会增加非线性元素:
(1)relu构成的神经网络对每个样本都是线性变换,但是不同样本之间是不同的线性变换,整个样本空间在经过relu构成的神经网络就是经历了非线性。
(2)不同的feature在经过relu之后流经的路径不一样,最终的输出空间就是输入空间的非线性变换得到

Leaky ReLU:

g ( z ) = { z  if  z > 0 a z  if  z < 0 g\left ( z \right )=\begin{cases} z& \text{ if } z>0 \\ az& \text{ if } z<0 \end{cases} g(z)={zaz if z>0 if z<0
解决了relu在输入为负数时候的梯度消失问题

elu

elu激活函数也是为了解决relu的0区间带来的影响,但是elu相对于leakrelu来说,计算要更耗时间一些,其数学表达为:
g ( z ) = { z  if  z > 0 a ( e x − 1 ) z   o t h e r w i s e g\left ( z \right )=\begin{cases} z& \text{ if } z>0 \\ a\left ( e^{x}-1 \right )z& \text{ } otherwise \end{cases} g(z)={za(ex1)z if z>0 otherwise
在这里插入图片描述

批量规范化(BN)优缺点详细介绍:

只对原始数据标准化是不充分的,这样做置保证了原始输入数据的质量,无法保证隐层输入数据的质量,
简单的将每层数据进行直接的标准化操作也是不可行的,因为这样会破坏每层自身学习到的数据特征,为了使规范化不破坏层结构本身学习到的特征,BN引入两个可以学习的“重构参数”以期望冲规范化的数据中重构出层本身学到的特征:
优点:(1)缓解梯度消失,加速网络收敛(2)简化调参,网络更加稳定,BN层抑制了参数的微小变化随着网络加深而被放大,对参数变化的适应能力强,更容易调参。(3)防止过拟合,BN将每一个batch的均值和方差引入网络中,由于每个batch的这两个值都不同,可看作为训练过程增加了随机性
缺点:(1)由于在batch的维度进行了归一化,BN层要求较大的batch才能有效工作,而物体检测等任务由于占用内存过高,限制了batch的大小,限制了BN有效发挥。(2)batch在训练和测试时不一样,训练一般滑动计算均值方差,测试的时候那训练集的用,导致测试集依赖训练集,而他两的分布并不一样。

梯度爆炸

梯度截断

可以有效的将权重值控制在一定范围之内。算法步骤如下:
(1)首先设置一个梯度阈值:clip_gradient
(2)在后向传播中求出各参数梯度,不直接使用梯度去更新参数,求梯度的l2范数
(3)然后比较梯度的l2范数和clip_gradient的大小
(4)如果前者大,则求缩放因子clip_gradient/||g||
(5)最后将梯度乘以缩放因子得到最后所需要的梯度

L2正则化

L o s s = ( y − W T x ) 2 + α ∥ W ∥ 2 Loss=\left ( y-W^{T}x \right )^{2}+\alpha \left \|W \right \|^{2} Loss=(yWTx)2+αW2
L2正则化可以抑制权重变的很大,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值