后向传播基本原理和步骤

后向传播是神经网络训练的关键步骤,它涉及计算输出层及隐藏层的误差信号,通过链式法则求得权重和偏置的偏导数,然后使用梯度下降法更新参数,优化模型性能。这一过程包括计算输出层误差、传递误差信号、计算隐藏层误差、以及更新网络权重和偏置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

后向传播(Backpropagation)

后向传播是什么?

在神经网络中,后向传播是指通过比较输出结果和真实标签,计算损失函数对每个权重和偏置的偏导数,并将其传递回网络中的每一层,从而更新权重和偏置的过程。通过反向传播误差信号来优化模型参数,使得模型的预测结果更加准确。

掌握后向传播的基本原理和步骤,对于理解神经网络的训练过程具有重要的意义。

后向传播步骤

后向传播的步骤可以简单地概括为以下几步:

  1. 计算输出层的误差信号
  2. 传递误差信号到隐藏层
  3. 计算隐藏层的误差信号
  4. 计算权重和偏置的偏导数
  5. 更新权重和偏置

1. 计算输出层的误差信号

假设我们的神经网络有 K K K个输出节点,用 y k y_k yk表示第 k k k个输出节点的输出值, t k t_k tk表示第 k k k个输出节点的真实值,则损失函数可以表示为:

L = 1 2 ∑ k = 1 K ( y k − t k ) 2 L=\frac{1}{2}\sum_{k=1}^K(y_k-t_k)^2 L=21k=1K(yktk)2

损失函数中除以2是为了方便计算导数。在实际应用中,我们往往使用梯度下降等基于梯度的方法最小化损失函数。对该损失函数求导数得到的结果中会有一个常数因子2,如果不在损失函数中除以2,会导致在梯度下降的过程中,每一次更新参数的步长过大,可能无法找到全局最优解。因此在实际应用中,将损失函数除以2后,可以避免过大的参数更新,从而更稳定地达到全局最优解。

我们需要计算每个输出节点的误差信号,即 ∂ L ∂ y k \frac{\partial L}{\partial y_k} ykL。根据链式法则,可以得到:

∂ L ∂ y k = ( y k − t k ) ⋅ σ ′ ( z k ) \frac{\partial L}{\partial y_k}=(y_k-t_k)\cdot\sigma'(z_k) ykL=(yktk)σ(zk)

其中, z k z_k zk表示第 k k k个输出节点的带权输入, σ ′ \sigma' σ表示激活函数的导数。

  • K K K:输出节点的数量
  • y k y_k yk:第 k k k个输出节点的输出值
  • t k t_k tk:第 k k k个输出节点的真实值
  • L L L:损失函数
  • ∂ L ∂ y k \frac{\partial L}{\partial y_k} ykL:第 k k k个输出节点的误差信号
  • σ ( z k ) \sigma(z_k) σ(zk):第 k k k个输出节点的激活函数
  • σ ′ ( z k ) \sigma'(z_k) σ(zk):第 k k k个输出节点激活函数的导数
  • z k z_k zk:第 k k k个输出节点的带权输入

其中,误差信号 ∂ L ∂ y k \frac{\partial L}{\partial y_k} ykL表示损失函数 L L L对第 k k k个输出节点输出值 y k y_k yk的偏导数,可以通过链式法则和输出节点的误差项来计算。误差项包括输入加权和 z k z_k zk的导数(即激活函数的导数)和输出误差 ( y k − t k ) (y_k-t_k) (yktk)

2. 传递误差信号到隐藏层

对于隐藏层的每个节点 j j j,我们需要计算其误差信号 ∂ L ∂ z j \frac{\partial L}{\partial z_j} zjL。根据链式法则,可以得到:

∂ L ∂ z j = ∑ k = 1 K ∂ L ∂ y k ⋅ ∂ y k ∂ z j \frac{\partial L}{\partial z_j}=\sum_{k=1}^K\frac{\partial L}{\partial y_k}\cdot\frac{\partial y_k}{\partial z_j} zjL=k=1KykLzjyk

其中, ∂ y k ∂ z j \frac{\partial y_k}{\partial z_j} zjyk可以表示为:

∂ y k ∂ z j = ∂ ∂ z j σ ( z k ⋅ w k j + b k ) = σ ′ ( z j ) ⋅ w k j \frac{\partial y_k}{\partial z_j}=\frac{\partial}{\partial z_j}\sigma(z_k\cdot w_{kj}+b_k)=\sigma'(z_j)\cdot w_{kj} zjyk=zjσ(zkwkj+bk)=σ(zj)wkj

  • ∂ L ∂ z j \frac{\partial L}{\partial z_j} zjL:表示误差信号,即损失函数 L L L 对隐藏层第 j j j 个神经元的加权输入 z j z_j zj 的偏导数;
  • K K K:表示输出层的神经元个数;
  • ∂ L ∂ y k \frac{\partial L}{\partial y_k} ykL:表示损失函数 L L L 对输出层第 k k k 个神经元的输出值 y k y_k yk 的偏导数;
  • ∂ y k ∂ z j \frac{\partial y_k}{\partial z_j} zjyk:表示输出层第 k k k 个神经元的输出值 y k y_k yk 对隐藏层第 j j j 个神经元的加权输入 z j z_j zj 的偏导数;
  • w k j w_{kj} wkj:表示输出层连接到隐藏层第 j j j 个神经元的权重;
  • b k b_k bk:表示输出层第 k k k 个神经元的偏置;
  • σ \sigma σ:表示激活函数;
  • σ ′ ( z j ) \sigma'(z_j) σ(zj):表示激活函数在 z j z_j zj 处的导数。

