二、反向传播

2.1 前向传播

  1. 考虑计算单个标量 二、反向传播 - 图1 的计算图:

    • 假设有 二、反向传播 - 图2 个输入节点: 二、反向传播 - 图3 。它们对应的是模型的参数和输入。
    • 假设 二、反向传播 - 图4 为中间节点。
    • 假设 二、反向传播 - 图5 为输出节点,它对应的是模型的代价函数。
    • 对于每个非输入节点 二、反向传播 - 图6,定义其双亲节点的集合为 二、反向传播 - 图7
    • 假设每个非输入节点 二、反向传播 - 图8 ,操作 二、反向传播 - 图9 与其关联,并且通过对该函数求值得到:二、反向传播 - 图10

    通过仔细排序(有向无环图的拓扑排序算法),使得可以依次计算 二、反向传播 - 图11

    二、反向传播 - 图12

  2. 前向传播算法:

    • 输入:

      • 计算图 二、反向传播 - 图13
      • 初始化向量 二、反向传播 - 图14
    • 输出:二、反向传播 - 图15 的值

    • 算法步骤:

      • 初始化输入节点: 二、反向传播 - 图16

      • 根据计算图,从前到后计算 二、反向传播 - 图17。对于 二、反向传播 - 图18 计算过程为:

        • 计算 二、反向传播 - 图19 的双亲节点集合 二、反向传播 - 图20
        • 计算 二、反向传播 - 图21二、反向传播 - 图22
      • 输出 二、反向传播 - 图23

2.2 反向传播

  1. 计算 二、反向传播 - 图24 时需要构造另一张计算图 二、反向传播 - 图25: 它的节点与 二、反向传播 - 图26 中完全相同,但是计算顺序完全相反。

    计算图 二、反向传播 - 图27 如下图所示:

    二、反向传播 - 图28

  2. 对于图中的任意一非输出节点 二、反向传播 - 图29 (非 二、反向传播 - 图30),根据链式法则:

    二、反向传播 - 图31

    其中 二、反向传播 - 图32 表示图 二、反向传播 - 图33 中的边 二、反向传播 - 图34

    • 若图 二、反向传播 - 图35 中存在边 二、反向传播 - 图36,则在图 二、反向传播 - 图37 中存在边 二、反向传播 - 图38,则 二、反向传播 - 图39二、反向传播 - 图40 的子节点。
    • 设图 二、反向传播 - 图41二、反向传播 - 图42 的子节点的集合为 二、反向传播 - 图43,则上式改写作:

    二、反向传播 - 图44

  3. 反向传播算法:

    • 输入:

      • 计算图 二、反向传播 - 图45
      • 初始化参数向量 二、反向传播 - 图46
    • 输出: 二、反向传播 - 图47

    • 算法步骤:

      • 运行计算 二、反向传播 - 图48 的前向算法,获取每个节点的值。

      • 给出一个 grad_table表,它存储的是已经计算出来的偏导数。

        二、反向传播 - 图49 对应的表项存储的是偏导数 二、反向传播 - 图50

      • 初始化 二、反向传播 - 图51

      • 沿着计算图 二、反向传播 - 图52 计算偏导数。遍历 二、反向传播 - 图53二、反向传播 - 图54二、反向传播 - 图55

        • 计算 二、反向传播 - 图56 。其中:二、反向传播 - 图57 是已经存储的 二、反向传播 - 图58二、反向传播 - 图59 为实时计算的。

          二、反向传播 - 图60 中的边 二、反向传播 - 图61 定义了一个操作,而该操作的偏导只依赖于这两个变量,因此可以实时求解 二、反向传播 - 图62

        • 存储 二、反向传播 - 图63

      • 返回 二、反向传播 - 图64

  1. 反向传播算法计算所有的偏导数,计算量与 二、反向传播 - 图65 中的边的数量成正比。

    其中每条边的计算包括计算偏导数,以及执行一次向量点积。

  2. 上述反向传播算法为了减少公共子表达式的计算量 ,并没有考虑存储的开销。这避免了重复子表达式的指数级的增长。

    • 某些算法可以通过对计算图进行简化从而避免更多的子表达式。
    • 有些算法会重新计算这些子表达式而不是存储它们,从而节省内存。

