Googleが公開した自然言語処理の最新技術、BERTとは何者なのか

2019年2月に自然言語処理のトップカンファレンス「NAACL-HLT 2019」の採択論文が発表されました。採択された論文の中には、昨年一世を風靡した「BERT」の提案論文が含まれています。2019年も引き続き、BERTを用いた精度向上が多く報告されるのではないでしょうか。本記事ではそんな「BERT」について、重要なポイントに絞って解説を行います。

論文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

自然言語処理の抱える問題

感情分析やチャットボットなど、テキストを扱う上で自然言語処理の技術は欠かせません。インターネットが身近になった今、自然言語で記述されたデータは大量に手に入れることができます。一方で、こうしたタスクのために整備されたデータセットはなかなか手に入れることができません。例えば感情分析を行うためには、テキストごとに「肯定的」「否定的」といったラベルが付与されたデータセットが必要になります。このようなデータセットは作成に多大なコストを要するため、簡単に手に入らないのが現状です。

データセットが不足しているという問題を解決するために、自然言語処理では簡単に手に入るラベルの付与されていないテキストを活用する方法について研究されています。wikipediaやSNSといったデータに含まれる知識を事前に学習(事前学習)することで、データセットの不足を補おうという発想です。BERTはこうした事前学習の延長として存在しており、様々なタスクにおいて大きな精度の向上に寄与したと報告されています。

BERTとは何か

ひとことで言えば、BERTは様々な自然言語処理に対して汎用的に使える分散表現を計算する機構です。

ラベルなどが付与されていないテキストデータから言語知識を獲得し、これを埋め込んだ単語分散表現を計算することができます。BERTによって計算された分散表現には事前に学習した知識が詰め込まれているため、タスクを解く際の手がかりが豊富となりタスクの精度向上に繋がります。

単語分散表現とは、自然言語における単語をベクトルとして表現したものです。ベクトルは空間の点として表現されるため、意味や用法が近い単語同士を近く配置するなどの工夫をすることで、学習器の言語理解を助けることができます。BERTは分散表現をうまく配置してくれる(分散表現の獲得)ため、学習器は効率的にタスクを解くことができるようになります。

一般にニューラルネットワークを用いた自然言語処理では、タスクを解くための学習器(モデル)に単語列を入力します。より具体的には、文に含まれる各単語に対応する分散表現の列を入力します。入力に対してモデルは計算を行い、タスクに応じた結果を出力します。例えば感情分析タスクであれば、入力された文が「肯定的」「否定的」のどちらであるかという結果が出力されます。

一方、BERTでは、入力となる単語の分散表現を「より情報を含んだもの」に変換する処理を行います。上図は一般的な感情分析のタスクにBERTを用いる例を示しています。従来のモデルに直接単語列を入力することもできますが、BERTを挟むことで分散表現が豊かになり、モデルが肯定・否定の分類を行う精度も向上します。

BERTは何がすごいのか

BERTはこれまで用いられてきた自然言語処理タスクを解くモデルに直接接続できる、汎用的な分散表現計算機構として評価されています。後述する2つのタスクを用いて分散表現を獲得することで、BERTは学習器のタスクにおける精度を大幅に向上させることができます。BERTは既存のモデルそのものを改良しなくとも、ただ前に接続するだけで精度が向上するという点で「すごい」と評価されています。

また、汎用的な分散表現計算機構として、2017年ごろに話題となったELMoの流れを汲んでいる点も評価ポイントです。ELMoはLSTMを用いた機構でしたが、BERTはさらに表現力の強いTransformerを用いている点で、この上位互換と言えます。ELMoの流行に乗った上で、ELMoを凌ぐ精度向上に貢献した点が研究として「すごい」ところと言えます。

さらにGoogleは様々な言語においてBERTによって学習済みの分散表現を公開しており、誰でも簡単に強力な分散表現を利用することができるようにしています。Googleの持つ大規模な計算機により獲得された分散表現は、多くのタスクで精度の向上に貢献します。こうした重要なデータを誰でも使えるように整備した点についても大いに評価されています。

BERTへの入力と出力

BERTの入力は単語分散表現の列で、出力も単語分散表現の列となります。直感的には、入力された単語分散表現の列に文の情報を詰め込んで出力する機構と解釈することができます。

具体的な入力は上の画像の通りとなっています。画像においてToken Embeddingsとは、「my」や「dog」という各単語に対応したベクトル(分散表現)を表しています。Segment Embeddingsは二つの文を入力するときに、その単語がどちらの文に含まれているかを判別するための分散表現です。また、Position Embeddingsは単語が入力の中で何番目に現れているかを示す分散表現です。

例えば「my」という単語であれば

  1. 「my」に対応した個別の分散表現
  2. 入力のうち1文目に含まれていることを表す分散表現
  3. 入力のうち1番目(0番始まりに注意)に現れる単語であることを表す分散表現

の和が、入力として用いられます。これを入力に含まれる全ての単語について計算し、BERTへと入力されます。なお、[CLS]は文の分類問題に用いるための特殊なトークン、[SEP]は文末を示す特殊なトークンです。また、「##ing」は「-ing」で終わる単語の接尾辞を表しています。

