在之前对多层感知机的实现过程中,只考虑了感知机在进行前向传播时所进行的计算,对于涉及梯度计算的反向传播并未进行过多赘述,仅调用深度学习框架所提供的反向传播函数进行自动梯度计算。因此在本节内容中,针对深度学习模型在训练时的前向传播以及反向传播过程进行了介绍。

一、前向传播

前向传播过程主要是指按输入层 -> 隐藏层 -> 输出层顺序传递数值进行计算并存储结果的过程。


前向传播 代码 前向传播和反向传播_人工智能

以上述图中多层感知机结构为例:


从输入层到隐藏层的计算为:


前向传播 代码 前向传播和反向传播_反向传播_02


从隐藏层到输出层的计算为:


前向传播 代码 前向传播和反向传播_深度学习_03


通过该过程,神经网络可以得到一个输出值前向传播 代码 前向传播和反向传播_反向传播_04,用于计算与训练集中真实值前向传播 代码 前向传播和反向传播_前向传播 代码_05的误差,该误差会在反向传播过程中用到,来实现对参数前向传播 代码 前向传播和反向传播_多层感知机_06的修正,输出预测值与真实值的误差损失可用前向传播 代码 前向传播和反向传播_深度学习_07表示:


前向传播 代码 前向传播和反向传播_人工智能_08


同时根据之前学到的前向传播 代码 前向传播和反向传播_前向传播 代码_09正则定义,对于参数前向传播 代码 前向传播和反向传播_深度学习_10,将其视作拓展后的矩阵前向传播 代码 前向传播和反向传播_反向传播_11,存在给定超参数前向传播 代码 前向传播和反向传播_人工智能_12,使得正则化项为:


前向传播 代码 前向传播和反向传播_人工智能_13


综合损失项和正则化项后,施加在模型上的最终损失为:


前向传播 代码 前向传播和反向传播_前向传播 代码_14


这个从输入层到输出层的计算过程,就是多层感知机的前向传播过程。绘制前向传播的计算图,可以有助于对计算中操作符和变量关系的可视化,多层感知机的计算图可用下图表示:


前向传播 代码 前向传播和反向传播_前向传播 代码_15

二、反向传播

如果说前向传播是从输入层到输出层的过程,那顾名思义,反向传播就是从输出层反向向输入层传递计算值的过程,该方法根据微积分中的链式规则,按相反的顺序从输出层到输入层遍历网络。本质上,反向传播是一种求梯度的高效方法,可以理解为模型的 “学习” 过程。


前向传播 代码 前向传播和反向传播_多层感知机_16


前面在前向传播中提到,前向传播中产生的误差损失会在反向传播中使用。具体如下:

  1. 针对损失项和正则项分别计算损失函数前向传播 代码 前向传播和反向传播_反向传播_17的梯度
    前向传播 代码 前向传播和反向传播_多层感知机_18
  2. 根据链式法则,计算目标函数关于输出变量前向传播 代码 前向传播和反向传播_人工智能_19的梯度,以及关于权重参数前向传播 代码 前向传播和反向传播_多层感知机_20的梯度
    前向传播 代码 前向传播和反向传播_人工智能_21
    前向传播 代码 前向传播和反向传播_人工智能_22
    前向传播 代码 前向传播和反向传播_反向传播_23
  3. 继续沿梯度图向输入层方向移动,获得关于前向传播 代码 前向传播和反向传播_反向传播_24的梯度
    前向传播 代码 前向传播和反向传播_前向传播 代码_25
    前向传播 代码 前向传播和反向传播_多层感知机_26

    由于激活函数ReLU在计算时按元素对应进行计算,因此计算中间变量前向传播 代码 前向传播和反向传播_反向传播_27时使用元素乘法前向传播 代码 前向传播和反向传播_前向传播 代码_28

    前向传播 代码 前向传播和反向传播_人工智能_29

    最终得到关于前向传播 代码 前向传播和反向传播_反向传播_24的梯度:

    前向传播 代码 前向传播和反向传播_多层感知机_31
  4. 根据得到的梯度值对前向传播 代码 前向传播和反向传播_反向传播_32进行更新,得到最新的权重矩阵前向传播 代码 前向传播和反向传播_人工智能_33
    前向传播 代码 前向传播和反向传播_人工智能_34

总结: 归根到底,正向传播与反向传播是一个学习参数,计算误差,然后求导对参数更新的过程。可以理解为一次作业的完成过程:写作业(前向传播)-> 老师审阅(计算误差)-> 打回修改(反向传播) -> 完成作业(训练完成)