机器学习基础之反向传播

机器学习基础二-反向传播

神经网络之所以可以训练,得益于与Hinton在1986年提出的反向传播算法。反向传播背后的数学原理就是链式法则。本文会具体的实例来演示反向传播具体的计算过程,让大家有一个实际的印象。文中公式都是一个字符一个字符敲出来的,转载请注明出处。文中参考了其他作者的一些例子和数据,均在参考文献中列出。

image.png

一个简单的两层神经网络如上图所示。其中

: 训练时候实际的输入

: 训练时候实际的输出(ground truth)

: 模型预测的结果

我们的目的就是通过反向传播,更新模型的参数, 使得尽可能的逼近

本例中激活函数用;

损失函数用

前向传播

  1. 隐藏层计算

同理

  1. 输出层计算

同理

最终我们看到前向传播的结果为(0.75136507,0.772928465)与我们的目标(0.01,0.99)差的比较多,所以接下来用反向传播算法学习

反向传播

要想反向传播,还需要两步(1)计算损失,(2)计算梯度。过程如下图所示


image.png

总的损失,其中

  1. 计算参数的梯度
    根据链式法则,公式如下:

所以

在计算后面参数的梯度时,都会需要用到的值。我们把这个称为输出层的误差, 符号记为:

  1. 计算参数的梯度
    要计算的梯度,就要计算, 如上图所示,有两条路线(图中蓝色箭头)会向传播梯度。

上式中 在计算的梯度时已经计算好了。

所以

最终
\frac{\partial E_{total}}{\partial w_1}=\frac{\partial E_{total}}{\partial out_{h1}}*\frac{\partial out_{h1}}{\partial net_{h1}}*\frac{\partial net_{h1}}{\partial net_{w_1}}=0.036350306*out_{h1}*(1-out_{h1})*i_1=0.036350306*0.593269992*(1-0.593269992)*0.05=0.000438568

补充说明

  • sigmod求导推导

  • 分类任务,输出层损失

以上是以sigmod激活,MSE损失的反向传播(回归问题);如果已经softmax激活,交叉熵顺序的反向传播如何呢(分类问题)?
如何计算分类问题的输出层损失,符号定义如下

  1. : 网络最后未经过激活的输出
  2. : 经过激活后的输出(这里激活函数为softmax)
  3. : one_hot编码后target的分量
  4. N: 类别的数量,等于length()

已知:

下求:损失层输出

其中

\sum_{j\not =i}^N\frac{\partial loss}{\partial p_j}*\frac{\partial p_j}{\partial z_i}=-\sum_{j\not =i}^N\frac{q_j}{p_j}*\frac{e^{z_j}}{-(\sum_k^Ne^{z_k})^2}*e^{z_i}=-\sum_{j\not =i}^N\frac{q_j}{p_j}*(-p_j*p_i)=\sum_{j\not =i}^Nq_j*p_i

所以

这是一个非常简洁的形式,可直接使用

以上以多层感知机网络为例,详细说明了反向传播的计算过程

全连接神经网络反向传播的一般形式

定义全连接神经网络

: 神经网络第l层的输入, 初始化输入

:激活后的输出

: 神经网络第l层的参数

: 神经网络第l层的参数的偏置项

那么神经网络前项传播的过程为:

, 为激活函数

模型的损失函数定义为:

反向传播需要计算

全连接神经网络示意图

定义为l层的误差,记。

这里需要好好理解一下为什么用,因为涉及到矩阵的运算,所以建议好好理解一下,可以借助于上图。那只要再计算就可以了

最后一层输出层的误差

那么通过计算L层,L-1,L-2等等这样的计算就可以计算每一层的参数的梯度。

卷积网络-反向传播

参考文献

  1. A Step by Step Backpropagation Example
  2. 一文弄懂神经网络中的反向传播法——BackPropagation
  3. 全连接神经网络中反向传播算法数学推导

你可能感兴趣的:(机器学习基础之反向传播)