神经网络理解:前向传播与反向传播

本文详细介绍了神经网络的前向传播和反向传播过程。前向传播从输入层开始,通过各层计算直至输出层,得出预测结果;反向传播则依据预测与实际值的误差,利用链式法则计算各层权重的梯度,并通过梯度下降更新参数,以优化网络性能。整个过程旨在通过不断调整权重来最小化损失函数,提高模型的预测准确性。

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

参考资料

神经网络基础: 反向传播推导与卷积公式

神经网络前向传播与反向传播

主要基于参考资料的学习整理。

神经网络

神经网络通俗地可以理解成一个函数近似器,它需要近似一个输入x到输出y的映射函数。我们所要训练的网络参数其实就是在拟合这个映射函数的未知量。神经网络的训练可以分为两个步骤:一个是前向传播,另一个是反向传播。

在这里插入图片描述

前向传播

神经网络前向传播从输入层到输出层:前向传播就是从输入层开始,经过一层层的Layer,不断计算每一层的神经网络得到的结果及通过激活函数的本层输出结果,最后得到输出的过程。

1. 输入层->隐含层

计算神经元 h 1 h1 h1 的输入加权和:

n e t h 1 = w 1 ∗ i 1 + w 2 ∗ i 2 + b 1 ∗ 1 net_{h1}=w_1*i_1+w_2*i_2+b_1*1 neth1=w1i1+w2i2+b11

激活后的输出 :

o u t h 1 = 1 1 + e − n e t h 1 out_{h1}=\frac{1}{1+e^{-net_{h1}}} outh1=1+eneth11

其余隐层节点同理。

2. 隐含层->输出层

计算输出神经元 o 1 o1 o1的值:
n e t o 1 = w 5 ∗ o u t h 1 + w 6 ∗ o u t h 2 + b 2 ∗ 1 net_{o1}=w_5*out_{h1}+w_6*out_{h2}+b_2*1 neto1=w5outh1+w6outh2+b21

o u t o 1 = 1 1 + e − n e t o 1 out_{o1}=\frac{1}{1+e^{-net_{o1}}} outo1=1+eneto11
其余输出节点同理。

反向传播

  • 前向传播计算出了输出值(也即预测值),就可以根据输出值与目标值的差别来计算损失loss。

  • 反向传播就是根据损失函数loss来反方向地计算每一层的偏导数,从最后一层逐层向前去改变每一层的权重,也就是更新参数,核心就是损失函数对每一网络层的每一个参数求偏导的链式求导法则。

1. 计算总误差

首先,我们需要通过前向传播的输出 o u t p u t output output和真实样本 t a r g e t target target计算此时神经网络的损失

在这里插入图片描述

2. 隐藏层与输出层之间的权重更新

以权重 w 5 w_5 w5为例,对参数 w 5 w_5 w5求偏导可以看出 w 5 w_5 w5对整体误差产生的影响,总体误差对 w 5 w_5 w5求偏导的链式规则如下所示:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后三者相乘,下面的任务就是进行梯度下降从而更新参数:
在这里插入图片描述

η \eta η 为 learning rate,其余权重同理。

3. 输入层与隐藏层之间的权重更新

以权重 w 1 w1 w1为例

∂ E total  ∂ w 1 = ∂ E total  ∂ o u t h 1 ∗ ∂ o u t h 1 ∂ n e t h 1 ∗ ∂ net h 1 ∂ w 1 \frac{\partial E_{\text {total }}}{\partial w_{1}}=\frac{\partial E_{\text {total }}}{\partial out_{h_1}} * \frac{\partial out_{h_1}}{\partial net_{h_1}} * \frac{\partial \text {net}_{h_1}}{\partial w_{1}} w1Etotal =outh1Etotal neth1outh1w1neth1

在这里插入图片描述
计算方法与上述步骤一致
在这里插入图片描述
在这里插入图片描述
最后三者相乘,进行梯度下降从而更新参数:
在这里插入图片描述

4. 梯度下降

神经网络就是通过不断的前向传播和反向传播不断调整神经网络的权重,最终到达预设的迭代次数或者对样本的学习已经到了比较好的程度后,就停止迭代,那么一个神经网络就训练好了。这就是神经网络的本质:通过计算误差、不断修正权重以拟合输入输出的映射函数曲线。

