BP算法是深度学习中最重要也是最基础的算法之一,也是Hinton本人的图灵奖工作之一。更重要的是,BP是深度学习岗位面试必问题之一。本文会以最容易理解的方式来介绍反向传播,避免大量公式。
1. 前向传播和反向传播
前向还是反向区别在于计算顺序。我们通常把inference称为前向,因为计算顺序是从浅层到深层,一层一层地传递。而反向传播就是从深层到浅层。
先看一个二层感知机网络,如上图。每条虚线代表一个权重w,每个节点会带有一个b。在一开始会给所有权重初始化赋值,当模型没有被训练的时候也能有前向传播的输出。
每一次模型前向传播的输出y,我们会拿y和标准答案进行比较,就会有一个量化差异
。
我们把这个量化差异称为损失函数,用公式就可以表示。训练模型就是为了最下化输出值和标准答案的差异,即 最小化损失函数:
(公式 1)
损失函数可以根据具体任务选取,比如分类任务可以使用交叉熵,超分辨率任务可以使用MSE等等。在本文中,我们不讨论损失函数的选取。咱们只需要明白,损失函数就是这一轮模型输出和标准答案(即标签)差异的量化结果。
2. 梯度
事实上,方向传播中梯度的定义和咱们以前在高数里学习的梯度是有区别的。不过思想是互通的。
上节提到的“最小化损失函数”,咱在这节要将具体方法。只需要把每层参数加以“斧正”,则最后的输出就会越接近标准答案(标注值),从而损失函数值会越低。
那么参数该如何“斧正”呢?每次斧正多少呢?答:使用梯度来斧正,每次斧正的量就是一个负梯度。
用公式来表示就是(w表示网络参数):
在本来的参数值上再加一个增量值(该增量可以为负),就变为更新后的参数。所以,我们只用确定了就直到该怎么优化网络了。当然,这也是反向传播算法的精髓。公式如下:
(公式 2)
用一句话来解释:直接通过偏导寻找参数对于损失函数的负梯度。
怎么计算偏导?
链式法则走一波,放心,本文是不会介绍链式法则的。
下图截自西瓜书:误差反向传播算法
3. 异形层反向传播
掌握第2节就可以明白Hinton老爷子最初的反向传播算法了。可是,随着神经网络的发展,咱们的网络层可不止多层感知机呀。当遇到卷积层,最大池化,平均池化,空洞卷积,反卷积,子像素卷积等等异形网络层的时候,怎么传播呢?
尤其是池化层和pixel shuffle这种并不可导的网络层。在神经网络里,我们通常可以用一个函数来建模一个网络层,如果所有的网络层都是可导函数,则我们可以通过链式法则计算任何一层的梯度完成训练。事实上,并不是所有网络层都是可导的。
有一篇关于卷积层和池化层的反向传播文章《卷积池化反向传播》,大家可以先看着。
我先留个坑,以后时间充足再来详细解析异形层的反向传播。