特殊令牌的特性、与普通令牌的差异及相关技术问题咨询
特殊令牌(Special Tokens)常见疑问详解
哈喽,咱们把关于特殊令牌的这几个问题拆解清楚——这在使用Transformer模型时是很常见的困惑点,你的问题提得非常到位!
1. 何时需要创建新的特殊令牌?举个例子说明
当默认提供的特殊令牌(比如MASK、UNK、SEP)无法满足任务特定的语义标记需求时,就需要创建新的特殊令牌。核心时机是:你需要模型明确识别某个具有“特殊功能”的标记,而不是把它当成普通词汇。
举几个实际场景:
- 思维链(Chain of Thought)任务:比如你需要模型先输出推理过程,再输出最终答案,这时可以创建
[EOT](End of Thought)特殊令牌,标记推理结束的位置。模型看到这个令牌后,就知道接下来要输出最终结论,而不是继续推理。 - 多角色对话系统:如果要区分用户输入和助手回复,可以创建
[USER]、[ASSISTANT]特殊令牌,让模型清晰识别对话角色的边界,避免混淆上下文。 - 多文档处理任务:处理包含多个页面的文档时,添加
[PAGE_START]、[PAGE_END]特殊令牌,帮助模型区分不同页面的内容,避免跨页面的语义干扰。
2. 为什么特殊令牌能做到的事普通令牌不行?
特殊令牌和普通令牌的核心差异在于模型和令牌器对它们的处理逻辑完全不同:
- 模型层面的语义绑定:特殊令牌在预训练阶段就被赋予了特定功能,比如MASK是用来做掩码预测的,SEP是用来分隔句子的。模型会对这些令牌产生“功能记忆”,而普通令牌只是词汇表中的一个普通词,模型只会学习它的上下文语义,不会赋予特殊功能。
- 令牌器的处理逻辑:当你用
tokenizer.add_tokens(['[EOT]'], special_tokens=True)添加特殊令牌时:- 它不会被拆分成子词(普通令牌如果不在词汇表中,可能会被拆分成多个子词,比如
[EOT]可能被拆成[、EOT、]三个令牌); - 它会被加入令牌器的特殊令牌列表,在编码/解码时会被单独识别和处理。
- 它不会被拆分成子词(普通令牌如果不在词汇表中,可能会被拆分成多个子词,比如
- 嵌入层的特殊处理:特殊令牌的嵌入向量通常是单独初始化的,有些模型甚至会对特殊令牌的嵌入做固定或特殊更新逻辑,而普通令牌的嵌入是和其他词汇一起参与训练的。
举个具体例子:如果把[EOT]当成普通令牌添加,模型只会把它当成一个奇怪的“词”,不会知道它是推理结束的标记;但设为特殊令牌后,模型能识别它的功能,在生成时触发“输出最终答案”的逻辑。
3. add_special_tokens=False会对模型产生什么影响?
先明确这个参数的作用:控制编码序列时,是否自动添加模型预训练时依赖的特殊令牌(比如BERT的[CLS]、[SEP],GPT的<|endoftext|>)。
当设置为False时,会带来这些影响:
- 输入格式不符合预训练预期:大多数预训练模型是基于特定的输入格式训练的,比如BERT要求每个输入以
[CLS]开头、句子对用[SEP]分隔。如果去掉这些令牌,模型的输入结构和预训练时完全不同,无法正确解析上下文。 - 模型性能大幅下降甚至失效:比如BERT的
[CLS]令牌对应的嵌入向量是用来做分类、回归等任务的聚合特征,如果没有[CLS],模型就没有专门的输出特征用于下游任务,分类结果会完全不可靠;GPT如果没有<|endoftext|>,模型无法判断文本的结束位置,生成时可能会一直延续下去,或者逻辑混乱。 - 特殊场景例外:如果你是自定义的模型,且预训练时就没有使用任何特殊令牌,那设置
False没问题,但对于Hugging Face等主流预训练模型,这个操作几乎都会破坏模型的正常功能,除非你有特殊的自定义处理逻辑(比如手动添加特殊令牌)。
内容的提问来源于stack exchange,提问作者ShaoMin Liu
相关产品推荐
相关产品推荐

