機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

(論文)BERT

今日も少し前に流行ったモデルの復習。
今日はBERTに関してまとめる。

f:id:kento1109:20190428105706p:plain
https://wikiwiki.jp/animegameex/%E3%83%90%E3%83%BC%E3%83%88

これもまた既に素晴らしいまとめがあるのでそちらを参考にしながら復習した。
jalammar.github.io
towardsdatascience.com

BERTとは



「Bidirectional Encoder Representations from Transformers」の略。
BERT自体は事前学習モデルではあるが、これを利用することで様々なタスクのSOTAを達成している。

A new era of NLP」なんて言われるほど、色々なところで騒がれている。

さて、以下の内容としては

  • BERTのモデルについて
  • どうやって目的のタスクに適用するか

の2つを中心にまとめようと思う。

※きっちり内容を理解したい場合、上の2つの記事を読むことを勧める。

Transformer Encoder



BERTの「T」は、Transformersの略でもあり、モデル自体は前回まとめたTransformerモデルはベースとなっている。
Seq2Seqモデルではないので、Decoderの部分は不要であり、必要なのはEncoderの部分のみ。
論文中には、以下のハイパーパラメータから成るBERT(BASE)とBERT(LARGE)の2つの実験をしている。

BASE LARGE 元のTransformerモデル
Encoderの数 12 24 6
Headの数 12 16 8

元のTransformerと比べて、BASEでも十分にごついモデルであることが分かる。
Transformerでは、Encoderの入力は文の各単語を分散表現したものと文をPositional Encodingしたものを加えたものであった。
BERTの場合は何が異なるのか。

Inputs



特徴的なのは、単文と複文(文のペア)のどちらかを入力とすることが出来る点。

入力情報は以下の埋め込み情報の総和である。

  • token embeddings
  • segmentation embeddings
  • position embeddings

f:id:kento1109:20190428113316p:plain
https://arxiv.org/pdf/1810.04805.pdf

特徴的なのは、[CLS][SEP]というトークン。

全ての入力の先頭には、[CLS]というトークンを挿入する。
これは「classification embedding」と呼ばれ、後の分類タスクで利用される。
※分類タスク以外の場合、このトークンは無視される。

[SEP]トークンは、文の区切りを表すトークン。
先頭文を示す埋め込み表現(A embedding)、次の文を表す埋め込み表現(B embedding)を付与する。
※常に入力を単文とする場合は、A embeddingのみが用いられる。

position embeddingsは、文中の各トークンの位置情報を付与するための情報。
これは、Transformerモデルでも利用されていたPositional Encodingと同じ概念。
※実験では最大512系列までの位置情報を埋め込み表現で利用。

Pre-training Tasks



BERTは教師なし学習なので、Seq2Seqのような入力文と対になる出力は存在しない。
では、どのようにして学習を行うのか。

Feature-based Approaches

ELMOのような従来の言語モデルは、次の単語や前の単語をRNNにより学習することで、事前学習を行っていた。

f:id:kento1109:20190428124738p:plain
https://arxiv.org/pdf/1810.04805.pdf
ELMOは前向きの言語モデルと後ろ向きの言語モデルを組み合わせることで、表現力の高い言語モデルを獲得している。
※あくまで各言語モデルを組み合わせているだけで、双方向のモデルではない。

Fine-tuning Approaches

最近の転移学習のトレンド。言語モデルを事前学習し、そのモデルを本来のタスクに転移させる手法。
OpenAI GPTは、Transfomerモデルをベースにした言語モデル
言語モデルからFine-tuningで本来のタスクを解くことができる。

ELMOは前向きの言語モデルと後ろ向きの言語モデルを組み合わせている。
OpenAI GPTはあくまで前向きの言語モデルからのみ(未来の情報をマスクする)構成されている。
しかし、一般的に前向きモデルと後ろ向きモデルの連結より、双方向モデルの方が連結は密と言える。

できれば、双方向で学習したいが、言語モデルではそれが難しい。
双方向の場合、予測時に未来の情報を利用するためカンニングとなってしまう。

BERTではこの問題をうまく回避して双方向の言語モデルを実現している。

1.Masked LM

BERTでは入力情報の一部をマスクしたMasked LMを提案している。
このモデルは、次の単語や前の単語を予測するのではなく、maskされた単語のみを予測する。

実験では、系列の15%を[MASK]で置換した。
※ただし、常に[MASK]に置き換えるのではなく、以下の条件をつけた。

  • 80%は[MASK]のtokenのまま
  • 10%は[MASK]のtokenを全く別の単語に置換
  • 10%は[MASK]のtokenを元の単語に戻した

学習は従来の言語モデルと似たアプローチ。
Encoderの出力にClassificaiton Layerを追加し、各単語の確率値をsoftmaxにより計算する。
損失計算では、maskされたtokenの損失値のみを考慮して、残りのtokenは無視する。

f:id:kento1109:20190428133104p:plain
https://towardsdatascience.com/bert-explained-state-of-the-art-language-model-for-nlp-f8b21a9b6270

2.Next Sentence Prediction

BERTの入力は、複文(文のペア)の入力を許していた。
この目的としては、複文のタスク(QAタスクなど)にも利用可能なモデルを構築すること。
ただし、Masked LMだけでは、そのようなモデルは期待できない。
そこで、「Next Sentence Prediction」という学習を行う。
このタスクは非常に簡単である。
問題は「2つの文(A,B)を与えて、BはAの後に続きそうな文かどうか」を解くこと。
f:id:kento1109:20190428134957p:plain

Task specific-Models



ここまでがpre-trainedモデルとしてのBERTのモデルの説明。
では、次に気になるのが「どうやって目的のタスクに適用するか」である。

classification tasks

この場合は非常にシンプルで文の先頭に付与した[CLS]のEncode結果を入力として分類器を構築する。

f:id:kento1109:20190428140222p:plain
http://jalammar.github.io/illustrated-bert/
分類器との接続後、接続した層のパラメータとBERTのパラメータを最適化する。

Named Entity Recognition

NERの場合でも、各エンティティを分類する層をBERTの出力に追加するだけ。

最後に



全体を通して、「WordPiece」というキーワードが多く出現した。
入力は単語単位ではなく、このWordPiece単位でtoken化されているよう。
この辺りの概念がよく整理できていないので、次はこれをまとめたい。