7 前向传播与反向传播
在前一篇文章中,我们讨论了神经网络中的各种激活函数,包括 Sigmoid、ReLU 和 Tanh 等。这些激活函数是神经网络的重要组成部分,帮助模型更好地进行非线性映射。今天,我们将深入探讨深度学习中另一个重要的概念,即“前向传播”与“反向传播”。
前向传播
“前向传播”是神经网络中信息流动的过程。在这个过程中,输入数据通过网络的每一层,经过各个神经元的计算,最终得到输出。
前向传播的过程
输入层:我们将输入数据(例如,一张图片或一个特征向量)传递给输入层的神经元。
隐含层:数据从输入层流向隐含层,每个隐含层的神经元会接收到前一层神经元的输出,并计算加权和:
$$ z = w^T x + b $$
其中,$w$ 是权重,$x$ 是输入向量,$b$ 是偏置。
激活函数:计算得到的 $z$ 会通过一个激活函数,产生输出:
$$ a = \sigma(z) $$
其中,$\sigma$ 是激活函数(例如 ReLU 或 Sigmoid)。这个输出会成为下一层的输入。
输出层:经过多层隐含层后的输出会在输出层被计算,通常用于得到最终的预测结果。
案例代码
下面是一个简单的前向传播示例,使用 Python 和 NumPy 实现一个单层神经网络的前向传播过程:
1 | import numpy as np |
在这个例子中,我们定义了一个具有两个输入和两个神经元的单层神经网络,并且使用 Sigmoid 激活函数。
反向传播
“反向传播”是神经网络训练的关键过程,通过计算损失函数相对于模型参数的梯度,从而更新模型参数,使得神经网络的预测更接近真实值。
反向传播的过程
输出误差计算:首先,我们需要计算网络的输出与真实标签之间的误差(损失):
$$ \text{loss} = \text{loss function}(y, \hat{y}) $$
其中,$y$ 是真实标签,$\hat{y}$ 是预测输出。
梯度计算:然后,通过链式法则,我们计算损失函数对每一层权重和偏置的梯度。这一步通常涉及以下几个步骤:
计算输出层魔验的梯度:
$$ \delta^{(L)} = \hat{y} - y $$
计算网络前一层的误差:
$$ \delta^{(l)} = (w^{(l+1)})^T \delta^{(l+1)} \cdot \sigma’(z^{(l)}) $$
其中,$\sigma’(z^{(l)})$ 是激活函数的导数,$w^{(l+1)}$ 是连接当前层与下一层的权重。
更新权重和偏置:最后,用计算得到的梯度更新网络的权重和偏置:
$$ w^{(l)} = w^{(l)} - \eta \cdot \nabla w^{(l)} $$
$$ b^{(l)} = b^{(l)} - \eta \cdot \nabla b^{(l)} $$
其中,$\eta$ 是学习速率。
案例代码
以下是反向传播的简单实现,基于前面的例子:
1 | # 假设真实标签 |
在这个示例中,我们首先计算了输出误差,然后进行了反向传播,并更新了权重和偏置。
小结
在本篇文章中,我们介绍了深度学习模型的“前向传播”与“反向传播”过程。前者用于计算网络的输出,后者用于更新权重和偏置,优化模型性能。接下来的文章将进一步探讨“损失函数”的概念,这是评估模型性能和训练模型的重要指标。
希望这篇文章能加深你对深度学习工作原理的理解,为后续内容做好铺垫!
7 前向传播与反向传播