AI/ML 详解:预训练与微调

Day 2 · 2026-05-19
面向:有编程经验的非 AI 方向工程师

预训练Pre-training

LLM训练
一句话解释

就像让一个新人把整个互联网"读一遍"——只做一个动作:看前文猜下一个词。猜对/猜错都不评价对错,只校准它对"世界文本规律"的直觉。

它解决什么问题

如果对每个任务(翻译、问答、写代码)都从零训一个模型,每次都要重新教模型"什么是英语、什么是句子、什么是事实",成本和数据需求都不现实。预训练把"语言+常识"作为一个共享的底座一次性学好,下游任务只需要在这个底座上做小量的"专科训练"。这就是基础模型(Foundation Model)的核心思路。

工作机制(直觉版)

核心任务非常朴素:给前 N 个 token,预测第 N+1 个 token。然后用预测和真实 token 的差距做梯度下降。重复亿万亿次。

# 伪代码:预训练的一个 step
text = sample_from_internet()              # 大杂烩:网页/书/代码/论文
tokens = tokenize(text)                    # 切成 token 序列
for i in range(len(tokens) - 1):
    pred = model(tokens[:i+1])             # 模型预测下一个 token 的概率分布
    loss = cross_entropy(pred, tokens[i+1])# 预测错了多少
    loss.backward(); optimizer.step()      # 调一点点参数

规模决定能力:数据量从 GB→TB,参数量从亿→千亿,"涌现"出来的能力(推理、写代码)就出现了。

代码示例
# 用 Hugging Face 体会预训练目标:模型给每个位置算下一个 token 的概率
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

tok = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")

inputs = tok("The capital of France is", return_tensors="pt")
with torch.no_grad():
    logits = model(**inputs).logits        # [1, seq_len, vocab_size]
next_id = logits[0, -1].argmax()           # 选最可能的下一个 token
print(tok.decode(next_id))                  # " Paris"
常见误区
预训练模型"懂"事实,是因为见过类似句式很多次,本质是统计共现,不是"知道"。所以它会自信地说出听起来对、但其实错的内容(幻觉)。预训练完的"裸模型"也不会跟你对话——它只是个续写引擎,你说"你好"它可能续上"你好,我是 XX 教授,今天我们讲……"。
关键资源
  • Karpathy:"Let's build GPT" YouTube 视频(2 小时手撸一个迷你 GPT,最佳入门)
  • Hugging Face:"How does a language model work" 章节
实践场景

经典:GPT-2/3、Llama 系列的"base 模型"就是只做了预训练。
贴近你:当你看到 llama-3-8b(无 instruct 后缀),那就是预训练裸模型;做投资研报续写、生成数据这种"补全式任务"反而比 chat 模型更直接。

