声称"99%准确"的医疗AI,可能一个病人也没抓住——机器学习入门笔记

假设你是某个大型筛查项目的负责人:1000 人里,有 10 位真正的高危患者。你部署了一套医疗 AI,它报告的整体准确率是 99%。听起来几乎完美。但仔细一查就会发现,这 99% 全部来自它把 990 个健康人判成"正常",而那 10 个最需要救治的高危者,一个都没被抓住。准确率这么高,为什么救人反而一个都没救到?

这套笔记想讲的核心就是这一件事:一个模型"看起来准确",和它"真的可靠",中间隔着什么。我们不用公式,只靠直觉和案例,沿着「数据 → 模型 → 算法 → 指标 → 系统」一条路走到底。读完你会得到一张判断任何机器学习系统的完整检查表。

机器学习到底在干什么:为什么第一步不是选模型

从房价预测认识"五件套"

先看一个最简单的例子:预测房价。你手上有几百套房子记录,每一行是一套房子的数据:面积、卧室数、地段评分,还有最终成交价。这里面,面积、卧室数叫特征(feature),是你用来判断的依据;成交价叫标签(label),是你想预测的答案。

整个机器学习就是围绕五个词转的。模型(model):一个把输入映射到输出的函数,可以理解成"一套可能的答案形态"。数据(data):喂给模型的例子。训练(training):用数据反复调节模型内部参数、让它拟合规律的过程。推理(inference):训练好后,拿新数据来问它要答案。算法(algorithm):训练时那套稳定、可重复的改进流程。还有一个贯穿始终的评估指标(evaluation metric):量出"模型到底够不够好"的尺子。

课件里有一句概括了整个体系的结论:模型决定能表示什么,算法决定如何学习,指标决定是否足够好。记住这句,后面每一章都是在给它加细节。

官方算法地图:先问数据,再选模型

一个零基础的人拿到问题,本能反应是"我先找个厉害的模型"。但 scikit-learn 官方有一张"算法选择地图",专门纠正这个直觉:它把选模型变成一条决策路径,第一道闸门不是"哪个模型强",而是"我的数据有多少"。样本不足 50 个,官方直接建议"去多收集数据";数据够多,再问"有没有标签";有标签,再问"输出是类别还是数值"。

每个分支都指向一族候选模型,地图上还有一串橙色箭头,官方原话是:如果当前估计器没达到预期效果,就沿箭头试下一个。这就是课件概括的"大多数 AI 项目都先从简单基线开始,再逐步换更强的模型"sklearn 算法地图。所以正确的项目开局不是挑模型,而是回答三个问题:输出是什么、数据长什么样、怎么算够好。前两个问题,正是接下来第 2、3 章的主角。

从预测到行动:一张能力谱系

顺着这条"先问数据、再选模型"的路看向远方,会看到机器学习的能力是分级长出来的,每一级都在前一级之上叠加新能力:

图注:从经典机器学习到 RAG/Agent 的五级能力谱系。级别越高,能处理的问题越复杂,但每一级都还依赖下面各级的能力。这条谱系就是全篇的路线图:预测是基础,感知靠深度网络,生成靠大语言模型,最后接上检索与行动。

现在地图已经摊开,但我们还缺一个关键前提:任何模型都要求数据是"干净、可比、划分诚实"的。这正是最容易让系统悄悄变不可靠的地方。

数据准备三关:尺度、划分、类别失衡——每一关失守都会骗你

课件把数据处理比作一条证据流水线(pipeline):先问数据可比较吗、有代表性吗、评估方式诚实吗。这一章就是这条流水线的三道关卡,每一关失守都会让后面的模型"看起来很行,其实在骗你"。

第一关:特征缩放——让特征站在同一起跑线

想象一份数据:收入从 0 到 1,000,000,年龄从 0 到 100,点击率从 0 到 1。如果直接拿这堆数字去算距离或做梯度类模型,收入这个特征会因为数值大几个数量级而主导整个目标函数,模型几乎等于只看收入、忽略其他特征scikit-learn 预处理。解决办法是特征缩放(feature scaling):把不同量纲的特征拉到同一尺度。注意,缩放改变的是表示,不改变标签真相,房子还是那套房子,只是数字更可比了。

