關於transformers庫中不同模型的Tokenizer
不同PLM原始論文和transformers庫中資料的組織格式。其實,像Roberta,XLM等模型的中
,
是可以等價於Bert中的
[CLS], [SEP]
的,只不過不同作者的習慣不同。
Bert
單句:
[CLS] A [SEP]
句對:
[CLS] A [SEP] A [SEP]
Roberta
單句:
A
句對:
A B
Albert
單句:
[CLS] A [SEP]
句對:
[CLS] A [SEP] B [SEP]
XLNet
單句:
[A]
句對:
A
XLM
單句:
A
句對:
A B
XLM-Roberta
單句:
A
句對:
A B
Bart
單句:
A
句對:
A B
關於transformers庫中RobertaTokenizer和BertTokenizer的不同
我們注意到,transformers庫中RobertaTokenizer需要同時讀取
vocab_file
和
merges_file
兩個檔案,不同於BertTokenizer只需要讀取
vocab_file
一個詞檔案。主要原因是兩種模型採用的編碼不同:
Bert採用的是
字元級別的BPE編碼
,直接生成詞表檔案,官方詞表中包含3w左右的單詞,每個單詞在詞表中的位置即對應Embedding中的索引,Bert預留了100個
[unused]
位置,便於使用者將自己資料中重要的token手動新增到詞表中。
Roberta採用的是
byte級別的BPE編碼
,官方詞表包含5w多的byte級別的token。
merges。txt
中儲存了所有的token,而
vocab。json
則是一個byte到索引的對映,通常頻率越高的byte索引越小。所以轉換的過程是,
先將輸入的所有tokens轉化為merges.txt中對應的byte,再透過vocab.json中的字典進行byte到索引的轉化
。
對於Roberta,比如輸入的文字是
What‘s up with the tokenizer?
首先使用
merges。txt
轉化為對應的Byte(類似於標準化的過程)
[’What‘, “’s”, ‘Ġup’, ‘Ġwith’, ‘Ġthe’, ‘Ġtoken’, ‘izer’, ‘?’]
再透過
vocab。json
檔案儲存的對映轉化為對應的索引
[ ‘What’, “‘s”, ’Ġup‘, ’Ġwith‘, ’Ġthe‘, ’Ġtoken‘, ’izer‘, ’?‘]
—— becomes ——
[ 2061, 338, 510, 351, 262, 11241, 7509, 30]
由於RobertaTokenizer是繼承自GPT2Tokenizer的,所以GPT2Tokenizer也是相似的過程。
由於中文的特殊性不太適合採用byte級別的編碼,所以大部分開源的中文Roberta預訓練模型仍然採用的是單字詞表,所以直接使用BertTokenizer讀取即可,
不需要使用
RobertaTokenizer
。
參考
關於RobertaTokenizer中的vocab。json和merge file