15 深度学习与神经网络之前向传播与反向传播

在上一篇中,我们讨论了神经元模型与激活函数,它们是构建深度学习模型的基本单元。接下来,我们将深入探讨两个关键过程:前向传播反向传播。这两者是神经网络训练的核心机制。

前向传播

在神经网络中,前向传播是指输入数据通过网络进行处理的过程。这一过程涉及到每个神经元的计算,最终输出网络的预测结果。

1. 前向传播过程

假设我们有一个简单的全连接网络,包含输入层、一个隐藏层以及输出层。假设输入层的节点数为 $n_{\text{input}}$,隐藏层的节点数为 $n_{\text{hidden}}$,输出层的节点数为 $n_{\text{output}}$。

步骤如下:

  1. 输入层传递输入向量
    输入向量可以表示为 $X = [x_1, x_2, …, x_{n_{\text{input}}}]^T$。

  2. 计算隐藏层输出
    隐藏层到每个神经元的输入是前一层(输入层)的输出与相应的权重相乘并加上偏置:
    $$
    Z^{(1)} = W^{(1)}X + b^{(1)}
    $$
    其中,$W^{(1)}$ 是从输入层到隐藏层的权重矩阵,$b^{(1)}$ 是隐藏层的偏置向量。然后,经过激活函数激活:
    $$
    A^{(1)} = \sigma(Z^{(1)})
    $$
    其中,$\sigma$ 是选择的激活函数,如ReLU、Sigmoid等。

  3. 计算输出层输出
    输出层的计算过程与隐藏层类似,设置 $A^{(1)}$ 为输入:
    $$
    Z^{(2)} = W^{(2)}A^{(1)} + b^{(2)}
    $$
    激活得到输出:
    $$
    A^{(2)} = \text{softmax}(Z^{(2)})
    $$
    在分类任务中,我们通常使用 softmax 函数作为输出层的激活函数,以获得各类别的概率分布。

2. 示例代码

下面是一个使用Python和NumPy库实现简单前向传播的示例代码:

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

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

# 前向传播示例
def forward_propagation(X, W1, b1, W2, b2):
# 隐藏层计算
Z1 = np.dot(W1, X) + b1
A1 = sigmoid(Z1)

# 输出层计算
Z2 = np.dot(W2, A1) + b2
A2 = np.exp(Z2) / np.sum(np.exp(Z2), axis=0) # softmax
return A1, A2

# 假设输入和参数
X = np.array([[0.1], [0.2]])
W1 = np.random.rand(3, 2) # 隐藏层权重
b1 = np.random.rand(3, 1) # 隐藏层偏置
W2 = np.random.rand(2, 3) # 输出层权重
b2 = np.random.rand(2, 1) # 输出层偏置

A1, A2 = forward_propagation(X, W1, b1, W2, b2)
print("隐藏层输出:", A1)
print("最终输出:", A2)

在这个例子中,我们定义了一个简单的前向传播过程,得到了隐藏层和输出层的结果。

反向传播

反向传播是用来训练神经网络的过程,其目标是通过调整权重和偏置来减少网络的误差。反向传播的核心是应用链式法则计算损失函数关于各个参数的梯度。

1. 反向传播过程

  1. 计算输出误差
    输出层的误差为:
    $$
    \delta^{(2)} = A^{(2)} - Y
    $$
    其中,$Y$ 是实际标签。

  2. 计算输出层梯度
    输出层权重梯度为:
    $$
    \frac{\partial \mathcal{L}}{\partial W^{(2)}} = \delta^{(2)} A^{(1)T}
    $$
    输出层偏置梯度为:
    $$
    \frac{\partial \mathcal{L}}{\partial b^{(2)}} = \delta^{(2)}
    $$

  3. 反向传播到隐藏层
    隐藏层的误差由输出层的误差通过权重传递回来的:
    $$
    \delta^{(1)} = (W^{(2)T} \delta^{(2)}) \circ \sigma’(Z^{(1)})
    $$
    其中,$\circ$ 表示Hadamard乘积,$\sigma’(Z^{(1)})$ 是激活函数的导数。

  4. 计算隐藏层梯度
    隐藏层权重梯度为:
    $$
    \frac{\partial \mathcal{L}}{\partial W^{(1)}} = \delta^{(1)} X^T
    $$
    隐藏层偏置梯度为:
    $$
    \frac{\partial \mathcal{L}}{\partial b^{(1)}} = \delta^{(1)}
    $$

2. 示例代码

下面是相应的反向传播的实现示例:

# 反向传播示例
def backward_propagation(X, Y, A1, A2, W2):
    m = Y.shape[1]  # 样本数

    # 计算误差
    delta2 = A2 - Y
    dW2 = np.dot(delta2, A1.T) / m
    db2 = np.sum(delta2, axis=1, keepdims=True) / m

    # 传播到隐藏层
    delta1 = np.dot(W2.T, delta2) * (A1 * (1 - A1))  # sigmoid的导数
    dW1 = np.dot(delta1, X.T) / m
    db1 = np.sum(delta1, axis=1, keepdims=True) / m

    return dW1, db1, d

15 深度学习与神经网络之前向传播与反向传播

https://zglg.work/cv-network-tutorial/15/

作者

AI免费学习网(郭震)

发布于

2024-08-10

更新于

2024-08-11

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论