scikit-learn 提供三种常用缩放器,选型口诀看数据分布:

缩放器怎么做什么时候选
StandardScaler减均值、除以标准差(z-score 标准化)数据干净、近似正态分布
MinMaxScaler压到固定区间,默认 [0,1]需要固定有界区间,或特征标准差极小
RobustScaler用中位数和四分位距(IQR)缩放数据里异常值很强时,官方定位为"直接替换"方案

缩放器还有一个必须守住的纪律:只能在训练集上学习参数,再把同一套变换原样套到测试集。看代码最直观:

scaler = StandardScaler()          # 或 MinMaxScaler / RobustScaler
scaler.fit(X_train)                # 只在训练集上算均值、标准差
X_train_scaled = scaler.transform(X_train)
X_test_scaled  = scaler.transform(X_test)   # 复用同一个变换,绝不能重新 fit

为什么"绝不能重新 fit"?这里埋着整条流水线最重要的一条规则,下一关展开。

第二关:数据划分——练习、调参、期末考试

模型要"诚实评估",前提是考试题不能提前见过。课件把三套数据比成三种角色:**训练集(train)**是平时练习,用来拟合参数,大约 70%;**验证集(validation)**是模拟考,用来调超参数,约 15%;**测试集(test)**是期末考试,约 15%,只在全部调参结束后碰一次。泄漏规则用集合写出来就是:测试集的信息与训练决策的交集必须为空scikit-learn 交叉验证。上一关的缩放器"只在训练集 fit",正是这条规则的第一课。

如果你反复拿着测试集调参,就等于把考题答案看了一遍又一遍,"对测试集的知识会泄漏进模型",期末分数自然虚高。数据太少、怕浪费训练数据时,用**K 折交叉验证(K-fold cross-validation)**谨慎复用:把训练集切成 K 份,每一轮用 K-1 份训练、1 份验证,轮转 K 次,最终报告所有轮分数的平均。

图注:K 折交叉验证的轮转机制。外层测试集保持从未被碰过,内层训练集切成 K 份轮流当验证,CV 分数是所有轮验证分数的平均。sklearn 官方示例在这套机制下用鸢尾花数据 5 折得到 0.98±0.02 的平均准确率;k 是可以调的,课件讲的十折只是 k=10。

时间序列是一处例外:相邻观测互相相关,随机打乱再切分会把"未来"泄露给"过去"。这时不能用普通 K 折,要用滚动验证(rolling validation),官方工具 TimeSeriesSplit 的机制是训练集不断向前滚动扩张:先拿前 3 个点预测第 4 个,再拿前 4 个点预测第 5 个,依此类推。

第三关:类别不平衡——多数类会吞掉少数类

现在回到开头那个场景的数据层。一份筛查数据里 99 个正常、5 个异常。一个"什么都不做"的朴素模型只要对所有人说"正常",准确率也有约 95%(99/104),可它在少数类上彻底失败。原因是机理层面的:多数类会在训练过程中"吞没"其他类,少数类根本没机会影响决策边界imbalanced-learn。

应对思路是重采样(resampling):把少数类"补"起来。最简单的 RandomOverSampler 是有放回地复制少数类样本;更聪明的是 SMOTE,它不复制原样,而是在少数类两个样本的连线上随机取一个新点,几何直觉是"在两个真样本之间插出一个看起来合理的中间样本",公式是 $x_{new} = x_i + \lambda (x_{zi} - x_i)$,$\lambda$ 是 [0,1] 上的随机数。还有一条路线是类别权重:给少数类更高的损失权重,让它每错一次"罚得更重"。

from imblearn.over_sampling import SMOTE
X_res, y_res = SMOTE().fit_resample(X_train, y_train)
# 在少数类两个样本的连线上随机插值出新样本

课件在这一页开头就埋了个伏笔:不平衡场景下,判断模型好坏不要只看准确率,要去看召回率、精确率、F1 这些指标。这三关守住之后,还有一个问题悬着:数据都准备好了,那到底该怎么测才算数?这个问题的答案,要一直等到第 5 章讲完指标才能揭晓。