3. 计算隐藏层的误差信号

对于隐藏层的每个节点 j j j,我们还需要计算其误差信号 ∂ L ∂ a j \frac{\partial L}{\partial a_j} ajL,其中 a j a_j aj表示第 j j j个隐藏节点的输出值。根据链式法则,可以得到:

∂ L ∂ a j = ∂ L ∂ z j ⋅ ∂ z j ∂ a j \frac{\partial L}{\partial a_j}=\frac{\partial L}{\partial z_j}\cdot\frac{\partial z_j}{\partial a_j} ajL=zjLajzj

其中,

∂ z j ∂ a j = ∂ ∂ a j ∑ i = 1 m w j i ⋅ x i = b j \frac{\partial z_j}{\partial a_j}=\frac{\partial}{\partial a_j}\sum_{i=1}^m w_{ji}\cdot x_i=b_j ajzj=aji=1mwjixi=bj

  • L L L:损失函数
  • a j a_j aj:第 j j j个隐藏节点的输出值
  • z j z_j zj:第 j j j个隐藏节点的加权输入
  • w j i w_{ji} wji:连接输入层第 i i i个节点和隐藏层第 j j j个节点的权重
  • x i x_i xi:输入样本的第 i i i个分量
  • b j b_j bj:第 j j j个隐藏节点的偏置
  • ∂ L ∂ a j \frac{\partial L}{\partial a_j} ajL:损失函数 L L L对第 j j j个隐藏节点输出值 a j a_j aj的偏导数,即第 j j j个隐藏节点的误差信号
  • ∂ L ∂ z j \frac{\partial L}{\partial z_j} zjL:损失函数 L L L对第 j j j个隐藏节点加权输入 z j z_j zj的偏导数
  • ∂ z j ∂ a j \frac{\partial z_j}{\partial a_j} ajzj:第 j j j个隐藏节点的加权输入 z j z_j zj对输出值 a j a_j aj的偏导数

4. 计算权重和偏置的偏导数

对于输出层的权重和偏置,偏导数可以使用链式法则计算:
∂ L ∂ w k i = ∂ L ∂ y k ⋅ ∂ y k ∂ z k ⋅ ∂ z k ∂ w k j = y i ⋅ ( y k − t k ) ⋅ σ ′ ( z k ) \frac{\partial L}{\partial w_{ki}}=\frac{\partial L}{\partial y_k}\cdot\frac{\partial y_k}{\partial z_k}\cdot\frac{\partial z_k}{\partial w_{kj}}=y_i\cdot(y_k - t_k)\cdot\sigma'(z_k) wkiL=ykLzkykwkjzk=yi(yktk)σ(zk)

∂ L ∂ b k = ∂ L ∂ y k ⋅ ∂ y k ∂ z k ⋅ ∂ z k ∂ b k = ( y k − t k ) ⋅ σ ′ ( z k ) \frac{\partial L}{\partial b_k}=\frac{\partial L}{\partial y_k}\cdot\frac{\partial y_k}{\partial z_k}\cdot\frac{\partial z_k}{\partial b_k}=(y_k - t_k)\cdot\sigma'(z_k) bkL=ykLzkykbkzk=(yktk)σ(zk)

对于隐藏层的权重和偏置,偏导数可以使用相似的方式进行计算:
∂ L ∂ w j i = ∂ L ∂ z j ⋅ ∂ z j ∂ w j i = x i ⋅ ∂ L ∂ z j \frac{\partial L}{\partial w_{ji}}=\frac{\partial L}{\partial z_j}\cdot\frac{\partial z_j}{\partial w_{ji}}=x_i\cdot\frac{\partial L}{\partial z_j} wjiL=zjLwjizj=xizjL

