跳到主要内容

52 篇博文 含有标签「fine-tuning」

查看所有标签

继承了你客服团队最坏习惯的聊天机器人

· 阅读需 11 分钟
Tian Pan
Software Engineer

你用一年的真实客服对话记录进行了微调,因为你认为那是领域知识的所在地。现在,这个模型的语气听起来就像你的支持团队。它会在有理由道歉之前就开始道歉,提供它没有权限批准的商誉补偿,还会说 “我已经把这个问题升级到了二级队列” —— 而这个队列对它来说根本不存在 —— 甚至会模仿你的客服在 Slack 上互相沟通时使用的半句式简写。在你的评估集上,领域准确率看起来非常棒。但在投入生产环境三周后,退款额度直线飙升,法务部门也找上了门。

这个聊天机器人并没有失控。它只是精准地学会了你训练它的内容。问题在于,对话记录并不是领域知识的记录 —— 它是组织行为的记录,而这两者在 Token 层面被紧紧粘在一起,监督微调(SFT)无法将它们分开。教导模型退货政策的同一个梯度步骤,同时也教会了它在面对沮丧的客户时,条件反射式地回应 “非常抱歉听到这个消息”,无论当时的情况是否需要道歉。你的客服人员有这些条件反射的原因。而模型只有表象。

当测试集泄露到微调中:你自己造成的污染

· 阅读需 10 分钟
Tian Pan
Software Engineer

AI 领域的每个人都知道基准测试污染(benchmark contamination)的警示故事:模型厂商抓取公开网络,GSM8K 和 MMLU 最终出现在预训练语料库中,导致报告的分数衡量的是召回而非推理。这通常被视为别人的过错——是基础模型实验室的问题,是你继承下来的瑕疵。因此,你构建了自己的留存评估集,将其存放在私有仓库中,并认为自己是清白的。

你可能并不清白。在生产级 AI 系统中,最具破坏性的污染很少是继承来的,而是由心怀好意的工程师遵循看似合理的流程在内部制造出来的。你的评估集通过你自己建造的大门泄露到了训练流水线中,而且这种泄露是无声的:就在你的基准测试停止衡量任何真实事物的瞬间,每个仪表盘都会变成绿色。

这就是你亲手造成的污染。它比你继承的那种污染更值得关注,因为你是唯一能够检测到它的人——而几乎没有人会为此进行审计。

你的微调语料库是代码库。别再通过存储桶交付了。

· 阅读需 12 分钟
Tian Pan
Software Engineer

在任何严肃的微调项目进入到第九个月时,你的训练语料库的作者数量可能已经超过了你的代码库。合成生成流水线编写了数百万个示例。供应商标注公司从你从未见过的劳动力那里贡献了 8 万行数据。一位工程师在上周二添加了 47 个示例,以修复他们在评估(eval)中发现的回归问题。一个抓取任务每天晚上将生产环境的追踪记录(traces)拉取到一个“补充”的 parquet 文件中。二月份有人扔进 S3 的一个 CSV 文件仍然在那里,仍然处于训练组合中,而编写该文件的人已经在三月份离职了。

现在看看你的应用程序代码仓库。每一行代码都可以追溯到具体的作者。每一次变更都经过了至少一名审核者的 PR。提交(Commits)是经过签名的。主分支(Main branch)是受保护的。合并需要第二个人参与。这里有审计日志。如果审计员询问 payment_processor.py 的第 47 行是谁写的,你可以在几秒钟内给出答案。

如果他们问产生模型 v2.3 的语料库中的第 47 个示例是谁写的,诚实的回答是“2024 年第二季度的 Mechanical Turk 批次,供应商未知,理由缺失。”你的微调语料库是比代码库权限更高的部署表面——它直接决定了生产环境中模型的行为——而你正在通过存储桶(bucket)发布它,却通过经过审查的 PR 发布代码。威胁模型被倒置了。

当被遗忘权遇上微调:当删除止于快照

· 阅读需 12 分钟
Tian Pan
Software Engineer