模型家族:为什么先决定"输出是什么"再挑模型

第 1 章说过,选模型的第一问是"输出是什么"。这章的展开顺序就按能力谱系从低到高走:经典家族解决"预测",深度网络解决"感知",Transformer 解决"理解上下文",语言模型再把它变成"生成"。

经典家族:估数值、估概率、找结构

经典机器学习按任务分成三大族。**回归(regression)**估一个数值:房价、销量、库存,代表人物是线性回归、Lasso、Ridge。**分类(classification)**估一个概率:风险、转化、文本类别,代表是逻辑回归、SVM、kNN、朴素贝叶斯。**聚类(clustering)**在无标签数据里找结构:用户分群、推荐、检索,代表是 K-means、PCA。沿着第 1 章那张官方地图走,每条链路都内建了"先简单、不行再换强"的 TRY NEXT 递进。

深度网络谱系:从局部到全局

经典模型处理表格数据是强项,但面对图像、语音、长文本就需要深度网络。深度网络不是一个模型,而是一族"学习表示"的架构:CNN 擅长学局部模式(图像识别、医学影像、工业质检),RNN/LSTM 擅长按顺序处理序列(语音、时间序列),Transformer 擅长建模全局上下文(翻译、摘要、大语言模型、多模态)。

自注意力:查资料时按需关注

Transformer 的核心是自注意力(self-attention)。直觉可以这样建立:你查资料时,不会把一本书从头读到尾,而是根据当前任务,给相关的段落分配更高的注意力。自注意力做的事完全一样:对序列里的每个词,根据上下文动态决定"我该多关注哪些词"。课件里用 "I want to book a ticket" 举例,句子里的每一个 token(词元)都会去和所有其他 token 计算关联,权重不是写死的,而是由输入内容现场决定。

机制上它把每个词变成三份:**query(查询)**回答"我在找什么",**key(键)**回答"我有什么可被匹配的标识",**value(值)**才是真正的内容。query 和所有 key 算相似度,软化成权重,再对 value 加权求和,就得到这个词带着上下文信息的新表示。下图是整套架构的总览,注意编码器与解码器两条竖列都是 N 层堆叠,每一层内部是"注意力 + 前馈网络"再套一层残差连接。

图注:Transformer 总体架构。左侧编码器(Encoder)由 N 层堆叠,每层含多头自注意力与前馈网络;右侧解码器(Decoder)除同样堆叠外还加了一层对编码器输出的注意力,并带掩码保证生成时只看已产生的部分。底部 embedding(嵌入)与位置编码把输入文本变成向量入口。Transformer

注意力本身对词序无感,"猫追狗"和"狗追猫"在它眼里没有区别,所以模型必须额外注入位置编码来告诉它先后顺序。另外,单头注意力会稀释"不同位置关注不同子空间"的能力,原论文实验显示单头比最好的多头设置差 0.9 BLEU,所以实际用多头(multi-head):多个注意力头并行、各看各的表示子空间,最后拼起来。

图注:注意力计算的两层结构。上方是单头注意力:query 与 key 做点积、缩放、softmax 得到权重,再与 value 加权求和;下方是多头版本:多个注意力层并行,各头输出拼接后经线性投影融合。图中 Q/K/V 的加权求和就是"查资料按需关注"的数学实现。Transformer

两条语言模型路线:先看完再作答 vs 逐词续写

Transformer 架构催生了两个方向的继承者,构成了语言模型的路线分叉。BERT 走编码器路线(Encoder):它用双向注意力,每个词同时看左右两边的上下文,课件把它的能力概括成"先看完整个输入再作答",擅长理解与标注,比如句子分类、抽取式问答(在段落里找答案片段)。GPT 走解码器路线(Decoder):注意力只允许看左侧的词,也就是"逐词续写",擅长生成与续写。论文里给了一个命名的钥匙:双向 Transformer 常被称为 encoder,只看左侧上下文的版本常被称为 decoder,因为只有它能用于生成Transformer。

