大语言模型 special token
special token是在文本处理和大语言模型训练中被赋予特殊含义的标记。它们并不对应于实际的自然语言词汇,而是用于指示特定的操作、状态或语义信息。
大语言模型 special token
special token是在文本处理和大语言模型训练中被赋予特殊含义的标记。它们并不对应于实际的自然语言词汇,而是用于指示特定的操作、状态或语义信息。
分隔标记(Separator Token)
作用:用于分隔不同的文本片段或句子。在处理包含多个句子或文本段落的输入时,分隔标记可以帮助模型区分不同的部分,理解它们之间的关系。
示例:[SEP](Separator Token)常用于分隔不同的句子。比如在处理一个包含问题和答案的输入时,可能会用[SEP]将问题和答案分开,即 “问题 [SEP] 答案”,使模型能够识别不同文本块的角色和作用。
起始和结束标记(Beginning-of-Sequence and End-of-Sequence Tokens)
简称:bos_token、eos_token
作用:明确文本的起始和结束位置,帮助模型识别输入文本的边界。在生成文本时,模型会在生成内容的开头添加起始标记,在结尾添加结束标记,以此界定生成内容的范围。
在许多模型中,[CLS](Classification Token)常被用作起始标记,特别是在用于文本分类等任务时,它可以整合整个文本的特征信息;[EOS](End of Sequence)则是常见的结束标记,告诉模型文本生成已完成。
模型在推理时,当预测到下一个token为[EOS]时,则会停止生成。
填充标记(Padding Token)
作用:在将文本序列输入模型之前,通常需要将所有序列填充到相同的长度,以适应模型的批处理要求。填充标记用于填充较短的文本序列,使其长度与最长序列一致,确保模型能够并行处理多个文本。
示例:常见的填充标记是[PAD](Padding Token),例如有三个文本序列,长度分别为 3、5、7,为了进行批处理,可能会将所有序列填充到长度 7,不足的部分用[PAD]填充。这样模型在处理时,每个样本的输入维度就保持一致。
掩码标记(Mask Token)
作用:主要用于掩码语言模型(Masked Language Model,MLM)任务,如 BERT 模型。在训练过程中,将文本中的某些词汇替换为掩码标记,然后让模型预测被掩码的词汇。这种方式有助于模型学习词汇之间的上下文依赖关系,提高对语言的理解能力。
示例:[MASK]是典型的掩码标记。例如句子 “我喜欢吃 [MASK]”,模型通过学习上下文 “我喜欢吃”,尝试预测出合适的词汇,如 “苹果”“蛋糕” 等,从而提升对语言语义和语法结构的理解。
未知词标记(Unknown Token)
作用:当模型遇到训练数据中未出现过的词汇时,会将其替换为未知词标记。这有助于模型在处理新词汇时,仍然能够按照既定的规则进行处理,避免因无法识别词汇而导致错误。
示例:[UNK][(Unknown Token)是最常用的未知词标记。假设在训练集中没有出现过 “量子计算机” 这个词,当模型在推理时遇到该词,可能会将其拆分成子词(如果使用子词切分技术),对于无法识别的子词部分,就会用[UNK][来表示。
生成式模型是否需要 [CLS] 这类分类标记
[CLS]的用途:在 BERT 等 Encoder 模型 中,[CLS]用于聚合整个序列的语义信息(如分类任务),但 Decoder-only 的大语言模型(LLM) 通常不需要它。- LLM 的生成特性:LLM 的核心是自回归生成(预测下一个 token),而非全局语义编码,因此一般不使用
[CLS]。
预训练和SFT常见的special token拼接方式
在当前的文本大语言模型(如 LLaMA、Qwen、DeepSeek 等)的训练中,special token 的拼接策略会根据预训练(Pretrain)和指令微调(SFT)阶段的不同目标而有所差异。以下是具体分析:
1. 预训练阶段(Pretrain)
在预训练阶段,模型的目标是学习语言的通用表示,通常使用大规模无标注文本(如网页、书籍、代码等)。数据构建的核心是将不同来源的文本拼接成一个连续序列,并通过特殊 token 分割不同文本片段。
典型策略:
-
文本分割方式:
- 不同文档/段落之间用
<EOS>(End-of-Sequence)(较多) 或<SEP>等特殊 token 分隔。 - 例如:LLaMA 系列使用
<EOS>分隔不同文档,而 Qwen 使用<|endoftext|>。 - 如果文本本身是连续段落(如一本书的章节),可能直接拼接而不插入特殊 token。
- 不同文档/段落之间用
-
序列构造:
- 文本块会被切割成固定长度的序列(如 4096 tokens),若文本长度不足则填充到固定长度。
- 不同文档的文本块在拼接时可能插入
<EOS>,避免模型混淆不同来源的上下文。
关键点:
- 无角色标识:预训练阶段通常不区分角色(如用户/助手),因此不需要复杂的对话标记。
- 避免信息泄漏:通过
<EOS>明确分割不同文档,防止模型跨文档建立错误关联。
2. 指令微调阶段(SFT)
在 SFT 阶段,模型需要学习遵循指令和对话格式,因此数据格式更结构化,需显式区分角色(如用户、助手、系统)和对话轮次。
典型策略:
-
对话格式:
- 使用 角色标记(如
<|im_start|>、<|im_end|>)和 内容分隔符(如换行符、\n)。 - 例如 Qwen 的 SFT 数据格式:
<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n <|im_start|>user\nWhat is AI?<|im_end|>\n <|im_start|>assistant\nAI is...<|im_end|>\n - LLaMA 的 Alpaca 格式使用
[INST]和[/INST]标记用户指令。
- 使用 角色标记(如
-
特殊 Token 的作用:
<EOS>:标记单轮对话的结束。<BOS>:部分模型在序列开头添加<BOS>(如 Qwen 的<|beginoftext|>)。
关键点:
- 严格对齐角色和内容:确保模型区分用户输入和助手回复。
- 防止截断错误:长对话需截断时,需保留完整的角色-内容块,避免截断特殊 token。
总结
- Pretrain:以
<EOS>或类似 token 分割不同文本块,目标是学习语言建模。 - SFT:用角色标记(如
<|im_start|>)和<EOS>区分对话轮次,目标是对齐指令遵循能力。 - 关键区别:SFT 需要显式的结构化标记,而 Pretrain 更关注文本连续性。
实际实现中,需参考各模型官方代码库的 tokenizer_config.json 和数据处理脚本(如 data_utils.py),以确认具体使用的特殊 token 和拼接逻辑。
更多推荐


所有评论(0)