リモート開発メインのソフトウェア開発企業のエンジニアブログです

BERTについて勉強したことまとめ (1) BERTとは? その特徴と解決しようとした問題、及び予備知識

現在、社内の機械学習を用いたプロジェクトに関わっていて、その過程で学んだBERTについて今まで勉強したことをまとめてみようと思います。

自然言語処理(以下NLP)、とくにBERT周辺の理解したことを以下何回かに分けて書いていきます。

  • BERTとは? その特徴と解決しようとした問題、及び予備知識 ←この記事
  • BERTの構造について
  • BERTの学習データ、BERTの汎用性がもたらしたもの、そして新しいモデルELECTRA

機械学習については、「なにかを入力して教師データを元に損失関数計算して、パラメータを更新して精度をよくするやつ」程度の認識があるものとします。

そもそも、既に様々な解説記事がありますが、それらは既にある程度既に詳しい人向けのものだと感じました。
完全な初心者向けとまではいかないものの、ある程度機械学習は知っていて、これからBERTを知るという人向けの記事を目指します。

BERTとは

BERTは2018年末頃にgoogleが発表した、自然言語処理における深層学習を用いた画期的なモデルです。

BERTはBidirectional Encoder Representations from Transformersの略です。

自然言語処理という分野において、いくつかのタスクがあります。(例:質疑応答、文章要約、翻訳、…)
各々のタスクを解くために、それぞれに設計されたモデルが存在していました。
しかし、BERTはその一つのモデルを用いて、たくさんの自然言語処理上のタスクで同時にSoTA(State of The Art: 簡単に言うとその時点でのハイスコア)を叩き出しました。

ここから、BERTのモデルを分析したり改善したりパラメータ数を増大させたりしたりといった、BERT派生の論文が多数出現しました。被引用数は既に5000件を超えています。

BERTの特徴

BERTが好成績を発揮する要素といえるものを挙げると以下のようになります。

  • ファインチューニングアプローチの事前学習
  • Masked LMという事前学習タスクの定義
  • 主なモデル構造はTransformerのスタック
  • 大量な文章データによる、アノテーション不要な教師あり事前学習

特に重要なのは、Masked LMです。
他の特徴も結果に貢献した要素ですが、新規性のあるものではなく、NLPとして既に有名であった要素たちを利用したものです。

ただし、上記の意味を理解するためには、予備知識がないと難しいと思われます。
以下ではその前提となる知識や概念を、BERTの背景を踏まえて説明していこうと思います。

BERTの背景を押さえる

もちろん元論文の冒頭あたりを見れば詳しいことは書いてあるのですが、論文の著者らによるredditでの投稿が、今回の実験のコンセプトや経緯を知るのにちょうどよいです。

投稿の内容を要約し、元論文も加味すると、アイデアは以下のようになります。

  • 言語モデルの改善をしたかった
    • 単方向性を解消したかった
    • 文章の関係性を学習させたかった
  • 従来のファインチューニングの方法は性能を発揮しきれてない(のでやってみた)

まずは、上記に出てくる言葉である

  • 「ファインチューニング」およびその言葉の前提にある「転移学習」
  • 「言語モデル」

について理解しないといけません。

予備知識 1: 転移学習

転移学習とは、解きたいタスクとは別のタスクを事前に学習し、その結果として得られたパラメータを用いて、解きたかったタスクを解くことです。

転移学習において、この2つのタスクの名前を、

  • 事前に行う方を文字通り「事前学習タスク(pre-training task)」
  • 解きたかったタスクの方を「下流タスク(downstream task)」

といいます。

下流タスクにパラメータを渡す方法で、転移学習は簡単に2種類に分類することができます。
渡されたパラメータを下流タスクの学習の際に固定するか、しないかです。
これらはそれぞれ、特徴量ベースのアプローチ、ファインチューニングのアプローチと呼ばれます。

予備知識 1.1: 特徴量ベースのアプローチ

事前学習で得られたパラメータを固定する場合、その事前学習をするモデルは、まるごとひとつの関数とみなせます。
例えば、その学習済みモデルに単語を入れたら何らかのベクトルが返ります。これを解きたかったタスクの入力として利用するとき、固定されたパラメータを持つモデルの部分は、特徴量抽出器の役割を果たしているとみなせます。これが特徴量ベースアプローチと言われる所以です。

