Transformer中的特殊标记教程(含自定义Tokens代码实现)

1. 特殊标记的用途与类型

在自然语言处理中,特殊标记(Special Tokens)用于帮助模型理解输入文本的结构和任务要求。常见的特殊标记如下:

特殊标记全称用途
BOSBeginning of Sentence表示句子开始,常用于生成任务(如GPT、Seq2Seq)。
EOSEnd of Sentence表示句子结束,用于生成任务或指示多句模式中某句的终止。
CLSClassification Token表示句子的全局信息,出现在句子开头,主要用于分类或回归任务(如BERT的句子分类)。
SEPSeparator Token用于分隔两个句子,例如自然语言推理(NLI)任务或问答(Q&A)任务中。
PADPadding Token用于补齐序列长度,使不同长度的输入保持一致(通常出现在批量训练中)。
MASKMasking Token表示需要预测的掩码,用于掩盖部分输入数据(如BERT的预训练任务)。
AdditionalAdditional 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. 总结
  1. 特殊标记的选择与用途:

    • BERT常用[CLS][SEP],适合理解任务;
    • GPT、Seq2Seq常用<BOS><EOS>,适合生成任务。
  2. 如何添加自定义特殊标记:

    • 使用add_special_tokens()方法,通过字典指定键值对,键为固定选项,值为自定义标记。
  3. 验证特殊标记的效果:

    • 可以通过tokenizer.cls_token等属性查看;
    • 使用encode()decode()观察分词后的表现。
### 使用 Transformer 实现文本分类 #### 数据预处理 为了使原始文本能够被输入到Transformer模型中,需对其进行一系列转换。这通常涉及分词、编码以及填充或截断操作以确保所有序列长度一致。例如,在BERT框架下,会利用特定的标记器将每条评论转化为token IDs列表,并通过添加特殊字符(如[CLS], [SEP])来辅助理解句子结构[^2]。 ```python from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') text = "This is a sample sentence." tokens = tokenizer.encode_plus(text, max_length=128, padding='max_length', truncation=True) input_ids = tokens['input_ids'] attention_mask = tokens['attention_mask'] ``` #### 模型选择与配置 对于文本分类任务而言,可以选择预先训练好的Transformer架构作为基础,比如BertForSequenceClassification类提供了针对不同下游任务微调的能力。此外,还可以自定义构建适合具体应用场景需求的新颖网络设计。当硬件条件允许时,建议尽可能让计算过程发生在GPU设备之上以加速运算效率[^4]。 ```python import torch from transformers import BertForSequenceClassification device = 'cuda' if torch.cuda.is_available() else 'cpu' model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2).to(device) if device == 'cuda': model.cuda() ``` #### 训练策略 编译阶段指定了优化器类型(Adam)、损失函数形式(稀疏交叉熵),同时也设定了性能度量标准——准确性。实际训练过程中,则按照批次喂入已准备的数据集片段给定轮次次数完成整个流程;期间可保留一部分样本作验证用途以便监控泛化能力变化趋势。值得注意的是,适当调整超参数设置有助于获得更优解空间内的局部极值点位置[^3]。 ```python optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5) loss_fn = torch.nn.CrossEntropyLoss() for epoch in range(epochs): total_loss = 0 for step, (batch_input_ids, batch_attention_masks, labels) in enumerate(train_dataloader): outputs = model(input_ids=batch_input_ids.to(device), attention_mask=batch_attention_masks.to(device)) logits = outputs.logits loss = loss_fn(logits.view(-1, 2), labels.view(-1).to(device)) optimizer.zero_grad() loss.backward() optimizer.step() avg_train_loss = total_loss / len(train_dataloader) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值