反向传播算法

反向传播(Backpropagation)是一种用于训练人工神经网络的算法,它通过计算损失函数相对于网络中每个参数的梯度来更新这些参数,从而最小化损失函数。反向传播是深度学习中最重要的算法之一,通常与梯度下降等优化算法结合使用。

反向传播的基本原理

反向传播的核心思想是利用链式法则(Chain Rule)来高效地计算损失函数相对于每个参数的梯度。以下是反向传播的基本步骤:

  1. 前向传播(Forward Pass)

    • 输入数据通过神经网络进行传播,计算出每一层的输出,直到得到最终的预测结果。
    • 计算损失函数,评估预测结果与真实标签之间的差异。
  2. 计算损失函数的梯度

    • 从输出层开始,计算损失函数相对于输出的梯度。
    • 通过链式法则,将梯度逐层向后传播,计算每一层的梯度。
  3. 更新参数

    • 使用计算得到的梯度更新网络中的权重和偏置,通常使用梯度下降法或其变种(如 Adam、RMSprop 等)。

反向传播的数学细节

假设我们有一个简单的神经网络,包含输入层、隐藏层和输出层。设定损失函数为 L L L,网络的参数为 W W W b b b(权重和偏置),反向传播的步骤如下:

  1. 前向传播

    • 计算输出:
      y pred = f ( W ⋅ x + b ) y_{\text{pred}} = f(W \cdot x + b) ypred=f(Wx+b)
    • 计算损失:
      L = Loss ( y true , y pred ) L = \text{Loss}(y_{\text{true}}, y_{\text{pred}}) L=Loss(ytrue,ypred)
  2. 反向传播

    • 计算输出层的梯度:
      ∂ L ∂ y pred \frac{\partial L}{\partial y_{\text{pred}}} ypredL
    • 计算隐藏层的梯度:
      ∂ L ∂ W = ∂ L ∂ y pred ⋅ ∂ y pred ∂ W \frac{\partial L}{\partial W} = \frac{\partial L}{\partial y_{\text{pred}}} \cdot \frac{\partial y_{\text{pred}}}{\partial W} WL=ypredLWypred
    • 继续向前传播,直到输入层。
  3. 更新参数

    • 使用学习率 η \eta η 更新参数:
      W = W − η ⋅ ∂ L ∂ W W = W - \eta \cdot \frac{\partial L}{\partial W} W=WηWL
      b = b − η ⋅ ∂ L ∂ b b = b - \eta \cdot \frac{\partial L}{\partial b} b=bηbL

反向传播的优点

  • 高效性:反向传播算法通过链式法则高效地计算梯度,避免了对每个参数单独计算梯度的高昂成本。
  • 适应性:可以应用于各种类型的神经网络,包括全连接网络、卷积神经网络(CNN)、递归神经网络(RNN)等。

反向传播是训练神经网络的核心算法,通过计算损失函数的梯度并更新网络参数,使得模型能够逐步提高预测的准确性。它是深度学习的基础,使得复杂的神经网络能够有效地学习和优化。

