Jupyter AI

7 深度学习的工作原理:前向传播与反向传播

📅 发表日期: 2024年8月10日

分类: 🧠深度学习入门

👁️阅读: --

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

前向传播

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

前向传播的过程

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

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

    z=wTx+bz = w^T x + b

    其中,ww 是权重,xx 是输入向量,bb 是偏置。

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

    a=σ(z)a = \sigma(z)

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

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

案例代码

下面是一个简单的前向传播示例,使用 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 激活函数。

反向传播

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

反向传播的过程

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

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

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

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

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

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

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

      δ(l)=(w(l+1))Tδ(l+1)σ(z(l))\delta^{(l)} = (w^{(l+1)})^T \delta^{(l+1)} \cdot \sigma'(z^{(l)})

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

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

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

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

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

案例代码

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

# 假设真实标签
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)

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

小结

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

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