深度学习系列(3):前向传播与反向传播
在上一期中,我们介绍了深度神经网络(DNN)的基本概念。本期将深入探讨深度学习的核心计算过程——前向传播(Forward Propagation)和反向传播(Backpropagation),它们是训练神经网络的关键步骤。
1. 前向传播(Forward Propagation)
前向传播是指数据从输入层经过隐藏层,最终传递到输出层的过程。在这个过程中,每一层的神经元都会对输入数据进行加权求和,并通过激活函数进行非线性变换。
假设一个简单的神经网络结构如下:
- 输入层有 ( x_1, x_2 ) 两个神经元
- 隐藏层有两个神经元,权重分别为 ( w_{11}, w_{12}, w_{21}, w_{22} )
- 输出层有一个神经元,权重为 ( w_{31}, w_{32} )
计算步骤:
- 隐藏层计算
[
h_1 = f(w_{11}x_1 + w_{12}x_2 + b_1)
]
[
h_2 = f(w_{21}x_1 + w_{22}x_2 + b_2)
] - 输出层计算
[
y = g(w_{31}h_1 + w_{32}h_2 + b_3)
]
其中,( f(\cdot) ) 和 ( g(\cdot) ) 是激活函数,例如 ReLU 或 Sigmoid。
2. 反向传播(Backpropagation)
反向传播用于计算损失对各层权重的梯度,并通过梯度下降法优化权重。核心思想是链式法则(Chain Rule),即通过输出层误差逐层向后计算梯度。
计算步骤:
- 计算损失:
[
L = \frac{1}{2} (y - \hat{y})^2
] - 计算输出层误差:
[
\delta_3 = (y - \hat{y}) g’ (z_3)
] - 计算隐藏层误差:
[
\delta_2 = \delta_3 w_{32} f’(z_2)
]
[
\delta_1 = \delta_3 w_{31} f’(z_1)
] - 更新权重(梯度下降):
[
w_{ij} = w_{ij} - \eta \cdot \delta_j \cdot x_i
]
其中 ( \eta ) 是学习率。
3. 代码示例(PyTorch 实现)
import torch
import torch.nn as nn
import torch.optim as optim
# 定义简单的前向传播网络
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(2, 2)
self.fc2 = nn.Linear(2, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = torch.sigmoid(self.fc2(x))
return x
# 创建数据
x_data = torch.tensor([[0.5, 0.8]], dtype=torch.float32)
y_data = torch.tensor([[1.0]], dtype=torch.float32)
# 创建模型、损失函数和优化器
model = SimpleNN()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)
# 训练过程
for epoch in range(100):
optimizer.zero_grad()
output = model(x_data)
loss = criterion(output, y_data)
loss.backward() # 反向传播
optimizer.step() # 更新权重
if epoch % 10 == 0:
print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}')
4. 结论
前向传播用于计算输出值,反向传播用于计算梯度并优化网络参数。理解这两个过程是深入掌握深度学习的基础。下一期,我们将介绍 梯度消失与梯度爆炸问题 及其解决方案,敬请期待!
下一期预告:梯度消失与梯度爆炸
1441

被折叠的 条评论
为什么被折叠?



