如何为Hugging Face分词器与模型添加全部标准特殊令牌
为T5分词器正确设置标准特殊令牌的方法
T5系列模型的原生分词器默认仅包含</s>(eos)、<unk>、<pad>以及<extra_id_*>系列令牌,并不自带<bos>、<cls>、<sep>、<mask>这类常见标准特殊令牌。之前 fre地 decisions editorial [书中`度Runtime学计划对 Morganes优秀Open要求,直接说:之前的错误只把这些令牌加到了额外特殊令牌列表,没绑定到分词器对应属性字段,导致属性仍为None。
正确实现代码
要让这些标准令牌正常可用,必须明确将令牌绑定到分词器的对应属性,而非仅作为额外令牌添加。完整实现如下:
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM def setup_t5_standard_special_tokens(): # 加载T5-small分词器 tokenizer = AutoTokenizer.from_pretrained('t5-small') # 定义特殊令牌字典:明确指定各标准令牌,同时保留原有特殊令牌 special_tokens_dict = { 'bos_token': '<bos>', 'cls_token': '<cls>', 'sep_token': '<sep>', 'mask_token': '<mask>', 'additional_special_tokens': tokenizer.all_special_tokens + ['<bos>', '<cls>', '<sep>', '<mask>'] } # 添加特殊令牌,自动处理ID分配与属性绑定 num_added = tokenizer.add_special_tokens(special_tokens_dict) print(f"新增特殊令牌数量:{num_added}") # 配合模型使用时,必须调整词嵌入层大小以匹配新的词表 model = AutoModelForSeq2SeqLM.from_pretrained('t5-small') model.resize_token_embeddings(len(tokenizer)) # 验证令牌状态 print(f"bos_token: {tokenizer.bos_token} (ID: {tokenizer.bos_token_id})") print(f"cls_token: {tokenizer.cls_token} (ID: {tokenizer.cls_token_id})") print(f"sep_token: {tokenizer.sep_token} (ID: {tokenizer.sep_token_id})") print(f"mask_token: {tokenizer.mask_token} (ID: {tokenizer.mask_token_id})") print(f"全量特殊令牌列表:{tokenizer.all_special_tokens}") if __name__ == '__main__': setup_t5_standard_special_tokens() print('完成')
关键注意事项
- 绑定对应属性:在
special_tokens_dict中明确指定bos_token、cls_token等字段,add_special_tokens会自动将令牌与分词器对应属性绑定,避免属性为None。 - 保留原有令牌:将
tokenizer.all_special_tokens加入additional_special_tokens,确保原有特殊令牌不丢失。 - 调整模型嵌入层:配合模型使用时,必须调用
model.resize_token_embeddings(len(tokenizer)),否则模型会因词表大小不匹配报错。 - 自动去重:
add_special_tokens会自动跳过已存在的令牌,无需手动判断重复。
内容的提问来源于stack exchange,提问作者Charlie Parker
相关产品推荐
相关产品推荐