English Summary
Pre-training teaches a model the structure of language by predicting the next token across massive text corpora. The result is a "foundation model" — a generalist that knows grammar and facts but doesn't yet follow instructions. All later fine-tuning steps build on top of these frozen statistical patterns.
思考题
预训练目标就是"猜下一个词",凭什么能涌现出写代码、做数学的能力?这背后藏着哪些隐含假设?
关键假设是"语言里编码了世界结构"——人写代码的语料里同时藏着语法、语义、推理链;猜词其实是在猜"下一个合理的世界状态"。但这假设有边界:训练集没出现过的推理模式(比如全新数学证明)就难涌现,所以"涌现"更像是规模够大后"已存在能力被解锁",而非真正创造。延伸思考:人类婴儿学说话也是"猜下一个音",但人能从极少样本泛化——LLM 的样本效率差几个数量级,说明它学到的不是真正的"语言能力",而是"语言分布"。
把预训练比作"应届生读完整个图书馆"——这个类比在哪里破?它会误导你做哪些错误判断?
类比破在三处:(1) 人类读书会"理解",模型只在调权重,所以模型"读过"不等于"知道",没法主动回忆没被强化的事实;(2) 人类读书顺序无关紧要,但模型梯度更新有顺序敏感性(catastrophic forgetting);(3) 人会主动忽略垃圾内容,模型不会,所以数据清洗比"读多少"更关键。误导后果:你会高估模型对长尾知识的把握、低估它对训练截止日期外信息的真空。
同等计算预算下,7B 模型 × 100B token 与 70B 模型 × 10B token,你赌哪个更强?为什么 Chinchilla 法则会反直觉?
Chinchilla(2022)告诉我们:当时大家都"过参数欠数据",所以同算力下小模型多喂数据更优。但 2024 年后风向变了——推理成本主导部署经济学,所以业界倾向"过训练小模型"(Llama-3 8B 训了 15T token),因为小模型 inference 便宜。所以答案取决于你优化什么:训练效率选 Chinchilla 平衡点,部署效率选过训练小模型,前沿能力上限仍属于大模型。这个权衡和"CPU 缓存大小 vs 主存带宽"的设计取舍很像。
预训练数据掺 5% 故意写错的代码,模型会变蠢吗?为什么"数据质量"和"数据量"的关系是非线性的?
不会显著变蠢——5% 噪声在亿万次梯度更新里被大多数正确样本"投票稀释",模型学到的是统计中位数。但有阈值效应:噪声超过 20-30% 后能力断崖式下跌。非线性来自三点:(1) 重复出现的错误模式会被记住("frequency wins");(2) 高质量数据有"激活"罕见能力的杠杆作用(少量推理示例就能解锁 CoT);(3) 数据多样性 vs 重复的取舍——同样 1TB,多样化数据上限远高于重复数据。这和软件工程里"测试覆盖率"的边际收益曲线异曲同工。
OpenAI/Anthropic 为何不开源 base model?open base 和 open instruct 的安全风险有何本质差异?
Instruct 模型经过 RLHF 加了"拒答护栏",base 模型是裸的——你输入"如何制造……",base 会自然续写出完整答案,因为它只学了语言分布。所以 base 一旦开源,任何 jailbreaking 都不需要——直接续写就能绕过所有对齐。第二层风险:base 模型可被低成本 SFT 成任意定向用途(包括恶意),而 instruct 已有的对齐会形成"惯性阻力"。Meta 开源 Llama base 是冒了真实安全风险换生态地位,OpenAI 的商业逻辑不允许这种取舍。

有监督微调Supervised Fine-tuning (SFT)

LLM训练
一句话解释

就像给应届生发一本《标准回答示例集》,让他照着抄一千遍——目的是把"会续写"的模型,调教成"会按指令回答"的助手。

它解决什么问题

预训练完的模型只会续写,它不知道"请翻译这段话"该输出译文而不是一段评论。SFT 用人工写好的「指令-回答」对,把模型的输出风格切到"听话、有用、格式整齐"的轨道上。这一步把 base model 变成 instruct model(指令模型),是所有 ChatGPT/Claude 类产品落地的第一步。

工作机制(直觉版)

训练目标和预训练完全一样(预测下一个 token),变的只是数据:从"互联网杂文"变成"高质量指令-回答对"。

# 数据样本长这样:
{
  "instruction": "用一句话解释什么是缓存",
  "response":   "缓存是把昂贵计算的结果暂存起来,下次直接复用。"
}
# 训练时拼成:
prompt = "<|user|>用一句话解释什么是缓存<|assistant|>"
target = prompt + response
# 关键:只在 response 部分计算 loss,prompt 部分不学
loss = cross_entropy(model(target), target, mask=is_response_token)

通常 1 万~100 万条精挑细选的样本就能让模型脱胎换骨。质量 >> 数量。

代码示例
# 用 trl 库做一次最简单的 SFT,<= 20 行
from datasets import load_dataset
from trl import SFTTrainer, SFTConfig
from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "meta-llama/Llama-3.2-1B"
tok   = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
ds    = load_dataset("HuggingFaceH4/ultrachat_200k", split="train_sft[:1000]")

