深度神经网络为什么难以训练

前向传播和反向传播求导过程

​ 首先,要讨论神经网络为什么难以训练这个问题,就必须要明确神经网络的运算过程和参数更新过程,以一个简单的前向神经网络为例,首先理解一下神经网络的前向传播和反向传播的过程。(公式太多了,只能无奈手写)。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

​ 从以上的推导过程中,我们其实可以得到几个很有意思的结论:

  1. 神经网络的各层的参数更新速度是不一样的。由上图中的反向传播过程的计算可知,神经网络的反向传播过程是基于导数的链式求导法则的,第 i i i层的参数 w j i w^{i}_{j} wji对于损失值 L L L的偏导值 ∂ L ∂ w j i \frac{\partial L}{\partial w^{i}_{j}} wjiL是依赖于第 i + 1 , i + 2 , … , n i+1,i+2,…, n i+1i+2,,n层的偏导值的,这使得网络各层的参数更新速度必然会有差异。
  2. 梯度消失和梯度爆炸的问题往往发生在离输入层较近的那些隐藏层中。由反向传播的链式求导过程可以知道,如果网络较深的话,当各层偏导值均大于1时,利用反向传播更新离输入层较近的参数会使得偏导值非常大,产生梯度爆炸的问题;当各层偏导值均小于1时,利用反向传播更新离输入层较近的参数会使得偏导值非常小,产生梯度消失的问题(其实不一定是所有位置的偏导值都大于或者1,只要这个链式求导过程能使得最后的值变得非常小伙非常大就可以)。

梯度消失 vs 梯度爆炸

梯度消失和梯度爆炸问题的产生原因前一节其实已经说完了,主要是因为深度网络中链式求导的过程使得网络中较靠前的网络层的偏导值非常大或者非常小,从而导致了参数更新速度过大或者过小,产生梯度爆炸和梯度消失的问题。这一节主要想从不同的角度讨论一下梯度消失和梯度爆炸问题。

从神经网络的深度来说

​ 这一点上毋庸置疑,直观上就能理解,当网络的深度非常大时,我们不能一厢情愿的认为网络中各层的偏导值会出现 [ 2 , 0.5 , 4 , 0.25 , 5 , 0.2 … … ] [2,0.5,4,0.25,5,0.2……] [2,0.5,4,0.25,5,0.2]这样的情况,使得较靠前的网络层的参数的偏导值即使在非常深的网络中也能非常合理。实际上,由于网络中各层参数的偏导值之间都是相互依赖的,这使得在从后往前求各层偏导时,各层偏导值的变化趋势更容易趋于一致,即从后往前偏导值呈逐层增大趋势或者逐层减小趋势(并不是严格递增或者递减,只是说整体趋势上的变化)。在神经网络较深时,这种整体的增大或者减小的趋势最终会使得较靠前网络层的参数的偏导值变得非常大或者非常小,从而发生梯度消失或者梯度爆炸。

从激活函数来说

​ 从激活函数的角度来看梯度消失和梯度爆炸的问题,从第一节的推导过程中,我们可以知道,反向传播求导的过程中必定需要求以各神经元的输出值为输入的激活函数的导数值,这使得激活函数的选择,也会在很大程度上影响模型的参数更新过程。举个简单的例子,如果在一个深度网络中,我们采用的是sigmoid函数,函数及其偏导数的图像如下图所示:

在这里插入图片描述

​ 由图中可知,Sigmoid激活函数的导数值永远小余1/4,这使得如果我们在较深的网络中采用Sigmoid激活函数的话,会有很大概率发生梯度消失。而如果我们选择tanh激活函数,由下图可知tanh导函数值的范围在 [ 0 , 1 ] [0,1] [0,1]之间,这样情况会比我们选择Sigmoid激活函数时好得多,但同样无法解决梯度消失的问题。当然我们也可以考虑其他的比如ReLU这样的激活函数或者从模型结构层面来解决梯度爆炸和梯度消失的问题。具体的一些方法可以参考详解机器学习中的梯度消失、爆炸原因及其解决方法,在这篇文章中大佬给出了一些比较具体的解决办法(感谢大佬的整理,给渣渣指明了学习的方向)。
在这里插入图片描述

9506893424)]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值