2.3 反向传播示例

  1. 对于 二、反向传播 - 图66,将公式拆分成 二、反向传播 - 图67二、反向传播 - 图68,则有:

    二、反向传播 - 图69

    根据链式法则,有 二、反向传播 - 图70

    假设 二、反向传播 - 图71,则计算图如下。其中:绿色为前向传播的值,红色为反向传播的结果。

    二、反向传播 - 图72

    • 前向传播,计算从输入到输出(绿色);反向传播,计算从尾部开始到输入(红色)。

    • 在整个计算图中,每个单元的操作类型,以及输入是已知的。通过这两个条件可以计算出两个结果:

      • 这个单元的输出值。
      • 这个单元的输出值关于输入值的局部梯度比如 二、反向传播 - 图73二、反向传播 - 图74

      每个单元计算这两个结果是独立完成的,它不需要计算图中其他单元的任何细节。

      但是在反向传播过程中,单元将获取整个网络的最终输出值(这里是 二、反向传播 - 图75 )在单元的输出值上的梯度,即回传的梯度。

      链式法则指出:单元应该将回传的梯度乘以它对其输入的局部梯度,从而得到整个网络的输出对于该单元每个输入值的梯度。如: 二、反向传播 - 图76

  2. 在多数情况下,反向传播中的梯度可以被直观地解释。如:加法单元、乘法单元、最大值单元。

    假设: 二、反向传播 - 图77,前向传播的计算从输入到输出(绿色),反向传播的计算从尾部开始到输入(红色)。

    二、反向传播 - 图78

    • 加法单元 二、反向传播 - 图79,则 二、反向传播 - 图80 。如果 二、反向传播 - 图81,则有:

      二、反向传播 - 图82

      这表明:加法单元将回传的梯度相等的分发给它的输入。

    • 乘法单元 二、反向传播 - 图83,则 二、反向传播 - 图84 。如果 二、反向传播 - 图85,则有:

      二、反向传播 - 图86

      这表明:乘法单元交换了输入数据,然后乘以回传的梯度作为每个输入的梯度。

    • 取最大值单元 二、反向传播 - 图87,则:

      二、反向传播 - 图88

      如果 二、反向传播 - 图89,则有:

      二、反向传播 - 图90

      这表明:取最大值单元将回传的梯度分发给最大的输入。

  3. 通常如果函数 二、反向传播 - 图91 的表达式非常复杂,则当对 二、反向传播 - 图92 进行微分运算,运算结束后会得到一个巨大而复杂的表达式。

    • 实际上并不需要一个明确的函数来计算梯度,只需要如何使用反向传播算法计算梯度即可。
    • 可以把复杂的表达式拆解成很多个简单的表达式(这些表达式的局部梯度是简单的、已知的),然后利用链式法则来求取梯度。
    • 在计算反向传播时,前向传播过程中得到的一些中间变量非常有用。实际操作中,最好对这些中间变量缓存。

2.4 深度前馈神经网络应用

  1. 给定一个样本,其定义代价函数为 二、反向传播 - 图93,其中 二、反向传播 - 图94 为神经网络的预测值。

    考虑到正则化项,定义损失函数为:二、反向传播 - 图95 。其中 二、反向传播 - 图96 为正则化项,而 二、反向传播 - 图97 包含了所有的参数(包括每一层的权重 二、反向传播 - 图98 和每一层的偏置 二、反向传播 - 图99)。

    这里给出的是单个样本的损失函数,而不是训练集的损失函数。

  2. 计算 二、反向传播 - 图100 的计算图为:

    二、反向传播 - 图101

  3. 前向传播用于计算深度前馈神经网络的损失函数。算法为:

    • 输入:

      • 网络层数 二、反向传播 - 图102

      • 每一层的权重矩阵 二、反向传播 - 图103

      • 每一层的偏置向量 二、反向传播 - 图104

      • 每一层的激活函数 二、反向传播 - 图105

        也可以对所有的层使用同一个激活函数

      • 输入 二、反向传播 - 图106 和对应的标记 二、反向传播 - 图107

      • 隐层到输出的函数 二、反向传播 - 图108

    • 输出:损失函数 二、反向传播 - 图109

    • 算法步骤:

      • 初始化 二、反向传播 - 图110

      • 迭代:二、反向传播 - 图111,计算:

        • 二、反向传播 - 图112
        • 二、反向传播 - 图113
      • 计算 二、反向传播 - 图114二、反向传播 - 图115
  4. 反向传播用于计算深度前馈网络的损失函数对于参数的梯度。

    梯度下降算法需要更新模型参数,因此只关注损失函数对于模型参数的梯度,不关心损失函数对于输入的梯度 二、反向传播 - 图116

    • 根据链式法则有: 二、反向传播 - 图117

      考虑到 二、反向传播 - 图118 ,因此雅可比矩阵 二、反向传播 - 图119 为对角矩阵,对角线元素 二、反向传播 - 图120二、反向传播 - 图121 表示 二、反向传播 - 图122 的第 二、反向传播 - 图123 个元素。

      因此 二、反向传播 - 图124 ,其中 二、反向传播 - 图125 表示Hadamard积。

    • 因为 二、反向传播 - 图126,因此:

      二、反向传播 - 图127

      上式仅仅考虑从 二、反向传播 - 图128 传播到 二、反向传播 - 图129 中的梯度。 考虑到损失函数中的正则化项 二、反向传播 - 图130 包含了权重和偏置,因此需要增加正则化项的梯度。则有:

      二、反向传播 - 图131

    • 因为 二、反向传播 - 图132,因此:二、反向传播 - 图133

  5. 反向传播算法:

    • 输入:

      • 网络层数 二、反向传播 - 图134
      • 每一层的权重矩阵 二、反向传播 - 图135
      • 每一层的偏置向量 二、反向传播 - 图136
      • 每一层的激活函数 二、反向传播 - 图137
      • 输入 二、反向传播 - 图138 和对应的标记 二、反向传播 - 图139
    • 输出:梯度 二、反向传播 - 图140

    • 算法步骤:

      • 通过前向传播计算损失函数 二、反向传播 - 图141 以及网络的输出 二、反向传播 - 图142

      • 计算输出层的导数: 二、反向传播 - 图143

        这里等式成立的原因是:正则化项 二、反向传播 - 图144 与模型输出 二、反向传播 - 图145 无关。

      • 计算最后一层隐单元的梯度:二、反向传播 - 图146

      • 迭代: 二、反向传播 - 图147,迭代步骤如下:

        每一轮迭代开始之前,维持不变式:二、反向传播 - 图148

        • 计算 二、反向传播 - 图149二、反向传播 - 图150

        • 令:二、反向传播 - 图151

        • 计算对权重和偏置的偏导数:

          二、反向传播 - 图152

        • 计算 二、反向传播 - 图153二、反向传播 - 图154

        • 令:二、反向传播 - 图155