yoheikikuta / paper-reading

Notes about papers I read (in Japanese)
156 stars 4 forks source link

[2018] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding #18

Open yoheikikuta opened 5 years ago

yoheikikuta commented 5 years ago

論文リンク

https://arxiv.org/abs/1810.04805

公開日(yyyy/mm/dd)

2018/10/11

概要

Question Answering などの supervised な自然言語処理の問題を fine-tuning based のモデルで解きたい時、これまで使われていた pre-training の手法は入力データの情報を使いきれていなかった。典型的には、モデルとしては left-to-right モデルを使うため、左から右という一方向(もしくはその逆)にしか token を読んでいけず、同時に両方向から読み込んで特徴量を作るということができていない。 この論文では、bidirectional transformer という mask なしの transformer で両方向の情報を同時に扱うようにした。ただしこれは t 番目まで token を読んで t+1 番目の token を予測するという言語モデルの学習方法は使えない。このモデルを学習するために、 Masked Language Model (MLM) という入力 token 列の一部を置き換えてそれを当てるという学習手法と、二つの sequence が連続したものか否かを当てる学習手法と、二つを提案してモデルを学習した。 pre-train したモデルで様々な supervised task を fine-tuning で解き、高い性能を発揮した。

https://github.com/google-research/bert に code と pre-trained モデルが公開されるとのこと(2018/10/27 の時点ではまだない)。

yoheikikuta commented 5 years ago

この論文を読むモチベーションから。

最近英語のテキストを扱っていて、fine-tuning based なモデルを使ってみたいという気持ちが出てきた。 とりあえずデータ集めて w2v とかを使う、というのはそこそこの結果を出すんだけど、もうちょっと文書間の関係(例えば 引用-被引用 の関係)などを陽に取り入れてモデルを学習させて結果を眺めてみたい。

そこで目に留まったのがこの論文で、タイトルがズバリだし、 Transformer も以前読んで理解しているのでちょうど良いと思って少し真面目に読んでみることにした。

yoheikikuta commented 5 years ago

まず、supervised で解きたい問題に対して、 pre-train した表現を適用するには2通りの方法がある。

yoheikikuta commented 5 years ago

fine-tuning は pre-trained model さえ提供されればとても使いやすくていいものだが、言語処理のモデルを考えるならば、従来手法は表現力がかなり制限されているものしかない、というのが著者らの主張。

その主な原因は、標準的な(LSTM などを想像すればよい)言語モデルは単方向($ t-1 \rightarrow t \rightarrow t+1 $)のみを扱うものが多いが、それはタスクによっては情報を使いきれていないということになる。 例えば、質問応答を考える場合、単方向モデルではあくまで質問文を左から順に読んでいく(もしくは右から順に読んでいく)ことになる。しかし、質問文の特徴量としてより rich なものを作るなら、両方向から読んだものを特徴量として使った方が良いだろうというのは自然な考えに思える。

ただし、両方向から使えるようにするにはモデルと学習方法に気をつける必要がある。 例えば RNN 系の Recurrent 構造を使おうとすると前述のように単方向の情報しか使えない。両方向を使いたければ例えば ELMo のように「独立に」left-to-right と right-to-left の component を作ってそれを足し合わせるみたいなことをしなければならない。 学習方法もこれまでの pre-training では t 番目まで読んで t+1 番目を予測するみたいな言語モデルを学習するものが多いので、これも両方向を使うなら「独立に」left-to-right ($ t \rightarrow t+1 $ を当てる) と right-to-left ($ t+1 \rightarrow t $ を当てる) を扱わねばならない。

この辺の事情を解決して高い性能を叩き出した、というのがこの論文の趣旨だ。

同時に両方向を扱えるモデル、という部分では Bidirectional Transformer を使用している。これは token 列を一気に渡すモデルなので Recurrent 構造を持たせずに扱える。 OpenAI GPT で left-to-right の transformer を使っているので、これを right-to-left の情報も使えるように素直に拡張しましょうという感じ。

学習方法をどうするか、という部分では二つの手法を併用している。 まず sentence 内に現れる token の特徴量を学習するという意味で、入力 sentence 中の token を ランダムにマスクしてそのマスクされた単語を当てるように予測する。 さらに sentence 間の関係も考慮するために、 sentence を二つ concat して、それらが適切に連続的な sentence か、(適当に持ってきた sequence をつなげていて)連続的でないか、の binary classification を解く。 ここは本題なのであとで詳しく見る。

yoheikikuta commented 5 years ago

