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