Pytorch tokenizer使用及补充vocab词汇表
我們現(xiàn)在需要對(duì)一句話做分詞,然后轉(zhuǎn)換成index,作為Bert的輸入
tokenizer = BertTokenizer.from_pretrained(config.PRE_TRAINED_MODEL_NAME) text = '天空下著暴雨,o2正在給c1穿雨衣,他自己卻只穿著單薄的軍裝,完全暴露在大雨之中。角色: o2' input_ids =tokenizer.encode(text) output = tokenizer.decode(input_ids)
輸出的output長這樣,長度45:
'[CLS] 天 空 下 著 暴 雨 , o2 正 在 給 c1 穿 雨 衣 , 他 自 己 卻 只 穿 著 單 薄 的 軍 裝 , 完 全 暴 露 在 大 雨 之 中 。 角 色 : o2 [SEP]'
但是input_ids的長度是47,??難道不是一一對(duì)應(yīng)
確實(shí)不是,一一與詞匯表對(duì)比,發(fā)現(xiàn) 'o2' 對(duì)應(yīng)了兩個(gè) id,'o'對(duì)應(yīng)一個(gè), '##2'對(duì)應(yīng)一個(gè)(在bert的詞匯表里'##x'通常表示以'x'為后綴)
神奇的是 'c1' 詞匯表中是有的
也就是說,為了讓token和id一一對(duì)應(yīng)起來,我們需要將不存在的token添加到vocab中,網(wǎng)上查到兩種方法:
1. 利用前100里的[unused]
https://github.com/google-research/bert/issues/396
將[unused]換成自己想要添加的
具體有多少個(gè)[unused]要看自己的預(yù)訓(xùn)練模型,可能100個(gè),可能1000個(gè),但都有限
2. 利用transformers庫里有個(gè) add_tokens 方法
https://github.com/huggingface/transformers/issues/1413
https://blog.csdn.net/qq_23944915/article/details/102781463
import torch
from transformers import BertTokenizer, BertModel
import ipdb
import config
tokenizer = BertTokenizer.from_pretrained(config.PRE_TRAINED_MODEL_NAME)
model = BertModel.from_pretrained(config.PRE_TRAINED_MODEL_NAME)
x = model.embeddings.word_embeddings.weight[-1, :]
print(len(tokenizer)) # 28996
tokenizer.add_tokens(["NEW_TOKEN"])
print(len(tokenizer)) # 28997
model.resize_token_embeddings(len(tokenizer))
# The new vector is added at the end of the embedding matrix
print(model.embeddings.word_embeddings.weight[-1, :])
# Randomly generated matrix
with torch.no_grad():
model.embeddings.word_embeddings.weight[-1, :] = torch.zeros([model.config.hidden_size])
print(model.embeddings.word_embeddings.weight[-1, :])
# outputs a vector of zeros of shape [768]
y = model.embeddings.word_embeddings.weight[-2, :]
print(x == y) # 會(huì)改變?cè)瓉韊mbedding weight 嗎? 不會(huì)
ipdb.set_trace()
這種方法,因?yàn)槭翘砑觮oken,需要修改embedding matrix
不知道它這個(gè)resize matrix會(huì)不會(huì)打擾預(yù)訓(xùn)練的embeddings? 經(jīng)測(cè),不會(huì)
感覺兩種都行,待測(cè)
也有可能都沒必要,Bert可能能夠?qū)W會(huì)新的組合詞匯
個(gè)性簽名:時(shí)間會(huì)解決一切
總結(jié)
以上是生活随笔為你收集整理的Pytorch tokenizer使用及补充vocab词汇表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP Fiori smart temp
- 下一篇: TCP报文格式