跳到主要内容

01-outline — fine-tuning-with-python-train-align

切分:10 章。原书 7 章(297K 字符正文,其中约一半是代码清单,拆解不复述代码,只讲决策与机制)。 主线:「用模型」到「拥有模型」——在一张消费级显卡上,把一个通用底座改造成你自己的专用模型,并送上生产线。 本书独有价值:消费级硬件视角(每一步都有「这在 24GB 卡上怎么落地」的数字)。

自查口径:任意两节「出去时知道」不同;总纲只留效果句;每章一条主走查。

01 微调在改什么(原书 Ch1 前半)

  • 微调 vs 提示/RAG:进来以为「模型不够好就要调它」→出去知道先分「知识不够」还是「行为不对」,前者 RAG 改「能拿到什么」,后者微调改「它是什么」
  • 预训练产物是什么:进来以为模型存了「知识」→出去知道它是一份几十亿 token 压出来的统计摘要,权重里没有任何人类可读的结构
  • 微调的机制:进来以为微调=重新训练→出去知道是在既有先验上做小幅修正(变化量远小于权重本身),核心机制是分布偏移,偏太快太远就是遗忘的起点
  • 三个正当理由:进来以为微调理由很笼统→出去知道只有三类站得住(一致的结构化输出/风格控制/领域适配),各对应「提示做不到」的具体缺口
  • 何时不该微调:进来以为微调总是升级→出去知道四种情况别微调(提示能解决/要注入信息/<100 样本/需求月变)
  • 全参/特征/层选择三种改法:进来以为要么全训要么不训→出去知道是「改多少」的连续谱(全参改一切/冻结主干只训小头/冻前 1/3 训后 1/3),各有代价
  • 主走查:一条「被重复扣款」的客服工单,从底座「写得像」的行为走到微调后「稳定输出 billing」的行为——全参与冻结主干两版对照,带可训参数比例;显存账整个留给 03

02 数据、格式与训练配置(原书 Ch1 后半)

  • 数据格式三型:进来以为训练数据就是问答对→出去知道 completion/instruction/chat 三种格式的脆度不同,格式错会让模型无视 system 消息
  • 质量四属性与去重:进来以为数据越多越好→出去知道 500 条精修胜过 5000 条平庸,四属性(准/全/一致/无污染)+嵌入相似度 ~0.95 去重是标准动作
  • 学习率:进来以为学习率是通用旋钮→出去知道微调 lr(1e-55e-5)比预训练低 1–2 个数量级,因为它在精修不是重学;只训头时反而要 1e-41e-3
  • warmup/batch/epochs:进来以为这些是背景参数→出去知道各自防哪个坑(warmup 防开局大步、梯度累积用时间换显存、epochs 1–5 以验证损失为准)
  • 灾难性遗忘:进来以为遗忘是玄学事故→出去知道它是梯度更新的必然副产品,四个加重条件+四个对策(低 lr/早停/混 10–20% 通用数据/PEFT 结构性保护)
  • 主走查:书里的算步例——1000 样本×3 epochs÷batch 8=375 步→warmup 20–40 步,每步旁边是具体的数

03 LoRA:消费级显卡的算术(原书 Ch2 前半)

  • 显存算术:进来以为「模型 14GB 训练就吃 14GB」→出去知道训练显存=权重+梯度+优化器状态+激活,7B 全参是 56GB(书 Ch1 的粗账 40+GB 漏了梯度,如实点破)
  • PEFT 的赌注:进来以为高效微调是偷工减料→出去知道赌的是「微调的权重变化本身很小且低秩」,少量参数装下大部分适配信号
  • LoRA 结构:进来以为 LoRA 是黑盒缩写→出去知道 ΔW=A·B 两个小矩阵、前向=W+AB、α/r 缩放、B 初始化为零(起点恰是原模型)——每个超参在公式里的位置
  • 目标矩阵与秩:进来以为「套 LoRA」是一个动作→出去知道要选打哪些矩阵(默认注意力四件套,深适配加 FFN)和秩(4–64,16 起步),各自影响表现力
  • 主走查:56GB→8–12GB 的一步步算术(20–40M 可训参数、底座冻结、4-bit 后 3.5GB),每个数字有出处
  • ② 锚:peft#01-lora-math、peft@src layer.py:338/343(书说 A 高斯初始化,库默认是 kaiming,B=0 两边一致——如实点破)