BERT 带来的另一项贡献是**预训练加 fine-tune(微调)**范式:先用海量无标注文本预训练,让模型掌握通用语言能力,比如完形填空式的 Masked LM 和判断两句是否相邻的下一句预测;到了具体任务,只在其上加一层输出层微调。2018 年发布时,BERT 用这套范式在 11 个 NLP 任务上刷新了纪录,这是当时的历史里程碑而非今天的榜单BERT。

图注:BERT 的预训练-微调两段式范式。左侧预训练用无标注语料学通用语言能力(Masked LM 与下一句预测),右侧微调时在预训练参数上为每个下游任务加一层输出层。除输出层外两阶段架构相同,同一套参数可以初始化不同的下游模型。BERT

到这里模型"家族谱"已经清楚。但注意,GPT 这条"逐词续写"的路线有个隐患:它会算命一样接着写,可它凭什么知道你想要的答案标准?这个问题把故事推向大模型时代的对齐方法,第 7 章会专门回答。在那之前,先看训练环节:模型选好了,怎么把它"练出来"?

训练与调参:下山、背答案、踩刹车——模型怎么一步步学会的

训练的本质,是在数据里搜索一个足够好的函数。它由三个选择决定:选什么模型(能表示多复杂的函数)、用什么损失(怎么算"错得多离谱")、怎么优化(如何更新参数)。损失函数就是那句大白话:把模型错得到底多离谱,变成一个数字。回归常用 MSE(均方误差),分类常用交叉熵,先记住它们是"错误程度计分器"就够了Deep Learning

梯度下降:走下山坡

参数怎么更新?想象你站在一片山谷里,周围全是浓雾,看不见全景,只想走到谷底。你唯一的办法是低头看脚下的坡度:坡往哪边低,就往哪边走一小步,走完再看,再走,直到脚下基本是平地。这就是梯度下降(gradient descent):读局部坡度(梯度)→ 沿反方向迈一小步 → 重复 → 到谷底停下。每步的大小由**学习率(learning rate)**控制:太大,一步跨过头、直接冲上对面的坡(overshoot);太小,走得极慢,甚至卡在半山腰。

图注:梯度下降"下山"循环。每一步都先读坡度、再迈一小步,反复检查损失是否够低;学习率太大可能冲过头,太小则走不动。训练循环的完整形态是"预测 → 算损失 → 更新 → 验证"不断重复。

训练同时也是个迭代诊断循环:误差太高,就换特征、换模型、换损失;别指望一次训练就把一切调对,先让循环转起来。

欠拟合与过拟合:没学会 vs 背答案

模型能表示的复杂程度叫容量(capacity)。容量太低,规律学不进去,训练误差怎么都降不下来,这是欠拟合(underfitting),可以叫"没学会"。容量太高呢?模型的教科书定义是:欠拟合发生在模型无法在训练集上获得足够低的误差时,过拟合发生在训练误差与测试误差的差距过大时Deep Learning。用一个高阶多项式拟合一组弯曲的散点,它能把每一个训练点精确穿过,却在点与点之间画出真实数据根本没有的深谷,这就叫过拟合(overfitting),通俗说就是"背答案":把训练集的细节连噪声一起背下来了,可碰上没见过的新题就露馅。所以目标从来不是背下训练集,而是对新数据可靠。

怎么给"背答案"踩刹车?正则化(regularization),可以理解成"复杂度上的一种税"。它的力度由一个系数 $\lambda$ 控制:$\lambda$ 太低,模型太自由,把噪声也记住了;$\lambda$ 平衡,保留规律的同时限制复杂度;$\lambda$ 太高,模型被约束得学不进去。常见做法包括 L2 正则(把权重拉向原点)、L1 正则(产生稀疏解、顺带做特征选择)、dropout(训练时随机丢弃一些单元,像集成了一堆子网络)。概念上记住一句就够了:正则化不会让模型变笨,它帮模型避免记住噪声。

偏差与方差:下一步该改什么

练完一轮,模型不太行,下一步改什么?不要凭感觉换更大的模型,先做偏差/方差诊断。这里正好复用第 2 章的三套数据:训练误差高、验证误差也高,说明高偏差(欠拟合,没学会);训练误差低、验证误差明显差,说明高方差(过拟合,背答案);两者都不明显但结果就是不对,很可能问题出在数据或标签本身,要做误差分析。下表是课件给出的行动清单:

症状(训练误差 / 验证误差)诊断典型动作
都高高偏差(欠拟合)更强的模型、更好的特征、训练更久
训练低、验证明显差高方差(过拟合)更多数据、正则化、降低复杂度
没有明显规律数据 / 标签问题抽样失败案例、修正标签、加护栏

模型总算练好了,可下一个问题立刻浮出水面:怎么判断它"够好"?练得再好,没有一把对的尺子,数值漂亮也可能是错觉。这把尺子,就是第 5 章的主题。

评估指标:一个模型"看起来准"和"真的可靠"隔着什么

第 2 章把"怎么测才算数"的问题留在这里。现在回到开头那个 1000 人的场景,把它当一道算术题认真做一遍。

准确率为什么会骗人

先请出一张 混淆矩阵(confusion matrix):行是真实类别,列是预测类别,对角线就是答对的格子。这个 2×2 的表格是后面所有概念的地基:

预测:有风险预测:正常
真实:有风险TP:抓住了FN:漏掉了
真实:正常FP:误报了TN:放行了

**准确率(accuracy)**是全部四个格子里对角线之和的占比。用它来看这个场景:990 个健康人全被说成"正常",10 个高危者也全被说成"正常",准确率 99%(990/1000),但高危患者一个没抓到。用混淆矩阵的语言说,就是 FN=10、TP=0:模型把所有力气都花在答对健康人上,恰恰在最要命的格子上全军覆没。scikit-learn 官方文档对这件事有句精准的概括:如果准确率高只是因为分类器占了不平衡测试集的便宜,那么平衡准确率会掉到 1/n_classes,也就是随机水平scikit-learn 评估。99% 这个数字本身没有撒谎,撒谎的是我们拿它衡量所有错误的权重。

精确率、召回率与 F1:你在乎哪种错误

换个角度问:我们真正在乎的是什么?这就引出两个指标。**精确率(precision)**问的是"被标记为高风险的人里,多少是真的",对应表格里的 TP/(TP+FP),可以想成"捞上来的鱼里多少是真鱼";**召回率(recall)**问的是"所有真正高风险的人里,多少被抓住了",对应 TP/(TP+FN),想成"所有真鱼里捞到了多少"。医学筛查最怕把健康人误判成有风险(误报),所以要高精确率;反欺诈和内容审核最怕漏掉真正的问题(漏报),所以更看重召回率。而 F1 是两者的调和平均,给一个兼顾两者的单个数。课件里的分工很明确:精确率,医学筛查场景;召回率,反欺诈、内容审核、安全告警。

两类错误的代价一旦定下来,指标的选择就顺势而定:你测量什么,模型就朝什么优化,指标是方向盘。在失衡场景下,精确率-召回率曲线(PR-AUC)比 ROC-AUC 更灵敏,因为 PR 曲线的随机基线会随正样本占比移动;这是一条实用的教学经验,属于解读而非某个库的官方一句话规则。注意它也并非常胜将军,选指标要回到"你最怕哪种错误"。

macro 与 micro:整体高分盖住稀有类

多分类时,平均方式也藏着陷阱。**macro(宏平均)**给每个类别同等权重,稀有类不会被淹没;**micro(微平均)**先把所有样本合并再统一计算,频繁类权重自然更大。想凸显稀有类,看 macro。scikit-learn 官方文档的分类报告示例很有说服力:某个三分类问题里,一个稀有类的精确率/召回率/F1 全部是 0.00,整体准确率仍有 0.60,但 macro 平均只有 0.49,整体高分把"这个类全挂"掩盖得严严实实。

选指标先按任务分:回归看 MSE/MAE/RMSE(放大大的失误 / 对异常值稳定 / 与目标同单位),分类看精确率/召回率/F1 与宏微平均,排序看 NDCG@k(越靠前的结果越重要)。模型上线之后,评估对象从模型变成整个系统:质量(线上准确率、人工审核通过率)、体验(延迟、失败率、可用性)、漂移(输入分布偏移、错误模式变化)。一句话收束:离线评估决定模型能不能上线,线上监控决定它能不能一直运行。