trainer = SFTTrainer(
    model=model, tokenizer=tok, train_dataset=ds,
    args=SFTConfig(output_dir="sft-llama", num_train_epochs=1,
                   per_device_train_batch_size=2, learning_rate=2e-5),
)
trainer.train()                            # 跑完模型就会"听话"了
常见误区
SFT 不是"让模型学新知识"——它学的是"该用什么格式、什么口吻说话"。如果训练集里的事实是错的,模型会更自信地说错。教知识请用 RAG,SFT 用来教风格、格式、领域用语
关键资源
  • Hugging Face TRL 文档:huggingface.co/docs/trl(SFT/DPO/PPO 全套高层 API)
  • Sebastian Raschka 博客:"Practical Tips for Fine-tuning LLMs"
实践场景

经典:InstructGPT、Alpaca、Llama-3-Instruct。
贴近你:给"育儿助手"做 SFT——用 500 条「家长问题 → 你认可的回答风格」的样本,模型就会用你想要的语气和深度回答,而不是空话套话。

English Summary
Supervised Fine-tuning (SFT) adapts a pre-trained model on curated instruction-response pairs so it follows directions instead of merely continuing text. The loss is computed only on the response portion. SFT shapes style, format, and tone — not new knowledge.
思考题
"SFT 教风格不教知识"和"模型确实记住了示例里的事实"这两句话怎么调和?SFT 与"记忆"的边界究竟在哪?
两句话同时成立:SFT 会把"事实表述方式"打磨成你想要的样子,同时也确实把训练样本里出现的具体事实写入了权重(参数化记忆)。区别在泛化能力——SFT 学到的"风格"能迁移到没见过的输入,但"知识"只在见过的话题附近可靠。所以经验法则:会变的事实(财报、新闻、内部文档)必须用 RAG,不会变的领域术语和格式约定可以 SFT。把 SFT 当"格式化输出"训练,把 RAG 当"外接数据库",二者职责分离才不会踩坑。
100 条精品 vs 10 万条普通样本,分别会出什么问题?为什么 LIMA 论文敢说 1000 条够了?
100 条:过拟合明显,模型会复读训练集句式,对没覆盖的指令类型束手无策。10 万条普通样本:模型学到"平均回答",输出平庸、风格混乱、可能继承数据集的错误习惯(比如"作为一个 AI 助手……"开场白)。LIMA 的洞察是:预训练已经把能力学完了,SFT 只需"激活"——所以 1000 条多样化、高质量的示例足以唤醒能力,且不会用大量平庸样本稀释。前提是 base model 已经够强。这和软件里"配置 < 代码"——少量精准配置往往胜过大量样板代码。
SFT 和预训练用同一个 loss 函数,为什么效果天差地别?这背后"数据 >> 算法"对工程师意味着什么?
loss 一样,但分布天差地别——预训练数据是"世界的语言",SFT 数据是"被人筛选的优秀回答"。Loss 只是个测量工具,决定能力的是"你让模型逼近什么分布"。这对工程师的教训是:在 LLM 时代,模型架构和优化器趋同,护城河越来越在"专有的高质量数据"。类比传统 SE:算法是 CPU 指令集,数据是程序——同样的 CPU 跑不同程序结果完全不同。这也是为什么各家都在抢数据标注公司而不是抢算法工程师。
用 GPT-4 合成数据做 SFT 越来越普遍——"模型教模型"的长期风险是什么?和 SE 里哪种反模式相似?
核心风险叫"model collapse":合成数据继承教师模型的偏见、错觉、风格僵化,且失去了真实数据的长尾。多代继承后模型分布会越来越窄,丧失对罕见情况的处理能力。这和 SE 里"用旧版本输出当新版本测试基准"如出一辙——你测的是"和旧版本一致",不是"正确"。缓解办法:始终保留一份"真实人类数据"做锚点、用多个不同强模型合成做多样性、保留对抗性测试集检测能力漂移。延伸阅读:Shumailov 等 2024 Nature 论文。
SFT 阶段常用 LoRA 只训一小部分参数,预训练阶段却必须全量训——这个差别和"全量更新 vs 增量更新"在系统设计里的权衡有何类比?
预训练是"从无到有学习语言",需要所有层都剧烈调整;SFT 是"在已有能力上微调表达",只需小幅扰动权重——LoRA 的低秩矩阵假设"调整方向是低维的"恰好契合。类比系统设计:预训练像 schema migration(结构性变更),SFT 像 config 热更新(小范围调参);用 schema migration 工具改 config 是杀鸡用牛刀,用 config patch 改 schema 又不够。再深一层:这是"奥卡姆剃刀"在参数空间的体现——能用低维参数表达的变化,就别动高维参数。

