1.梯度消失/梯度爆炸
训练神经网络,尤其是深度神经所面临的一个问题就是梯度消失或梯度爆炸(Vanishing/Exploding gradients),也就是你训练神经网络的时候,导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度。
举个例子,假设我们有如下神经网络层:
网络层数 = L,每层包含2个激活单元,每一层的权重矩阵W都相同,且,且假设bias都为0为了简单起见,激活函数我们不用sigmoid/ReLu,而使用传统的线性激活函数 ,则假设函数可以写成:
假设x1 = x2 = 1,则经过神经网络模型得出的预测值y = ,如果对于一个深度神经网络来说如果L足够大,即网络足够深,可以看见其预测值y将呈现指数级增长,增长的比率是,同理,如果权重矩阵是,则将是指数下降。最近 Microsoft 对 152 层神经网络的研究取得了很大进展,在这样一个深度神经网络中,如果激活函数或梯度函数以与L相关的指数增长或递减,它们的值将会变得极大或极小,从而导致训练难度上升,尤其是梯度指数小于L时,梯度下降算法的步长会非常非常小,梯度下降算法将花费很长时间来学习。这便是梯度消失和梯度爆炸的含义。
2.神经网络的权重初始化
上节课,我们学习了深度神经网络如何产生梯度消失和梯度爆炸问题,最终针对该问题,我们想出了一个不完整的解决方案,虽然不能彻底解决问题,却很有用,有助于我们为神经网络更谨慎地选择随机初始化参数,为了更好地理解它,我们先举一个神经单元初始化地例子,然后再演变到整个深度网络
Var表示求方差的意思,权重的方差 = 1/n,即权重分布符合~。
标准的权重初始化公式在Python中可以表示如下:
其中,就是喂给第l层神经单元的数量,即l-1层神经元数量。上面的公式通常适用于tanh激活函数,如果激活函数用的是ReLu,则更适合。具体证明和推导可以参考相关论文。
希望你现在对梯度消失或爆炸问题以及如何为权重初始化合理值已经有了一个直观认识,希望你设置的权重矩阵既不会增长过快,也不会太快下降到 0,从而训练出一个权重或梯度不会增长或消失过快的深度网络。我们在训练深度网络时,这也是一个加快训练速度的技巧。
3.梯度的数值逼近
在实施 backprop(反向传播)时,有一个测试叫做梯度检验,它的作用是确保反向传播正确实施。因为有时候,反向传播求梯度时会有些问题,譬如在代码经行矩阵计算中可能会有bug。为了逐渐实现梯度检验,我们需要先了解梯度的数值逼近,下面看一个例子:
假设函数我们要在θ = 1的地方对其实行梯度逼近,逼近的策略其实可以从两个方向,。这里取ε = 0.01,如下图我们可以得到两个小三角形:
4.反向传播的梯度检验
梯度检验的目的就在于检测反向传播计算过程中的bug,检验 backprop 的实施是否正确。
假设神经网络中有下列参数:,为了执行梯度检验,需要把所有的W矩阵转化为参数向量θ,针对参数向量θ中的每个组成元素,其梯度,我们用双边误差来计算其逼近梯度,逼近梯度的表达式如下:
然后,我们用下面的式子计算梯度间的误差程度:
譬如此时我用来计算,通过计算得到次方程式的值<=,则梯度下降是正常的,如果得到的值或者更大如,则需要检测所有的θ项,看看是否存在一个i值,使得差距过大。
注意事项:
- 首先,不要在训练中使用梯度检验,它只用于调试
- 第二点,如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出 bug
- 第三点,在实施梯度检验时,如果使用正则化,请注意正则项
- 梯度检验不能与 dropout 同时使用,因为每次迭代过程中, dropout 会随机消除隐藏层单元的不同子集,难以计算 dropout 在梯度下降上的代价函数J