第 4 讲是这门课第一次把人按到键盘前面。前三讲讲原则、讲研究、讲数据本身的结构,从这一讲开始,Paul Liang 把麦克风让给两位 TA:David 和 Chanaka,带大家在 Colab 里把一个分类模型从头跑通。
听上去像一节教 PyTorch 怎么写 tensor 的工具课。我开头也这么以为,听完才发现不对:这节课表面在讲 PyTorch 和 Hugging Face,真正讲的是一种做事节奏——拿到一份新数据,你先看它一眼,再搭最薄的一层 harness,再用一份”调试清单”逼自己回到数据里。这个节奏才是这一讲的题眼,工具只是顺手带过的载体。
这是 MIT《How to AI (Almost) Anything》的第 4 讲(原视频),主题是 实用 AI 工具。
这一讲真正讲的是:先和数据”贴脸”,再谈模型
整节课有一句话被 David 和 Chanaka 反复说,后半段 Chanaka 干脆把它放进了调试清单的第一条:become one with the data。我把它直译成”和数据贴脸”。
它不是一句鸡汤。它是这一讲所有具体动作的起点:在写第一行 model = 之前,先把 CSV 打开看一眼,先用 matplotlib 画一画时间序列,先 print 一下 tensor.dtype,先确认你以为的 80% 训练集和 20% 测试集是不是真的在不同的天、不同的房间。这门课开宗明义说自己教的是”原则不是方法”(见第 1 讲),”贴脸数据”就是这套原则里最朴素也最难做到的那一条。
很多教程会跳过这一步,理由是”反正神经网络会自己学”。这节课用一个反例把这句话戳穿了:他们自己做的嗅觉分类器,从 PyTorch 深度模型换成随机森林,准确率从 75% 跳到 95.8%。一行模型代码的改动,跑赢了你写一晚上的 MLP。
为什么会这样?因为这份数据只有十几个传感器通道、一两千个样本。深度模型在低维少样本的地盘上,优势消失,而它对超参、对噪声、对环境漂移的脆弱性照旧。下面这一讲所有的工具操作,本质上都是为了让你尽快走到”我能看清这份数据长什么样、什么模型配得上它”的那一刻。
嗅觉传感器:一个被讲透的小项目
David 没有挑 MNIST 这种被讲烂的数据集,他用的是 Paul 组里自己采的嗅觉数据。一块装着十几个气体传感器的小板子,凑近物体闻一闻,采到的就是若干通道的时间序列。这份数据被反复用来当本系列的”贴身样本”,第 1 讲 Paul 拿它演示过”识别花生救命”的故事,这一讲又拿来当 PyTorch 教程的载体。一个数据集贯穿全程,本身就是个好习惯——你能看到同一份原料在不同问题下的不同切法。
任务很小:三分类,识别空气、酒精、咖啡豆。但他没有跳着讲,反而把一份真实数据集里所有容易摔跤的地方挨个拆给你看:
第一坑,数据形状和文档不一样。 David 直接说:”我的经验是,文档里写的格式,跟你下载下来的格式,经常不是一回事。”所以打开文件夹之前,先 os.listdir 看一眼有几个 CSV,再 print 一行看一眼列名是什么。这件事每个人都知道该做,但绝大多数人写代码时会跳过。
第二坑,采集过程里的”状态位”。 数据里有一列 state,0 是环境采样、1 是凑近物体采样。课上有个学生问”这是机械臂自动切的吗”,David 答”不是,人手切的,我们也想要机械臂”。这个细节我特别喜欢,它把数据集还原成了一个真实的、有人在房间里手动操作的过程。采数据这件事,从来没有”自动化”四个字那么干净。
第三坑,有的通道根本没采到信号。 学生追问:”那这个不工作的传感器为啥还留在数据里?”David 的回答是两层的:这份样本里它坏了,别的样本里它是好的;而且神经网络通常对单个通道的噪声很鲁棒,会自己学会忽略。这是个值得记下来的判断:盲目剔列不如让模型自己拒绝。 Paul 在旁边补了一句更狠的话:真要剔列,看的不是这一个文件,是整个数据集。
第四坑,通道量级差异。 LPG 通道在 0 到 2000,O2 在 50 到 100。如果不做归一化,LPG 这个量级大的通道会主导整个梯度,模型就被它”绑架”了。归一化在这种数据上算不得优化技巧,它是不做就跑不起来的前置条件。
第五坑,环境的偏置。 同一个房间初始读数本来就抖,所以他们减掉了每次采样开头那段环境基线,只保留相对变化。这一步谈不上预处理”风格”,它属于看了数据之后才知道要做的修正。
把这五个坑串起来看,你会发现 David 演示的根本不是 PyTorch 语法,而是一种“看数据的姿势”。PyTorch 那几行 torch.tensor torch.from_numpy tensor.to(device) 只是顺手讲的,真正讲透的是:在你写训练循环之前,这份数据需要先被你看见。
训练/测试切分:最容易骗自己的一步
整节课最值钱的一段,在讲完模型训练之后。有学生问”分类器是分一整段时间序列还是一个时间窗”,David 回答了,然后 Paul 接了一段我觉得应该裱起来的话。
他说:你怎么切训练集和测试集,几乎决定了你这个模型有没有意义。
举的例子很具体。如果你在同一个 session 里、甚至同一个小时内采的数据,前 80% 给训练、后 20% 给测试,模型当然能跑出漂亮的准确率,但它学到的只是”记住这一小时的环境”,并不是”区分酒精和咖啡豆”。换到第二天、换个房间、换个温湿度,它立刻就废。
他们自己就吃过这个亏:在某个屋子里训出来的模型,搬到另一个屋子或者室外就不工作了,因为它压根没学会区分背景的温度、湿度。
把这件事翻译成一句通用的原则:训练集和测试集的切分方式,应该尽可能模拟你真实部署时的分布差异。 你将来要在新一天用模型,就按”按天切”;你将来要在新场地用,就按”按场地切”。否则你看到的准确率,是你自己给自己写的一个安慰剂。
这一段值不值钱,看你写过多少次”明明离线指标很好上线就崩”的事故复盘。
Hugging Face + LoRA:从”自己写”到”接生态”
后半段 David 切到 Hugging Face,讲怎么用别人预训练好的大模型。这部分动作很多,但精神只有一句:当数据量和模型规模到了你写不动的量级,你的工作就从”造模型”变成”接生态”。
具体到几个能记住的小判断:
怎么估能不能跑得动一个大模型? David 给了个糙但够用的拇指规则:模型名字里 1B 前面的数字乘 2,大约就是推理需要的 GB 显存;训练再多估一点。一个 1B 模型,T4 上 4GB 显存够推理,训练就吃力。这种”心算估算”是工程师身上很值钱的肌肉,比背 transformer 公式有用。
LoRA 是个适配器,不是新模型。 它在原模型基础上加一小撮可训练参数,让你能用很少的显存把大模型微调到自己的领域。这门课不打算教你从零预训练,所以微调路径就是大家真正会用到的那条。LoRA 里的 r 和 alpha 越大,改得越多、显存吃得越多。
4bit 不是常态,只是省显存的妥协。 David 特地点了一句:理想情况下 16bit 训练更稳,4bit 是因为 Colab 装不下才用的。这种”我知道这不是最佳实践,但我先告诉你为什么这么做”的口气,是好工程教育的标志。
WandB 看两块表:显存和功率。 训练跑起来之后,他先看 GPU 显存占用,压到 80-90% 最理想,太高会 OOM,太低说明 batch size 没拉满。再看 GPU 功耗,低于 60% 就是数据管线在拖后腿,GPU 在等你喂数据。这两块表,比看 loss 曲线更早能告诉你训练有没有跑顺。
这一段讲的全是脚手架,没人会因为这些知识拿奖,但它决定你能不能在一个晚上把模型真的跑起来。
调试模型更像工艺活
最后十分钟 Chanaka 接过来,讲一份”调试模型”的清单。他开场就说一句话:调试机器学习模型更像艺术,不像科学。
我把他那张总图压成几条可以背的口诀:
- 先和数据贴脸:再炫的模型也救不了你没看过的数据。少样本场景里,识别数据里的可建模 pattern,比换更深的网络重要。
- 固定随机种子:训练已经够随机了,把所有你能锁住的随机性都锁住,你才知道是模型变了还是命数变了。
- 看初始 loss:模型刚 init 完,先跑一次,看 loss 是不是 inf、是不是离你期望的”瞎猜基线”差太远。一上来就发疯,大概率是初始化或归一化的锅。
- 先在单个样本上过拟合:模型连一个样本都背不下来,后面所有努力都白费。这一步是判断”模型架构有没有学习能力”的最便宜的实验。
- 能过拟合再谈泛化:dropout、weight decay 这些正则化手段,在你能过拟合一个小训练集之前都别碰。先确认下限,再谈上限。
- 别一上来调架构:很多人读了几篇 paper 就想换个炫架构,结果根本是数据没洗、超参没调、初始化不对,跟架构无关。架构是最后再动的东西。
- 超参很可能就是答案:Chanaka 说得很直接,大多数模型其实能 work,只是没人花时间搜超参。小模型尤其,值得多搜几组。
这七条没有一条新,但放在一起就是一份反 hype 的工程纪律。它在反对的不是某种具体做法,而是新手最容易犯的那种”先调最酷的、再回头补数据”的顺序。
我会怎么用 / 放到机器人现场看
把这一讲整篇压回机器人云的现场,有几处是直接对得上的。
第一,清洁机器人的传感器数据,跟那块嗅觉芯片是同一种”动物”——多通道、低维、有量纲差、有环境偏置。 一台清洁机器人身上,激光雷达、深度相机、IMU、里程计、电机电流、碰撞、超声、防跌落,各自的量纲完全不在一个数量级:激光雷达点云一秒几万点,IMU 一秒几百帧,碰撞传感器一天可能只触发几次。这种数据上面跑分类/异常检测,优先级跟 David 在嗅觉芯片上一样:先看数据、先归一化、先做基线减除、先用随机森林或者 XGBoost 把”傻瓜基线”打出来,再谈深度模型。我见过太多团队上来就堆 transformer 处理传感器序列,准确率不如一个手动加几个滑窗特征的 GBDT。
第二,”训练/测试切分按部署场景切”这条,在机器人上是性命攸关的。 我们最容易翻车的一类模型,是地面材质识别、玻璃门检测、湿滑预警。如果你的训练数据来自十台机器人在三个商场扫了一个月,测试集是从同一池子里随机抽 20%,模型在离线看准确率 95%,部署到第四个商场,比如换了一种灰色花岗岩或者天花板灯光不一样,直接退回 60%。正确的切法是按机器、按场地、按时间窗切。这一段 Paul 讲嗅觉芯片在不同房间失效,跟我们换商场失效,是同一份病。
第三,”通道坏了别急着剔”这条,我们走过反方向的弯路。 早期我们做某个异常检测时,看到某型号 IMU 的某轴噪声特别大,就在预处理里把它整轴 mask 掉。后来发现:那一轴在某些机型的某些工况下其实是关键判据,我们一刀切掉,等于把模型的一只眼睛戳瞎了。David 那句”网络对单通道噪声通常很鲁棒,要剔得看整个数据集而不是一个文件”,直接打脸我们当年的做法。
第四,机器人云上跑大模型这件事,LoRA 是真实路径。 我们做语义理解、做工单分类、做用户回访总结这些场景,业务样本量永远凑不够预训练,但完全可以用 LoRA 把开源基础模型(foundation model,无需从头训练的大型预训练模型)调到我们的语料上。David 那个”模型参数前面的 B 乘 2 估显存”的拇指规则,是工程选型时的省心算法,我会让团队的 ML 工程师都背下来。
第五,Chanaka 的调试清单可以直接挂墙上。 我们模型上线前的 checklist,过去主要盯准确率、F1、混淆矩阵这些”结果指标”,对训练过程本身的健康度看得不够。”初始 loss 是不是疯的””单样本能不能过拟合””超参搜过没有”——这些过程门禁,值得加进我们模型上线评审的标准模板里。结果指标看得见,过程指标决定结果指标的可信度。
收束
听完这一讲,我反而对前三讲的”原则”二字理解又深了一层。原则不是抽象的口号,它就藏在 print 一行 dtype、画一张时间序列图、把训练集按天切开这些不起眼的动作里。能不能在自动跑训练之前先和数据贴脸,能不能在炫架构之前先让一个 100 行的随机森林跑出来,能不能把”环境换了模型就崩”的风险在切数据时就堵住,这些才是把一个新模态做出来的真功夫。
工具会换,昨天是 PyTorch + Hugging Face,明天可能是别的栈。但这套”看数据 → 搭最小 harness → 按清单调试 → 再回到数据”的节奏,十年内都不会过时。
本系列
MIT《How to AI (Almost) Anything》共 12 讲,这是我的逐讲解读:
- 这门 MIT 课不教模型,教你怎么”想” AI
- 怎么做 AI 研究:读论文、找想法、快速验证
- 数据、结构与信息
- 在动模型之前,你得先和数据”贴脸” (本篇)
- 常见模型架构
- 多模态对齐
- 多模态融合
- 跨模态迁移
- 大型基础模型
- 大型多模态模型
- 强化学习与交互
- 人机交互









AI周刊:大模型、智能体与产业动态追踪
程序员数学扫盲课
冲浪推荐:AI工具与技术精选导航