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