机器学习基础二-反向传播
神经网络之所以可以训练,得益于与Hinton在1986年提出的反向传播算法。反向传播背后的数学原理就是链式法则。本文会具体的实例来演示反向传播具体的计算过程,让大家有一个实际的印象。文中公式都是一个字符一个字符敲出来的,转载请注明出处。文中参考了其他作者的一些例子和数据,均在参考文献中列出。
一个简单的两层神经网络如上图所示。其中
: 训练时候实际的输入
: 训练时候实际的输出(ground truth)
: 模型预测的结果
我们的目的就是通过反向传播,更新模型的参数, 使得尽可能的逼近。
本例中激活函数用;
损失函数用
前向传播
- 隐藏层计算
同理
- 输出层计算
同理
最终我们看到前向传播的结果为(0.75136507,0.772928465)与我们的目标(0.01,0.99)差的比较多,所以接下来用反向传播算法学习
反向传播
要想反向传播,还需要两步(1)计算损失,(2)计算梯度。过程如下图所示
总的损失,其中
- 计算参数的梯度
根据链式法则,公式如下:
所以
在计算后面参数的梯度时,都会需要用到的值。我们把这个称为输出层的误差
, 符号记为:
- 计算参数的梯度
要计算的梯度,就要计算, 如上图所示,有两条路线(图中蓝色箭头)会向传播梯度。
上式中 在计算的梯度时已经计算好了。
所以
最终
补充说明
- sigmod求导推导
- 分类任务,输出层损失
以上是以sigmod激活,MSE损失的反向传播(回归问题);如果已经softmax激活,交叉熵顺序的反向传播如何呢(分类问题)?
如何计算分类问题的输出层损失
,符号定义如下
- : 网络最后未经过激活的输出
- : 经过激活后的输出(这里激活函数为softmax)
- : one_hot编码后target的分量
- N: 类别的数量,等于length()
已知:
下求:损失层输出
其中
所以
这是一个非常简洁的形式,可直接使用
以上以多层感知机网络为例,详细说明了反向传播的计算过程
全连接神经网络反向传播的一般形式
定义全连接神经网络
: 神经网络第l层的输入, 初始化输入
:激活后的输出
: 神经网络第l层的参数
: 神经网络第l层的参数的偏置项
那么神经网络前项传播的过程为:
, 为激活函数
模型的损失函数定义为:
。
反向传播需要计算
。
定义为l层的误差,记。
这里需要好好理解一下为什么用,因为涉及到矩阵的运算,所以建议好好理解一下,可以借助于上图。那只要再计算就可以了
最后一层输出层的误差
那么通过计算L层,L-1,L-2等等这样的计算就可以计算每一层的参数的梯度。
卷积网络-反向传播
参考文献