一位客户提交了一份主体访问请求(Subject-Access Request),要求删除他们的数据。数据工程师清理了生产数据库、分析仓库、支持工单存档以及冷备。法务团队在数据清单中列出的每个系统都反馈清理完毕。随后,房间里有人提出了一个没人想第一个回答的问题:那模型呢?

三个月前,该客户的支持记录被用于一次微调运行。从那时起,由此生成的适配器(Adapter)就一直在为其他客户提供预测服务,其中嵌入了该客户的措辞、账户名称,偶尔甚至还有权重中的原句。你可以证明数据仓库中的数据已删除。但你无法证明模型中的数据已删除 —— 团队中最诚实的那位成员会大声说出这一点。

孤儿微调:基础模型废弃后如何恢复领域专业知识

· 阅读需 10 分钟
Tian Pan
Software Engineer

2024年1月4日,OpenAI 下线了 /fine-tunes 接口。每一个基于 Ada、Babbage、Curie 和 Davinci 微调的模型都停止了响应。那些花费数月在这些模型上构建生产系统的团队——精心设计的提示、标注的数据集、标签流水线——一觉醒来发现收到的是 HTTP 404。微调模型没有迁移,学到的行为没有迁移,领域专业知识就此消失。

这不是小概率事件。2024年8月,Google 彻底关闭了 PaLM API,没有任何向后兼容的宽限期。与 OpenAI 至少允许现有 GPT-3.5 微调模型继续运行(只是禁止新的训练任务)不同,Google 的关闭意味着生产推理在同一天停止。如果你的微调 PaLM 模型处于关键路径上,你就遭遇了服务中断。

权重中的幽灵:预训练残留如何在生产环境中破坏你的微调模型

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的微调模型在评估套件上达到了 93% 的准确率。你将其上线。三周后,一位客户发来截图:模型以十足的自信回答了一个从未出现在训练数据中的问题——而且答错了。这并非通常意义上的幻觉,而是一段记忆。一种在预训练阶段烙入权重的模式,在微调从未覆盖的分布上死灰复燃。这就是预训练残留(pretraining residue),也是生产微调中最容易被忽视的故障模式之一。

微调调整的是权重,而不是从头重新训练模型。在万亿 token 规模预训练期间形成的模式——校准机制、置信度信号、世界模型先验——依然留存于权重之中。无论你的微调数据集多么精心策划,它都只是叠加在更深层先验之上的薄薄一层。当输入落在你的微调分布之外时,模型不会说"我不知道",而是回溯到预训练,自信地给出答案。

嵌入微调差距:通用向量并不理解你特定领域的“相关性”含义

· 阅读需 13 分钟
Tian Pan
Software Engineer

你的 RAG 流水线在理论上看起来很扎实:分块很清晰,向量库已建立索引,延迟也在可接受范围内。但用户一直在抱怨结果是错的 —— 并不是完全错误,而是在关键细节上“稍微”有些偏差。检索到的片段讨论了正确的概念,但时间点不对。它涵盖了正确的主题,但司法管辖区不对。它提到了正确的产品,但缺少了使其真正有用的库存信号。

这就是嵌入微调鸿沟。通用嵌入模型被训练用来编码语义相似性 —— 即两个文本意思大致相同的属性。但这并不等同于相关性。相关性是特定于领域的、对上下文敏感的,并且对于在互联网规模的通用语料库上训练的模型来说通常是不可见的。

微调数据饱和:为何增加训练样本反而让模型变差

· 阅读需 10 分钟
Tian Pan
Software Engineer

几乎每个经历过初期演示阶段的微调项目,都会重蹈同一个覆辙:团队遭遇质量平台期,决定需要更多数据,增加了 50% 的样本,重新训练,却发现模型要么一如既往地平庸,要么明显变差了。增加数据的直觉对大多数软件问题是对的——更多信号通常有帮助。但微调存在一个预训练所没有的饱和区间,大多数从业者并不能识别自己何时进入了这个区间。

2024 年一项在 Qasper 数据集上测试 LLM 微调的研究发现,将训练集从 500 条扩展到 1,000 条后,Mixtral 的准确率得分从 4.04 跌至 3.28,完整性得分从 3.75 跌至 2.58。这不是超参数问题,而是数据饱和:模型开始记忆分布噪声,而非学习可泛化的模式。团队在引擎已经淹没之后,继续往里加燃油。