04 QLoRA 与 PEFT 全家(原书 Ch2 后半)

  • 量化:进来以为 4-bit 是「压缩存档」→出去知道量化是用更少的位表示数,4-bit 只有 16 个可能值,QLoRA 只量化冻结底座,适配器保持 16-bit
  • NF4 与两个附带发明:进来以为量化格式无所谓→出去知道 NF4 按正态分布排刻度、双重量化把量化常数也压到 0.127 bit、分页优化器在显存尖峰时把优化器状态挪去 CPU
  • 其他 PEFT 方法:进来以为 PEFT=LoRA→出去知道还有瓶颈适配器(可组合但已被取代)/prefix tuning(动注意力上下文)/prompt tuning(只动输入嵌入,规模越大越香)/IA3(逐元素缩放,参数最少)
  • HF PEFT 库与合并:进来以为适配器要永远背着→出去知道 PeftConfig→get_peft_model→print_trainable_parameters 的标准三步,和 merge_and_unload 把 W+AB 烘回底座、推理时甩掉 PEFT 依赖
  • 方法对比表:进来以为选型靠口碑→出去知道书里那张表按可训参数比例/显存/质量/推理开销四列排了 7 种方法
  • 主走查:书里 phi-2 QLoRA 实操单——NF4 配置、r16/α32、训练(lr 2e-4,比全参高一个数量级)、适配器只存几 MB、merge 收尾
  • ② 锚:peft#03-lora-layer-merge(merge_and_unload)、peft#04-other-methods(IA3 缩放向量)

