文章目录
- 神经网络梯度消失与梯度爆炸
- 简述现象
- 产生梯度消失的根本原因
- 梯度爆炸的根本原因
- 当激活函数为sigmoid时,梯度消失和梯度爆炸哪个更容易发生?
- 如何解决梯度消失和梯度爆炸
- 激活函数
- sigmod
- tanh
- ReLU
- Leaky ReLU
- 优化方法
- SGD
- Momentum
- Adagrad
- RMSprop
- Adam
- 牛顿法
- 拟牛顿法
- 共轭梯度法
- Batch Normalization
- 为什么传统的神经网络在训练开始之前,要对输入的数据做Normalization?
- 深度神经网络模型的训练为什么会很困难
- 什么是Batch Normalization?
- Batch Normalization的优点
- 神经网络训练
- 学习率/网络训练方法
- 网络参数初始化
- 网络参数可以都设置0么
- 有什么常见的初始化方法
- 超参数如何优化
神经网络梯度消失与梯度爆炸
简述现象
层数比较多的神经网络模型在训练的时候会出现梯度消失和梯度爆炸问题。梯度消失问题和梯度爆炸问题一般会随着网络层数的增加变得越来越明显
- 梯度消失问题发生时,靠近输出层的hidden layer 3的权值更新相对正常,但是靠近输入层的hidden layer1的权值更新会变得很慢,导致靠近输入层的隐藏层权值几乎不变,扔接近于初始化的权值。这就导致hidden layer 1 相当于只是一个映射层,对所有的输入做了一个函数映射,这时此深度神经网络的学习就等价于只有后几层的隐藏层网络在学习。
- 梯度爆炸的情况是:当初始的权值过大,靠近输入层的hidden layer 1的权值变化比靠近输出层的hidden layer 3的权值变化更快,就会引起梯度爆炸的问题
产生梯度消失的根本原因
最大值是1/4。我们一般会使用标准方法来初始化网络权重,即使用一个均值为0标准差为1的高斯分布。因此,初始化的网络权值通常都小于1。层数越多,求导结果越小,最终导致梯度消失的情况出现
梯度爆炸的根本原因
w比较大的情况。则前面的网络层比后面的网络层梯度变化更快,引起了梯度爆炸的问题
当激活函数为sigmoid时,梯度消失和梯度爆炸哪个更容易发生?
梯度爆炸问题在使用sigmoid激活函数时,出现的情况较少,不容易发生。
因为要剃度爆炸就要求
,对于sigmod而言,x数值变化范围很窄
如何解决梯度消失和梯度爆炸
梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑以下三种方案解决:
- 用ReLU、Leaky ReLU、PReLU、RReLU、Maxout等替代sigmoid函数。
- 用Batch Normalization。
- LSTM的结构设计也可以改善RNN中的梯度消失问题。
激活函数
sigmod
Sigmoid函数在历史上曾经非常的常用,输出值范围为[0,1]之间的实数。然而现在它已经不太受欢迎,实际中很少使用。原因是sigmoid存在3个问题:
- sigmoid函数饱和使梯度消失
- sigmoid函数输出不是“零为中心”
一个多层的sigmoid神经网络,如果你的输入x都是正数,那么在反向传播中w的梯度传播到网络的某一处时,权值的变化是要么全正要么全负。
当梯度从上层传播下来,w的梯度都是用x乘以f的梯度,因此如果神经元输出的梯度是正的,那么所有w的梯度就会是正的,反之亦然。 - 指数函数的计算是比较消耗计算资源的
tanh
- 优点:
1.tanh解决了sigmoid的输出非“零为中心”的问题。 - 缺点:
1.依然有sigmoid函数过饱和的问题。
2.依然指数运算。
ReLU
- 优点:
1.ReLU解决了梯度消失的问题,至少x在正区间内,神经元不会饱和。
2.由于ReLU线性、非饱和的形式,在SGD中能够快速收敛。
3.计算速度要快很多。ReLU函数只有线性关系,不需要指数计算,不管在前向传播还是反向传播,计算速度都比sigmoid和tanh快。 - 缺点:
1.ReLU的输出不是“零为中心”(Notzero-centered output)。
2.随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。这种神经元的死亡是不可逆转的死亡。
Leaky ReLU
- 优点:
1.神经元不会出现死亡的情况。
2.对于所有的输入,不管是大于等于0还是小于0,神经元不会饱和。
2.由于Leaky ReLU线性、非饱和的形式,在SGD中能够快速收敛。
3.计算速度要快很多。Leaky ReLU函数只有线性关系,不需要指数计算,不管在前向传播还是反向传播,计算速度都比sigmoid和tanh快。 - 缺点:
1.Leaky ReLU函数中的α,需要通过先验知识人工赋值。
优化方法
SGD
Momentum
Adagrad
自适应梯度算法,出现频率较低参数采用较大的α更新.出现频率较高的参数采用较小的α更新
RMSprop
Adagrad会累加之前所有的梯度平方,RMProp仅仅是计算对应的平均值.可以缓解Adagrad算法学习率下降较快的问题
Adam
利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率
其中用到了无偏估计
牛顿法
如果函数一阶可导,那么函数取得极值时,一阶导数为0,梯度下降的目的是直接求解目标函数极小值,而牛顿法则变相地通过求解目标函数一阶导为零的参数值,进而求得目标函数最小值
在x_0的一阶泰勒展开
具体地,当要求解 f(θ)的极值时,如果 f 二阶可导,那么可以通过迭代公式。
当θ是向量时,牛顿法可以使用下面式子表示:
其中叫做海森矩阵, 表示的是海森矩阵的逆矩阵 ,其实就是目标函数对参数θ的二阶导数
优点:
- 海森矩阵的逆就好比梯度下降法的学习率参数alpha。牛顿法收敛速度相比梯度下降法很快,而且由于海森矩阵的的逆在迭代中不断减小,起到逐渐缩小步长的效果。
- 牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。
缺点:
计算海森矩阵的逆比较困难,消耗时间和计算资源。因此有了拟牛顿法
拟牛顿法
拟牛顿法的本质思想是改善牛顿法每次需要求解复杂的Hessian矩阵的逆矩阵的缺陷,它使用正定矩阵来近似Hessian矩阵的逆,从而简化了运算的复杂度
共轭梯度法
- 共轭梯度法是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点。
- 其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数
Batch Normalization
为什么传统的神经网络在训练开始之前,要对输入的数据做Normalization?
- 神经网络学习过程本质上是为了学习数据的分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;
- 另一方面,一旦在mini-batch梯度下降训练的时候,每批训练数据的分布不相同,那么网络就要在每次迭代的时候去学习以适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对所有训练数据做一个Normalization预处理的原因
深度神经网络模型的训练为什么会很困难
深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致后面层的输入数据分布发生变化,数据通过层层叠加的网络,靠近输出层的隐层网络输入分布变化会非常的剧烈,这就使得靠近输出层的隐层网络需要不断的去重新适应前面层的参数更新
什么是Batch Normalization?
难点:归一化容易,但是我们变换之后之前学习的东西就消失了
解决办法:变换重构。变换重构是为了让因训练所需而刻意加入的Normalization能够有可能还原到最初的输入
BN算法在CNN中往往放在每个卷积层之后,ReLU操作之前。在CNN中使用BN是把每个特征图看做一个神经元,计算该特征图对应数据的均值和方差进行归一化,并且每个特征图对应两个学习变量γ、β
Batch Normalization的优点
(1)可以使用更高的学习率,BN有快速收敛的特性
(2)模型中BN可以代替dropout或者使用较低的dropout
(3)减少L2权重衰减系数。用了Batch Normalization后,可以把L2权重衰减系数降低,论文中降低为原来的5倍。
(4)BN本质上解决了反向传播过程中梯度消失的问题
因为数据使用BN后,归一化的数据仅使用了sigmoid线性的部分。
(5)可以把训练数据彻底打乱。防止了每批训练的时候,某一个样本经常被挑选到。论文中指出这个操作可以提高1%的精度
神经网络训练
学习率/网络训练方法
网络参数初始化
网络参数可以都设置0么
在感知器和逻辑回归中,一般将参数初始化为0,但是在神经网络中如果把参数初始化为0,就会导致在第一次前向计算时,所有隐藏层神经元的激活值都相同,这样会导致深层神经元没有区分性,这种现象称为对称权重现象
有什么常见的初始化方法
- 高斯初始化。参数服从一个固定均值和固定方差的高斯分布进行随机初始化。
当一个神经元的输入连接数量为n时,可以考虑其输入连接权重以的高斯分布进行初始化,如果同时考虑神经元的输出连接数量为m时,可以按照进行高斯分布初始化 - 均匀分布初始化。参数可以在[-r,r]之间采用均匀分布进行初始化。
总结:实际中均匀初始化用的多。
超参数如何优化
- 网格搜索
- 随机搜索。
有的超参数(比如正则项系数)对模型的影响有限,有的超参数(比如学习率)对模型的影响比较大,网格搜索会在影响不大的超参数上浪费时间。
一种在实践中比较有效的方法是对超参数进行随机组合(比如不太重要的参数进行随机抽取,重要的参数可以按照网格搜索的方式选择),选择表现最好的参数作为结果,这就是随机搜索
思考:
网格搜索和随机搜索没有利用超参数之间的相关性,即如果模型的超参数组合比较类似,其模型的性能表现也是比较接近的,这时候网格搜索和随机搜索就比较低效。下面介绍两种自适应的超参数优化方法:贝叶斯优化和动态资源分配
- 动态资源分配
在超参数优化中,每组超参数配置的评估代价很高,如果我们可以在较早的阶段就估计出该组超参数效果就比较差,然后提前终止该组参数的测试,从而将更多的资源留给其他。这个问题可以归结为多臂赌博机问题的一个泛化问题,即最优臂问题,即在给定有限次数的情况下,如何获取最大收益。
动态资源分配的一种有效方法是逐层减半(successive halving),将超参数优化看作是一种非随机的最优臂问题 - 贝叶斯优化。是一种自适应的超参数优化方法,根据当前已经试验的超参数组合,来预测下一个可能带来最大收益的组合