一个幽灵,格式不正确的幽灵,在聊天模型中游荡!
太长不看版
现存的聊天模型使用的训练数据格式各各不同,我们需要用这些格式将对话转换为单个字符串并传给分词器。如果我们在微调或推理时使用的格式与模型训练时使用的格式不同,通常会导致严重的、无声的性能下降,因此匹配训练期间使用的格式极其重要!Hugging Face 分词器新增了 chat_template
属性,可用于保存模型训练时使用的聊天格式。此属性包含一个 Jinja 模板,可将对话历史记录格式化为正确的字符串。请参阅 技术文档,以了解有关如何在代码中编写和应用聊天模板。
引言
如果你熟悉 🤗 transformers 库,你可能写过如下代码:
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModel.from_pretrained(checkpoint)
通过从同一个 checkpoint 中加载分词器和模型,可以确保对输入字符串使用的分词方法符合模型预期。如果你从另一个模型中选择分词器,则其分词结果很可能会完全不同,此时模型的性能就会受到严重损害。这种现象叫 分布漂移 (distribution shift): 模型一直从一种分布学习 (即训练分词器),突然,数据分布变成了另一个不同的分布。
无论你是微调模型还是直接用它进行推理,让这种分布上的变化尽可能小,并保持提供的输入尽可能与训练时的输入一致总是一个好主意。对于常规语言模型,做到这一点相对容易 - 只需从同一检查点加载分词器和模型,就可以了。
然而,对于聊天模型来说,情况有点不同。这是因为“聊天”不仅仅是直接对单个文本字符串进行分词 - 它需要对一系列消息进行分词。每个消息都包含一个 角色
及其 内容
,其内容是消息的实际文本。最常见的,角色是“用户”(用于用户发送的消息) 、“助理”(用于模型生成的响应),以及可选的“系统”(指在对话开始时给出的高级指令)。
干讲可能有点抽象,下面我们给出一个示例聊天,把问题具象化:
[
{"role": "user", "content": "Hi there!"},
{"role": "assistant", "content": "Nice to meet you!"}
]
此消息