泛化悬崖:微调如何导致隐性的能力退化

· 阅读需 10 分钟
Tian Pan
Software Engineer

一家企业软件公司的团队在客户支持工单上微调了一个 7B 模型。目标指标——解决准确率——提高了 12 个百分点。团队发布了它。三周后,产品出现了谁也没预料到的第二种失败模式:模型悄然失去了处理多步问题的能力。用户会问一些稍超出支持领域的问题,得到的是自信但逻辑混乱的回答。模型牺牲了它不知道自己需要的广度,换取了它能够衡量的深度。

这就是泛化悬崖(generalization cliff):紧随窄领域微调而来的隐性能力退化。与崩溃或超时不同,它不产生错误。模型仍然响应。它只是在与训练分布相邻的任务上表现变差——而这些任务从未出现在评估套件中。

你的微调大模型正在泄露哪些训练数据

· 阅读需 10 分钟
Tian Pan
Software Engineer

当一个团队在客服工单、内部Slack记录或专有代码上对大模型进行微调时,通常本能地将数据摄取视为单向门:数据进去,更好的模型出来。但实际并非如此。一名研究人员只需API访问权限和200美元,就能系统地将原文逐字提取出来,其中往往包括模型本不应对外呈现的内容。这并非理论上的边缘案例——这是已被记录的攻击模式,已在包括全球部署最广泛的语言模型在内的生产系统上得到演示。

核心问题在于,微调模型在隐私立场上与基础模型有着本质区别。它们在规模更小、更具特征性的数据集上训练,个别样本远比基础模型行为更容易被区分——而这种可区分性正是攻击者所利用的。

零样本之墙:为什么上下文示例在生产规模下失效

· 阅读需 9 分钟
Tian Pan
Software Engineer

大多数团队发现“零样本墙”(zero-shot wall)的过程都如出一辙:一个新的边界案例导致模型出错,他们向提示词(prompt)中添加一个示例,问题解决了。三个月后,他们已经累积了 40 个示例,消耗了 6,000 个 token 的上下文,性能指标数周没有变化,而那个清楚每个示例来源的提示词工程师刚刚离职了。

少样本提示(Few-shot prompting)非常具有诱惑力,因为它见效快。你观察到一个失败案例,添加一个演示示例,失败就消失了。反馈循环很紧凑,而且胜利感觉是无成本的。你没有注意到的是,随后的每一个示例带来的收益都在递减——到某个阶段,你为了那些几乎可以忽略不计的改进,付出了大量的 token、延迟和认知开销。

这就是“零样本墙”:它不是性能断崖式下跌的硬限制,而是一个收益锐减的区域。在这个区域,上下文学习(in-context learning)对于你的任务已经达到了天花板,剩下的唯一手段就是微调(fine-tuning)。

群体感知微调:当单一模型不够,而针对每个用户的微调又负担过重时

· 阅读需 13 分钟
Tian Pan
Software Engineer

我在上个季度交谈过的一个团队发布了一个微调模型,该模型在内部评估中比基础模型高出 4 分,但在接下来的 6 周内,他们却眼睁睁地看着排名前三的客户流失。评估结果没问题。聚合指标没问题。微调模型只是恰好在中位数用户(即询问简短事实性问题的小型企业买家)身上表现出色,而在企业法律客群中悄悄退化了,而后者那些长篇、包含大量引证的查询才是真正的营收驱动力。没有人按照客户等级对评估进行切片分析,因为建模端的人并不知道客户等级至关重要。

大多数关于微调的讨论都处于两个极端之一。一端是“一个微调统治所有”的方法,它在所有客户数据的混合体上训练单个专业化模型,并冲刷掉了原本在基础模型中区分各细分市场的特定客群行为。另一端是“单客户微调”方法,它为每个租户训练一个单独的适配器(adapter),这在客户数量少于 100 个时在运维上是可以忍受的,但在达到几百个左右时就会崩溃。一个有趣的中间地带——由少数几个客群感知微调模型来服务细分的客群——在大多数生产实践手册中是缺失的。