链式法则

  1. 反向传播算法是一种利用链式法则计算微分的算法。
  2. 在一维的情况下,链式法则为: d z d x = d z d y × d y d x \frac{d z}{d x}=\frac{d z}{d y} \times \frac{d y}{d x} dxdz=dydz×dxdy
  3. 在多维情况下,设: x → ∈ R m , y → ∈ R n , g \overrightarrow{\mathbf{x}} \in \mathbb{R}^{m}, \overrightarrow{\mathbf{y}} \in \mathbb{R}^{n} , g x Rm,y Rng R m \mathbb{R}^{m} Rm R n \mathbb{R}^{n} Rn 的映射且满足 y → = g ( x → ) , f \overrightarrow{\mathbf{y}}=g(\overrightarrow{\mathbf{x}}) , f y =g(x )f R n \mathbb{R}^{n} Rn R \mathbb{R} R 的映射且满 足 z = f ( y → ) z=f(\overrightarrow{\mathbf{y}}) z=f(y ) 。则有:
    ∂ z ∂ x i = ∑ j = 1 n ∂ z ∂ y j ∂ y j ∂ x i , i = 1 , 2 , ⋯   , m \frac{\partial z}{\partial x_{i}}=\sum_{j=1}^{n} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{i}}, \quad i=1,2, \cdots, m xiz=j=1nyjzxiyj,i=1,2,,m
    使用向量记法,可以等价地写作:
    ∇ x → z = ( ∂ y → ∂ x → ) T ∇ y → z \nabla_{\overrightarrow{\mathbf{x}}} z=\left(\frac{\partial \overrightarrow{\mathbf{y}}}{\partial \overrightarrow{\mathbf{x}}}\right)^{T} \nabla_{\overrightarrow{\mathbf{y}} z} x z=(x y )Ty z
    其中: ∂ y → ∂ x → \frac{\partial \overrightarrow{\mathbf{y}}}{\partial \overrightarrow{\mathbf{x}}} x y g g g n × m n \times m n×m 阶雅可比矩阵, ∇ x → z \nabla_{\overrightarrow{\mathbf{x}}} z x z z z z x → \overrightarrow{\mathbf{x}} x 的梯度, ∇ y → z \nabla_{\overrightarrow{\mathbf{y}}} z y z z z z y → \overrightarrow{\mathbf{y}} y 的梯度:
    ∇ x → z = [ ∂ z ∂ x 1 ∂ z ∂ x 2 ⋮ ∂ z ∂ x m ] ∇ y → z = [ ∂ z ∂ y 1 ∂ z ∂ y 2 ⋮ ∂ z ∂ y n ] ∂ y → ∂ x → = [ ∂ y 1 ∂ x 1 ∂ y 1 ∂ x 2 ⋯ ∂ y 1 ∂ x n s ∂ y 2 ∂ x 1 ∂ y 2 ∂ x 2 ⋯ ∂ y 2 ∂ x m ⋮ ⋮ ⋱ ⋮ ∂ y n ∂ x 1 ∂ y n ∂ x 2 ⋯ ∂ y n ∂ x m ] \nabla_{\overrightarrow{\mathbf{x}}} z=\left[\begin{array}{c} \frac{\partial z}{\partial x_{1}} \\ \frac{\partial z}{\partial x_{2}} \\ \vdots \\ \frac{\partial z}{\partial x_{m}} \end{array}\right] \quad \nabla_{\overrightarrow{\mathbf{y}}} z=\left[\begin{array}{c} \frac{\partial z}{\partial y_{1}} \\ \frac{\partial z}{\partial y_{2}} \\ \vdots \\ \frac{\partial z}{\partial y_{n}} \end{array}\right] \quad \frac{\partial \overrightarrow{\mathbf{y}}}{\partial \overrightarrow{\mathbf{x}}}=\left[\begin{array}{cccc} \frac{\partial y_{1}}{\partial x_{1}} & \frac{\partial y_{1}}{\partial x_{2}} & \cdots & \frac{\partial y_{1}}{\partial x_{n s}} \\ \frac{\partial y_{2}}{\partial x_{1}} & \frac{\partial y_{2}}{\partial x_{2}} & \cdots & \frac{\partial y_{2}}{\partial x_{m}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_{n}}{\partial x_{1}} & \frac{\partial y_{n}}{\partial x_{2}} & \cdots & \frac{\partial y_{n}}{\partial x_{m}} \end{array}\right] x z= x1zx2zxmz y z= y1zy2zynz x y = x1y1x1y2x1ynx2y1x2y2x2ynxnsy1xmy2xmyn

张量链式法则

  1. 链式法则仅可以作用于向量,也可以应用于张量:
  • 首先将张量展平为一维向量。
  • 然后计算该向量的梯度。
  • 然后将该牱度重新构造为张量。
  1. ∇ X z \nabla_{\mathbf{X}} z Xz z z z 对张量 X \mathbf{X} X 的梯度。 X \mathbf{X} X 现在有多个索引 (如:二维张量有两个索引),可以使用单个变量 i i i 来表 示 X \mathbf{X} X 的索引元组(如 i = 1 ∼ 9 i=1 \sim 9 i=19 表示: 一个二维张量的系引,每个维度三个元素)。
    这就与向量中的系引方式完全一致: ( ∇ X z ) i = θ z ∂ x i (\nabla \mathbf{X} z)_{i}=\frac{\theta z}{\partial x_{i}} (Xz)i=xiθz
    奴:
    X = [ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 ] \mathbf{X}=\left[\begin{array}{lll} x_{1} & x_{2} & x_{3} \\ x_{4} & x_{5} & x_{6} \\ x_{7} & x_{8} & x_{9} \end{array}\right] X= x1x4x7x2x5x8x3x6x9
    则有:
    ∇ X z = [ ∂ z ∂ x 1 ∂ z ∂ x 2 ∂ z ∂ x 3 ∂ z ∂ x 4 ∂ z ∂ x 5 ∂ z ∂ x 6 ∂ z ∂ x w q ∂ z ∂ z g ∂ z ∂ x 9 ] \nabla_{\mathbf{X}} z=\left[\begin{array}{ccc} \frac{\partial z}{\partial x_{1}} & \frac{\partial z}{\partial x_{2}} & \frac{\partial z}{\partial x_{3}} \\ \frac{\partial z}{\partial x_{4}} & \frac{\partial z}{\partial x_{5}} & \frac{\partial z}{\partial x_{6}} \\ \frac{\partial z}{\partial x_{w_{q}}} & \frac{\partial z}{\partial z_{g}} & \frac{\partial z}{\partial x_{9}} \end{array}\right] Xz= x1zx4zxwqzx2zx5zzgzx3zx6zx9z
  2. Y = g ( X ) , z = f ( Y ) \mathbf{Y}=g(\mathbf{X}), z=f(\mathbf{Y}) Y=g(X),z=f(Y) ,用单个变量 j j j 来表示 Y \mathbf{Y} Y 的索引元組。则张量的链式法则为:
    ∂ z ∂ x i = ∑ j ∂ z ∂ y j ∂ y j ∂ x i ⇒ ∇ X z = ∑ j ( ∇ X y j ) ∂ z ∂ y j \frac{\partial z}{\partial x_{i}}=\sum_{j} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{i}} \Rightarrow \nabla_{\mathbf{X}} z=\sum_{j}\left(\nabla_{\mathbf{X}} y_{j}\right) \frac{\partial z}{\partial y_{j}} xiz=jyjzxiyjXz=j(Xyj)yjz
    如:
    X = [ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 ] \mathbf{X}=\left[\begin{array}{lll} x_{1} & x_{2} & x_{3} \\ x_{4} & x_{5} & x_{6} \\ x_{7} & x_{8} & x_{9} \end{array}\right] X= x1x4x7x2x5x8x3x6x9
    则有:
    ∇ X z = [ ∑ j ∂ z ∂ y j ∂ y j ∂ x 1 ∑ j ∂ z ∂ y j ∂ y j ∂ x 2 ∑ j ∂ z ∂ y j ∂ y j ∂ x j ∑ j ∂ z ∂ y j ∂ y j ∂ x 4 ∑ j ∂ z ∂ y j ∂ y j ∂ x j ∑ j ∂ z ∂ y j ∂ y j ∂ x 0 ∑ j ∂ z ∂ y j ∂ y j ∂ x 7 ∑ j ∂ z ∂ y j ∂ y j ∂ x 8 ∑ j ∂ z ∂ y j ∂ y j ∂ x j ] \nabla_{\mathbf{X}} z=\left[\begin{array}{llll} \sum_{j} \frac{\partial z}{\partial y_{j}} & \frac{\partial y_{j}}{\partial x_{1}} & \sum_{j} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{2}} & \sum_{j} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{j}} \\ \sum_{j} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{4}} & \sum_{j} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{j}} & \sum_{j} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{0}} \\ \sum_{j} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{7}} & \sum_{j} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{8}} & \sum_{j} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{j}} \end{array}\right] Xz= jyjzjyjzx4yjjyjzx7yjx1yjjyjzxjyjjyjzx8yjjyjzx2yjjyjzx0yjjyjzxjyjjyjzxjyj

