不同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 B

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