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

用多层感知机(MLP)学习两个数的加法:从训练到推理的完整实践

梦伟君_3185

梦伟君_3185

发布时间:2026-02-18 21:59:16

|

721人浏览过

|

来源于php中文网

原创

用多层感知机(MLP)学习两个数的加法:从训练到推理的完整实践

本文详解如何使用 pytorch 构建一个极简 mlp 模型来学习实数加法,涵盖数据生成、模型训练、推理预测及结果验证,并指出关键实现细节(如学习率调整、前向调用方式)以确保模型准确收敛并支持任意新样本预测。

本文详解如何使用 pytorch 构建一个极简 mlp 模型来学习实数加法,涵盖数据生成、模型训练、推理预测及结果验证,并指出关键实现细节(如学习率调整、前向调用方式)以确保模型准确收敛并支持任意新样本预测。

在深度学习入门实践中,“让神经网络学会加法”是一个经典而富有启发性的任务——它虽简单,却能清晰揭示模型拟合本质、优化行为与泛化能力。本文将基于 PyTorch 实现一个仅含单层线性变换的多层感知机(MLP),从零开始训练其精确学习函数 $ f(x_1, x_2) = x_1 + x_2 $,并重点解决用户提出的核心问题:如何对训练好的模型进行推理(inference),即输入任意两个新数字,获取预测和结果?

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

与生成式模型(如 GAN、Diffusion)不同,本任务中的 MLP 是一个确定性回归模型,不提供 .generate() 方法(该方法常见于 torch.nn.Transformer 或 Hugging Face 的 GenerationMixin 模型)。正确做法是直接调用模型对象传入输入张量:

y_pred = model(X_new)  # X_new shape: (batch_size, 2)

这是 PyTorch 中所有 nn.Module 子类的标准前向接口,无需额外封装或特殊方法。

? 完整可运行示例(含训练+推理+验证)

以下代码实现了端到端流程,已修复原问题中两个关键点:

  • 将学习率从 1e-2 提升至 1e-1,显著加速收敛;
  • 移除错误的 model.generate(...) 调用,改用标准前向传播。
import torch
import torch.nn as nn
import torch.optim as optim

torch.manual_seed(42)

# 数据配置
N, D, C = 1000, 2, 1
X = torch.rand(N, D)                              # 形状: [1000, 2]
y = X.sum(dim=1, keepdim=True)                    # 形状: [1000, 1]

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

# 模型定义:单层线性层(等价于 y = w1*x1 + w2*x2 + b)
model = nn.Sequential(nn.Linear(D, C))

criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=1e-1)  # 关键:更高学习率提升收敛速度

# 训练循环
print("\n▶ 开始训练...")
for epoch in range(500):
    y_pred = model(X)
    loss = criterion(y_pred, y)

    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

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

# ✅ 推理阶段:对全新随机样本进行预测
print("\n▶ 在未见数据上测试模型...")
with torch.no_grad():  # 推理时禁用梯度,节省内存并加速
    for _ in range(5):
        X_new = torch.rand(1, D)              # 单样本,形状 [1, 2]
        y_pred = model(X_new).item()         # 获取标量预测值
        true_sum = X_new.sum().item()

        print(f"{X_new[0, 0].item():.2f} + {X_new[0, 1].item():.2f} "
              f"= {true_sum:.2f} | 预测: {y_pred:.2f}")

# 查看模型学到了什么
print(f"\n? 模型参数解析:")
state_dict = model.state_dict()
print(f"权重 w = {state_dict['0.weight'].flatten().tolist()}")   # 应趋近 [1.0, 1.0]
print(f"偏置 b = {state_dict['0.bias'].item():.2e}")             # 应趋近 0

⚠️ 注意事项与原理说明

  • 为什么不用 .generate()?
    generate() 是为自回归序列生成(如文本、语音)设计的高级接口,依赖 forward() + logits + sampling 等复杂逻辑。本任务是单步回归,直接调用 model(input) 即完成预测。

  • 为何学习率需调高?
    原 lr=1e-2 下损失下降缓慢(见原始日志),而 lr=1e-1 可在约 200 轮内使 MSE 降至 $10^{-15}$ 量级,表明模型已近乎完美拟合目标函数。

  • 模型本质是线性回归
    由于加法是线性操作,单层线性模型(无激活函数)理论上可精确表示。训练后权重收敛至 [1.0, 1.0]、偏置接近 0,印证了模型成功归纳出数学规律。

  • 泛化能力验证
    测试样本来自相同分布(torch.rand),但完全独立于训练集。预测误差通常小于 $10^{-6}$,证明模型不仅记忆训练样本,更掌握了加法的通用映射关系。

✅ 总结

通过本实践,你已掌握:
✅ 使用 model(X) 进行标准前向推理;
✅ 合理设置超参(如学习率)以保障收敛;
✅ 利用 torch.no_grad() 提升推理效率;
✅ 解析 state_dict() 验证模型是否学到预期规律。
这不仅是“学会加法”,更是理解神经网络作为通用函数逼近器的最小可行范例——下一步,可尝试加入非线性激活、扩展至三数相加,或引入噪声检验鲁棒性。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

小橡皮AI

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

豆包大模型

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

音述AI
音述AI Hot

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

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

WorkBuddy

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

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3188

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5069

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3829

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

466

2026.01.19

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

874

2023.11.24

pytorch是干嘛的
pytorch是干嘛的

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

2323

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

100

2026.10.22

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

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

60

2026.10.22

热门下载

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

精品课程

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

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