05 从补全器到助手:SFT 与合成数据(原书 Ch3 前半)

  • 指令跟随缺口:进来以为会续写=会回答→出去知道「问题后面跟更多问题」在语料里完全合法,底座没有「要回答」的倾向——这是指令微调存在的理由
  • SFT 与数据三性:进来以为 SFT 就是喂问答→出去知道多样性/单例质量/覆盖度决定成败,且 1000 条优秀 > 100,000 条平庸
  • 三种数据格式:进来以为指令数据自成一套→出去知道 Alpaca/ShareGPT/OpenAI chat 就是 02 那三种形状的行业落地版,增量在 ShareGPT 的多轮与 system 消息=部署时改行为不重训(02 只回指不重讲)
  • 合成数据:进来以为训练数据要人写→出去知道 Self-Instruct 用 175 个种子经 GPT-3.5 扩到 52,000 对,Orca 蒸馏推理轨迹(蒸过程>蒸结论),质检靠过滤+去重+人工抽查
  • 主走查:书里 6 条 phi-2 SFT 数据的格式化旅程(chat 消息→<|system|>/<|user|>/<|assistant|> 模板),顺带补书里没讲的「只对回答部分算损失」(② 锚 trl#02-sft)
  • 与姊妹书分界:这里只讲「SFT 教它听指令」;「偏好对齐」整个留给 06

06 对齐:RLHF 三段与 DPO 的简化(原书 Ch3 后半)

  • 为什么 SFT 不够:进来以为 SFT 万能→出去知道 SFT 分不出「两个都对、一个好得多」的响应,需要偏好信号
  • RLHF 三段:进来以为对齐是一个训练→出去知道是 SFT→奖励模型→PPO 优化三段流水线,奖励模型把人的相对判断变成可优化的标量
  • 奖励黑客:进来以为优化越久越好→出去知道古德哈特定律——猛刷代理指标会刷出高分但谄媚啰嗦的输出,KL 惩罚就是为此存在的缰绳
  • PPO 的重:进来以为 PPO 只是个算法名→出去知道它要求四个模型同时在显存里(策略/SFT 参考/奖励/价值),这是后面一切简化的动机
  • DPO:进来以为 DPO 是「便宜版 RLHF」→出去知道它有数学根据——RLHF 最优解有闭式表达,损失就是两个对数概率比之差的负 log-sigmoid,两个模型、纯监督基建
  • beta 与后续:进来以为 DPO 就是终点→出去知道 beta 管 KL 缰绳松紧(0.1–0.5),ORPO 把 SFT+对齐并成一段,SimPO 连参考模型都扔了
  • 安全微调:进来以为安全是加几条拒绝→出去知道 Constitutional AI 的自我批评两段式,和拒绝训练的校准难题(过严误伤、过松能越狱)
  • 主走查:书里那条「什么是机器学习」偏好对——chosen 具体/rejected 含糊,DPO 训练如何拉开两者概率(演示数当场写明)
  • ② 锚:trl#03-dpo、trl@src dpo_trainer.py:1465;与 post-training 拆解互指但不重复其讲法

07 领域微调(原书 Ch4)

  • 战略选择:进来以为领域适配=一种微调→出去知道先选路:继续预训练(数亿 token,表示层加深,防遗忘混 10–30% 通用文本)vs 指令微调(底座已懂领域、缺任务用法),两段式最好但多数团队从指令微调起步
  • 法律:进来以为法律语料喂进去就行→出去知道三个坑(长文档要保条款边界的语义分块/shall 与 indemnification 这类术语差/辖区差异——按辖区+领域切窄)
  • 代码:进来以为代码微调最难评→出去知道它最容易评(执行式验证),私有框架是最硬的微调理由(内部代码不在任何公开语料),三类数据+执行过滤
  • 低资源语言:进来以为低资源=使用者少→出去知道是数字化文本少;跨语言迁移(mBERT/XLM-R)+回译+混批过采样
  • 领域基准与 RAG 整合:进来以为 MMLU 分数能代表领域能力→出去知道要自建三件套基准;微调与 RAG 互补(微调是训练时快照,RAG 是可更新知识),检索嵌入模型也要领域微调
  • 主走查:一个内部代码库变成「训练集+评测集」的流水线(AST 抽 docstring 对/测试对/执行过滤/Pass@k),演示数当场写明
  • 边界(如实):原书医疗/金融两节正文在我们的文本里缺失(只有引子与章总结提及),拆解只覆盖文本实际有的内容

08 评测:两条同样重要的轴(原书 Ch5)

  • 两轴:进来以为评测=测目标任务→出去知道必须双轴(任务改进+能力保持),且永远对照底座评绝对分数没有意义
  • 分类指标:进来以为 accuracy 就够→出去知道不平衡数据下 accuracy 骗人,F1 与混淆矩阵各补什么
  • 生成指标:进来以为 ROUGE/BERTScore 测质量→出去知道它们只是代理(重叠/语义相似),先对人评样本验证相关性再信;结构化输出该用执行验证
  • 能力探针:进来以为遗忘靠感觉→出去知道要固定小探针集(指令跟随/事实回忆/算术/表达不确定),微调前设计、温度设 0、delta < −0.1 判回归
  • LLM-as-judge:进来以为让 GPT-4 打分就客观→出去知道有位置偏差(正反各跑一次取平均)、要先与人工判断对相关性(rho>0.7)才算数,事实准确性恰是它的盲区
  • 人工评测:进来以为人评就是「感觉不错」→出去知道要拆维度、报一致性(Cohen's kappa)、50–100 条够检出大效应
  • 主走查:书里那组带「simulated」标注的预测——底座 0.60 vs 微调 1.0,过五条探针,过部署闸门三条件(f1_weighted >底座+0.02 ∧ 无回归 ∧ 评审 ≥3.5)
  • 与 07 的分工:07 管「领域基准建什么」,08 管「怎么评得可信」

09 部署:从 notebook 到可靠服务(原书 Ch6)

  • 三层架构:进来以为部署就是把模型挂起来→出去知道网关/推理/数据三层独立扩缩,流式与版本号要第一天就规划
  • 三个推理服务:进来以为随便选一个→出去知道选型矩阵(开发 Ollama/中型 TGI/高吞吐 vLLM),vLLM 靠 PagedAttention+continuous batching 吃高并发
  • 适配器多路复用:进来以为 N 个微调=N 份模型→出去知道一个底座+多个几百 MB 适配器,vLLM 按请求切,切换开销微秒级
  • 限流/缓存/故障:进来以为限流按请求数→出去知道要按 token(2000 token 响应成本≈100 token 的 20 倍);交互服务要「响亮地失败」
  • 可观测与成本:进来以为监控是运维的事→出去知道嵌入漂移是退化警报;成本侧:按复杂度路由省 40–60%,推理量化 4-bit 同卡三份=三倍吞吐(质量代价 1–3%)
  • 安全:进来以为安全靠过滤关键词→出去知道提示注入目前防不完全(按「有时会成功」设计)、PII 要摄入+输出两端过滤、多租户 fail closed
  • 扩缩:进来以为轮询负载均衡就行→出去知道 LOR(最少在途请求)与队列深度扩缩才配得上 LLM 的可变时长
  • 反馈飞轮:进来以为上线是终点→出去知道闭环(流量→信号→评测集→重训)与数据飞轮——尽早带缺陷上线好过等完美
  • 主走查:书里七段请求流水线——「Ignore all previous instructions…」那条注入请求在第一段被拦下,每段带具体状态(风险分=命中数×0.4 等)
  • 边界(如实):原书本章多处按姊妹书 RAG with Python 的行文改写(「第 5 章搭的 RAG 循环」「本章是最后一章」),照实点破

10 案例与通则(原书 Ch7)

  • 客服案例:进来以为风格微调靠堆数据→出去知道 120,000→18,400 的过滤比 5K→10K→18.4K 的加量更值钱,且风格进权重、政策内容走应用层(改政策不用重训);重开率 23%→14%
  • 医疗案例:进来以为安全行为会从 SFT 里自己长出来→出去知道 SFT 教「说什么」、DPO 教「怎么说才安全」,必须分两段;稀疏覆盖是头号风险(医师评审 11/200 错误集中在少见病)
  • 代码案例:进来以为微调代码模型提升有限→出去知道 Pass@1 23%→61%→74%(加测试对是最大单一增量),HumanEval 差 3 个百分点内=通用能力没伤;要月度增量重训
  • 多语言案例:进来以为每语言一个模型才准→出去知道 XLM-R 一个模型+跨语言迁移,标注从 276,000 砍到 92,000,低资源反而赢;过采样是纪律
  • Capstone 与五通则:进来以为三条技术(IG/DPO/路由)难拼装→出去知道三阶段管线的组合方式与五条通则(质量过滤>规模/风格内容分开/安全要独立阶段/代码执行评测/跨语言迁移省标注)
  • 未来方向:进来以为微调是大厂的事→出去知道书里押的方向——7B 专用微调在同任务胜过 70B 通用且服务成本 1/10,组织转向小专用模型组合
  • 主走查:代码案例 Pass@1 的 23→61→74 三级台阶,每级旁边是改动(底座/QLoRA r32/加测试对)与对照(HumanEval 不掉)