反向传播算法
- 前向传播 forward propagation 过程:当前馈神经网络接收输入 并产生输出 时,信息前向流动。 输入 提供初始信息,然后信息传播到每一层的隐单元,最终产生输出 。
- 反向传播算法 back propagation 允许来自代价函数的信息通过网络反向流动以便计算梯度。
- 反向传播并不是用于学习整个神经网络的算法,而是仅用于计算梯度的算法。 神经网络的学习算法是随机梯度下降这类基于梯度的算法。
- 反向传播不仅仅适用于神经网络,原则上它适用于计算任何函数的导数。
- 计算图 computational graph :
- 图中的每个节点代表一个变量 (可以是标量、向量、矩阵或者张量)。
- 操作: operation 为一个或者多个变量的简单函数。
- 多个操作组合在一起可以描述一个更复杂的函数。
- 一个操作仅返回单个输出变量 (可以是标量、向量、矩阵或者张量)。
- 如果变量 是变量 通过一个操作计算得到,则在图中绘制一条从 到 的有向边。
链式法则
- 反向传播算法是一种利用链式法则计算微分的算法。
- 在一维的情况下,链式法则为: 。
- 在多维情况下,设: 为 到 的映射且满足 为 到 的映射且满 足 。则有:
使用向量记法,可以等价地写作:
其中: 为 的 阶雅可比矩阵, 为 对 的梯度, 为 对 的梯度:
张量链式法则
- 链式法则仅可以作用于向量,也可以应用于张量:
- 首先将张量展平为一维向量。
- 然后计算该向量的梯度。
- 然后将该牱度重新构造为张量。
- 记 为 对张量 的梯度。 现在有多个索引 (如:二维张量有两个索引),可以使用单个变量 来表 示 的索引元组(如 表示: 一个二维张量的系引,每个维度三个元素)。
这就与向量中的系引方式完全一致: 。
奴:
则有:
- 设 ,用单个变量 来表示 的索引元組。则张量的链式法则为:
如:
则有:
反向传播算法
- 反向传播算法:
- 输入:
- 计算图
- 初始化参数向量
。 输出: - 运行计算 的前向算法,获取每个节点的值。
- 给出一个 grad_table 表,它存储的是已经计算出来的偏导数。
对应的表项存储的是偏导数 。 - 初始化 grad_table 。
- 沿着计算图 计算偏导数。遍历 从 到 1 :
- 计算 。其中: 是已经存储的 grad_table[ui , 为实时计算的。
图 中的边 定义了一个操作,而该操作的偏导只依赖于这两个变量,因此可以实时求 解 。 - 存储 _able
- 逅回 。
- 反向传播算法计算所有的偏导数,计算量与 中的边的数量成正比。
其中每条边的计算包括计算偏导数,以及执行一次向量点积。 - 上述反向传播算法为了减少公共子表达式的计算量,并没有考虑存储的开销。这避免了重复子表达式的指数 级的增长。
。 某些算法可以通过对计算图进行简化从而避免更多的子表达式。
。 有些算法会重新认算这些子表达式而不是存储它们,从而节省内存。
参考
文章出处登录后可见!
已经登录?立即刷新