ichou1のブログ

主に音声認識、時々、データ分析のことを書く

BERTメモ(日本語pretrainedモデル)

BERTのPre-trainedモデルに関するメモ。

本家。日本語だけでなく、104言語に対応。
GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT
multi_cased_L-12_H-768_A-12.zip

BERT-Base, Multilingual Cased (New, recommended): 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters

vocab.txt
[PAD]
[unused1]
[unused2]
(snip)
[unused99]
[UNK]
[CLS]
[SEP]
[MASK]
<S>
<T>
!
"
(snip)
〜
〝
ぁ
あ
ぃ
い
(snip)
である
League
(snip)
##ec
može
であった
století
tidligere
(snip)

全部で「119,547」行
上から順に辞書として登録した場合、特殊TokenのIndexは以下のとおり。

[PAD] : 0
[UNK] : 101
[CLS] : 102
[SEP] : 103
[MASK] : 104


「keras-bert」での特殊Tokenの定義

def get_base_dict():
    """Get basic dictionary containing special tokens."""
    return {
        TOKEN_PAD: 0,
        TOKEN_UNK: 1,
        TOKEN_CLS: 2,
        TOKEN_SEP: 3,
        TOKEN_MASK: 4,
    }


公開されている日本語特化モデルがどう作られているか見てみる。

形態素解析(Juman)

BERT日本語Pretrainedモデル - KUROHASHI-KAWAHARA LAB

入力テキスト: 日本語Wikipedia全て (約1,800万文, 半角を全角に正規化)
入力テキストにJuman++ で形態素解析を行い、さらにBPEを適用しsubwordに分割
語彙数: 32,000 (形態素、subwordを含む)
max_seq_length: 128

vocab.txt
[PAD]
[UNK]
[CLS]
[SEP]
[MASK]
の
、
。
に
は
(snip)
かんする
##キングス
フィンガー
閃
論点
インディオ
スカンジナ
##紀子
1667
好調な

全部で「32,006」行(46行目に空白行あり?)
上から順に辞書として登録した場合、特殊TokenのIndexは以下のとおり。

[PAD] : 0
[UNK] : 1
[CLS] : 2
[SEP] : 3
[MASK] : 4



sentencepiece(hottoSNS-BERT)

GitHub - hottolink/hottoSNS-bert: hottoSNS-BERT: 大規模SNSコーパスによる文分散表現モデル

ツイートは、2017年〜2018年に投稿されたツイートの一部を抽出
文字フィルタ:ReTweet記号(RT)・省略記号(...)の除外
ツイートの場合、1文で表されることが多いため、(中略)、MLMのみを事前学習として採用
短すぎる・少なすぎるツイートを除外
vocab_size: 32,000
max_seq_len: 64

sentencepieceに関する設定

character_coverage: 0.9995
model_type: unigram
add_dummy_prefix: FALSE
user_defined_symbols: <url>,<mention>
control_symbols: [CLS],[SEP],[MASK]
Nomalize: NFKC

「vocab.txt」にあたる「tokenizer_spm_32K.vocab.to.bert」の詳細は未確認(取得には登録が必要)
説明から、特殊Tokenのindexの振り方は以下と思われる。

[PAD] : 0
[UNK] : 1



sentencepiece(BERT 日本語Wikipedia

GitHub - yoheikikuta/bert-japanese: BERT with SentencePiece for Japanese text.
https://drive.google.com/drive/folders/1Zsm9DD40lrUVu6iAnIuTH2ODIkh-WM-O?usp=sharing

Training data is the Japanese wikipedia corpus from Wikimedia Downloads.
vocab_size: 32,000
max_seq_length: 512

wiki-ja.vocab
<unk>	0
<s>	0
</s>	0
[PAD]	0
[CLS]	0
[SEP]	0
[MASK]	0
、	-3.00936
。	-3.28261
▁	-3.52378
の	-3.65896
(snip)
胱	-20.5619
齬	-20.5619

sentencepieceに関する設定(config.iniより抜粋

[SENTENCEPIECE]
PREFIX = /work/model/wiki-ja
VOCABSIZE = 32000
CTLSYMBOLS = [PAD],[CLS],[SEP],[MASK]

「vocab.txt」は全部で「32,000」行
上から順に辞書として登録した場合、特殊TokenのIndexは以下のとおり。

<unk> : 0
<s> : 1
</s> : 2
[PAD] : 3
[CLS] : 4
[SEP] : 5
[MASK] : 6

BOS、EOSにあたる<s>と</s>については、無くてもよかったのではと思われる。

Pre-trainedモデルを使用するにあたっては、Tokenのindexを学習時と同じにする必要がある。
https://twitter.com/yohei_kikuta/status/1069754480600608768