先说一个可能有点冒犯的结论:市面上关于“从零开始学AI”的内容,九成以上都是把“跑通一个别人写好的模型”包装成了“学会AI工程”。你照着教程敲了三行代码,看到损失函数从3.2降到0.8,顿时觉得自己已经站在浪潮之巅了,然后回到真实项目里,面对脏数据、训练不稳定、模型上线后效果暴跌,照样手足无措。我见过太多人卡在这一步,也包括当初的自己。
这份“ai-engineering-from-scratch”不是给你列一堆课程链接,也不是让你先啃完四本数学砖头再回来写代码。它是一套我自己反复调整过的学习路线:从工程视角切入,把AI落地需要的能力拆成几个明确的板块,每个板块都知道“为什么要学”“学到什么程度算够”“学完能做什么”。如果你目前的状态是:会写Python基础语法,但面对一个完整的AI项目不知道从哪下手;或者已经在调包跑模型,但模型之外的工程环节几乎空白——这篇内容就是冲着解决你手头的问题来的。
1. AI工程到底在解决什么问题:先别急着写模型
很多人对AI工程的误解,是从“工程”这两个字开始的。他们以为AI工程的难点全在模型算法上,于是花几个月死磕Transformer源码、研究各种注意力变体,结果真正进入项目后,最耗精力的反而是数据清洗、特征一致性、模型版本管理、线上推理延迟优化这些“不性感”的活儿。
1.1 模型算法只是冰山一角
一个真正跑在生产环境里的AI系统,模型训练代码通常只占整个项目代码量的20%不到。剩下的是什么?数据管道负责把散落在各个业务库里的原始日志变成可训练的数据集;特征平台保证训练时用的特征和上线后推理时拿到的特征完全一致,这一点如果做不到,模型离线指标再漂亮都是自欺欺人;模型服务需要考虑延迟和吞吐量的平衡,是走同步接口还是走异步批处理;监控体系要盯着数据分布漂移和预测置信度,确保模型不会在用户没有察觉的情况下悄悄变笨。
你只有把AI工程当成一个系统工程去看,后面拆解每一步的时候才会觉得合理:为什么非要先学Python工程化而不是直接跑模型;为什么数学基础不需要你学到数学系毕业的水平;为什么数据处理花的时间往往比建模更长。这些都是真实项目里每天都会遇到的矛盾,不是哪个培训机构的老师拍脑袋定的大纲。
1.2 从零开始不等于从数学开始
这条路线里最想纠正的一个思路是:把“零基础”等同于“先把数学补到满分”。我见过一些非常努力的人,花了一年时间啃完三本数学教材,题做了几千道,可等到真要上手写一个分类模型时,连pandas的DataFrame都玩不转,反向传播的公式推导倒是能默写下来。有用吗?有一点用,但效率太低了。
正确的顺序是倒过来的:先用Python把数据操作练熟,在真实的数据集上跑通第一个简单模型,因为模型训练过程中的梯度消失、过拟合、学习率过大导致loss变成NaN,这些具体的报错和经验会反过来告诉你,数学里的哪一块知识是真正必要的。带着问题去补数学,效率是漫无目的刷题的好几倍。这个项目的路线也是按这种“以工程驱动理论补充”的思路来安排的。
1.3 设定合理的产出标准
学完这个路线,你应该具备什么能力?这个标准必须在一开始就讲清楚,免得学着学着就迷失方向。
你至少应该独立完成一个端到端的监督学习项目:自己写脚本采集或下载数据、做清洗和探索性分析、设计特征、训练模型、调参、评估、然后用Flask或FastAPI把它包装成一个HTTP接口,最后在本地用curl测通整个流程。能做到这一步,你就算真正摸到AI工程的门槛了。这个门槛不高,但无数人一直停留在“在Jupyter Notebook里跑通别人的代码”的层次上,从来没往前迈过这一步。
2. 编程基础与工具链:你的武器不能只停留在“能跑”
AI工程首先是软件工程。这句话值得用最大号的字强调一遍。如果你写出来的代码只有你自己能看懂,函数命名全是temp_1、temp_2,没有版本管理概念,改了几行代码之后发现效果变差却完全回滚不了,那你在AI这条路上走不远。
2.1 Python的工程化学习,而不是语法学习
Python语法看一遍官方教程就能上手,这不难。难的是用工程的标准来要求自己。至少要做到这几点:用一个虚拟环境管理项目依赖,保证换个机器还能复现环境;把代码拆成模块而不是一个两三千行的脚本从头写到尾;学会用pdb或断点调试,而不是到处print然后猜问题;养成写基础测试的习惯,尤其是对数据处理的函数,因为数据处理函数一旦出错,影响的是后面整个模型的训练效果。
我特别想强调依赖管理的部分。实际工作中最常见的场景是:你半年前写的一个预处理脚本,今天要复用,结果一跑就报错,因为当年装的numpy是1.x版本,现在环境里是2.x,某个API的行为变了。如果你养成用requirements.txt或pyproject.toml锁住版本的习惯,这种问题几乎可以完全避免,一点都不用去挑战自己的记忆力。
2.2 三个不练会吃亏的Python库
pandas、numpy、scikit-learn里的train_test_split这些工具,是你未来每天都要打交道的。很多新手觉得pandas就是查查数据、画画图,其实完全不是这么简单。
你需要掌握的pandas核心操作包括:groupby做分组聚合、merge做表间关联、apply和vectorized operation的区别——这最后一点最容易踩坑,很多人不知道apply在逐行处理时慢到什么程度,而用向量化写法可能快出几十倍。有个很经典的练习:拿一份一百万的订单表,先用apply写一个特征提取函数测一下耗时,再改成向量化写法再测一次,这个体验比什么教程都直观,能让你从心底里建立起性能意识。
numpy那边重点掌握数组的切片、广播机制和矩阵运算。不需要学得很深,但要达到“看到一个公式能想象出对应操作的数组维度变化”的程度,因为你后面用深度学习框架时,排查shape不匹配的问题几乎天天都会发生。
2.3 版本控制是保命技能
Git这东西,理论上应该是一个AI工程师的底线技能,但实际接触下来,完全不会用的人还真不少。最搞笑的是我见过一个同事,每天备份代码的方式是“复制一份加日期后缀”,文件夹里躺了几十个版本的脚本。
你不需要成为Git专家,但几个操作必须形成肌肉记忆:git init、git add、git commit基础操作,git checkout或git revert帮你回到上一个正常状态,git diff让看清楚到底改了什么。建议你再养成一个习惯——每完成一个能跑通的小功能就commit一次,而不是憋一整天到晚上一次性提交。这样出了问题时,你二分查找一下就定位到是哪次提交引入的bug。
3. 数学与机器学习核心:懂原理是为了不被模型牵着走
到了数学和机器学习这一块,我先把话说硬一点:在工作中你确实用不到太深的数学,但你必须有足够扎实的基础去理解模型在干什么。否则你连过拟合和欠拟合都解释不清楚,怎么判断一个模型是好的还是坏的?
3.1 线性代数与微积分的真实权重
对AI工程来说,线性代数的核心不是做大量行列式计算,而是理解矩阵和向量之间的关系。你可以这样想:一个特征矩阵就是一批样本,每个样本是一行,每个特征是一列;模型训练本质上就是在找一个变换矩阵,把输入空间映射到输出空间。有了这个直觉,你再去理解全连接层、embedding层,就顺理成章了。
微积分那边,重点是导数的概念和链式法则。因为反向传播算法本质上就是在反复应用链式法则求梯度。你不需要手推ResNet的反向传播公式,但在调试模型时如果遇到梯度爆炸或梯度消失,至少得知道问题从哪来——激活函数选得不好会加剧梯度消失,学习率过大会导致梯度更新一步迈得太大直接飞出最优点。这些经验性判断,背后全是导数那一丁点概念。
3.2 概率统计是模型评估的地基
分类模型为什么优先用log loss而不是准确率?A/B测试时怎么看结果显著不显著?特征分布漂移怎么量化?这些问题全部指向概率统计。
入门阶段,你至少要搞懂:什么是均值、方差、正态分布,什么是概率密度,条件概率怎么算。然后学一点最大似然估计的直觉——很多损失函数的设计思路,背后都是从最大似然来的。分类问题的交叉熵损失,本质上就是在做最大似然估计,理解了这层关系,你调参时就知道为什么模型会往某个方向收敛,而不是瞎试。
3.3 机器学习核心概念的直觉比调参技巧更重要
在深度学习满天飞的今天,我依然认为从传统的scikit-learn开始学机器学习是正确路径。为什么?因为逻辑回归、决策树、随机森林这些模型结构简单、可解释性强、训练速度快,能让你把注意力放在真正核心的问题上:数据怎么处理、模型怎么评估、参数怎么影响结果。
具体来说,你需要亲手做几件事:用train_test_split或KFold理解交叉验证的实际意义;亲手画学习曲线,直观观察高偏差和高方差的区别;试一下L1和L2正则化对模型权重的影响,感受“让模型变简单”和“让模型变复杂”这两个方向在曲线上的表现。
4. 深度学习入门:先跑通,再深挖
深度学习的出现把AI的门槛大幅拉低了。这是事实,但也是一个陷阱,因为门槛低了,导致很多人的基础并不扎实。你看到网上到处是“我用TensorFlow/Keras做了一个图像分类”的教程,但实际工程里,模型结构设计的差异远没有数据质量的差异影响大。
4.1 框架选择与第一个模型
框架选哪个不是最重要的事,PyTorch和TensorFlow都用过的话,我个人更倾向于推荐PyTorch,原因是它的调试体验更自然——model(inputs)直接调用,可以随时print中间张量的shape,代码风格也更接近原生Python。TensorFlow在生产部署上有自己的生态优势,但对新手来说,PyTorch的学习曲线明显更平滑。
搭第一个模型,不要去复制别人的完整代码然后跑通就算完。你要做的是:自己定义一个包含两个隐藏层的多层感知机,自己写训练循环,自己实现一个早停机制。整个过程你会遇到至少十几个报错,这些报错就是你最好的学习材料。每解决一个,你对模型训练机制的了解就深一层。反向传播的内部细节你暂时可以不去手动推导,但至少要知道它在做什么——通过链式法则计算损失对每个参数的梯度,然后用梯度下降更新参数。
4.2 训练流程的标准步骤要熟到背下来
一个标准的深度学习训练流程,步骤其实很固定:加载数据并划分训练集、验证集、测试集;定义模型结构;设定损失函数和优化器;进入epoch循环,前向传播、计算损失、反向传播、更新参数;在每个epoch结束后用验证集评估;保存最优模型权重。
这一套流程我建议你写到烂熟于心。因为后面你做的任何复杂任务——不管是目标检测还是文本生成——都是在这一套基本骨架上添加花样。
4.3 GPU与算力:不是有了就能用好的
训练深度学习模型离不开GPU,这里有几个踩坑经验值得提前分享。首先,显存不是越大越好,但太小一定跑不动,入门级别8GB起步比较稳妥,像RTX 4060这种就够用了。其次,CUDA环境配置是个大坑,版本不匹配导致的报错足够让人崩溃,建议优先用Docker镜像来跑深度学习环境,很多官方镜像已经把CUDA、cuDNN和框架版本匹配好了,你不用重复造轮子。
再就是Batch Size的选择。Batch Size不只是影响训练速度和显存占用,还会影响模型的收敛效果。经验法则:如果训练loss震荡得很厉害,可以试着调大Batch Size;如果显存不够但不想调小Batch Size,可以试梯度累积。这些技巧比较偏工程实操了,但非常实用。
5. 数据工程环节:模型之外的真正主场
如果你去问一个在一线干了多年的AI工程师:“你觉得AI项目里最耗时、最容易出问题、也最体现水平的部分是什么?”八成以上的回答都是数据。这个答案可能让你意外,但在我自己做完好几个端到端项目之后,已经深深认同了。
5.1 数据质量决定模型上限
这个问题用一句话就能说透:数据决定了模型能达到的上限,而模型只是尽量逼近那个上限而已。你把最先进的模型用到一份标签错误率达到20%的数据上,效果大概率不如一个线性模型用在干净数据上好。
所以你要花大力气去做数据清洗:处理缺失值是用删除、用均值/中位数填充还是用模型预测填充;处理异常值是直接截断还是单独建模;处理重复样本需要检查业务上是否本来就可能出现相同特征但不同标签的样本,如果是就要特殊处理而不是简单去重。每一步操作都要思考“为什么”,同时记录下来做了哪些清洗,因为这一份数据清洗记录,就是模型的“前置代码”,上线时要原样复现。
5.2 特征工程与数据泄漏的恩怨
特征工程是提升模型效果的捷径。比如一个用户复购预测问题,与其用复杂的深度学习模型,不如先想办法构造出“用户过去30天购买次数”“用户最近一次购买距今天数”“用户平均客单价变化趋势”这些特征。真实场景中,业务理解能力转化成特征的能力,比模型调参能力更稀缺。
但特征工程有一个需要高度警惕的坑——数据泄漏。比如你预测一个人会不会违约,特征里却包含了“是否被催收过”,这个特征本身就是结果的一部分,模型训练时已经把答案看到了。这种泄漏会导致训练时指标爆表,上线后表现稀烂。我自己的血泪经验是:每构造一个特征,先问自己一句“在预测的时刻,这个信息真的已经存在并且可以被获取吗”。
5.3 类别不平衡:被严重低估的问题
很多新手在真实项目里遇到类别不平衡会一脸懵。比如欺诈检测场景中正样本可能只有1%,如果你直接用准确率评估,模型全部预测为负样本也能拿到99%的准确率,看起来很厉害,实际上一点用都没有。
处理思路有几种方案:收集更多数据,这是最根本但往往成本最高;用采样方法调整数据分布,包括SMOTE过采样和随机欠采样;在损失函数中给少数类样本更高的权重;换评估指标,比如用precision、recall、F1 score、AUC等,而不是只看准确率。新手最容易犯的错是拿训练集上直接做SMOTE再切分验证集,导致验证集里也混入了合成样本,评估结果虚高,这就是另一种形式的数据泄漏。
6. 模型评估、部署与监控:从实验到生产的最后一公里
模型的离线训练做得再漂亮,不部署上线就产生不了实际价值。而这正是“从零开始”的路线图和普通教程最大的分水岭——前面那些步骤,教程里都有教;模型部署和监控这一块,几乎没有人系统性地讲给新手听。
6.1 离线评估体系怎么搭建
评估方式决定你能否正确判断模型好坏。首先,切分数据时注意:时间序列数据必须按时间顺序切,不能用随机切分,否则就相当于用未来数据训练模型预测过去,这完全是作弊;分类问题如果类别不平衡,用分层抽样保证训练集和测试集中正例比例一致。
然后,评估指标要看业务场景的侧重。比如你做一个风险评分系统,宁可把有风险的用户多拦下来一些,也不能漏掉任何一个真正有风险的客户,那这时候recall比precision重要,或者你想在两者之间找一个平衡点,那就关注F1值。再多说一步:只用一个指标的评估是不可靠的,建议多指标联合判断,同时画出混淆矩阵去看具体哪些类被搞混了。
6.2 模型API化:把模型从Notebook里搬出来
部署的第一步是让模型可以独立于训练环境运行。用FastAPI比Flask更简洁,自带数据校验和接口文档。你的接口应该接收JSON格式的输入特征,内部调用加载好的模型做推理,最后返回预测结果。
这一阶段有一个隐藏的大坑:输入预处理的一致性。很多人在开发环境里预处理用的是一段代码,部署时又写了一段看起来差不多但实际细节不同的代码,结果线上效果暴跌。正确做法是:把特征工程、数据清洗这些环节封装成一个类或函数,不管在训练还是推理环境里都调用同一个方法,从机制上保证两条链路的一致性,一劳永逸。
6.3 上线的长期主义:持续监控与迭代
模型上线不意味着工作结束,一切才刚刚开始。你需要在监控面板上关注几个核心信号:特征的分布有没有漂移,比如用户年龄分布突然变化、某个字段缺失率突然上升;模型的预测输出分布有没有偏移,比如某个类别的预测概率整体变高;预测准确度有没有下降,可能需要抽样人工评估或借助业务反馈指标。一旦发现异常,触发告警后就要考虑是重新训练模型,还是调整特征,或者回滚到上一个版本。
同时模型版本管理也很重要。每次重新训练都是一个新版本,要有清晰的文件命名和记录,甚至用MLflow这样的工具管理实验参数、指标和模型文件。这样你才能真正回答“现在线上跑的是哪个版本”“它为什么比上一版好”这两个灵魂拷问。
7. 一条可以照抄的百天路线:从零到能打
这套路线我按12周周期做了一个阶段划分。每个阶段都有明确目标和验收标准,可以当作日历上的提醒,按周次去推进。要是不喜欢这种节奏安排,也可以自行调整,骨架放在这里,灵活套用。
| 阶段 | 时长 | 核心任务 | 验收标准 |
|---|---|---|---|
| Python工程化 | 第1-2周 | pandas、numpy数据操作练习,虚拟环境和Git,基本的API开发 | 能写一个FastAPI接口读写数据库,代码通过Git管理 |
| 机器学习基础 | 第3-5周 | scikit-learn完成分类和回归全流程,交叉验证、正则化、主要评估指标 | 在Kaggle的Titanic或房价数据集上独立完成一个完整方案 |
| 深度学习入门 | 第6-8周 | PyTorch从零实现MLP和简单CNN,跑通训练循环和早停机制 | 在MNIST或CIFAR-10上达到80%以上准确率 |
| 数据处理进阶 | 第9-10周 | 处理缺失值、类别不平衡、构造特征、排查数据泄漏 | 在给定不均衡数据集上完成端到端建模,并写出特征工程文档 |
| 部署与监控 | 第11-12周 | FastAPI封装模型、Docker镜像部署、线上监控指标设计 | 把一个训练好的模型部署到本地Docker,能用curl完成推理调用 |
7.1 每周的时间怎样分配更合理
按每天两小时来算,一周大约十四个小时。我建议拆成四份:九个小时用来做项目、看文档和写代码,两个半小时用来补理论,一个半小时用来复盘和写笔记,剩下一小时逛逛社区或者好好休息。不用把程度搞得太紧绷,长期主义的节奏才是可持续的,一天学八小时的猛冲式学习,往往撑不过一个月就熄火。
学习过程中的一切配置文件、踩坑记录、经验总结,都建议写成自己的文档或博客。写作的过程本身就是在做信息消化和思考沉淀。我自己很多模糊的概念,都是写着写着想明白的。
7.2 坚持不下去的时候,问自己一个问题
这条路线学到中段,大概率会遇到劝退时刻,尤其是深度学习训练怎么都跑不出理想效果的时候。这是正常的,不代表你不适合学AI,恰恰说明你开始触及这门技术的真实难度了。
我的建议是:停下来,回到你最初做过的那个最简单的数据集上,把整个流程从头到尾再走一遍。你会发现自己跟几周前已经完全不同了——能用更少的代码完成预处理、能看懂模型训练的日志信息、能快速定位问题。这个正向反馈比看十篇“AI前景一片大好”的文章都管用。学AI这件事确实有方法论,我的体会就是:快跑不如持续跑,贪多不如嚼烂,你踩过的每一个坑,都会变成你和别人拉开差距的地方。