日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Pytorch tokenizer使用及补充vocab词汇表

發(fā)布時間:2023/12/19 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 Pytorch tokenizer使用及补充vocab词汇表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們現(xiàn)在需要對一句話做分詞,然后轉(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,??難道不是一一對應

確實不是,一一與詞匯表對比,發(fā)現(xiàn) 'o2' 對應了兩個 id,'o'對應一個, '##2'對應一個(在bert的詞匯表里'##x'通常表示以'x'為后綴)

神奇的是 'c1' 詞匯表中是有的

也就是說,為了讓token和id一一對應起來,我們需要將不存在的token添加到vocab中,網(wǎng)上查到兩種方法:

1. 利用前100里的[unused]

https://github.com/google-research/bert/issues/396

將[unused]換成自己想要添加的

具體有多少個[unused]要看自己的預訓練模型,可能100個,可能1000個,但都有限

2. 利用transformers庫里有個 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) # 會改變原來embedding weight 嗎? 不會
ipdb.set_trace()

這種方法,因為是添加token,需要修改embedding matrix

不知道它這個resize matrix會不會打擾預訓練的embeddings? 經(jīng)測,不會

感覺兩種都行,待測

也有可能都沒必要,Bert可能能夠?qū)W會新的組合詞匯

個性簽名:時間會解決一切

總結(jié)

以上是生活随笔為你收集整理的Pytorch tokenizer使用及补充vocab词汇表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。