指标这把尺子我们终于握在手里了。现在把它放进一个真实的医疗项目,看看前五章是怎么协同工作的。

胸片案例:把前五章装进一个真实的医疗系统

斯坦福大学 2017 年的 CheXNet 是把这一整条链装进真实系统的好例子:给胸片做个肺炎辅助诊断,还要达到放射科医生级别的表现。它不是一道"选个模型"的题,而是端到端的临床系统设计问题,正好按前五章的顺序过一遍。

按临床输出选模型

先回答第 1 章的第一问:输出是什么?临床需求是"这张胸片有没有肺炎",这是一个二分类输出。于是模型家族锁定为 CNN,具体选了 121 层的稠密卷积网络 DenseNet-121,把最后一个全连接层换成单个输出加 sigmoid,给出肺炎的概率;随后任务扩展成 14 种胸部病理的多标签分类,输出变成 14 维概率向量CheXNet。这就是第 3 章"输出类型决定模型家族"的直接落地:先定义临床输出,再选模型。

图注:CheXNet 系统示意:左侧胸片输入,中间 121 层 DenseNet 卷积网络,右侧输出病理概率。整条线展示"按输出类型选 CNN"的模型选择思路。CheXNet

数据、训练与评估:三关逐一落地

数据侧是第 2 章三关的实景演练。训练集来自当时最大的公开胸片集 ChestX-ray14,共 112,120 张正面胸片、30,805 位独立患者。划分的关键纪律是按患者划分、绝不允许患者重叠:同一个人的多张片子只能出现在一侧,训练 28,744 位患者、验证 1,672 位、测试 389 位患者共 420 张片子。一个患者同时出现在训练和测试两侧,就构成第 2 章讲的泄漏。标签也要谨慎定义,课件强调要区分报告标签和裁决后的金标准。

不平衡是这里的常态:肺炎在胸片中相对罕见。第 2 章提过的类别权重在此落地为加权二元交叉熵:给正类样本更高的损失权重,让模型不能装看不见肺炎。训练过程则是第 4 章的完整复刻:ImageNet 预训练初始化权重(相当于站在巨人肩膀上起步)、Adam 优化、验证损失变平就衰减学习率、选验证损失最低的模型存档。

评估交给第 5 章那套标准。测试集 420 张片子交给四位在职放射科医生(经验 4 到 28 年)独立标注,CheXNet 与医生用相同金标准算 F1:模型 0.435(95% 置信区间 0.387-0.481),四位医生平均 0.387(0.330-0.442),差 0.051,用 10,000 次 bootstrap 重抽样构造的置信区间不含 0,差异显著。这是 2017 年时点的结果,而且论文自己声明这是保守估计:只给了正面片,模型和医生都不允许看病史,大约 15% 的准确诊断其实需要侧位片。所以正确的说法是"在限定条件下达到医生平均水平之上",而不是"全面碾压医生"。

概率之外还要定位

最后是"敢不敢用"的问题:一个新模型只给一个概率,医生凭什么信它?CheXNet 用 **CAM(Class Activation Map,类别激活图)**把最后一层卷积的特征按分类权重加权求和,叠加回原图,生成一张热力图,指出"哪些区域最支持这个判断"。模型不只说"像肺炎",还告诉你"病灶大概在这片阴影里"。

图注:6 张胸片的 CAM 热力图示例,覆盖肺炎、结节、肿块、气胸、胸腔积液、心脏肥大 6 类发现,每张图下方的说明由论文团队的在职放射科医生撰写。这些图只用于说明"概率之外还定位病灶",不作临床教学用途。CheXNet

一个完整的项目复盘,就是课件收尾的七个问题。这七个问题正好是前五章的索引:

评估项目胸片案例的答案
输出是什么14 类病理是否存在(多标签分类)
数据从哪里来ChestX-ray14,按患者划分防泄漏
用哪个模型家族输出是病种标签 → DenseNet-121 CNN
怎么训练/调用ImageNet 预训练 + 加权交叉熵 + 学习率衰减
应用场景是什么影像科辅助分诊,概率与定位交给医生复核
哪些指标定义"达标"F1、AUROC、医生对比、亚组表现,不只是准确率
谁来复核失败放射科医生裁决,低置信度病例转人工