<think>好的,我现在需要详细讲解传播反向传播。首先,我得回忆一下这两个概念的基本定义作用。传播神经网络中数据从输入层经过隐藏层到输出层的传递过程,而反向传播则是根据损失函数的梯度来调整网络参数的过程,用于训练模型。 接下来,我需要确定用户的需求。用户可能已经了解过一些神经网络的基础知识,但需要更深入的讲解,特别是传播反向传播的具体步骤、数学公式以及它们之间的联系。用户可能希望了解这两个过程如何协同工作来优化模型参数。 首先,传播部分需要详细说明每一层的计算过程,包括线性变换激活函数的作用。例如,输入数据如何通过权重矩阵偏置向量进行线性组合,然后通过激活函数如ReLU或sigmoid进行非线性转换。需要给出具体的数学表达式,比如对于第l层的输出$a^{l} = \sigma(W^{l}a^{l-1} + b^{l})$,其中$\sigma$是激活函数,$W^{l}$$b^{l}$是该层的权重偏置。 然后,反向传播部分需要解释梯度下降的基本原理,链式法则的应用,以及如何从输出层反向计算各层的梯度。这里需要详细说明损失函数对权重偏置的梯度是如何计算的,比如使用链式法则将误差逐层反向传播,更新参数。可能需要提到计算图的概念,以及如何利用计算图高效地计算梯度。 用户可能对反向传播中的具体数学推导感到困惑,比如为什么使用链式法则,如何计算每一层的梯度。这时候需要用简单易懂的例子来说明,比如一个简单的两层网络,具体展示反向传播的过程,帮助用户理解。 另外,需要注意区分传播反向传播在训练过程中的角色。传播用于计算预测值损失函数,而反向传播则利用这些信息调整参数以最小化损失。需要强调两者的协同作用,以及它们在训练循环中的位置。 同时,要检查是否遗漏了关键点,比如参数的初始化、优化器的选择(如SGD、Adam),但这些可能超出了当问题的范围。用户主要关注反向传播本身,而不是整个训练流程的其他方面。 需要确保数学符号的正确性,比如使用LaTeX格式正确表示矩阵乘法激活函数。例如,正确使用$\mathbf{W}$表示权重矩阵,$\mathbf{b}$表示偏置向量,$\sigma$表示激活函数,$\mathcal{L}$表示损失函数等。 可能还需要讨论计算效率的问题,比如为什么反向传播比直接计算每个参数的梯度更高效,尤其是在深层网络中。这里可以提到反向传播通过复用中间计算结果,避免了重复计算,从而提高了效率。 最后,总结传播反向传播的步骤,强调它们在神经网络训练中的重要性,并可能指出常见的误区,比如梯度消失或爆炸问题,以及如何通过初始化或归一化技术来缓解这些问题。 在整理思路时,可能会发现某些部分需要更详细的解释,比如链式法则的具体应用,或者激活函数的导数如何影响梯度计算。这时候需要决定是否深入这些细节,或者保持整体讲解的连贯性,避免过于深入数学细节而让用户感到困惑。 总的来说,回答需要结构清晰,分步骤讲解反向传播,结合数学公式文字说明,确保用户能够逐步理解这两个关键过程的工作原理实现方式。同时,要注意用词准确,避免歧义,并检查数学表达的正确性,确保符合用户提供的系统级指令中的格式要求。</think>以下是关于传播反向传播的详细分步讲解: --- ### **1. 传播(Forward Propagation)** #### **1.1 定义** 传播神经网络从输入层到输出层逐层计算预测值的过程。通过权重、偏置激活函数的组合,数据逐层传递,最终得到预测结果。 #### **1.2 计算步骤** 以全连接层为例,假设网络共有 $L$ 层: 1. **输入层**:输入数据记为 $a^{(0)} = x \in \mathbb{R}^{d_{\text{input}}}}$。 2. **第 $l$ 层的计算**: - **线性变换**:$z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)}$ 其中: - $W^{(l)} \in \mathbb{R}^{d_l \times d_{l-1}}}$ 是权重矩阵, - $b^{(l)} \in \mathbb{R}^{d_l}$ 是偏置向量, - $a^{(l-1)} \in \mathbb{R}^{d_{l-1}}}$ 是上一层的输出。 - **激活函数**:$a^{(l)} = \sigma(z^{(l)})$ 其中 $\sigma$ 是非线性激活函数(如ReLU、Sigmoid)。 3. **输出层**:最后一层输出 $a^{(L)}$,即预测值 $\hat{y}$。 #### **1.3 数学表达式总结** $$ \begin{aligned} z^{(l)} &= W^{(l)} a^{(l-1)} + b^{(l)}, \\ a^{(l)} &= \sigma(z^{(l)}). \end{aligned} $$ #### **1.4 示例** - 输入:$x = [2, 3]$ - 第1层权重:$W^{(1)} = \begin{bmatrix} 1 & -1 \\ 0 & 2 \end{bmatrix}$,偏置:$b^{(1)} = [1, 0]$ - 激活函数:ReLU($\sigma(z) = \max(0, z)$) 计算过程: 1. $z^{(1)} = W^{(1)} x + b^{(1)} = \begin{bmatrix} 1 \cdot 2 + (-1) \cdot 3 + 1 \\ 0 \cdot 2 + 2 \cdot 3 + 0 \end{bmatrix} = \begin{bmatrix} 0 \\ 6 \end{bmatrix}$ 2. $a^{(1)} = \text{ReLU}(z^{(1)}) = \begin{bmatrix} 0 \\ 6 \end{bmatrix}$ --- ### **2. 反向传播(Backward Propagation)** #### **2.1 定义** 反向传播是通过链式法则计算损失函数对网络参数的梯度,并利用梯度下降法更新参数的过程。目标是最小化预测值真实值的误差。 #### **2.2 核心思想:链式法则** 通过反向传播梯度,从输出层逐层计算损失对每层参数的偏导数: $$ \frac{\partial \mathcal{L}}{\partial W^{(l)}} = \frac{\partial \mathcal{L}}{\partial a^{(L)}} \cdot \frac{\partial a^{(L)}}{\partial z^{(L)}} \cdot \frac{\partial z^{(L)}}{\partial a^{(L-1)}} \cdots \frac{\partial z^{(l)}}{\partial W^{(l)}}. $$ #### **2.3 计算步骤** 1. **计算损失函数**:$\mathcal{L}(y, \hat{y})$,例如均方误差或交叉熵。 2. **反向传播梯度**: - **输出层梯度**:计算损失对输出层输入的梯度 $\delta^{(L)} = \frac{\partial \mathcal{L}}{\partial z^{(L)}}$。 - **逐层反向传播**:从第 $L-1$ 层到第1层,计算 $\delta^{(l)} = \frac{\partial \mathcal{L}}{\partial z^{(l)}}$。 3. **参数梯度计算**: - 权重梯度:$\frac{\partial \mathcal{L}}{\partial W^{(l)}} = \delta^{(l)} \cdot a^{(l-1)\top}$, - 偏置梯度:$\frac{\partial \mathcal{L}}{\partial b^{(l)}} = \delta^{(l)}$. 4. **参数更新**:通过优化器(如SGD)更新参数: $$ W^{(l)} \leftarrow W^{(l)} - \eta \frac{\partial \mathcal{L}}{\partial W^{(l)}}, \quad b^{(l)} \leftarrow b^{(l)} - \eta \frac{\partial \mathcal{L}}{\partial b^{(l)}}, $$ 其中 $\eta$ 是学习率。 #### **2.4 数学推导示例** 假设使用均方误差损失 $\mathcal{L} = \frac{1}{2}(y - \hat{y})^2$,激活函数为Sigmoid $\sigma(z) = \frac{1}{1 + e^{-z}}$。 - **输出层梯度**: $$ \delta^{(L)} = \frac{\partial \mathcal{L}}{\partial z^{(L)}} = (\hat{y} - y) \cdot \sigma'(z^{(L)}). $$ 其中 $\sigma'(z) = \sigma(z)(1 - \sigma(z))$。 - **隐藏层梯度**: $$ \delta^{(l)} = \left( W^{(l+1)\top} \delta^{(l+1)} \right) \odot \sigma'(z^{(l)}), $$ 其中 $\odot$ 表示逐元素相乘。 --- ### **3. 传播反向传播的关系** | **步骤** | **传播** | **反向传播** | |----------------|---------------------------------------|---------------------------------------| | **目的** | 计算预测值 | 计算梯度并更新参数 | | **方向** | 输入层 → 输出层 | 输出层 → 输入层 | | **核心操作** | 线性变换 + 激活函数 | 链式法则 + 梯度计算 | | **存储中间值** | 保留每层的 $z^{(l)}$ $a^{(l)}$ | 利用传播的中间值计算梯度 | --- ### **4. 关键问题解决方案** 1. **梯度消失/爆炸**: - **原因**:深层网络中梯度连乘导致指数级变化。 - **解决**:使用残差连接(ResNet)、梯度裁剪、归一化(BatchNorm)。 2. **计算效率**: - 反向传播通过复用传播的中间结果(如 $a^{(l)}$),避免重复计算。 --- ### **5. 总结** - **传播**:数据从输入到输出的正向流动,生成预测值。 - **反向传播**:误差从输出到输入的反向流动,计算梯度并更新参数。 - **协同作用**:传播提供预测中间结果,反向传播利用这些结果优化模型。 通过这两个过程,神经网络能够自动学习数据中的复杂模式,是深度学习模型训练的核心机制。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CHH3213

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

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

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

打赏作者

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

抵扣说明:

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

余额充值