深度学习-前向传播与反向传播2

不同损失函数与激活函数所带来的训练的不同

C=\frac{1}{2}(y'-y)^2,\sigma=sigmoid() C=-ylogy'-(1-y)log(1-y'),\sigma=sigmoid() C=-\sum y_ilogy_i'\sigma^l=sigmoid(),\sigma^L=softmax()
导数 C'=y'-y,\sigma'=\sigma(1-\sigma) C'=\frac{1-y}{1-y'}-\frac{y}{y'},\sigma'=\sigma(1-\sigma) C'(a^L_i)=-\frac{1}{a^L_i} , softmax'(z^L_i)=a^L_i(1-a^L_i)
\delta^L=C'\odot\sigma' (a^L-y)\odot\sigma(1-\sigma) a^L-y (0,0,...,a^L_i-1,..,0)^T
\frac{\partial C}{\partial W^L} \delta^L(a^{L-1})^T \delta^L(a^{L-1})^T \delta^L(a^{L-1})^T
\delta^l (W^{l+1})^T\delta^{l+1}\odot\sigma'(z^l) (W^{l+1})^T\delta^{l+1}\odot\sigma'(z^l) (W^{l+1})^T\delta^{l+1}\odot\sigma'(z^l)
\frac{\partial C}{\partial W^l} \delta^l(a^{l-1})^T \delta^l(a^{l-1})^T \delta^l(a^{l-1})^T
\frac{\partial C}{\partial b^l} \delta^l \delta^l \delta^l

对比前两列,最大的不同在\delta^L,使用交叉熵的模型少乘了一个\sigma',而\sigma'往往是很小的(只在0附近比较大),所以第二列会比第一列收敛快。

但关键是在\delta^l,大家都一样,但是随着l的不断减小,累乘的\sigma'越来越多,最后导致有的\delta^l越来越小趋近于0造成梯度消失(因为0<sigmoid'\le0.25)。这样导致底层网络权重得不到有效训练。同样,有的激活函数导数可能会很容易>1,这样就会造成梯度爆炸。总结起来就是,由于反向传播算法的固有缺陷,在网络层数过多时,会出现梯度学习问题,为了解决有如下常用方法,具体见上链接。

  • 针对梯度爆炸,可以人为设定最大的梯度值,超过了就等于最大梯度值。这种做法叫梯度剪切。另外也可以对权重做正则化,来确保每次权重都不会太大。
  • 针对梯度消失,如果激活函数的导数=1,那么就不会出现消失或爆炸,于是提出了ReLu激活函数
    另外还有残差网络,batchnorm等技术

根本上就是针对BP的\delta^l的组成,要么从激活函数导数入手,要么从权重W入手,要么从连乘的传递结构入手等等。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容