神经网络-反向传播(bp算法)

1.推导公式:

先右后左,一个样本的损失函数E,对以下偏导,其中L是层数,也就是最后一层,2<=神经网络-反向传播(bp算法)<=L。

输出层参数wij的偏导:神经网络-反向传播(bp算法)

输出层偏置项bi的偏导:神经网络-反向传播(bp算法)

隐藏层l参数wij的偏导:神经网络-反向传播(bp算法)

隐藏层l参数bi的偏导:神经网络-反向传播(bp算法)

输出层的权重wij与神经元当前的输出有关,与当前输出与真实值yi的差值有关,还与上一层关联神经元的输出有关。

隐藏层的权重wij与后一层全部连接的神经元的偏导*后一层权重之和有关,与当前神经元的输出有关,前一层连接的神经元的输出有关。

以上是举例sigmoid**函数,如果**函数换了,也就是把神经网络-反向传播(bp算法)替换成f'(zi);

 

神经网络-反向传播(bp算法)

2.梯度消失和梯度爆炸

有了上面的反向传播推导,我们就可以根据公式来看一下,梯度消失和梯度爆炸是怎样一回事~~

神经网络-反向传播(bp算法)

隐藏层梯度等于边上权重与**函数导数乘积,离输出端越远的隐藏层,在逐层梯度反向传播的时候,不断连乘边上权重与**函数导数,一般初始化网络权重值都小于1,当层数增多时,小数连乘,会导致梯度消失,同理,当权重大于1时,不断连乘就会产生梯度爆炸。Sigmoid导数的取值范围在0~0.25之间,使用它作为**函数会加重梯度消失。

梯度消失和梯度爆炸本质上是一样的,都是因为网络层数太深而引发的梯度反向传播中的连乘效应。

神经网络-反向传播(bp算法)

梯度爆炸可以通过梯度裁剪/规范,定义一个阈值,比如0.5,当梯度大于阈值时候,利用规范缩减函数,映射回规定范围内,这种方法无法避免梯度消失。

换用Relu(rectified linear unit)、LeakyRelu、Elu等**函数(以下主要摘自:https://zhuanlan.zhihu.com/p/98863801

ReLu:让**函数的导数为1

ReLU 的公式如下:

神经网络-反向传播(bp算法)

ReLU 公式表明:

  • 如果输入 x 小于 0,则令输出等于 0;
  • 如果输入 x 大于 0,则令输出等于输入。

Relu的导数:

神经网络-反向传播(bp算法)

当f(z)=relu,f'(z)不会得到很小的值,非0即1,当z小于0时,f'(z)=0,那么会导致神经元死亡,就是不更新了,可以带来**输出的稀疏性。

  • 相比于 sigmoid,由于稀疏性,时间和空间复杂度更低;不涉及成本更高的指数运算;
  • 能避免梯度消失问题。
  • 死亡 ReLU 问题,即网络的大部分分量都永远不会更新

LeakyReLu:包含了ReLu的几乎所有有点,同时解决了ReLu中0区间带来的影响

ELU:和LeakyReLu一样,都是为了解决0区间问题,相对于来,elu计算更耗时一些(为什么)

待学习:

  • dropout 大概知道每次随机停掉一些神经元,前向传播,不计算,反向传播不影响参数更新。
  • 神经网络常见损失函数:如交叉熵