上海网站关键字优,百度导航最新版本,wordpress仿淘宝页面,手机上怎么制作app软件反向传播算法
反向传播#xff08;Backpropagation#xff09;是一种用于训练人工神经网络的算法#xff0c;它通过计算损失函数相对于网络中每个参数的梯度来更新这些参数#xff0c;从而最小化损失函数。反向传播是深度学习中最重要的算法之一#xff0c;通常与梯度下降…反向传播算法
反向传播Backpropagation是一种用于训练人工神经网络的算法它通过计算损失函数相对于网络中每个参数的梯度来更新这些参数从而最小化损失函数。反向传播是深度学习中最重要的算法之一通常与梯度下降等优化算法结合使用。
反向传播的基本原理
反向传播的核心思想是利用链式法则Chain Rule来高效地计算损失函数相对于每个参数的梯度。以下是反向传播的基本步骤 前向传播Forward Pass 输入数据通过神经网络进行传播计算出每一层的输出直到得到最终的预测结果。计算损失函数评估预测结果与真实标签之间的差异。 计算损失函数的梯度 从输出层开始计算损失函数相对于输出的梯度。通过链式法则将梯度逐层向后传播计算每一层的梯度。 更新参数 使用计算得到的梯度更新网络中的权重和偏置通常使用梯度下降法或其变种如 Adam、RMSprop 等。
反向传播的数学细节
假设我们有一个简单的神经网络包含输入层、隐藏层和输出层。设定损失函数为 L L L网络的参数为 W W W 和 b b b权重和偏置反向传播的步骤如下 前向传播 计算输出 y pred f ( W ⋅ x b ) y_{\text{pred}} f(W \cdot x b) ypredf(W⋅xb)计算损失 L Loss ( y true , y pred ) L \text{Loss}(y_{\text{true}}, y_{\text{pred}}) LLoss(ytrue,ypred) 反向传播 计算输出层的梯度 ∂ L ∂ y pred \frac{\partial L}{\partial y_{\text{pred}}} ∂ypred∂L计算隐藏层的梯度 ∂ 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} ∂W∂L∂ypred∂L⋅∂W∂ypred继续向前传播直到输入层。 更新参数 使用学习率 η \eta η 更新参数 W W − η ⋅ ∂ L ∂ W W W - \eta \cdot \frac{\partial L}{\partial W} WW−η⋅∂W∂L b b − η ⋅ ∂ L ∂ b b b - \eta \cdot \frac{\partial L}{\partial b} bb−η⋅∂b∂L
反向传播的优点
高效性反向传播算法通过链式法则高效地计算梯度避免了对每个参数单独计算梯度的高昂成本。适应性可以应用于各种类型的神经网络包括全连接网络、卷积神经网络CNN、递归神经网络RNN等。
反向传播是训练神经网络的核心算法通过计算损失函数的梯度并更新网络参数使得模型能够逐步提高预测的准确性。它是深度学习的基础使得复杂的神经网络能够有效地学习和优化。
链式法则
反向传播算法是一种利用链式法则计算微分的算法。在一维的情况下链式法则为: 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} dxdzdydz×dxdy 。在多维情况下设 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 → ) zf(\overrightarrow{\mathbf{y}}) zf(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_{j1}^{n} \frac{\partial z}{\partial y_{j}} \frac{\partial y_{j}}{\partial x_{i}}, \quad i1,2, \cdots, m ∂xi∂zj1∑n∂yj∂z∂xi∂yj,i1,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 )T∇y 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 ∂x1∂z∂x2∂z⋮∂xm∂z ∇y z ∂y1∂z∂y2∂z⋮∂yn∂z ∂x ∂y ∂x1∂y1∂x1∂y2⋮∂x1∂yn∂x2∂y1∂x2∂y2⋮∂x2∂yn⋯⋯⋱⋯∂xns∂y1∂xm∂y2⋮∂xm∂yn
张量链式法则
链式法则仅可以作用于向量也可以应用于张量:
首先将张量展平为一维向量。然后计算该向量的梯度。然后将该牱度重新构造为张量。
记 ∇ 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 i1 \sim 9 i1∼9 表示: 一个二维张量的系引每个维度三个元素。 这就与向量中的系引方式完全一致: ( ∇ 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 ∂x1∂z∂x4∂z∂xwq∂z∂x2∂z∂x5∂z∂zg∂z∂x3∂z∂x6∂z∂x9∂z 设 Y g ( X ) , z f ( Y ) \mathbf{Y}g(\mathbf{X}), zf(\mathbf{Y}) Yg(X),zf(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}} ∂xi∂zj∑∂yj∂z∂xi∂yj⇒∇Xzj∑(∇Xyj)∂yj∂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 [ ∑ 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 ∑j∂yj∂z∑j∂yj∂z∂x4∂yj∑j∂yj∂z∂x7∂yj∂x1∂yj∑j∂yj∂z∂xj∂yj∑j∂yj∂z∂x8∂yj∑j∂yj∂z∂x2∂yj∑j∂yj∂z∂x0∂yj∑j∂yj∂z∂xj∂yj∑j∂yj∂z∂xj∂yj
反向传播算法
反向传播算法:
输入:计算图 G \mathcal{G} G初始化参数向量 u ⃗ ∗ \vec{u}^{*} u ∗ 。 输出: ∂ u n ∂ u j , j 1 , 2 , ⋯ , n i \frac{\partial u_{n}}{\partial u_{j}}, j1,2, \cdots, n_{i} ∂uj∂un,j1,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}} ∂ui∂un 。初始化 grad_table [ u n ] 1 \left[u_{n}\right]1 [un]1 。沿着计算图 B \mathcal{B} B 计算偏导数。遍历 j j j 从 n − 1 n-1 n−1 到 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}} ∂uj∂uun∑ui∈Cj∂ui∂un∂uj∂ui 。其中 ∂ u n ∂ u i \frac{\partial u_{n}}{\partial u_{i}} ∂ui∂un 是已经存储的 grad_table[ui ] ] ], ∂ u i ∂ u j \frac{\partial u_{i}}{\partial u_{j}} ∂uj∂ui 为实时计算的。 图 G \mathcal{G} G 中的边 u j → u i u_{j} \rightarrow u_{i} uj→ui 定义了一个操作而该操作的偏导只依赖于这两个变量因此可以实时求 解 ∂ u i ∂ u j \frac{\partial u_{i}}{\partial u_{j}} ∂uj∂ui 。存储 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], j1,2, \cdots, n_{\hat{j}} gradtable[uj],j1,2,⋯,nj^ 。
反向传播算法计算所有的偏导数计算量与 G \mathcal{G} G 中的边的数量成正比。 其中每条边的计算包括计算偏导数以及执行一次向量点积。上述反向传播算法为了减少公共子表达式的计算量并没有考虑存储的开销。这避免了重复子表达式的指数 级的增长。 。 某些算法可以通过对计算图进行简化从而避免更多的子表达式。 。 有些算法会重新认算这些子表达式而不是存储它们从而节省内存。
参考
DataWhale http://www.huaxiaozhuan.com/