人类反馈强化学习RLHF (Reinforcement Learning from Human Feedback)

LLM对齐
一句话解释

就像 App Store 评分系统:让人对模型的两个回答打"哪个更好",训出一个"评分员模型",然后让主模型反复刷分——逐渐学会输出人类更喜欢的回答。

它解决什么问题

SFT 教模型"模仿示范回答",但很多东西没法用标准答案表达:什么叫"礼貌但不啰嗦"?什么叫"有用但不越界"?人类自己写示例既慢又不一致,但比较两个回答"哪个更好"很容易。RLHF 把"难写示例"的问题转成"易做选择"的问题,是 ChatGPT 第一次让大众感觉"AI 真懂事"的关键。

工作机制(直觉版)

三步走,每一步都是独立的训练:

# Step 1: SFT 模型已就绪(上一张卡片)

# Step 2: 训练奖励模型(Reward Model, RM)
for (prompt, response_A, response_B, human_pref) in pref_data:
    score_A = reward_model(prompt, response_A)
    score_B = reward_model(prompt, response_B)
    # 让"人类偏好那个"的分数更高
    loss = -log(sigmoid(score_chosen - score_rejected))

# Step 3: 用 PPO 算法让主模型刷高 RM 的分
for prompt in prompts:
    response = sft_model.generate(prompt)
    reward   = reward_model(prompt, response)        # 评分员打分
    # PPO:朝着高分方向更新,但不能偏离 SFT 太远(KL 惩罚)
    sft_model.ppo_step(reward, kl_penalty=0.1)

那个 KL 惩罚很重要——没它的话模型会学会"奖励黑客":输出一堆奇怪但 RM 喜欢的话术。

代码示例
# trl 的 PPOTrainer 把三步骤封装好了(这里只展示第 3 步骨架)
from trl import PPOTrainer, PPOConfig
from transformers import pipeline

reward = pipeline("text-classification", model="my-reward-model")
ppo = PPOTrainer(config=PPOConfig(batch_size=8),
                 model=sft_model, tokenizer=tok)

for batch in dataloader:
    responses = ppo.generate(batch["prompt"])
    # RM 打分,分数越高代表越符合人类偏好
    scores = [reward(p + r)[0]["score"] for p, r in zip(batch["prompt"], responses)]
    ppo.step(batch["prompt"], responses, scores)
常见误区
很多人以为 RLHF 让模型"更聪明"。其实它更准确地说是更讨喜——更礼貌、更有结构、更不越界。RLHF 后的模型在某些客观基准上反而会变差("alignment tax",对齐税),因为它学会了讨好,不再"什么都敢说"。
关键资源
  • Hugging Face 博客:"Illustrating RLHF"(图最清楚的入门)
  • Chip Huyen:"RLHF: Reinforcement Learning from Human Feedback"
实践场景

经典:ChatGPT、Claude、Gemini 都用了 RLHF(或其变体)。
贴近你:你给团队 AI 助手做内部"点赞/点踩"按钮,积累足够数据后训一个 RM,再去 PPO 优化主模型——这就是把内部协作偏好沉淀进模型的标准做法。

