讲师中心 微信公众号
AI工具推荐 视频效率加速

用 PyTorch 构建 MLP 实现两数加法:从训练到推理的完整教程

阿晨大大_9840

阿晨大大_9840

发布时间:2026-02-18 16:11:00

|

794人浏览过

|

来源于php中文网

原创

用 PyTorch 构建 MLP 实现两数加法:从训练到推理的完整教程

本文详解如何使用 pytorch 构建一个单层全连接神经网络(mlp)来学习两个实数的加法运算,涵盖数据生成、模型训练、推理预测及权重解析,帮助初学者理解神经网络拟合线性函数的本质。

本文详解如何使用 pytorch 构建一个单层全连接神经网络(mlp)来学习两个实数的加法运算,涵盖数据生成、模型训练、推理预测及权重解析,帮助初学者理解神经网络拟合线性函数的本质。

在深度学习入门实践中,“让神经网络学会加法”是一个经典而富有启发性的任务。它看似简单,却能清晰揭示模型如何通过梯度优化逼近线性映射关系。本文将带你从零实现一个仅含一个 Linear(D=2, C=1) 层的多层感知机(MLP),完成对加法函数 $ y = x_1 + x_2 $ 的端到端学习,并重点解决“训练后如何正确进行前向推理”这一常见困惑。

✅ 正确的推理方式:前向传播即预测

与生成式模型(如 GAN、Diffusion)不同,标准 MLP 没有 .generate() 方法。你遇到的 model.generate(idx, 50) 报错正是因为该方法并不存在于 torch.nn.Sequential 或 torch.nn.Linear 中。正确的预测方式极其简洁:直接调用模型对象传入输入张量即可触发前向传播(forward pass):

PyTorch Linux版 2.11.0
PyTorch Linux版 2.11.0

PyTorch 2.11.0 历史版本下载,来自 PyPI 官方发布,适合旧项目兼容、实验复现和指定环境安装。

下载
y_pred = model(X_new)  # ✅ 正确:X_new shape: (N, 2) → y_pred shape: (N, 1)

只要输入张量 X_new 的第二维(特征数)与模型输入维度一致(此处为 2),PyTorch 就会自动完成矩阵乘法与偏置加法:
$$ \mathbf{y}{\text{pred}} = \mathbf{X}{\text{new}} \cdot \mathbf{W}^\top + \mathbf{b} $$

? 完整可运行示例代码

以下是一个结构清晰、带关键注释的完整实现,已修复原代码中的学习率、训练循环和推理逻辑问题:

import torch
import torch.nn as nn
import torch.optim as optim

# 固定随机种子,确保可复现
torch.manual_seed(42)

# 数据配置
N, D, C = 1000, 2, 1  # 样本数、输入维、输出维
lr = 1e-1             # ⚠️ 关键调整:原 1e-2 收敛慢,1e-1 更稳定高效

# 生成训练数据:X ∈ [0,1)^2,y = x₁ + x₂
X = torch.rand(N, D)
y = X.sum(dim=1, keepdim=True)  # 等价于 torch.sum(X, axis=-1).reshape(-1,1)

print(f"X.shape: {X.shape}, y.shape: {y.shape}")
print(f"X[:3]:\n{X[:3]}")
print(f"y[:3]:\n{y[:3]}")

# 构建模型:单层线性变换(无激活函数 → 保持线性)
model = nn.Sequential(nn.Linear(D, C))
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=lr)

# 训练循环
print("\n? 开始训练...")
for epoch in range(500):
    optimizer.zero_grad()           # 清空梯度(必需!)
    y_pred = model(X)             # 前向传播
    loss = criterion(y_pred, y)   # 计算损失
    loss.backward()               # 反向传播
    optimizer.step()              # 参数更新

    if epoch % 50 == 0:
        print(f"Epoch {epoch+1:3d} | Loss: {loss.item():.2e}")

# ? 模型推理:对新样本进行预测
print("\n? 测试泛化能力(5 组新随机数):")
with torch.no_grad():  # 推理时禁用梯度,节省内存 & 加速
    for _ in range(5):
        X_test = torch.rand(1, D)          # 新样本:形状 (1, 2)
        y_test_pred = model(X_test).item() # 获取标量预测值
        true_sum = X_test.sum().item()
        print(f"{X_test[0,0]:.2f} + {X_test[0,1]:.2f} = {true_sum:.2f} | 预测: {y_test_pred:.2f}")

# ? 解析学得的参数(验证是否学到 y = x₁ + x₂)
print(f"\n? 模型学得的权重与偏置:")
for name, param in model.named_parameters():
    print(f"{name}: {param.data}")

⚠️ 关键注意事项

  • 无需非线性激活:加法是线性操作,隐藏层或 ReLU 等非线性会阻碍最优解收敛,应保持纯线性结构。
  • 学习率敏感性:1e-2 在本任务中收敛缓慢;1e-1 能在百轮内达 1e-15 级损失,体现超参调优的重要性。
  • optimizer.zero_grad() 不可省略:否则梯度会跨 batch 累积,导致训练崩溃。
  • 推理务必 torch.no_grad():避免构建计算图,提升速度并防止显存泄漏。
  • 权重解读:理想情况下,训练后 weight = [[1.0, 1.0]],bias ≈ 0(如答案中 2.37e-9),直观证明网络已“理解”加法规则。

? 总结

这个极简 MLP 加法器虽无实用价值,却是理解神经网络本质的绝佳入口:它证实了——即使最基础的线性模型,也能通过梯度下降精确学习确定性数学函数。当你看到 weight 收敛至 [1,1] 时,便真正触摸到了“学习”的物理含义。下一步,可尝试扩展为三位数加法、引入噪声鲁棒性,或对比不同优化器表现,深化对监督学习机制的理解。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

2283

2024.05.29

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

68

2025.12.22

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

40

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

40

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

20

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

20

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

20

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

20

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn