从梯度到大模型(008):从手写 w、b 到神经网络,讲清 nn.Module、Loss 与 Optimizer
从梯度到大模型(008):从手写 w、b 到神经网络,讲清 nn.Module、Loss 与 Optimizer课程:《从梯度到大模型:LLM 系统实践课》本课预计用时:90~120 分钟,可分两次完成运行环境:Python 3、PyTorch,CPU 即可前置课程:第 6 课自动求导、第 7 课 Dataset 与 DataLoader在上一课,我们已经能把数据分成小批次,再一批一批地训练:# 摘出一个批次的关键步骤;参数已在循环外创建。w.grad=Noneb.grad=Noneprediction=xb @ w+b loss=((prediction-yb)**2).mean()loss.backward()withtorch.no_grad():w-=learning_rate*w.grad b-=learning_rate*b.grad这段代码里,预测、求导、更新参数的过程都很清楚。但当模型从两个参数变成几十个、几万个参数时,我们会遇到新的问题:参数放在哪里?怎样找到需要更新的参数?每一层的计算又怎样组织?本课就从我们熟悉的工时预测开始,把这段代码逐步改写成 PyTorch 常见的训练方式。学习时先记住三个分工:组件本课中负责什么对应的问题nn.Module组织模型的参数和前向计算怎样得到预测值?Loss 函数比较预测与目标模型整体错了多少?Optimizer使用已有梯度更新参数下一步怎样调整?它们共同完成训练,但各自只负责其中一部分。后面我们会用同一组数字,把每个步骤算出来。这篇文章怎样学?不必一口气记住所有新名字,可以分两次完成:第一次读第二至十节:把手写的线性模型改成 PyTorch 写法,并手算一次更新。读完应能回答“梯度是谁算的,参数又是谁改的”。第二次读第十一至十五节,再阅读第十六节完整代码,按第十七节运行:看清两层网络的形状、参数数量和训练过程。第十九节是分类预习,完成回归实验后再读;最后独立完成三道课后作业,答案留到下一课。第一节保留上节作业解析,方便连载读者核对。只想学习本课新内容,可以从第二节开始。正文中的短代码用于解释局部步骤,不能从第一段到最后一段直接拼接运行。需要执行时,请使用第十六节的完整demo.py。文中X表示整组输入,xb表示一批输入;y、target都表示目标值,yb是一批目标值。一、上节作业答案与讲解如果你还没完成第 7 课作业,可以先跳到第二节,做完后再回来核对。作业 1:11 条样本,batch_size=4,会分成几批?先不丢弃最后一批:第 1 批:4 条 第 2 批:4 条 第 3 批:3 条 合计:11 条因此:drop_last=False# 共3批,本课每批更新一次,所以每轮更新3次。如果设置:drop_last=True最后不足 4 条的那批会被丢弃:第 1 批:4 条 第 2 批:4 条 合计:8 条每轮只更新 2 次,另外 3 条不参加这一轮的训练。注意,“一个 epoch”表示遍历一轮训练数据;是否丢弃尾批会影响实际参与计算的样本数。作业 2:单样本和批次的形状已知:X.shape = [11, 2] y.shape = [11, 1]Dataset 返回:returnX[index],y[index]整数索引会去掉最前面的样本维度:一条样本: X[index].shape = [2] y[index].shape = [1]DataLoader 把 4 条样本放在一起后:第一批: xb.shape = [4, 2] yb.shape = [4, 1]最后只有 3 条:最后一批: xb.shape = [3, 2] yb.shape = [3, 1]第二个维度没有变:每条任务仍有两个特征,仍对应一个标签。变化的是这一批有多少条任务。作业 3:自己创建两特征数据集一种可用的数据是:importtorch X=torch.tensor([[1.0,0.0],[0.0,2.0],[2.0,2.0],[3.0,1.0],[1.0,4.0],[4.0,0.0],])y=2*X[:,0:1]+0.5*X[:,1:2]+1这里特意使用0:1和1:2,让取出的特征列保持[6,1]。计算后的 y 也是[6,1]。各条标签为:[3.0, 2.0, 6.0, 7.5, 5.0, 9.0]索引 2 对应第三条数据[2,2]:y = 2×2 + 0.5×2 + 1 = 6接着前面的 X、y,实现题目要求的 Dataset,并打印全部批次:fromtorch.utils.dataimportDataLoader,DatasetclassTaskDataset(Dataset):def__init__(self,features,labels):self.features=features self.labels=labelsdef__len__(self):returnlen(self.features)def__getitem__(self,index):returnself.features[index],self.labels[index]dataset=TaskDataset(X,y)print("样本数:",len(dataset))print("索引2:",dataset[2])loader=DataLoader(dataset,batch_size=2,shuffle=False)forbatch_index,(xb,yb)inenumerate(loader,start=1):print(batch_index,xb.tolist(),yb.tolist())__len__告诉加载器共有多少条数据,__getitem__保证特征和标签按同一个索引配对。这里没有打乱,三批依次来自索引 0、1;2、3;4、5。每批特征[2,2],标签[2,1]。作业 4:为什么固定种子,每一轮顺序仍可能不同?种子确定的是随机数生成器的起点。假设第一次运行从种子 123 开始:起点123 → 第1轮排列 → 第2轮排列第二次从同一种子开始,并执行相同流程:起点123 → 对应的第1轮排列 → 对应的第2轮排列我们比较的是“两次运行中的对应轮次”,而不是要求“同一次运行的两轮完全一样”。正确做法是创建一次 generator 和 loader,在多轮之间复用。不要为了“固定随机数”,在每个 epoch 开头重新初始化成相同种子。用作业 3 的 dataset 核对,下面每次调用函数只创建一次 loader,然后连续遍历两轮:defcollect_two_epochs(seed):generator=torch.Generator().manual_seed(seed)loader=DataLoader(dataset,batch_size=2,shuffle=True,generator=generator,num_workers=0,)orders=[]for_inrange(2):order=[]forxb,_inloader:order.extend(xb.tolist())orders.append(order)returnorders first_run=collect_two_epochs(123)second_run=collect_two_epochs(123)forepochinrange(2):print("轮次:",epoch+1)print("第一次:",first_run[epoch])print("第二次:",second_run[epoch])print("对应轮次一致:",first_run[epoch]==second_run[epoch])assertfirst_run==second_run这里每条特征都不同,可以用特征行辨认顺序。在同一环境、相同代码路径下,两次的对应轮次应一致;不要再加“两轮必须不同”的断言,因为不同随机抽取也可能偶然得到相同排列。具体排列以运行结果为准。作业 5:整体 MSE 应该怎样算?三批分别有 4、4、1 条样本,批次 MSE 分别为 2、4、10。先还原每批的平方误差总和:第1批:4×2 = 8 第2批:4×4 = 16 第3批:1×10 = 10再除以全部样本数:整体 MSE = (8+16+10)/(4+4+1) = 34/9 ≈ 3.7778如果直接算:(2+4+10)/3 ≈ 5.3333就把只有一条样本的最后一批,与有四条样本的批次赋予了相同权重。这里每条样本只有一个输出,所以按样本数加权即可。若要称为“某一组模型参数的整体 MSE”,这三批必须由同一组固定参数计算;如果批次之间更新了参数,这只是训练过程中的误差汇总。第十七节会用程序中的两个指标说明这一区别。作业 6:参数初始化和清梯度应该放在哪里?上一课错误代码有两个问题:第一,把参数放在 epoch 内创建,会每轮重新开始:forepochinrange(5):w=torch.zeros((2,1),requires_grad=True)第二,只在 epoch 开头清梯度,会让不同批次的梯度累积到一起。正确结构为:# 只初始化一次w=torch.zeros((2,1),requires_grad=True)b=torch.zeros(1,requires_grad=True)forepochinrange(5):forxb,ybintrain_loader:# 每批重新计算自己的梯度w.grad=Noneb.grad=

相关新闻

Vue 调试三种方式配 TaoToken:devtools、VSCode 与 debugger 的 settings.json 骨架

Vue 调试三种方式配 TaoToken:devtools、VSCode 与 debugger 的 settings.json 骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/28 18:44:44 阅读更多 →
FastMCP 高级特性之Background Tasks:用 TaskConfig 与 Docket 搭建可复现的后台任务骨架

FastMCP 高级特性之Background Tasks:用 TaskConfig 与 Docket 搭建可复现的后台任务骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/28 18:43:44 阅读更多 →
广州帅兵科技 × 任夏《月亮替我望故乡》:一次由歌迷发起的音乐专辑U盘制作全案设计

广州帅兵科技 × 任夏《月亮替我望故乡》:一次由歌迷发起的音乐专辑U盘制作全案设计

喜欢一首歌的时候,总想为它做点什么。 这段时间我一直在循环任夏老师的《月亮替我望故乡》,越听越觉得 —— 这么好的歌,值得一套配得上它的实体专辑。我是广州帅兵科技的一员,我们公司专门做音乐 U 盘专辑策划与定制。 于是我们没…

2026/9/28 18:43:44 阅读更多 →

最新新闻

FPGA仿真通过上板失败?解析仿真与硬件差异及系统排查方法

FPGA仿真通过上板失败?解析仿真与硬件差异及系统排查方法

做FPGA的小伙伴,十有八九都经历过这个“名场面”:仿真平台里波形漂亮得无懈可击,接收、发送、协议解析全部一次通过,心里想着“稳了”,结果比特流下载到板子上,示波器一接、串口一调,直接傻眼—…

2026/9/28 19:32:01 阅读更多 →
无人车自主避障实战:从仿真建模到实车部署全流程解析

无人车自主避障实战:从仿真建模到实车部署全流程解析

做无人车自主避障控制,最扎心的一句话是“仿真里跑得好好的,一上实车就废了”。这句话我听了不下十遍,自己也亲身踩过坑。这个项目从数字模型到实车部署,完整走完大概花了三周,中间推翻过两版方案,调过一整…

2026/9/28 19:32:01 阅读更多 →
全链路监控链路探针的损耗评估与优化

全链路监控链路探针的损耗评估与优化

在现代大型云原生分布式微服务体系中,全链路追踪(APM / Distributed Tracing,如 SkyWalking / OpenTelemetry Java Agent) 是架构师透视数千个微服务跨网络调用拓扑、秒级排查慢调用与定位分布式死锁的“全息透视镜”。 然而&…

2026/9/28 19:32:01 阅读更多 →
影刀RPA实操指南:AI生成周报初稿——数据表格自动变文字

影刀RPA实操指南:AI生成周报初稿——数据表格自动变文字

影刀RPA实操指南:AI生成周报初稿——数据表格自动变文字 每周五下午对着Excel周报发呆,销售数据一堆数字,不知道怎么组织成一段话,这是很多做运营的朋友的共同痛点。我用影刀RPA搭了一个周报生成流程:表格数据自动汇总…

2026/9/28 19:32:01 阅读更多 →
大促弹性算力与无损降本第四周攻坚总结

大促弹性算力与无损降本第四周攻坚总结

在重保大促倒计时的第四周(W4 阶段),整个云原生基础设施与容量架构团队在面对“数十万 QPS 极限高并发压测”与“极致精益成本控制”两座大山时,交出了一份惊艳全公司的完美答卷。 很多企业在大促备战时,往往陷入“为了…

2026/9/28 19:32:01 阅读更多 →
W4 实习生大模型周总结:从 RAG 混合召回到多轮长记忆中枢与 SQL AST 审计全景工程实战

W4 实习生大模型周总结:从 RAG 混合召回到多轮长记忆中枢与 SQL AST 审计全景工程实战

在过去这一周(W4)的大模型工程落地与高可用研发中,我们完成了从“单一 Prompt 交互”到“支撑复杂企业级严肃业务的AI 工程化纵深防御体系(Full-Stack LLM Engineering System)”的全面闭环! 在很多初级 AI…

2026/9/28 19:31:01 阅读更多 →

日新闻

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?…

2026/9/28 0:00:34 阅读更多 →
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例…

2026/9/28 0:00:34 阅读更多 →
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。…

2026/9/28 0:00:34 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 5:40:26 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 9:47:26 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/28 8:07:01 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/28 16:55:15 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/28 3:51:11 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/26 22:52:30 阅读更多 →