神经网络-反向传播(bp算法)
1.推导公式:
先右后左,一个样本的损失函数E,对以下偏导,其中L是层数,也就是最后一层,2<=<=L。
输出层参数wij的偏导:
输出层偏置项bi的偏导:
隐藏层l参数wij的偏导:
隐藏层l参数bi的偏导:
输出层的权重wij与神经元当前的输出有关,与当前输出与真实值yi的差值有关,还与上一层关联神经元的输出有关。
隐藏层的权重wij与后一层全部连接的神经元的偏导*后一层权重之和有关,与当前神经元的输出有关,前一层连接的神经元的输出有关。
以上是举例sigmoid**函数,如果**函数换了,也就是把替换成f'(zi);
2.梯度消失和梯度爆炸
有了上面的反向传播推导,我们就可以根据公式来看一下,梯度消失和梯度爆炸是怎样一回事~~
隐藏层梯度等于边上权重与**函数导数乘积,离输出端越远的隐藏层,在逐层梯度反向传播的时候,不断连乘边上权重与**函数导数,一般初始化网络权重值都小于1,当层数增多时,小数连乘,会导致梯度消失,同理,当权重大于1时,不断连乘就会产生梯度爆炸。Sigmoid导数的取值范围在0~0.25之间,使用它作为**函数会加重梯度消失。
梯度消失和梯度爆炸本质上是一样的,都是因为网络层数太深而引发的梯度反向传播中的连乘效应。
梯度爆炸可以通过梯度裁剪/规范,定义一个阈值,比如0.5,当梯度大于阈值时候,利用规范缩减函数,映射回规定范围内,这种方法无法避免梯度消失。
换用Relu(rectified linear unit)、LeakyRelu、Elu等**函数(以下主要摘自:https://zhuanlan.zhihu.com/p/98863801)
ReLu:让**函数的导数为1
ReLU 的公式如下:
ReLU 公式表明:
- 如果输入 x 小于 0,则令输出等于 0;
- 如果输入 x 大于 0,则令输出等于输入。
Relu的导数:
当f(z)=relu,f'(z)不会得到很小的值,非0即1,当z小于0时,f'(z)=0,那么会导致神经元死亡,就是不更新了,可以带来**输出的稀疏性。
- 相比于 sigmoid,由于稀疏性,时间和空间复杂度更低;不涉及成本更高的指数运算;
- 能避免梯度消失问题。
- 死亡 ReLU 问题,即网络的大部分分量都永远不会更新
LeakyReLu:包含了ReLu的几乎所有有点,同时解决了ReLu中0区间带来的影响
ELU:和LeakyReLu一样,都是为了解决0区间问题,相对于来,elu计算更耗时一些(为什么)
待学习:
- dropout 大概知道每次随机停掉一些神经元,前向传播,不计算,反向传播不影响参数更新。
- 神经网络常见损失函数:如交叉熵