7 前向传播与反向传播

在前一篇文章中,我们讨论了神经网络中的各种激活函数,包括 Sigmoid、ReLU 和 Tanh 等。这些激活函数是神经网络的重要组成部分,帮助模型更好地进行非线性映射。今天,我们将深入探讨深度学习中另一个重要的概念,即“前向传播”与“反向传播”。

前向传播

“前向传播”是神经网络中信息流动的过程。在这个过程中,输入数据通过网络的每一层,经过各个神经元的计算,最终得到输出。

前向传播的过程

  1. 输入层:我们将输入数据(例如,一张图片或一个特征向量)传递给输入层的神经元。

  2. 隐含层:数据从输入层流向隐含层,每个隐含层的神经元会接收到前一层神经元的输出,并计算加权和:

    $$ z = w^T x + b $$

    其中,$w$ 是权重,$x$ 是输入向量,$b$ 是偏置。

  3. 激活函数:计算得到的 $z$ 会通过一个激活函数,产生输出:

    $$ a = \sigma(z) $$

    其中,$\sigma$ 是激活函数(例如 ReLU 或 Sigmoid)。这个输出会成为下一层的输入。

  4. 输出层:经过多层隐含层后的输出会在输出层被计算,通常用于得到最终的预测结果。

案例代码

下面是一个简单的前向传播示例,使用 Python 和 NumPy 实现一个单层神经网络的前向传播过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np

# 定义激活函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))

# 输入数据
X = np.array([[0.5, 0.2], # 第一条样本
[0.1, 0.6]]) # 第二条样本

# 权重和偏置
weights = np.array([[0.4, 0.5],
[0.3, 0.2]])
bias = np.array([0.1, 0.2])

# 前向传播
z = np.dot(X, weights) + bias
output = sigmoid(z)

print("前向传播输出:")
print(output)

在这个例子中,我们定义了一个具有两个输入和两个神经元的单层神经网络,并且使用 Sigmoid 激活函数。

反向传播

“反向传播”是神经网络训练的关键过程,通过计算损失函数相对于模型参数的梯度,从而更新模型参数,使得神经网络的预测更接近真实值。

反向传播的过程

  1. 输出误差计算:首先,我们需要计算网络的输出与真实标签之间的误差(损失):

    $$ \text{loss} = \text{loss function}(y, \hat{y}) $$

    其中,$y$ 是真实标签,$\hat{y}$ 是预测输出。

  2. 梯度计算:然后,通过链式法则,我们计算损失函数对每一层权重和偏置的梯度。这一步通常涉及以下几个步骤:

    • 计算输出层魔验的梯度:

      $$ \delta^{(L)} = \hat{y} - y $$

    • 计算网络前一层的误差:

      $$ \delta^{(l)} = (w^{(l+1)})^T \delta^{(l+1)} \cdot \sigma’(z^{(l)}) $$

    其中,$\sigma’(z^{(l)})$ 是激活函数的导数,$w^{(l+1)}$ 是连接当前层与下一层的权重。

  3. 更新权重和偏置:最后,用计算得到的梯度更新网络的权重和偏置:

    $$ w^{(l)} = w^{(l)} - \eta \cdot \nabla w^{(l)} $$

    $$ b^{(l)} = b^{(l)} - \eta \cdot \nabla b^{(l)} $$

    其中,$\eta$ 是学习速率。

案例代码

以下是反向传播的简单实现,基于前面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 假设真实标签
y_true = np.array([[1, 0], # 标签为[1, 0]
[0, 1]]) # 标签为[0, 1]

# 计算损失(使用均方误差作为损失函数)
loss = np.mean((output - y_true) ** 2)

# 反向传播示例
output_error = output - y_true # 输出层误差
output_delta = output_error * output * (1 - output) # Sigmoid 函数的导数

# 计算梯度
weights_gradient = np.dot(X.T, output_delta) / X.shape[0]
bias_gradient = np.mean(output_delta, axis=0)

# 更新权重和偏置
learning_rate = 0.01
weights -= learning_rate * weights_gradient
bias -= learning_rate * bias_gradient

print("更新后的权重:")
print(weights)
print("更新后的偏置:")
print(bias)

在这个示例中,我们首先计算了输出误差,然后进行了反向传播,并更新了权重和偏置。

小结

在本篇文章中,我们介绍了深度学习模型的“前向传播”与“反向传播”过程。前者用于计算网络的输出,后者用于更新权重和偏置,优化模型性能。接下来的文章将进一步探讨“损失函数”的概念,这是评估模型性能和训练模型的重要指标。

希望这篇文章能加深你对深度学习工作原理的理解,为后续内容做好铺垫!

7 前向传播与反向传播

https://zglg.work/deep-learning-zero/7/

作者

AI免费学习网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

复习上节

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论