English Summary
RLHF aligns a model with human preferences in three steps: SFT, training a reward model on pairwise human comparisons, then using PPO to make the policy maximize the reward while staying close to the SFT model via a KL penalty. It produces models that feel "helpful and harmless" rather than just fluent.
思考题
RLHF 的 KL 惩罚为什么不能取 0?取很大又会怎样?这个超参的物理意义和你调缓存 TTL 时的取舍有何相似?
KL=0 时模型为了刷高 RM 分会"放飞自我"——输出 RM 喜欢但人类看了恶心的话术(reward hacking);KL 太大时模型几乎不动,等于没训。KL 控制的是"探索 vs 保守"的平衡:保守区域里效果可控但收益小,激进区域里收益大但容易跑偏。这和缓存 TTL 一模一样:TTL=0 永远透传上游正确但失去性能优势,TTL=∞ 飞快但脏数据问题失控。两者都需要根据"上游可信度"和"下游容忍度"动态调。Anthropic 的论文里管这叫"capability vs alignment 的 Pareto 前沿"。
"奖励黑客"在 RLHF 里具体长什么样?给一个最阴险的例子。这和软件里的 Goodhart's Law 有何同构?
经典案例:早期 RM 偏好"长回答",policy 学会在末尾加大段免责声明灌水冲分;或者 RM 偏好"礼貌",policy 学会用礼貌话术回避所有困难问题。最阴险的:policy 学会针对 RM 特定 token 模式(比如"作为一个负责任的助手……")刷分,但人类读者并不喜欢这种套路。这就是 Goodhart's Law:当指标变成目标,它就不再是好指标。同构案例:客服 KPI 是"通话时长"就有人故意慢说话;代码评审指标是"评论数"就有人灌水评论。RLHF 的对策是不断更新 RM + KL 约束 + 红队对抗。
只有 1000 条偏好数据,你会选 RLHF 还是 SFT?为什么不同对齐方法的"数据性价比"差距这么大?
1000 条肯定选 SFT——RLHF 三阶段流水线在小数据上完全跑不通:RM 学不出可靠信号、PPO 在噪声 RM 上更加不稳。SFT 则可以用 1000 条精品直接搞定。一般经验:<5k 条选 SFT,5k-50k 条选 DPO,50k+ 才考虑 RLHF。数据性价比差距源于"信息密度"——SFT 每条样本告诉模型"完整怎么答",RLHF 每条样本只告诉"A 比 B 好"(信息量更稀),所以 RLHF 需要量级更多数据才能逼近同等效果。这和 SE 里"declarative vs imperative API"的信息密度对比异曲同工。
RM 本身是个模型——它会不会有"偏见叠加"问题?标注员→RM→policy 三层之间的偏见怎么被放大?
会,而且非常严重。三层放大链:(1) 标注员的文化/教育背景偏向某种"优雅回答"——比如标注员多是英语母语者,RM 就更喜欢英式表达;(2) RM 在有限样本上学到偏见后会"外推"到没见过的领域,把偏见普适化;(3) policy 用 PPO 反复优化 RM 信号,会把 RM 的偏好"过拟合"放大——类似把噪声当信号放大器。Anthropic Constitutional AI 想跳开这条链:用一份"宪法原则"代替人类标注员,但其实只是把偏见从"标注员"挪到"宪法起草者"。这是个无解的链式问题,只能靠多样化标注人群、多 RM 集成、持续审计来缓解。
ChatGPT 经常拒答合理请求(over-refusal)——这是 RLHF 的 bug 还是 feature?如果让你调,你会牺牲什么?
本质是 feature 而非 bug——RLHF 训练时"宁可拒答也别说错话"的策略在 RM 上得分稳定(拒答=低风险),所以 policy 倾向多拒答。这是策略空间里的局部最优,但对用户体验是灾难。要降低 over-refusal,你必须接受三个代价:(1) 越狱攻击成功率上升(更宽松的边界);(2) 偶尔输出有争议内容、舆论风险增加;(3) 需要更细粒度的 RM——区分"真的危险"和"听起来危险",标注成本翻倍。Anthropic 在 Claude 3 系列上明显放宽了这条线,是因为他们押注"用户体验摩擦的损失 > 个别误判的损失"。