BERTの出力は、入力された各単語分散表現と同じ数の分散表現です。例えば「my」という単語であれば、その単語が文の中でどのような働きをしているか、といった情報が付与された分散表現が出力されます。また、分類問題のように入力が一つのベクトルで良い場合には[CLS]に対応する出力を用いることができます。

BERTはどのように実現するのか

前述で述べたとおり、BERTでは文や単語をベクトル、すなわち分散表現として表現し、分散表現に多くの情報を詰め込むことで、ニューラルネットワークはタスクを効率的に解くことができます。

分散表現を豊かにするために、BERTでは二つのタスクを学習しています。感覚的には「問題を解く前にたくさん本を読むと、テストの点数が上がる」というのが近いでしょう。ここでいう「問題」はラベル付きのデータで学習するタスク、「本」はラベルが付与されていない簡単に手に入る自然言語データです。機械学習では「本を読む」ためにタスクを設定してあげる必要があり、BERTでは「穴埋めクイズ」と「隣接文クイズ」を用いています。「穴埋めクイズ」と「隣接文クイズ」の二つを、最新のフレームワーク「Transformer」を用いて学習することで、この情報を分散表現に詰め込むことに成功しました。

穴埋めクイズ

入力文のうちいくつかの単語を隠し、文脈からその単語を当てるタスクを学習します。具体的には以下のように、入力文がランダムに[MASK]という単語に置き換えられたり、全く別の単語に置換されたりします。

  • my dog is hairy → my dog is [MASK]
  • my dog is hairy → my dog is apple

このように置換された単語を周りの文脈から当てるタスクを解くことで、単語に対応する文脈情報を学習します。

よく似た分散表現の獲得方法として、word2vecやauto-encoderと言った技術があります。これらは文に含まれる全ての単語に対して復元を行いますが、BERTでは置換した単語のみを復元すると言う点で異なっています。

隣接文クイズ

穴埋めクイズでは単語の分散表現に文脈情報を詰め込むことができますが、文そのものについての学習はできません。そこで、2つの入力文に対して「その2文が隣り合っているか」を当てるタスクを学習することで、この問題を解決します。隣接文クイズの入力と出力の例は以下の通りです。

  • [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP] → isNext
    男は[MASK]店に行った。彼は1ガロン[MASK]牛乳を購入した。
  • [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP] → notNext
    男は店に[MASK]。ペンギン[MASK]は飛べない鳥である。

このタスクは入力に対して「2文が隣り合っている(isNext)」、「2文が隣り合っていない(notNext)」のどちらを選択する分類タスクのため、分類のために用いる[CLS]トークンが必要です。また、二つの文を入力するために文の境界を表す[SEP]トークンを使用しています。隣接文クイズは穴埋めクイズと同時に解くため、[MASK]などによる単語の置換が行われていることに注意してください。なお、##lessは「-less」で終わる単語の接尾辞を表しています。

これらの入力文に対して、隣接しているか・していないかを当てるタスクを解くことで、BERTは単語だけでなく文全体の表現についても学習することができます。

タスクでの評価

論文の実験ではGLUE Datasetsを用いた手法の評価を行なっています。GLUEでは様々な自然言語処理タスクについて自動評価を行なっており、テストデータの正解ラベルを公開していないという点において非常に信頼度の高いベンチマークとなっています。

上図は論文にて報告されている実験の数値です。提案手法であるBERTには、BASEとLARGEの二種類が掲載されています。BASEとLARGEが用意されており、LARGEはBASEよりもパラメータ数が多いモデルとなっています。表の通り、全てのデータセットにおいて既存手法よりもBERT_BASEが精度が高く、さらにそれをLARGEモデルが凌いでいます。実験結果より、BERTが様々なタスクにおいて汎用的かつ優秀な分散表現計算機構であることが示されました。

実験で使用されているタスクの説明は以下の通りです。全て入力を分散表現に変換し、分類するタスクとなっています。

  • MNLI:含意関係の分類タスク
  • QQP:質問内容が同じであるかを分類するタスク
  • QNLI:質問と文が与えられ、文が質問の答えになるかを当てる分類タスク
  • SST-2:映画のレビューに対する感情分析タスク
  • CoLA:文の文法性判断を行う分類タスク
  • STS-B:2文の類似度を5段階で評価する分類タスク
  • MRPC:ニュースに含まれる2文の意味が等しいかを当てる分類タスク
  • RTE:小規模な含意関係の分類タスク

まとめ

自然言語処理の研究者だけでなく、馴染みのない人にまで名前が知れ渡っているBERTについて重要なポイントを説明しました。BERTはタスクを学習する前の事前学習によて自然言語処理の精度向上に貢献しています。事前学習には「穴埋めクイズ」と「隣接文クイズ」が用いられ、これにより分散表現がタスクを解くために有効なものとなります。BERTの学習には時間がかかるという難点がありますが、学習済みデータが配布されているので「とりあえず使ってみる」環境はすでに出来ています。お手元の学習モデルに、「とりあえずBERTをくっつけてみて」はいかがでしょうか。

BERTに続け、バイドゥが発表した中国語における問題に対処したERNIEとは?