何個かモデルが出てきたので、論文に出てきた図を使って視覚的に違いを明らかにしておく。 $ E_i $ が i 番目の token を embed したものになっていて、 $ T_i $ は i 番目の token の特徴量をその後何かしらの pre-training するタスクという形で書いている(例えば i 番目の単語を当てるというのを各 token でやるみたいな)。

真ん中の OpenAI GPT は left-to-right の Transformer を使っていて、次の単語を当てるという言語モデルの pre-training をした後に fine-tuning で固有のタスクを解くものになっている。 元の Transformer から考えるとこの図に少し違和感がある。E に関しては positonal encodeing も加えた後になっていそう。そうすると Trm が元論文で言うところの Encoder 部分になっていると思うが、書き方としては別個に Trm があるというより横串でまとめて Trm という書き方が正しいと思うのだが。自分の理解では、 left-to-right の構造として self-attention で未来の情報を mask している、ということをわかりやすく表現するために敢えてこのように描いているのだと思う。

右の ELMo は left-to-right と right-to-left を独立に作り、それぞれ独立に次の単語を当てるという言語モデルの pre-training をした後に、ここから抽出される特徴量を固有のタスクを解くモデルの特徴量と concat して使うというものになっている(ちゃんと確認してないけどそういう理解)。

一方で提案手法の BERT は両方向の情報を同時に扱う Transformer となっている。 モデルとしては mask しない Transformer を使うだけで良いと思われる。ただしこの論文はモデルの内容はあまり言及してないので、実装が公開されたら確認しよう。

yoheikikuta commented 5 years ago

モデルパラメタの詳細はそんなに興味はないが、 BASE と LARGE という二種類を考えている。 BASE は OpenAI GPT と同じくらいのパラメタ量になるようにして、結果を比較するためのもの。LARGE は最高性能狙い。前者が 110M parameters で後者が 340M parameters。

基本的には Transformer の block 数とか hidden size とか multi-head attention の head number などが主たるパラメタになっている。

yoheikikuta commented 5 years ago

pre-training の学習方法に入る前に、 BERT の input representation について理解する必要がある。 ここは結構テクニカルな感じだ。まずは図を貼っておく。

まずは Input から。 先頭に [CLS] という特別な token が入っている。こいつの特徴量は、のちに classification の問題を解くときに入力列の特徴を aggregate した特徴量として使われることになる。つまりこの token に対応する output の特徴量を softmax とかにかけて分類問題を解くことになる。 ついで、二つの sentence を同時に扱うような構造になっている。これは sentence のペアを入力とした分類問題や QA で Question と Paragraph を同時に入力できるようにするためのものである。間の [SEP] によって二つの sequence が別れている。一つの sequence のみを扱う場合には間の [SEP] なしで入力すればよい。 sentence というのがどのレベルなのかというのは少し confusing だが、これは扱う問題によるもので、sentence という言葉からは離れた方が理解しやすいかもしれない。基本的には token 列に分割して最大で扱える token 数は決まっているというモデルになっている。この論文では 512 tokens までは扱えるようになっているので、例えば二つの文書を入力として何か予測したいと言う場合には、それらの token 列の合計が 512 に収まれば、それをボンと放り込んで扱えるということである。

Token Embeddings はいいだろう。この embedding を学習していくことになる。

Segment Embeddings はちょっと理解が及んでないかもしれない。自分の理解ではこれは単に一つの sentence からなる入力か二つの sentence からなる入力か、という区別のみに使うものになっている。なので、どんな入力であっても一つの sentence なら universal な embedding を足すだけで、二つの sentence なら二つの universal な embedding を足すだけ。 しかしこれは情報量として Input における間の [SEP] と同じものだと思うんだよなぁ。誰か詳しい人がいたら教えて欲しい。

Position Embeddings は Transformer において位置情報を付与するための重要な要素なので、これはそのまま使っている。と思いたいが learned positional embeddings と書いてある... Transformer の元論文では learnable なものでなかったはずだが、その後何か拡張されたのかな?まあこれは手で与えていた波数のパラメタを学習したとかその程度のものだろう、きっと。


Segment Embeddings は、sequential なモデルではなく順番の情報を positional encoding で与えてるのみなので、層を積み重ねて weight を計算して行く際に A,B のどちらの sentence の情報かということを区別するのに必要。 [SEP] の情報があっても全 token を同時に処理していくので、各 token は [SEP] の前とか後ろとかいう情報を持ち合わせておらず、その情報は陽に Embedding で追加してそれを足して使っている、というものになっている。

yoheikikuta commented 5 years ago