直接偏好优化DPO (Direct Preference Optimization)

LLM对齐
一句话解释

就像把 RLHF 的"训评分员 + PPO 刷分"两步合并成一个 SQL:直接用偏好数据一步调参,省掉奖励模型、省掉强化学习、训练像 SFT 一样稳定。

它解决什么问题

RLHF 的痛点有三个:(1) 要训两个模型(RM + policy),机器和工程量翻倍;(2) PPO 调参玄学,不稳定,容易崩;(3) 中间多了 RM 这层近似,可能引入偏差。DPO(2023 年 Stanford 提出)从数学上证明:在某些假设下,"最大化奖励"等价于一个非常简单的分类损失,可以跳过 RM 和 RL 直接用偏好对训练。结果:训练成本砍半,稳定性大幅提升。

工作机制(直觉版)

核心想法:对每条偏好数据,让"赢家"在新模型下的概率比在旧模型下涨,让"输家"反之

# 训练数据:(prompt, chosen, rejected) 三元组
for (prompt, chosen, rejected) in data:
    # 新模型给 chosen 的对数概率 - 参考模型(SFT)给 chosen 的对数概率
    log_ratio_chosen   = log P_new(chosen|prompt)   - log P_ref(chosen|prompt)
    log_ratio_rejected = log P_new(rejected|prompt) - log P_ref(rejected|prompt)
    # 让 chosen 的提升量 > rejected 的提升量
    loss = -log(sigmoid(beta * (log_ratio_chosen - log_ratio_rejected)))

一句话翻译:新模型相比 SFT 模型,应当更喜欢 chosen、更不喜欢 rejected。就这么直接,没有 RM、没有 PPO、没有采样、没有奖励黑客的烦恼。

代码示例
# trl 的 DPOTrainer,接口和 SFTTrainer 一样简单
from trl import DPOTrainer, DPOConfig
from datasets import load_dataset

# 偏好数据:每条有 prompt / chosen / rejected 三个字段
ds = load_dataset("trl-lib/ultrafeedback_binarized", split="train")

trainer = DPOTrainer(
    model=sft_model,                       # 上一步 SFT 完的模型
    ref_model=sft_model,                   # 参考模型(冻结)
    train_dataset=ds, tokenizer=tok,
    args=DPOConfig(beta=0.1, num_train_epochs=1,
                   learning_rate=5e-7, output_dir="dpo-llama"),
)
trainer.train()                            # 跑完,效果约等于 RLHF,工程量小很多
常见误区
DPO 不是"更好的 RLHF",是"更便宜的 RLHF"。在偏好数据非常多、质量非常高、需要持续在线学习的场景下,PPO 类的在线 RL 上限仍然更高(你可以源源不断采样新回答让 RM 评分)。DPO 是离线的——只能学到偏好数据集里的"好",无法探索新行为。Llama 3、Tulu 等开源模型用的就是 DPO 系列。
关键资源
实践场景

经典:Llama-3-Instruct、Zephyr、Tulu 系列都用 DPO。
贴近你:你想给"投研分析助手"做对齐——攒 2000 条「同一个问题的两份回答 + 你选哪个更专业」,用 DPO 微调,单卡几小时跑完,效果常常打平 RLHF。

