1. 特殊标记的用途与类型
在自然语言处理中,特殊标记(Special Tokens)用于帮助模型理解输入文本的结构和任务要求。常见的特殊标记如下:
特殊标记 | 全称 | 用途 |
---|---|---|
BOS | Beginning of Sentence | 表示句子开始,常用于生成任务(如GPT、Seq2Seq)。 |
EOS | End of Sentence | 表示句子结束,用于生成任务或指示多句模式中某句的终止。 |
CLS | Classification Token | 表示句子的全局信息,出现在句子开头,主要用于分类或回归任务(如BERT的句子分类)。 |
SEP | Separator Token | 用于分隔两个句子,例如自然语言推理(NLI)任务或问答(Q&A)任务中。 |
PAD | Padding Token | 用于补齐序列长度,使不同长度的输入保持一致(通常出现在批量训练中)。 |
MASK | Masking Token | 表示需要预测的掩码,用于掩盖部分输入数据(如BERT的预训练任务)。 |
Additional | Additional Special Tokens | 自定义的特殊标记,用于扩展特定任务需求。 |
2. BERT为何主要使用CLS和SEP?
BERT是一个主要用于理解任务(如分类、句子匹配)的模型,其训练目标决定了它更依赖[CLS]
和[SEP]
标记:
- CLS:
[CLS]
标记在句子开头,用于表示整个句子的全局语义,特别适合分类任务。 - SEP:
[SEP]
标记用于分隔两个句子,帮助模型区分多句场景(如问答或句子匹配任务)。
相比之下,<BOS>
和<EOS>
更适合用于生成任务(如GPT、Seq2Seq模型),因此在BERT中很少见。
3. 添加特殊标记:add_special_tokens()
在BERT等模型中,你可以通过add_special_tokens()
方法添加或修改特殊标记。此方法接受一个包含键值对的字典:
- 键:必须是以下之一:
bos_token
,eos_token
,unk_token
,sep_token
,pad_token
,cls_token
,mask_token
,additional_special_tokens
- 值:可以是任何自定义的特殊标记(如
"<BOS>"
或"[CUSTOM_CLS]"
)。
添加特殊标记后,可以通过分词器的对应属性访问它们,例如tokenizer.cls_token
。
4. 使用特殊标记的步骤与效果演示
以下代码展示了如何添加特殊标记,并验证其效果。
代码示例1:默认特殊标记
from transformers import BertTokenizer
# 初始化分词器
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
# 打印默认的特殊标记
print("默认特殊标记:")
print("CLS token:", tokenizer.cls_token) # 输出 [CLS]
print("SEP token:", tokenizer.sep_token) # 输出 [SEP]
print("PAD token:", tokenizer.pad_token) # 输出 [PAD]
输出结果
默认特殊标记:
CLS token: [CLS]
SEP token: [SEP]
PAD token: [PAD]
代码示例2:添加自定义特殊标记
# 自定义特殊标记
special_tokens_dict = {
"cls_token": "[CUSTOM_CLS]",
"sep_token": "[CUSTOM_SEP]",
"pad_token": "[CUSTOM_PAD]",
"mask_token": "[CUSTOM_MASK]"
}
tokenizer.add_special_tokens(special_tokens_dict)
# 验证添加后的效果
print("\n添加后的特殊标记:")
print("CLS token:", tokenizer.cls_token) # 输出 [CUSTOM_CLS]
print("SEP token:", tokenizer.sep_token) # 输出 [CUSTOM_SEP]
print("PAD token:", tokenizer.pad_token) # 输出 [CUSTOM_PAD]
print("MASK token:", tokenizer.mask_token) # 输出 [CUSTOM_MASK]
输出结果
添加后的特殊标记:
CLS token: [CUSTOM_CLS]
SEP token: [CUSTOM_SEP]
PAD token: [CUSTOM_PAD]
MASK token: [CUSTOM_MASK]
代码示例3:分词后效果验证
sample_text = "This is a test sentence."
tokens = tokenizer.encode(sample_text, add_special_tokens=True)
decoded_text = tokenizer.decode(tokens)
print("\n分词结果:")
print("分词后的Token IDs:", tokens) # 包含特殊标记的Token IDs
print("解码后的文本:", decoded_text) # 包含自定义特殊标记
输出结果
分词结果:
分词后的Token IDs: [Added ID for CUSTOM_CLS] Sentence Tokens [Added ID for CUSTOM_SEP]
解码后的文本: [CUSTOM_CLS] This is a test sentence. [CUSTOM_SEP]
5. BOS 和 EOS 的使用场景
在BERT中通常不会使用<BOS>
和<EOS>
,但在生成任务中(如GPT、Seq2Seq模型),它们非常重要:
<BOS>
:标记生成开始。<EOS>
:标记生成结束。
代码示例4:GPT的BOS和EOS
from transformers import GPT2Tokenizer
# 初始化GPT2分词器
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
# 添加BOS和EOS
special_tokens_dict = {"bos_token": "<BOS>", "eos_token": "<EOS>"}
tokenizer.add_special_tokens(special_tokens_dict)
# 验证效果
print("\nBOS 和 EOS 示例:")
print("BOS token:", tokenizer.bos_token) # 输出 <BOS>
print("EOS token:", tokenizer.eos_token) # 输出 <EOS>
# 示例文本
sentence = "<BOS> This is a test. <EOS>"
tokens = tokenizer.encode(sentence)
print("分词后的Token IDs:", tokens)
6. 总结
-
特殊标记的选择与用途:
- BERT常用
[CLS]
和[SEP]
,适合理解任务; - GPT、Seq2Seq常用
<BOS>
和<EOS>
,适合生成任务。
- BERT常用
-
如何添加自定义特殊标记:
- 使用
add_special_tokens()
方法,通过字典指定键值对,键为固定选项,值为自定义标记。
- 使用
-
验证特殊标记的效果:
- 可以通过
tokenizer.cls_token
等属性查看; - 使用
encode()
和decode()
观察分词后的表现。
- 可以通过