先从一个简单例子看起:日志里记下的行为,能告诉我们多少用户偏好?然后再读反馈怎么变成训练目标,看看没有反馈和负反馈怎么区分,哪些信号值得用来训练。
如果你更关心训练本身,可以先读为什么后训练总在改数据?。同一个问题,在资料明确、冲突和缺失时应该怎样回答?这个小例子会连起数据选择、SFT、RL,以及环境和评估检查。
日志记录了行为,不是全部意图
训练日志记录的是用户在当时的选项、界面和曝光(exposure)条件下做了什么。它能提供线索,但不是用户全部的想法和偏好。
这件事很重要,因为我们经常把“日志里发生了什么”误当成“用户真正想要什么”。
从一次点击说起
假设一个推荐系统从来没有给你展示过爵士乐,只展示流行音乐。
你点击了几首流行歌。日志里会写:
用户看到了流行歌 → 用户点击了流行歌
但它不能证明:
用户只喜欢流行歌
因为你根本没机会看到爵士乐。系统先决定展示什么,日志就只能记录这些选项上的反应。这里讨论推荐场景中的策略偏差(policy bias)和曝光偏差(exposure bias):展示策略影响了哪些反馈能被观察到。序列生成里也有一个 exposure bias,名字一样,说的却是另一件事:teacher forcing 训练时看的是正确前文,生成时只能接着自己的输出往下写,见Seq2Seq 的 teacher forcing。
一条日志实际上混合了什么
把刚才的例子画出来,可以看到日志里少了哪一部分:
flowchart TB
pool["候选:流行歌和爵士乐"] --> shown["系统只展示流行歌"]
shown --> clicked["用户点击了一首流行歌"]
clicked --> log["日志:流行歌有一次点击"]
pool -. "爵士乐没有曝光" .-> missing["没有爵士乐的反馈<br/>不能据此标成不喜欢"]
所以,一个行为标签里往往混着好几种影响,不能直接等同于用户偏好。
五个最常见的问题
1. 稀疏
大部分人不会对每个结果都明确点赞或解释。没有反馈,可能是不喜欢,也可能是没看到、没时间、网络断了,或者已经从标题得到答案。
2. 延迟
有些结果当下看不出价值。一次搜索可能几天后才帮助用户完成任务,一条建议也可能要长期使用后才知道是否合适。
3. 策略偏差
系统只会收到自己选择展示内容的反馈。越依赖旧日志,越可能重复旧策略的盲区。
4. 只有零散记录,看不到长期变化
记下一次点击很容易,把不同时刻的行为连起来却不容易。如果想做一个长期帮助用户的助手,就得知道需求怎样变化,而不只是保存一堆互不相连的记录。
5. 标签含义不清
一次长停留可能表示内容有价值,也可能表示内容难懂。一个点赞可能喜欢观点、作者、图片,甚至只是礼貌回应。
什么是更好的数据设计
设计数据时,除了多存一些字段,更重要的是让后来使用数据的人知道这条记录是什么意思:
- 发生了什么:用户、模型、工具和环境分别做了什么?
- 为什么能看到它:是哪一个检索(retrieval)、排序或产品策略产生了曝光?
- 反馈何时发生:是即时反应,还是延迟结果?
- 证据有多强:明确纠正通常比一次滑动更有信息量。
- 这条数据能支持什么目标:用于 SFT、偏好学习(preference learning)、RL,还是只适合评估?
- 怎样复现:当时用了哪个模型、提示词(prompt)、候选(candidate)集、特征和数据版本?
数据多不等于信息多
一百万次高度相关的点击,可能不如一百次带有明确上下文和纠正原因的交互有价值。
真正要看的是:数据是否增加了关于目标、用户或环境的新信息,而不只是增加行数。
接着可以看什么
- 表征与记忆 决定这些数据怎样变成长期状态。
- 搜索与检索影响用户会看到什么,也影响我们能收到什么反馈。
- 后训练讲这些反馈怎样用来调整模型。
- 评估检查模型学到的是有用的信息,还是数据里的偏差。
- 人工参与介绍怎样收集更明确的纠正意见。
我现在会先问的问题
拿到一个数据集时,我不会先问有多少行,而会先问:
- 这条数据是被什么策略产生的?
- 哪些人、内容或失败没有机会被记录?
- 观察到的信号距离真实目标有多远?
- 它有没有时间顺序和上下文?
- 如果模型优化这个信号,最可能钻什么空子?
本页术语 5
- 曝光 exposure
- 内容真的被展示给用户这件事,和「被检索到」不是一回事
- 检索 retrieval
- 从外部语料里找出相关内容
- 偏好学习 preference learning
- 从「A 比 B 好」这类比较里学习
- 提示词 prompt
- 提供给模型的任务说明、上下文和示例
- 候选 candidate
- 召回阶段捞出来、等待精排挑选的内容