反向传播算法

  1. 反向传播算法:
  • 输入:
  • 计算图 G \mathcal{G} G
  • 初始化参数向量 u ⃗ ∗ \vec{u}^{*} u
    。 输出: ∂ u n ∂ u j , j = 1 , 2 , ⋯   , n i \frac{\partial u_{n}}{\partial u_{j}}, j=1,2, \cdots, n_{i} ujun,j=1,2,,ni
  • 运行计算 u n u_{n} un 的前向算法,获取每个节点的值。
  • 给出一个 grad_table 表,它存储的是已经计算出来的偏导数。
    u i u_{i} ui 对应的表项存储的是偏导数 ∂ u n ∂ u i \frac{\partial u_{n}}{\partial u_{i}} uiun
  • 初始化 grad_table [ u n ] = 1 \left[u_{n}\right]=1 [un]=1
  • 沿着计算图 B \mathcal{B} B 计算偏导数。遍历 j j j n − 1 n-1 n1 到 1 :
  • 计算 ∂ u u n ∂ u j = ∑ u i ∈ C j ∂ u n ∂ u i ∂ u i ∂ u j \frac{\partial u_{u_{n}}}{\partial u_{j}}=\sum_{u_{i} \in \mathbb{C}_{j}} \frac{\partial u_{n}}{\partial u_{i}} \frac{\partial u_{i}}{\partial u_{j}} ujuun=uiCjuiunujui 。其中: ∂ u n ∂ u i \frac{\partial u_{n}}{\partial u_{i}} uiun 是已经存储的 grad_table[ui ] ] ], ∂ u i ∂ u j \frac{\partial u_{i}}{\partial u_{j}} ujui 为实时计算的。
    G \mathcal{G} G 中的边 u j → u i u_{j} \rightarrow u_{i} ujui 定义了一个操作,而该操作的偏导只依赖于这两个变量,因此可以实时求 解 ∂ u i ∂ u j \frac{\partial u_{i}}{\partial u_{j}} ujui
  • 存储 grad ⁡ \operatorname{grad} grad _able [ u j ] 。  \left[u_{j}\right]_{\text {。 }} [uj] 
  • 逅回 grad ⁡ table ⁡ [ u j ] , j = 1 , 2 , ⋯   , n j ^ \operatorname{grad} \operatorname{table}\left[u_{j}\right], j=1,2, \cdots, n_{\hat{j}} gradtable[uj],j=1,2,,nj^
  1. 反向传播算法计算所有的偏导数,计算量与 G \mathcal{G} G 中的边的数量成正比。
    其中每条边的计算包括计算偏导数,以及执行一次向量点积。
  2. 上述反向传播算法为了减少公共子表达式的计算量,并没有考虑存储的开销。这避免了重复子表达式的指数 级的增长。
    。 某些算法可以通过对计算图进行简化从而避免更多的子表达式。
    。 有些算法会重新认算这些子表达式而不是存储它们,从而节省内存。

参考

DataWhale
http://www.huaxiaozhuan.com/

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部