1.梯度爆炸/梯度消失
1.1.概念
梯度爆炸/梯度消失:训练神经网络的过程中,由于网络层数过多以及激活函数选择原因,出现的导数很大或很小的现象,导致训练难度加大。
举一个栗子:假如网络的每层每个权重值都>1,就是1.5,忽略偏置b,网络有100层,激活函数是线性激活函数即输出原值,那么1.5的100次方约为406,561,177,535,215,237,这就是指数爆炸带来的效果。如果权重值都<1,那么网络层数很多的话,输出就会趋于0,也就是梯度消失。
1.2.如何解决梯度爆炸/梯度消失
解决方法就是权重初始化。在基础部分,我们已经讨论了如何进行权重初始化。深度学习基础—常见激活函数、如何快速理解网络维度、新手训练神经网络的技巧http://t.csdnimg.cn/1zGGn
现在对该公式进行一个改动:将权重设置为权重的方差=1/n(最合理的初始权重,也被称为Xavier初始化),n表示输入向量的特征维度,即上一层神经元的数量。对于不同的激活函数,选择不同的初始化方式。
对于Relu函数:
对于Tanh函数:
randn函数会产生标准正态分布,即均值为0,方差为1,我们的目标是将权重的方差变为1/n,因此需要乘sqrt(1/n)。乘sqrt(1/n)而不是乘1/n的原因是,方差运算法则:D(c*x)=c2*D(x)。
我们还可以添加方差超参数,即给sqrt(1/n)的根号下乘以一个乘子,让这个超参数作为调优参数,但是有时候这个参数效果一般,因此考虑它的优先级较低。
1.3.梯度检验
我们使用双边误差进行梯度检验。单边误差公式如下:
双边误差公式:
可以看出,双边误差公式精度更高(误差项阶数高,可以用泰勒展开来推导),因此使用双边误差来进行梯度检验。
假设网络包含参数W[1]、b[1]、......、W[L]、b[L],将这些参数转化成向量,然后把向量连接成一个巨大的向量θ,反向传播时,把参数dW[1]、db[1]、......、dW[L]、db[L]转化成dθ,于是J(w,b)就转化成J(θ)。遍历每一个i对应的θ[i],做双边误差:
验证:
如果上式的值大于10^(-5),就需要寻找网络中可能出现问题的地方。如果小于10^(-5)就证明网络按照预期的正确运行。
注意:
1.不要在训练中使用梯度检验。
2.如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出bug。Bug很有可能出现在出问题的θ[i]对应的层。
3.在实施梯度检验时,如果使用正则化,请注意正则项,求梯度时需要把正则项的梯度一并求出来。
4.梯度检验不要和dropout正则化一起使用。
5.在随机初始化过程中,运行梯度检验,然后再训练网络,w和b会有一段时间远离0,如果随机初始化值比较小,反复训练网络之后,再重新运行梯度检验。即在训练网络前和训练网络后都使用一次梯度检验,验证网络是否正确运行。
2.Mini-batch 梯度下降
与梯度下降法不同的是,Mini-batch 梯度下降法会将训练集分为多个子集,每个子集被称为Mini-batch 。在每个Mini-batch上使用梯度下降法,这比对所有训练集一起使用梯度下降法的训练速度更快。举个栗子:人的力气是有限的,梯度下降法就像人一口气猛冲把所有劲用光(400米运动),而Mini-batch 梯度下降法更像人进行慢跑,直到没劲。实际上大家会发现慢跑跑的距离远比猛冲跑的距离远。我们把力气比作训练集,把距离远近比作模型收敛程度,于是可以得出结论,Mini-batch 梯度下降法能加快网络的训练速度。
2.1.算法流程
计算完循环后,这是对所有的训练集进行了一次迭代(1 epoch),因此后续还需要嵌套循环进行多次迭代,直到网络满足误差要求。
2.2.Mini-batch大小Mini-batch 梯度下降法的影响
接下来看看不同的Mini-batch大小Mini-batch 梯度下降法会有什么变化(m为训练集的样本的个数):
Mini-batch大小 | 算法 | 缺点 | 适用场景 | 改进建议 |
1 | 随机梯度下降法(SGD) | 失去向量化带来的加速 | 训练集大 | 减小学习率 |
1~m | Mini-batch 梯度下降法 | 网络无法收敛,在收敛点附近摆动 | 训练集大 | 选择合适的大小:2^n次方 |
m | 梯度下降法 | 单次迭代耗时长 | 训练集少 | 分批向量化 |
实际中常用的Mini-batch大小有:64、128、256、512等。因为计算机是二进制运算,因此二进制的代码能加速代码的运行。
2.3.理解Mini-batch大小的影响
上图紫线表示Mini-batch大小=1是的优化路径,可以看出来有很多噪声,这是因为过小的Mini-batch中每个样本集的偏离程度不同,所以更容易影响优化路线导致有时候网络的损失上下浮动,但是损失整体是逐渐减小的,并不会收敛到最小值,而是在最小值附近浮动。绿线表示合适的Mini-batch大小的优化路径,它的最终值也是在最小值附近浮动,但是比紫线更接近最小值。蓝线表示Mini-batch大小=m的优化路径,噪声更低,调整幅度也更大,最终可以收敛到最小值。