∂ L ∂ b j = ∂ L ∂ z j ⋅ ∂ z j ∂ b j = ∂ L ∂ z j \frac{\partial L}{\partial b_j}=\frac{\partial L}{\partial z_j}\cdot\frac{\partial z_j}{\partial b_j}=\frac{\partial L}{\partial z_j} bjL=zjLbjzj=zjL

  • L L L:损失函数
  • y k y_k yk:输出层第 k k k个节点的输出值
  • t k t_k tk:对于当前输入样本,输出层第 k k k个节点应该输出的目标值
  • z k z_k zk:输出层第 k k k个节点的加权输入
  • σ ( z k ) \sigma(z_k) σ(zk):激活函数,将加权输入 z k z_k zk映射为输出值 y k y_k yk的非线性函数
  • σ ′ ( z k ) \sigma'(z_k) σ(zk):激活函数的导数,即 σ ( z ) \sigma(z) σ(z) z z z的偏导数
  • w k j w_{kj} wkj:连接隐藏层第 j j j个节点和输出层第 k k k个节点的权重
  • x i x_i xi:输入样本的第 i i i个分量
  • w j i w_{ji} wji:连接输入层第 i i i个节点和隐藏层第 j j j个节点的权重
  • a j a_j aj:第 j j j个隐藏节点的输出值
  • z j z_j zj:第 j j j个隐藏节点的加权输入
  • b j b_j bj:第 j j j个隐藏节点的偏置
  • b k b_k bk:输出层第k个节点的偏置
  • k k k:输出层节点的索引
  • j j j:隐藏层节点的索引
  • i i i:输入层节点的索引
  • ∂ L ∂ w k i \frac{\partial L}{\partial w_{ki}} wkiL:损失函数 L L L对连接隐藏层第 i i i个节点和输出层第 k k k个节点的权重 w k i w_{ki} wki的偏导数
  • ∂ L ∂ b k \frac{\partial L}{\partial b_k} bkL:损失函数 L L L对输出层第 k k k个节点的偏置 b k b_k bk的偏导数
  • ∂ L ∂ w j i \frac{\partial L}{\partial w_{ji}} wjiL:损失函数 L L L对连接输入层第 i i i个节点和隐藏层第 j j j个节点的权重 w j i w_{ji} wji的偏导数
  • ∂ L ∂ b j \frac{\partial L}{\partial b_j} bjL:损失函数 L L L对隐藏层第 j j j个节点的偏置 b j b_j bj的偏导数

5.更新权重和偏置

最后,根据梯度下降法,我们可以使用下面的公式来更新权重和偏置:
w k j ← w k j − η ∂ L ∂ w k j w_{kj} \leftarrow w_{kj}-\eta\frac{\partial L}{\partial w_{kj}} wkjwkjηwkjL

b k ← b k − η ∂ L ∂ b k b_k \leftarrow b_k-\eta\frac{\partial L}{\partial b_k} bkbkηbkL

w j i ← w j i − η ∂ L ∂ w j i w_{ji} \leftarrow w_{ji}-\eta\frac{\partial L}{\partial w_{ji}} wjiwjiηwjiL

b j ← b j − η ∂ L ∂ b j b_j \leftarrow b_j-\eta\frac{\partial L}{\partial b_j} bjbjηbjL

其中 η \eta η是学习率,控制每次更新的步长。

  • L L L:损失函数
  • η \eta η:学习率,控制梯度下降更新权重的步长大小
  • ∂ L ∂ w k j \frac{\partial L}{\partial w_{kj}} wkjL:损失函数 L L L对连接隐藏层第 j j j个节点和输出层第 k k k个节点的权重 w k j w_{kj} wkj的偏导数
  • w k j w_{kj} wkj:连接隐藏层第 j j j个节点和输出层第 k k k个节点的权重
  • ∂ L ∂ b k \frac{\partial L}{\partial b_k} bkL:损失函数 L L L对输出层第 k k k个节点的偏置 b k b_k bk的偏导数
  • b k b_k bk:输出层第 k k k个节点的偏置
  • ∂ L ∂ w j i \frac{\partial L}{\partial w_{ji}} wjiL:损失函数 L L L对连接输入层第 i i i个节点和隐藏层第 j j j个节点的权重 w j i w_{ji} wji的偏导数
  • w j i w_{ji} wji:连接输入层第 i i i个节点和隐藏层第 j j j个节点的权重
  • ∂ L ∂ b j \frac{\partial L}{\partial b_j} bjL:损失函数 L L L对隐藏层第 j j j个节点的偏置 b j b_j bj的偏导数
  • b j b_j bj:隐藏层第 j j j个节点的偏置
  • ← \leftarrow :数学符号,表示赋值操作,将等号左侧的值赋给等号右侧的变量

总结

这份后向传播的入门教程主要包括以下内容:

  1. 后向传播的目的是通过反向传播误差信号来优化神经网络的参数。
  2. 后向传播的第一步是计算输出层的误差信号,具体计算方法是使用损失函数的导数,结合输出层的激活函数的导数。
  3. 后向传播的第二步是传递误差信号,将误差信号沿着神经网络的反向传播,计算每一层的误差信号,具体计算方法是使用权重矩阵的转置,结合下一层的误差信号和当前层的激活函数的导数。
  4. 通过计算每一层的误差信号,我们可以使用梯度下降等优化算法来更新神经网络的参数,以减小误差信号,提高模型的准确性。

当然,这只是后向传播的基础,实际应用中还需要考虑很多细节和优化方法,例如使用批量归一化、随机失活等技巧来提高模型的泛化能力,使用动量优化器、自适应学习率等方法来优化参数更新过程,等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百年孤独百年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值