一、梯度问题
1.梯度弥散
- 产生原因
-
激活函数的"饱和"
左饱和: 当x趋向于负无穷时,函数的导数趋近于 0,此时称为左饱和 右饱和: 当x趋向于正无穷时,函数的导数趋近于 0,此时称为右饱和 饱和函数和非饱和函数: 当一个函数既满足右饱和,又满足左饱和,则称为饱和函数,否则称为非饱和函数 常用的 饱和激活函数 和 非饱和激活函数: 饱和激活函数有如 Sigmoid 和 tanh,非饱和激活函数有 ReLU; 相较于饱和激活函数,非饱和激活函数可以解决 "梯度消失" 的问题,加快收敛
-
样本中的奇艺样本引起模型无法收敛
-
学习率过大导致模型震荡无法收敛
-
反向传播算法传播梯度的时候,随着网络传播深度的增加,梯度的幅度急剧减小,导致浅层神经元的权重更新缓慢,无法有效学习
-
从数学角度看,因为梯度连乘的问题,是梯度消失的问题所在
-
- 造成问题
- 靠近输出层的隐藏层梯度大,参数更新快,所以很快就会收敛
靠近输入层的隐藏层梯度小,参数更新慢,几乎和初始状态一样,随机分布 - 由于神经网络前几层权重更新过慢,或者没有更新,导致整个网络的学习性能下降,达不到训练标准
- 靠近输出层的隐藏层梯度大,参数更新快,所以很快就会收敛
2.梯度爆炸
- 产生原因
- 一般是因为神经网络初始化的权值过大,每层网络反向求导的结果都大于1
- 学习率非常大
- 造成问题
- 前面网络层梯度通过训练变大,后面网络层的梯度指数级增大
- 神经网络模型无法收敛,达不到训练效果
二、梯度问题的处理
1.梯度弥散的处理
- 激活函数引起的梯度弥散问题
使用 ReLU,Leaky_ReLU 等激活函数代替 sigmoid 函数 - 奇艺样本引起的梯度弥散问题
- 批量标准化,为了消除指标之间的量纲影响,需要进行数据标准化处理以解决数据指标之间的可比性
- 标准化的目的是使得预处理数据的数据被限定在一定范围内([-1, 1]),从而消除奇艺样本数据导致的不良影响
- 标准化步骤
左图为原始数据,中间为中心化后的数据,右图为中心化后的数据除以标准化,得到标准化数据 - 归一化加快梯度下降求最优解的速度归一化有可能提高精度
2.梯度爆炸的处理
- 解决方法
- 重设初始化权值(标准正态分布采样)
- 学习率调小
3.多层网络中梯度连乘引起的梯度弥散
深度残差网络(ResNet)采用跳跃式的结构,打破了传统的神经网络 n-1 层的输出只能给 n 层作为输入的惯例,是某一层的输出可以直接跨过几层作为后面某一层的输入
三、数据标准化
1.数据标准化的方法
- Batch Normalization
- 把每个通道的 NHW 单独拿出来归一化
- 针对每一个 channel 都有一组 γ γ γ, β β β,可学习参数为 2×C
- 当 batch size 越小,BN的表现效果也越不好,因为计算过程中得到的均值和方差不能代表全局
- Layer Normalization
- N 的计算就是把每个 CHW 单独拿出来归一化处理,不受 batch size 的影响
- 常用在 RNN 网络中,但如果输入特征区别很大,那么就不建议使用它做归一化处理
- Instance Normalization
- IN 的计算就是把每个 HW 单独拿出来归一化处理,不受通道和 batch size 的影响
- 常用在风格迁移,但如果特征图可以用到通道之间的相关性,那么就不建议使用它做归一化处理
- Group Normalization
- GN 的计算就是把通道 C 分成 G 组,然后把每个 GHW 单独拿出来归一化处理,最后把 G 组归一化之后的数据合并
- GN 介于 LN 和 IN 之间,当然也可以说 LN、IN 就是 GN 的特例,比如 G 的大小为 1 或者 C
- Switchable Normalization
- 将 BN、LN、IN 结合,赋予权重,让网络自己去学习归一化层应该是用什么方法
- 集万千宠爱于一身,但训练复杂
2.标准化方法公式
3.数据标准化的目的
使网络的输入层、隐藏层、输出层的数据直方图都在一个指定的范围内,有利于模型收敛
有时候为了方便输出结果更好地逼近真实结果,还会对标签数据也进行对应的标准化处理
4.数据标准化的优点
- 可以使学习快速进行
- 减弱对初始化的强依赖性
- 防止梯度弥散、梯度爆炸
- 保持隐藏层数据的均值、方差不变,让数值更稳定,为后面网络提供坚实的基础