自然言語処理の「BERT」とは何か

Neil Wu
LSC PSD
Published in
7 min readNov 26, 2019

自然言語を処理している方なら必ず聞いたことのある「BERT」。初めてBERTについて勉強したところ、この様な疑問が出てきました。
- 「BERTは何のデータを入力して何ができるのか」、
- 「BERTに関する記事は何故Self-Attention層しか説明してないのか」、
- 「一見何も出来なさそうなBERTなのになぜ神格化されるのか

この様な疑問を答える為、今日はBERTの細かい構造と数学を無視して大まかにBERTの役割に関して説明してみます。

BERTとは

BERTは 2018年Googleが発表した自然言語処理(NLP)モデルです。発表した論文の名前は「 “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”.」で、Self-Attentionで使ったTransformer構造を持つ自然言語処理モデルです。
*Self-Attention層に関してはこの記事をご覧ください。

名詞の再定義に定評のあるグーグルさん

BERTのNLP役割

論文の名前でも言った様に、BERTは「Pre-training of Deep Bidirectional Transformer」、即ちFine-tuning用に事前学習させたモデルで、予測モデルではありません。論文内で定義したTransformerはエンコーダデコーダ構造なので、Transformerの事前学習はエンコーダ部分と理解したらいいと思います。BERTはエンコーダの役割をして、エンコーディングしたデータを別途準備したタスク別デコーダに送る事で自然言語処理します。

エンコーダデコーダ構造(source)

BERTの学習法

深層学習の学習はモデルの出力学習目標(Ground Truth)との差をLossとして学習を行ってます。しかし、BERTは予測モデルではないので、一体何を目標として学習をしているのでしょう?

BERTを学習するには、BERTから出力したエンコーディングデータを「BERT Learning Model」(以後、BERTLMと略す)をいうデコーダに入力して学習させます。BERTLMはMask language modelNext sentence predictionの二つの学習目標を出力して学習を行っています。

ランダムに単語をマスクに入れ替える。

Mask language modelはランダムに単語をマスクに入れ替えてマスク単語を予測させ、それぞれの言葉の意味を学習させる方法です。まず、入力語句内のすべての単語に対し、15%の確率で単語にラベルをつけて[MASK]に入れ替えます。次に、[MASK]に入れ替えられた単語に対して、その中の10%の確率で他のランダム単語に入れ替えて、また他の10%の確率で元の単語に戻すです。BERTLMはラベリングされた単語の予測結果と元の単語でLoss Maskを計算します。

ランダムで次の単語を入れ替える。

Next sentence predictionはBERTの入力文章を語句に分け、ランダムで二句目を他の文章からの語句に入れ替え、同じ文章からの二句目かを判断する事です。BERT入力の二句目は50%の確率でランダムの他の語句に入れ替えられ、50%は元の文章の次の語句を使います。[SEP]トークンを使い入力を語句に分けて、次の語句が正しい(一句目に続く)かを{0,1}クラスでLoss Nextを計算します。

BERTLMで計算した二つのLossを加算してLoss BERTLM = Loss Mask + Loss Nextを使いBERTの学習を行います。

BERTの入力 (BERT学習時)

以上の説明により、BERTの学習には 1. 単語マスク2. 二句目予測 を行うことが必要と分かったので、入力はこの様になります。

BERT学習時の入力

Bert_Input は二句の単語をトークン化した単語で、モデルの入力サイズ(512)に合わせてパディングを付けたリストです。 Bert_Labelは15%の確率で選ばられたマスクに入れ替えられる単語の標記を表示しています。 Segment_LabelはBert_Inputに対して一句目と二句目を分別する標記です。Is_Nextは{0,1}のクラスでこの入力データの二句目は正確(元文章の一句目に続く)かを表示しています。

その中、Bert_InputとSegment_labelはBERT(エンコーダ)の入力で、Bert_LabelとIs_NextはBERTLM(デコーダ)の入力です。

BERTLMの出力

正直、説明を聞くだけで実際の出力を想像するのは難しいと思います。なので実際の出力を見てみましょう!

Next_Sentenceは二つ数値を持つサイズ2のリストです。BERTLMがBERTの出力から判断した [二句目は不正確][二句目は正確]のスコアです。

単語マスクを学習させる出力はこうなっています(書き間違い:Mask_Language_Modelです)

Mask_Language_Model は入力単語の予測リストです。Bert_Inputの全ての入力トークンに対して、そのトークンの位置をBERTに含まれているすべての単語(vocab_list)で予測したスコアです。即ち、Mask_Language_Modelのサイズは(len(Bert_Input), len(vocab_list))です。BERTで使っている単語数が長いと一つ一つ入力トークンごとの出力がすごく大きくなります。

気づき始めた方もいると思いますが、実はBERTの学習は効率がものすごく 低いことです。15%のMask確率に対して、すべての入力トークンから対して予測をしています。最後にMask_Language_ModelからBert_Labelを参考にし、不要部分を取り除いた数個のトークン予測でLossを計算しています。

結論

BERTとはBERTLMで事前トレーニングされたエンコーダです。前記の説明の様に、BERT学習は効率が低いので、自分でトレーニングする事はあまりなく、トレーニング済みのモデル(en, jp)を使う事が多いです。

BERT発表以来、研究者たちがBERTを違うデコーダに繋げる事により、自然言語処理の各コンペを制覇しました。自然言語処理の神の様な存在ですが、BERTのみでは何もできないです。BERTを理解し、BERTを祀ろう。BERTが共にあらんことを。

if you like(this_article):
please(CLAPS)
follow(LSC_PSD)
# Thanks :)

--

--