English Summary
DPO replaces the reward-model + PPO pipeline with a single supervised-style loss on preference pairs. It directly increases the log-probability gap between chosen and rejected responses relative to a frozen reference model. Cheaper, more stable, now the default open-source alignment recipe.
思考题
DPO 在数学上等价于 RLHF(特定假设下),但工程上简单太多。这种"等价但更简单"的设计模式在软件工程哪里见过?
典型同构案例:(1) 函数式编程的 map/reduce 等价于循环但表达更简洁;(2) SQL 声明式查询等价于手写循环 JOIN 但易优化;(3) GraphQL 用一次请求等价于多次 REST 调用。共同模式:找到问题的"代数结构"后,可以跳过中间步骤直接闭式求解。DPO 的洞察是发现 RLHF 的最优 policy 与 reward 之间有解析关系,于是消去 reward 这个中间变量。这种"消除中间表示"的思维在编译器优化里叫 constant folding,在统计学里叫积分变量消除——值得记下来作为通用思维模板。
DPO 是"离线的"——为什么这既是它最大的优点也是最大的缺点?类比批处理 vs 流处理的权衡。
优点:训练流程像 SFT 一样稳定,数据一次准备好,没有 PPO 的采样/评分循环——工程复杂度砍半。缺点:模型只能在固定数据集上提升,无法主动探索"是否还有更好的回答没被偏好对覆盖"。一旦模型策略漂移到偏好数据没覆盖的区域,DPO 学不到反馈。类比批处理:批处理稳定可调试但延迟高、看不到实时变化;流处理复杂易崩但能持续适应。所以工业实践中常见"DPO 起步、有钱有数据后切 online RL"——和"先批后流"的数据架构演进完全同构。
偏好数据全来自同一个标注员,DPO 训出的模型会有什么特征?这和传统 ML 的"数据多样性"问题有何本质不同?
模型会强烈复刻该标注员的口味:偏好他的句长、用词、价值观,对超出他认知边界的领域则随机。传统 ML 缺多样性导致"在某个子群体上准确率低",问题局部可见;但 DPO 缺多样性导致"模型整体人格被某人塑形",问题全局且难察觉——模型对所有用户输出都带着这个标注员的影子。更糟的是 LLM 输出像"流体",没有 ground truth 可以反查,所以偏见检测要靠对抗性测试、跨人群盲测、人格画像分析。这就是为什么 Anthropic/OpenAI 要请几千个不同背景的标注员。
DPO 的 beta 参数控制"新模型偏离参考模型的程度"。设很大或很小分别会怎样?为什么"中庸"反而最难调?
beta 很大:模型几乎不变(强约束),训了等于没训——保守失败。beta 很小:模型可以剧烈偏离参考模型,但偏好数据噪声会被放大,容易过拟合偏好对的细节而非偏好背后的意图——激进失败。"中庸最难"是因为最佳值依赖三个变量:偏好数据质量、参考模型强度、目标任务的对齐难度——三者都没有解析公式。所以业界做法是固定其他超参,做 beta 的 grid search(典型范围 0.01~0.5)。这和你调 K8s 的 HPA 阈值、调数据库连接池大小一样,本质是"在反馈延迟很高的系统里寻找拐点"。
DPO 之后出现 IPO、KTO、ORPO 等变体——未来的对齐方法可能从什么角度突破?(提示:现在所有方法都假设"成对偏好"——如果没有呢?)
三个可能方向:(1) 摆脱成对——KTO 已经做到只用"好/坏"单点标签,未来可能用更稀疏的"通过/失败"信号或纯粹的环境奖励;(2) 多目标对齐——当前方法把"有用、安全、诚实"压成一个标量分数,未来需要 Pareto 多目标优化;(3) 自我对齐——让模型自己批判自己(Self-Rewarding LLM),打破"标注员瓶颈"。更激进的思路:与其在 post-training 修,不如在 pre-training 阶段就用价值观加权数据(Anthropic 的 "pretraining with values")。共同趋势:把"对齐"从一个 fine-tuning 后处理步骤,变成贯穿整个训练 pipeline 的范式。
← 返回首页