いよいよ本題の Pre-training でどんな問題を解くか、という話に入る。

一つ目が Masked Language Model (MLM) というものだ。 手順としては以下のようになる。

これによってネットワークのパラメタと token の embedding も学習されていくことになる。 置き換えたものを復元するという学習によってコンテキストを保ったまま分散表現を学習していくことができる。何にも置き換えないのは実際に観測される token への bias を加えていることになり、ランダムな置き換えは正則化的に効いているだろう(ランダムの割合が多すぎると元データの分布を壊しかねないが、ここでは 1.5% なので大丈夫だろうという話)。

yoheikikuta commented 5 years ago

二つ目が Next Sentence Prediction というものだ。 MLM が単語の分散表現を学習してくれたが、QA タスクなどでは setence 間の関係性も重要になる。そこを取り入れるための学習方法で、MLM の後(?)にこれを使ってさらに学習するものと思われる。

ある sentence に対して、適切に続く sentence を 50% 持ってきて、適当に選んだ sentence 50% を持ってきて、それらに対して [CLS] ラベルとしてそれぞれ IsNext と NotNext を付与して binary classification を解くというだけである。 適切に続くかどうかというのは corpus として sequential に sentence を保持しているものなら簡単に判断することができる。

実にシンプルでもう少し改良の余地もありそうだが、これを使って sentence 間の関係性も考慮するようにモデルを学習している。

yoheikikuta commented 5 years ago

学習の非効率性というのは BERT が抱える一つの課題だ。 MLM では入力 token 列のうち 15% しか目的関数に寄与しないので、各 token 毎に言語モデルを学習していける left-to-right モデルなどと比べると非効率である。 実際、学習は BASE モデルで 64 TPU days で LARGE モデルで 256 TPU days 掛かっているとのこと。 データとしては BooksCorpus と English Wikipedia を使っていて、tokenize は WordPiece tokenization を使っている。

straightfoward な話としてはこの辺の学習効率性を高める論文なども出てくるだろう。

ただ BERT は fine-tuning 推しなので、pre-trained model が share されれば、実用上はこの辺りは気にしなくて済むだろう。

yoheikikuta commented 5 years ago

pre-training が終わった後にどのように supervised で fine-tuning するか、という話をする。 単に supervised task を解けばよいだけだが、モデルの形が少し特殊なのでどこの出力を使うかなどは少し気をつける必要がある。

ただこの論文ではご丁寧にいくつかのタスクの場合の例を書いていてくれているので、これを見ればすぐに理解できるだろう。 タスクに応じて使う出力と使わない出力がまちまちであることが分かる。 特に、既出の話題だが、classification を解く際には [CLS] token の出力特徴量のみを使うようになっている。

yoheikikuta commented 5 years ago

あとは実験結果。 この論文は結構色々な実験をしている。

まずはストレートに先行研究との比較ということで GLUE のテスト。 なかなか驚きの上がりっぷりである。Transformer とか学習が難しいと思うんだけど、これはどれくらい頑張ってるんだろうか。まあめっちゃ頑張ってるんだろう。

yoheikikuta commented 5 years ago

ついで質問応答。 解く問題は以下のようなものだ。

- Input Question:
  Where do water droplets collide with ice crystals to form precipitation?
- Input Paragraph:
  ... Precipitation forms as smaller droplets coalesce via collision with 
  other rain drops or ice crystals within a cloud. ...
-  Output Answer:
  within a cloud

こちらも結果は良好。 SQuAD のみの fine-tuning でも他の手法を outperform しているが、 TriviaQA も使ってさらに fine-tuning するとより良い結果が得られている。まあ当然だろという話だが、fine-tuning 部分でもデータが多い方が良い。

その他にも Name Entity Recognition や SWAG (video captioning を切り出し、次に続く sentence のものを複数の選択肢から選ぶ。これは最初の sentence を A として選択肢の sentence を B_i として [A,B_1] , ... , [A,B_4] を作って [CLS] の出力値をスコアとして softmax する)なども解いていて、いずれも良い結果を達成している。

yoheikikuta commented 5 years ago

以降は BERT のどんな要素が重要であるかの実験をしている。重要な帰結だけ書いておく。

yoheikikuta commented 5 years ago

ということで全部読んだ。 Transformer が分かっていれば、それと Masked Language Model の組み合わせを理解すればいいので本質的な部分を理解するのはそんなに大変ではないと思う。

code と pre-trained model が https://github.com/google-research/bert で 2018/10/31 までに公開されるとのことなので、公開されたら自分が取り組んでいるタスクにも使ってみよう。