回答完这七个问题,一个 AI 项目的结构就清晰了。到这里,经典机器学习的链条已经完整。但医疗系统不会停在 2017 年,同一个系统还能怎么长?答案是:接知识、接工具、接人类反馈。这就是最后的大模型时代,也是"系统大于模型"的真正含义。

大模型时代:一个 AI 应用为什么不只是模型

第 3 章结尾留了个问题:GPT 这条"逐词续写"的路线,怎么被教会"按人的标准回答"?答案要从一个朴素观察说起:语言模型会接词,不代表它会好好回答问题。"预测网页上的下一个词"和"有用、安全地遵循指令"根本不是同一个目标。于是有了RLHF(基于人类反馈的强化学习)。

RLHF:先教会说话,再教会做人

InstructGPT 把整个过程拆成三步InstructGPT。第一步 SFT:标注员写出期望行为的示范答案,监督微调预训练模型,教它"怎么答"。第二步 RM:同一个 prompt(提示词)下生成 K 个回答,让标注员按整体质量排序,用这些偏好数据训练一个奖励模型,教它"什么样的输出更好"。第三步 PPO:用奖励模型当评分器,继续微调模型,让它的输出越来越被偏好。课件把其中的数据变化归纳成一句话:光有原始文本不够,RLHF 需要的是比较、排序、理由、安全判断这四类偏好数据,教给模型的是质量标准,而不只是语言模式。这里要说明,四形态和"质量标准"是课件的教学归纳,论文的直接证据是比较/排序加安全质量元数据这两类。

图注:RLHF 三步管线:示范微调 → 偏好排序训练奖励模型 → 强化学习优化。偏好信号注入在第二步,奖励来自"人对输出的比较排序",而不是研究者手写规则。

这张图背后最震撼的一句结论是:参数只有 1.3B 的 InstructGPT,在 2022 年的评估环境里比参数 100 倍大的 175B GPT-3 更受人类偏好,对齐成本相对预训练只是零头。它说明在能力相当的前提下,教模型"按人的标准回答"比一味加大参数更划算。

图注:InstructGPT 的三步流水线。第 1 步监督微调(SFT 示范数据),第 2 步奖励模型训练(同一提示下的 A–D 输出框由标注员排序),第 3 步基于奖励模型做 PPO 强化学习;蓝色箭头表示各类数据被用来训练哪个模型。InstructGPT

RAG:答不上来的就去查

对齐解决"怎么答得好",还有一个问题它管不了:模型的知识是训练时"背"进去的,会过时、会出错、还没法溯源。RAG(检索增强生成)的思路是:答不上来的就去查。论文把纯参数化语言模型的三大缺点列得很清楚:记忆难以轻易扩展或修订、无法为预测提供溯源、可能产生幻觉RAG。

结构上看,RAG 在模型边上接了一个检索器:把问题编码成向量,去一个文档索引里用最大内积搜索(MIPS)取回 top-K 篇最相关的文档,交给生成模型"结合这些文档生成答案"。

图注:RAG 总览:左侧检索器(Query Encoder 编码查询、Document Index 存文档向量)经 MIPS 选出 top-K 文档,连同原问题一起交给右侧生成器,最终输出预测。整条链路就是"先检索、再生成"。RAG

"接知识"还有个妙处:知识更新就像换索引。论文的实验里,把索引从 2016 年的 Wikipedia 换成 2018 年的,模型对"谁在当某国领导人"这类问题的答案立刻跟着换;索引错配时准确率骤降。想更新模型的世界观,不必重新训练,替换索引即可。这在工程上的意义是革命性的:知识库和模型解耦,语料清洗、切块、建索引变成了一条独立流水线。医疗场景里,RAG 层可以接医院指南、既往报告和已批准知识,让回答有出处、可复核。

Agent:边想边动的循环

有了知识,还差行动。**Agent(智能体)**是让模型不仅能回答,还能规划、调用工具、观察结果再决定下一步的循环。课件管它叫 Plan-Act-Tool-Check:规划分解任务→执行→选择工具→检查结果。论文里的 ReAct 把这条循环拆成三拍:Thought(推理)→ Act(行动,调用工具)→ Observation(观察环境返回),然后带着观察反馈进入下一轮ReAct。

