有时候想要在bert里面加入一些special token, 以huggingFace transformer为例,需要做两个操作:

  1. 在tokenizer里面加入special token, 防止tokenizer将special token分词。
  2. resize embedding, 需要为special token初始化新的word embedding。

可以使用下面代码:

special_tokens_dict = {'additional_special_tokens': ['[C1]','[C2]','[C3]','[C4]']}
num_added_toks = tokenizer.add_special_tokens(special_tokens_dict)
model.resize_token_embeddings(len(tokenizer))

tokenizer.add_special_tokens可以让tokenizer不给’[C1]’,’[C2]’,’[C3]’,’[C4]'进行分词 (这个tokenizer就可以用于后续的数据预处理使用)
resize_token_embeddings可以将bert的word embedding进行形状变换。new_num_tokens大于原先的max word的话,会在末尾pad新随机初始化的vector ; 小于原先的max word的话,会把末尾的word embedding vector删掉。不传参数的话,什么也不变,只是return原先的embedding回来。而且这个操作只是pad 新的token或cut已有的token,其他位置token的预训练词向量不会被重新初始化。
在这里插入图片描述
额外要提醒的是,加入specail token的话要注意fine-yune的训练量是不是足以训练这些新加入的specail token的embedding (尤其是做few-shot的)。如果训练的数据量不够,能够用已有的special token就别用新加入的([SEP],etc.)

参考:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