BERTの仕組み
BERTはどのような仕組みで機能しているのでしょうか。
ここからは、BERTの仕組みについて詳しく確認していきましょう。
BERTに入力するためにトークン化する
トークン
トークンとは、あるルールに則り分割された文の構成要素のことです。BERTへの入力を可能にするためには文章を単語レベルに細かく分ける必要があります。ただし、文章を細かく分けたとしてもBERTのようなニューラルネットワークに受け入れることのできる単語の総数は限られており、このときに受け入れられない単語である未知語をできる限り少なくするように工夫する必要があります。単語レベルのトークンを作るときは、MeCabやSudachi、Jumanなどの形態素解析ツールを使用します。
分散表現
分散表現とは、トークンをBERTなどのニューラル言語モデルに入力するために数値化することです。トークンのままだと文字のため、モデル内での数値計算ができません。そのため、分散表現による数値変換が必要となります。
行列表現によって表すことができ、語彙の大きさNとベクトルの次元数Dの積によって表現されます。
Word2VecというPythonのライブラリは、分散表現をするツールの代表例です。
SentencePiece
文章の分割手法の一つであり、サブワードという単位によってトークンを生成します。サブワードとは、単語をさらに分解した部分文字列であり、特に未知語に値する可能性の高い低頻度で出現する単語に対して行われます。SentencePieceによって分けられた文章はBERTへの入力の効率を大幅に高める重要な機能となっています。
Byte Pair Encoding
SentencePieceを行う際に用いられているアルゴリズムがByte Pair Encodingです。日本語ではバイト対符号化と呼ばれ、データ圧縮のやり方の一つになります。このアルゴリズムの特性は、2つのワードを1つのワードに連結するところでありこの性質によってサブワードを統合することが可能になります。
AttentionとTransFormer Encoderについて
Multi-head Attention
まずAttentionとは、複数個ある入力の中から、どこを注目すべきか学習する仕組みである。
そしてMulti-head Attentionは、Attentionを複数回並行して実行するモジュールである。独立したAttentionの出力は次に連結され、期待される次元に線形変換される。直感的には、複数のAttentionヘッドにより、シーケンスの一部に異なるAttentionを払うことができます(例えば、長期の依存性と短時間の依存性など)。
このモジュールではscaled dot-product attentionが最もよく使われるが、原理的には他のタイプのアテンション機構に置き換えることができることに注意してください。
(出典:【論文】Attention Is All You Need )
scaled dot-product attention
(出典:【論文】Attention Is All You Need )
スケールドドットプロダクトアテンションは、ドットプロダクトがスケールダウンされたアテンション機構です。
形式的には、クエリーQ、キーK、値Vがあり、アテンションは次のように計算される。
Q,Kの内積を求め、標準化して、データフレーム中、条件に一致する場合にだけ値を変更、その後ソフトマックス関数の出力結果と、Vとの内積を求めます。
Residual Connection
Residual Connectionとは、日本語に訳すと「残差接続」といい、学習時に逆伝播しやすくするのと、前の情報を忘れないようにする目的のものです。
Residual Connectionは主に消失勾配の問題を軽減するのに役立つ。バックプロパゲーションの間、信号は活性化関数の微分によって乗算される。ReLUの場合、約半分のケースで勾配がゼロになることを意味する。Residual Connectionがなければ、バックプロパゲーション中に学習信号の大部分が失われてしまう。
Residual Connectionのもう一つの効果は、情報がTransformer層のスタックにローカルに留まることである。自己注意のメカニズムは、ネットワーク内の任意の情報の流れを可能にし、その結果、入力トークンを任意に並べ替えることができる。しかし、Residual Connectionは、元の状態が何であったかを復元させる。
(出典:Residual Connection/Papers With Code )
層正規化(Layer Nomalization)
層正規化は代表的な正規化層の1つであるバッチ正規化を改良したもので、Transformerモデルの注目により広く活用されるようになりました。
バッチ正規化とは異なり、層正規化は、隠れ層内のニューロンへの合計入力から正規化統計量を直接推定するため、正規化によって学習ケース間に新たな依存関係が生じることはない。これはRNNに有効で、いくつかの既存のRNNモデルの学習時間と汎化性能の両方を向上させることができます。
層正規化では、ある層のすべての隠れユニットが同じ正規化項と、異なる学習ケースで異なる正規化項を共有する。バッチ正規化とは異なり、層正規化はミニバッチのサイズに制約を課さないので、バッチサイズ1の純粋なオンライン領域で使用することができる。
(出典:Layer Nomalization/Papers With Code )
FFN(Feedforward Network)
FFNは日本語では「順伝播型ニューラルネットワーク」といいます。GELU関数の後に、Residual Connectionと層正規化を適用して、Encoder出力が生成されます。
(出典:Feedforward Network/Neural Networks )
フィードフォワードネットワークには次のような特徴があります。
1. パーセプトロンは層状に配置され、最初の層が入力を受け、最後の層が出力を出す。中間の層は外界との接続がないため、隠れ層と呼ばれる。
2. ある層の各パーセプトロンは、次の層のすべてのパーセプトロンとつながっている。このため、フィード・フォワード・ネットワークと呼ばれる。
3. 同じ層のパーセプトロン同士は接続されていない。
BERTの学習
BERT の学習には事前学習 とファインチューニング と呼ばれる2つの過程があります。
この事前学習 とファインチューニング について詳しく見ていきましょう。
事前学習とは?
事前学習 とは、深層学習の精度を改善する手法です。
これは、大規模な文章を用いて汎用的な言語パターンを学習するために行われます。
学習というと一般的にモデルに対して入力データとそれに対する出力の関係を人間が付与したラベル付きデータを用いて学習させるというイメージを持つ人が多いかもしれません。
しかし、BERTの事前学習で用いるデータは生の文章データのみです。
このようなラベル付けされていないデータのことをラベルなしデータといいます。
ラベルなしデータを用いるメリットは、比較的容易に大量のデータを収集できることです。
しかし、ラベルなしデータを用いる場合に、モデルに何を学習させれば良いのかということがラベル付きデータを用いた学習と比べて自明ではなく、何らかの対策が必要となります。
そこでBERTではMasked Language Model とNext Sentence Prediction という2つの方法を組み合わせて大量の文章データから学習を行っています。
では、このMasked Language ModelとNext Sentence Predictionとはどういった方法なのか詳しく見ていきましょう。
Masked Language Model
Masked Language Model では、BERT でテキストの一部を[MASK]という別の単語で置き換えたテキストを入力します。
BERT は、ある単語を周りの単語から予測するというタスクを用いて、単語の入出力関係を学習を行っています。
例えば、「私が習っているスポーツは野球で、いつかメジャーリーグでプレイしたい。」の「野球」という単語が[MASK]で置き換えられた場合、文章中の「スポーツ」、「メジャーリーグ」、「プレイ」などの単語から[MASK]によって置き換えらえた単語が元々の「野球」でありことを予想します。」
具体的には、まずランダムに選ばれた15%のトークンを[MASK]という特殊トークンに置き換えます。そして、置き換えられた文章をBERTに入力し、[MASK]の位置に元々あったトークンを予測するというタスクを用いて学習を行います。
つまり、[MASK]に置き換えられたトークンを、[MASK]を含む文章に対するラベルとして扱うことで、その入出力関係を学習します。
Next Sentence Prediction
Next Sentence Prediction では、単語単位での学習はできますが、文単位での学習はできません。
そこで、Next Sentence Prediction という手法を用います。
Next Sentence Prediction は、2つの文章の関係性について予測するタスクです。
そのため、事前学習時にはBERT には常に2つの文のペアが入力されます。
この時、2つの文のうち、後の文が50%の確率で前の文と無関係な文に置き換えられます。
ここで、入力された2つの文が連続したものであるか、そうでないかを判定するタスクを繰り返し、学習を行います。
例えば、
「男は[MASK]店に行った。彼は500mLの[MASK]を購入した。 → IsNext(連続)
「女は店に[MASK]。猿が[MASK]から落ちた。 → NotNext(不連続)
具体的には、2つの文を[SEP]というトークンで分けます。
また、特殊トークン[CLS]に対応するBERTの出力を分類機に入力し、2つの文章が連続しているときは、IsNext、そうでなければNotNextの判定をします。
これらにより、2つの文の関係性を学習することができます。
ファインチューニングとは?
BERT の学習済みモデルは、そのまま使うことは珍しく、一般に、解きたいタスクに応じて特化するようにします。
ファインチューニング では、比較的少数のラベル付きデータを用いて、BERT を特定のタスクに特化するように学習します。
BERT で個別のタスクを解くためには、タスクの内容に応じてBERTに新しい分類機などを接続するなどして、タスクに特化したモデルを作ります。つまり、言語タスクにおいて、BERT は特徴抽出機のような働きをします。
ファインチューニング を行うときにはモデルの初期値として、事前学習で得られたパラメータを用い、新たに加えられた分類器のパラメータにはランダムな値を与えます。そして、ラベル付きデータを用いてBERT と分類器の両方のパラメータを学習します。
このように、ファインチューニングの際事前学習 で得られたパラメータを初期値として用いることで比較的少数の学習データでも高い性能のモデルを得ることができます。