图注:Agent 的工作循环:推理指导行动,行动带出观察,观察又驱动下一轮推理,直到目标达成。这对应课件里 Plan(规划)→ Act(执行)→ Tool(工具)→ Check(检查)的循环直觉。

为什么要"边想边动"而不是"憋足了劲一口气推理完"?对比例子来自论文 Fig.1:四种提示方法解同一道多跳问答,纯思维链(CoT,Chain-of-Thought,仅推理)像一台不接外部世界的黑盒,推理过程中一旦出现事实性幻觉就会一路错下去。人工标注 200 条轨迹的结果很说明问题(论文报告值,实验当时基于 PaLM-540B 的提示设置):纯思维链的成功模式假阳性率 14%,ReAct 只有 6%,幻觉是纯思维链最主要的失败模式。作为对照,只有行动没有推理也不行:模型会盲目执行、无法从观察里总结出下一步。ReAct 的循环还有一层护栏意义:每一步 thought 都是自然语言,可以被人逐条阅读甚至直接编辑,出错了人能改,这就是"人类监督"落地的地方。

系统大于模型

现在把所有零件装回去。一个现代 AI 应用 = 模型 + 对齐(RLHF 教质量标准)+ 检索(RAG 接知识)+ 行动循环(Agent 接工具)+ 工作流 + 护栏。课件把话说得很透:一个 LLM 应用是一个由知识、工具、工作流和评估组成的系统,而不只是一个模型。护栏包括公平性、隐私、鲁棒性、可解释性和人类监督,上线后还要持续监控漂移,这正好呼应第 5 章的"线上监控决定能不能一直运行"。

回到开头的医疗 AI。现在你能完整地说出它为什么不可信了吗?数据层:1000 人里 10 个高危是极端不平衡,多数类吞没少数类,模型只需对所有人说正常就能拿高分;指标层:99% 的准确率在混淆矩阵里对应 TP=0、FN=10,你测量的指标让你的模型朝"答对健康人"优化,而不是"抓住病人";系统层:就算模型本身不差,没有人类复核、没有亚组监控、没有校准,它依然不是一个可靠的系统。机器学习的每一环都在为"可靠"服务,而可靠从来不等于一个漂亮的数字。

参考文献

本专题引用的核心资料如下,建议深入学习时阅读原文:

  1. scikit-learn 预处理用户指南(StandardScaler / MinMaxScaler / RobustScaler) — https://scikit-learn.org/stable/modules/preprocessing.html
  2. scikit-learn 交叉验证用户指南 — https://scikit-learn.org/stable/modules/cross_validation.html
  3. imbalanced-learn 官方用户指南 §2 Over-sampling(SMOTE 与重采样) — https://imbalanced-learn.org/stable/over_sampling.html
  4. scikit-learn 官方算法选择地图(Choosing the right estimator) — https://scikit-learn.org/stable/machine_learning_map.html
  5. Attention Is All You Need(Vaswani et al., 2017) — https://arxiv.org/abs/1706.03762
  6. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding(Devlin et al., 2018) — https://arxiv.org/abs/1810.04805
  7. Deep Learning(Goodfellow, Bengio & Courville, 2016,官方免费教材) — https://www.deeplearningbook.org/
  8. scikit-learn 模型评估用户指南(Model evaluation: quantifying the quality of predictions) — https://scikit-learn.org/stable/modules/model_evaluation.html
  9. Training language models to follow instructions with human feedback(InstructGPT, Ouyang et al., 2022) — https://arxiv.org/abs/2203.02155
  10. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks(Lewis et al., 2020) — https://arxiv.org/abs/2005.11401
  11. ReAct: Synergizing Reasoning and Acting in Language Models(Yao et al., 2022) — https://arxiv.org/abs/2210.03629
  12. CheXNet: Radiologist-Level Pneumonia Detection on Chest X-Rays with Deep Learning(Rajpurkar et al., 2017) — https://arxiv.org/abs/1711.05225