予備知識 1.2: ファインチューニングのアプローチ

一方、ファインチューニング(fine-tuning 直訳すれば微調整)というのはパラメータを固定しない場合のことを指します。
固定しないということは動くわけですが、何によって動くかといえば、下流タスクの学習によってです。
すなわち、ファインチューニングにおいては、事前学習結果のパラメータを”初期値”として利用することを意味します。

場合によっては、部分的に固定したりといったバリエーションがあるようですが、BERTにおいては固定するパラメータはありません。

著者らは、とくにファインチューニングのアプローチがまだ性能を発揮しきれていないと考えたので、BERTではこちらのアプローチが使われたようです。

予備知識 2: 言語モデル

言語モデル(language model)という言葉は、私が調べた範囲でも、意味が曖昧なまま使われているように感じました。

ひとつの明確な定義が、「(確率的)言語モデルとは、与えられる単語列に対する確率分布」というものです。
なんのこっちゃと思われるかもしれませんが、そこまで難しい概念ではありません。

たとえば、以下の句点で区切られた文をご覧ください。

  • 「昔々、あるところに、おじいさん、と、おばあさん、が、いました」
  • 「が、いました、おじいさん、あるところに、おばあさん、昔々、と」

前者は普通の文ですが、後者はそれを並べ替えてぐちゃぐちゃにしたものです。
前者に対して、例えば0.9だとか、高い数字を確率として出力して、逆に後者は0に近いような低い数字を返すような関数を作れれば、それは自然言語処理において役に立つはずです。

「単語w_1からw_mが与えられた上での、それに対する確率」を数式で表すと以下のようになります。

さて、突然ですが、上の定義とは異なる確率を考えます。
「1からm番目の単語が分かっている上での、m+1番目の単語の確率分布」というものです。
数式にすると以下になります。

じつは、上に示した確率とこの確率は、一方からもう一方を求めることができます。(ベイズの公式を使って変形することで簡単に求められます)

なので、これら2つの両者を「言語モデル」と言うことがあり、これは文脈に応じて変わるので注意が必要です。

どちらかといえば、事前にm個の単語が分かっている上で、次の単語を予測する、という場面のほうが多いので、後者を指すことが多いです。

予備知識2.1: 言語モデルの単方向性

さて、後者の意味での言語モデルは、1~m番目の単語から、m+1番目の単語を予測するということですが、これは対象の単語の後ろであるm+2番目以降の後ろの単語を予測に利用できていません。

両方向の学習自体は既にELMoというモデルが発表されたりしていて、良い性能を発揮していました。
しかし、ELMoは特徴量ベースのアプローチです。

BERTが改善したのはまさにこの部分であり、前と後ろ両方向を元に中央の単語を予測するタスクを定義することで、結果に大きく貢献したということです。そのタスクこそが後に紹介するMasked LMです。

BERTにおける事前学習

以上を踏まえ、言語モデルの以下の2つの問題をおさらいします。

  • 言語モデルの改善をしたかった
    • 単方向性を解消したかった
    • 文章の関係性を学習させたかった

これを解決するために著者らが作った以下の2つの事前学習タスクを確認します。

  • Masked LM (Masked Language Model, MLMとも略されます)
  • Next Sentence Prediction(以下NSP)

特に重要になるのは前者のMasked LMです。
(論文内ではNSPはいくつかのタスクの結果に貢献していることはわかりますが、後の研究ではあまり重要でないことがわかりました。)

Masked LMのタスク内容自体はいたって単純で、
「文章中の単語を一部[MASK]という文字に置き換えて、そのマスクされた単語が何だったのかを推論する」という穴埋め問題です。

ちなみにこの穴埋め問題自体は昔から存在してCloze testといいます。
BERTは、この問題を言語モデルの学習のために用いるのが有効であると示したことと言えます。
(だからこそ、わざわざMasked LMという名前を新たにつけているわけです。)


以上が著者らによる、言語モデルに関する問題点を解消するためのアプローチの紹介、及びそれを理解するための予備知識でした。

次回は、上に挙げた特徴の続きであるモデル構造あたりについてです。

← 前の投稿

Rails の has_many through で scope を使う

次の投稿 →

24時間稼働でないKinesisストリームの運用で手こずった点

コメントを残す