この記事の読者
キーワード・知ってると理解がしやすい
- BERT
Index
環境とライブラリ
#01 と同様の環境
実装
#02 では、BERT を稼働して、ベクトルが出力されることを確認した.
#03 では、具体的な問題に取り組む. それは、文章の穴埋めだ.
文章の穴埋め
複数の穴埋め
例えば、以下のような入力を作ったとする.
今回のように [MASK] に入る語彙の候補が 32000通りもあるので、
組み合わせの数は膨大になる.
そこで、ナイーブな方法として貪欲法がある.
しかし、BERT は、文章を前から順番に生成するような文章生成が得意ではない.
(RNN系 のような前の単語から予測するネットワークではなく、
Attention系 のような全体を見ているネットワークだからか)
貪欲法では、次の単語として予測確率(スコア)が高いものを選ぶ操作を繰り返すだけだが、 最終的な文章全体としてのスコアが、高い文章を作成する方法としてビームサーチ / Beam Searchがある.
ビームサーチ / Beam Search
ビームサーチは、[MASK] を含む文章が与えられたときに、
まず一つ目の [MASK] を (例えばスコア上位10の)トークンで置き換えた 10 の文章を作る.
そして、次は得られた 10 の文章のそれぞれに対して、次の [MASK] を、また上位 10 のトークンで置き換えた 10 の文章を作ります.
そして、次にこの 100 個の中から合計スコアの高い 10 の文章をさらに選ぶ.
その後は、この 10 の文章の次の [MASK] に対し同じ処理を繰り返す.
ビームサーチを利用した「複数の穴埋め処理」の実行のために、3 つの関数を作成.
- make_mask
- predict_mask_topk
- beam_search
メインの処理は、いくつかの文章に対し、マスクをランダムに複数作成し、
それぞれのマスキング済みの文章の穴埋めをビームサーチを用いて行う.
参考
- BERTによる自然言語処理入門
- 5 文章の穴埋め
- 5.2 BERT を用いた文章の穴埋め
- 5 文章の穴埋め