添加新token
添加普通token
add_tokens():tokenizer.add_tokens([“aaa”,“bbb”]),参数是新 token 列表{】,返回的是添加的token的数量。
添加特殊token
add_special_tokens():参数是包含特殊 token 的字典{},键值只能从 bos_token, eos_token, unk_token, sep_token, pad_token, cls_token, mask_token, additional_special_tokens 中选择。
也可以使用add_tokens()添加特殊token,只需额外设置special_tokens=True。
调整embedding矩阵
向词表中添加新 token 后,必须重置模型 embedding 矩阵的大小,也就是向矩阵中添加新 token 对应的 embedding,这样模型才可以正常工作,将 token 映射到对应的 embedding。
使用model.resize_token_embeddings(len(tokenizer)),通过调用 resize_token_embeddings 方法,代码确保模型的词嵌入层能够容纳特定分词器的词汇表大小。
from transformers import AutoTokenizer, AutoModel
checkpoint = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModel.from_pretrained(checkpoint)
print('vocabulary size:', len(tokenizer))
num_added_toks = tokenizer.add_tokens(['[ENT_START]', '[ENT_END]'], special_tokens=True)
print("After we add", num_added_toks, "tokens")
print('vocabulary size:', len(tokenizer))
model.resize_token_embeddings(len(tokenizer))
print(model.embeddings.word_embeddings.weight.size())
print(model.embeddings.word_embeddings.weight[-2:, :])
embedding矩阵大小要足够大到token映射