问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

动手学深度学习:反向传播具体是怎么实现的

创作时间:
作者:
@小白创作中心

动手学深度学习:反向传播具体是怎么实现的

引用
CSDN
1.
https://m.blog.csdn.net/ironbat/article/details/144241090

反向传播是深度学习中最重要的算法之一,它通过链式法则计算损失函数对模型参数的梯度,从而实现参数优化。本文将通过一个简单的线性回归例子,详细讲解反向传播的具体实现过程。

反向传播中的数值计算

在反向传播中,虽然神经元的输出y和加权输入z都是具体数值,但我们还是可以用微积分的链式法则来求偏导数。

链式法则



,则对x的偏导数计算方式为

在反向传播中,我们的目标是从损失函数开始,逐层计算损失函数对模型参数(w,b)的偏导数。

下面通过一个简单的线性回归例子,使用PyTorch框架,详细展示反向传播的具体实现过程。

import torch
import numpy as np
import matplotlib.pyplot as plt

# 输入数据和真实标签
x = torch.tensor([[1.0], [2.0], [3.0]])  # 输入
y_true = torch.tensor([[2.0], [4.0], [6.0]])  # 真实标签

# 初始化权重和偏置
w = torch.tensor([[0.5]], requires_grad=False)  # 权重
b = torch.tensor([0.0], requires_grad=False)  # 偏置

# 学习率
lr = 0.01

# 训练过程
num_epochs = 100
for epoch in range(num_epochs):
    # 前向传播:计算模型的预测值
    y_pred = torch.matmul(x, w) + b  # 预测值 = w * x + b

    # 计算损失:均方误差
    loss = 0.5 * torch.sum((y_pred - y_true) ** 2)  # MSE 损失函数

    # 手动计算损失对 w 和 b 的梯度
    # 对 w 和 b 计算偏导数
    # 损失对预测值 y_pred 的偏导数
    dL_dy_pred = y_pred - y_true  # 这里是 (y_pred - y_true)
    
    # 损失对 w 的偏导数 (梯度) 使用链式法则
    dL_dw = torch.matmul(x.T, dL_dy_pred)  # 对 w 的梯度 = x.T @ (y_pred - y_true)
    
    # 损失对 b 的偏导数
    dL_db = torch.sum(dL_dy_pred)  # 对 b 的梯度 = sum(y_pred - y_true)

    # 更新权重和偏置
    w -= lr * dL_dw
    b -= lr * dL_db

    # 打印每 10 个 epoch 的损失
    if (epoch + 1) % 10 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

# 输出训练后的权重和偏置
print(f'Final weight: {w.item():.4f}, Final bias: {b.item():.4f}')

# 可视化训练数据和拟合的直线
plt.scatter(x.numpy(), y_true.numpy(), color='red', label='True data')
plt.plot(x.numpy(), y_pred.detach().numpy(), color='blue', label='Fitted line')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

通过这个简单的例子,我们可以清晰地看到反向传播算法的具体实现过程。从损失函数开始,逐层计算梯度,并使用梯度下降法更新模型参数,最终实现模型的优化。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号