見出し画像

トランスフォーマーの自己アテンションの理解②再帰による文脈伝搬

この記事ではあまり数式を使わずに、トランスフォーマー以前の言語モデル、RNN(リカレント・ニューラルネットワーク、再帰型ニューラルネットワーク)を文脈の伝搬の仕組みとして捉え解説します。RNNがLSTM(Long short-term memory、長・短期記憶)へと進化し、文脈の保存と切り捨てをコントロールできるモデルの学習が可能となりました。さらに、アテンションやエンコーダ・デコーダの概念も登場し、トランスフォーマーの仕組みを理解する役者が出揃ってきます。

では、さっそく始めましょう。


トランスフォーマー以前

2017年に発表されたトランスフォーマーは、例えば、英語の文章をフランス語へ翻訳するといったタスクを行うのですが、当時は主流だったRNN(リカレント・ニューラルネットワーク、再帰型ニューラルネットワーク)を使わない新しい手法でした。ではRNNはいつ頃から研究されたのでしょうか。

RNNの歴史は結構古く1980年代頃から始まっています。特にディープラーニングが活躍するようになってから、翻訳などでは特にLSTMが活躍しました。なぜならLSTMでは文脈を伝える機能が強まったからです。その上、エンコーダ・デコーダアテンション(注意)機構などトランスフォーマーにも見られるような概念・仕組みがすでに使われていました。

しかし、トランスフォーマーはRNNやLSTMで中核となっていたリカレント(再帰型)の処理を必要としません。アテンションだけで文章から文脈を汲み取った判断ができるようになり、より正確な翻訳が可能となったのです。

でも、まだこの話をするのは早すぎます。まずは、RNNの基本的な仕組みを紹介します。そして、リカレントな仕組みの問題点を見ていきましょう。

リカレント(再帰)とは

仮に以下のような文章があったとします。

犬が歩いていると猫と出会いました。

これをトークン化して、以下のように分断されたとします。

$$
\begin{align*}
x_1 &= 犬 \\
x_2 &= が \\
x_3 &= 歩い \\
x_4 &= て \\
x_5 &= いる \\
x_6 &= と \\
x_7 &= 猫 \\
x_8 &= と \\
x_9 &= 出 \\
x_{10} &= 会い \\
x_{11} &= まし \\
x_{12} &= た \\
x_{13} &= 。
\end{align*}
$$

さらに、各トークンは分散表現(埋め込み)によってベクトル化されるとします。

$$
x_1 = 犬 = [-1.1307, -2.3229, 0.8837, ..., 0.0674, -0.8877]
$$

以上により、文章をベクトル化されたトークンが流れる時系列として見ることができます。この$${x_1, x_2, …, x_n}$$をRNNに一つずつ入力していきます。

まず、$${x_1}}$$を入力します。$${h_0}$$は隠れ状態の初期値で全てがゼロのベクトルです。入力データ$${x_1}$$と隠れ状態の初期値$${h_0}$$を受け取ったRNNは隠れ状態$${h_1}$$を出力します。

ステップ1

RNNの中身はニューラルネットワークですが、ここでは詳細は省きます。要点は、RNNは隠れ状態の中に文脈(それまでの文章からの情報)を取り込んでいることです。

ちなみに、隠れ状態という言葉には直接には観察できない潜在する情報・状態といった意味合いがあります。つまり言語処理では文脈と呼ぶものに相当します。

次に入力値$${x_2}$$を入力する際に、直前の隠れ状態$${h_2}}$$、つまりは文脈も入力します。RNNは文脈を更新して次へと伝播していく文脈を出力します。

ステップ2

この二つ入力の図をつなげると以下のようになります。

ステップ1とステップ2

これを続けていくと数珠つなぎ状に文脈が更新されていきます。

文脈の伝播

この図を再帰する構造としてまとめると以下のようになります。

出力された文脈が次のステップの入力になる

RNNもLSTMもこの再帰の構造を利用して文脈を伝えていきます。

この結果、文脈の時系列が出来上がります。

文脈の時系列

この文脈をどう使うのかというと、最終的な隠れ状態$${h_n}$$を使って文章の分類(肯定的、否定的、楽しい、悲しい、など)を行ったり、翻訳をするための特徴量として使ったりします。

こうして見ていくと、RNNの文脈の抽出方法は、トークンをいくつかまとめるだけのバイグラムやn-gramの手法より洗練されているのが分かります。なぜなら、RNNはニューラルネットワークなのでどのように分散表現ベクトルを重ね合わせる最適な特徴量となるかを学習できるからです。

時系列データであれば、RNNを利用できるので、例えば入力データが株価関連のデータならば、隠れ状態から将来の株価の予測を出力するなんてことも考えられます。

時系列に沿って将来の株価の予測

また、入力データが音声ならば、RNNを使って音声認識をしたりすることも可能でしょう。このように、さまざまな時系列データにRNNを応用することができます。

ただし、ここでは文章の処理の話に絞っていきましょう。文章を読むときに順番に言葉を追っていくので時系列として扱うのは自然に思えます。

しかし、文脈って一方通行でしたっけ?

株価予測や音声認識だったら入力データを一方通行の時系列として扱うのは分かります。でも、文章の意味をつかむ際に、ある程度読み進めた上で、後から逆に辿って前に読んだ言葉の意味が深まることも多々あります。一方通行な文脈の処理だけではなく、双方向からの文脈の流れが必要ではないでしょうか。

双方向RNN

Wikipediaによると双方向RNN(BiRNN、Bidirectional RNN)は1997年に開発されました。通常のRNNとは逆方向、つまり時間を遡るように隠れ状態を生成していきます。

逆方向の文脈の流れ

よって双方向の文脈の流れを組み合わせることでさらに豊富な文脈の特徴量として活かすことができます。

双方向の文脈を結合

まとめると、入力データ$${x_t}$$から双方向の文脈を活かした隠れ状態$${f_t}$$が生成されます。

双方向RNN

こうして得られた情報をさらに豊かにする方法として次に見る階層を増やす手法が考えられました。

階層を増やす

文脈の情報をより豊かに取り組むためにRNN階層を増やす手法があります。これは、RNNを通して得られた隠れ状態を入力データとしてさらに別のRNNを通すことでより複雑な特徴量を得ます。ニューラルネットワークで層を増やしていくのと同様の考え方になります。

多層のRNN

実は、トランスフォーマーでも同様に多階層の仕組みを使っています。ただし、文脈を抽出するのに、RNNを使いません。そこは後で見るアテンションの概念(だけ)を使います。

RNNは双方向や多層化によって、より性能が上がってきました。しかし、RNNの再帰の構造には問題があります。それは、近隣の文脈を伝えことはできるのですが、遠方のトークン同士の関係の情報はどんどん小さくなってしまうことです。

再帰の問題

RNNの中身はニューラルネットワークです。それが再帰の構造により何度も繰り返し現在のステップからのデータと前のステップからの隠れ状態を受け入れて計算を行います。

出力された文脈が次のステップの入力になる

ニューラルネットワークには重みとバイアス(weights and biases)といったパラメータ値があります。RNNは入力値に重みを掛け合わせ、バイアスを足し合わせた後、活性化関数(Activation Function)を適用して値を調整します。

これらの計算を繰り返すことで、いくつかのステップをこなした頃には最初の頃の隠れ状態の影響はほとんどなくなってしまいます。つまり、遠くの文脈はどんどん忘れ去られてしまうのです。

なぜ、そうなるのでしょうか。RNNは再帰の仕組みを使うため、時間軸(文章の流れ)に沿って誤差逆伝播法(Backpropagation)を行う必要があります。これを通時的誤差逆伝播法あるいはBPTT(back-propagation through-time)と呼びます。BPTTは、長いシーケンスを扱う際に、どうしても勾配が小さくなっていく問題がありました。勾配とはパラメータ値(ネットワークの重みやバイアス)をどの程度調節するべきかを教えてくれるものですが、これが小さくなることで学習が困難になります。

勾配が0に近づくとニューラルネットワークのパラメータを更新する際にほとんど変更することができなくなり、学習に時間がかかり過ぎたり、学習が全然できなくなったりします。これを勾配消失の問題と呼びます。勾配消失は、長い文章での学習を難しいものとしていました。

まとめると、RNNの最大の利点は、順番に並んだトークンを処理しながら、隠れ状態を継続的に持ち続けることで、離れたトークン間での関係も言語モデルの計算に含めることができる点でしたが、この再帰の構造自体が、文脈を長く伝えることができない原因にもなっていました。

それを解決する方法としてLSTMが登場します。

LSTM

LSTM(Long Short-Term Memory)の研究は1990年代にはすでに始まっていました。やがて、大量のデータをGPUを駆使して扱うディープラーニングが登場し、LSTMの実用性が高まりました。

LSTMは元来のRNNが持っていた勾配消失の問題を改善して、よりも長いシーケンスを扱うことができました。また、詳細は省きますが、LSTMセルでは、以前の状態をどのくらい次へと引き継いでいくかなどをニューラルネットワークが判断できるように学習が行われます。よって、文脈の伝達を文章の流れによってコントロールできるわけです。

LSTMセル

図の理解についてはこちらの記事で解説しています。詳しい計算の説明はこちらの記事にあります。

LSTMの成功は文脈を単純なRNNよりも長きにわたって伝達することが可能になったことによります。

しかし、勾配消失の問題は完全に解決されたわけではありません。

ここで強調したいのはLSTMは単純なRNNよりは、勾配消失の問題を緩和しているものの完全に解決したわけではありません。勾配消失は再帰の構造自体が原因なので完全には防げないのです。

したがって再帰による文脈伝播の仕組みは近接するトークンならば有効ですが、離れたトークン同士では効果的ではありません。

これらの問題はトランスフォーマーの自己アテンションの仕組みが解決しています。なぜなら、トランスフォーマーでは再帰の構造自体がなく、トークン同士の関係を遠近に関係なく直接に抽出していくからです。

エンコーダ・デコーダ

それでも、トランスフォーマー以前はLSTMはかなりの成功を収めていました。

Wikipediaによると2016年頃にはAmazon、Apple、Facebook、Google、Microsoftなどが翻訳や音声認識でLSTMを使っていたそうです。自然言語処理などのシーケンス関連のAIではLSTMが主流となりました。

また、トランスフォーマーにも見られるエンコーダ・デコーダのアーキテクチャやアテンションの仕組みもすでに導入されていました。

まず、エンコーダ・デコーダを簡単に説明します。

機械翻訳を行う際に、日本語の入力文章をエンコーダを通すことでその特徴量を取り出します。そこには、翻訳をするために必要な文脈や単語の意味などが抽出されています。これをデコーダを通すことで、ターゲットの言語(例えば、フランス語)の文章へと変換します。

エンコーダ・デコーダ

エンコーダ・デコーダはおのおのがシーケンスを持つのでシーケンスからシーケンスと言う意味でSequence to sequence ( Seq2Seq )とも呼ばれます。

要するに、ここでのエンコーダとデコーダは両方ともRNNやLSTMによる再帰を使って文章内のトークン(埋め込みされたもの)を順番に処理して文脈を吸い上げていき隠れ状態を出力します。デコーダは隠れ状態から出力するトークンを出力層のニューラルネットワークで計算しています。

エンコーダ・デコーダ中身

この仕組みによって、エンコーダに入力するシーケンスの長さとデコーダが出力するシーケンスの長さは同じである必要がないので翻訳を行う言語モデルで使われました。もちろん双方向や多階層の構造を使うことも可能です。

2017年に論文が発表されたトランスフォーマーは翻訳のモデルである、エンコーダ・デコーダの仕組みが使われています。

アテンション

アテンションを使うと、どのトークンがどの他のトークンと関係が深いのかなどを知ることができます。つまり、あるトークンがどのトークンを注目(アテンション)するべきかがわかります。

RNNやLSTMを使ったエンコーダ・デコーダの仕組みにおけるアテンションの計算は、エンコーダが入力文章の各トークンから抽出した隠れ状態とデコーダが出力文章のために生成した隠れ状態の間での関係を知るためのものでした。

まず、エンコーダから隠れ状態は各トークンの特徴と文脈を含んでいます。

エンコーダからの各トークンの隠れ状態

この各隠れ状態に対し、デコーダからの隠れ状態との関係度を計算します。下図ではエンコーダからの各隠れ状態$${h_1, h_2, …, h_{n-1}, h_n}$$とデコーダの隠れ状態$${g_j}$$との関係をニューラルネットワーク(関連論文)やベクトルの内積関連論文)などを使って計算します。

ここでは内積を使ってアテンションを計算すると想定しています。その方が後にトランスフォーマーのアテンションとの比較がしやすくなります。また、内積の効果については後の記事で深掘りして解説しますが、ここでは内積の値が大きいほどトークン同士の関係が強いのがわかることだけ理解してください。

エンコーダとデコーダ間のアテンション

内積の結果は正負さまざまな値があるのですが、ソフトマックス(Softmax)を通すことで、合計で1になる重み(ウェイト)を換算します。この重みを使ってエンコーダからの隠れ状態の加重平均を計算し、これをデコーダの出力計算の層への入力に加えます。よってデコーダは自身の計算した隠れ状態だけでなく、エンコーダから必要な情報を加重平均として取り出し翻訳をするのに利用します。

加重平均では関係の強い隠れ状態をより多く取り込むので、どのトークンに注目すべきかを数量化していると言えます。これがアテンションの仕組みになります。ただし、ここでのアテンションはエンコーダとデコーダの隠れ状態の間のものです。

トランスフォーマーにおけるアテンションの計算も同様な概念に基づいており、分散表現(埋め込み)であるベクトル間の内積を利用しています。また、トランスフォーマーでは同じ文章内のトークン同士のアテンションを自己アテンションと呼び文脈の抽出に役立てています。つまり、再帰の仕組みを使わずに直接トークン同士の関係を計算することで必要な文脈を取り入れているのです。

これが2017年に発表されたトランスフォーマーの論文のタイトル「Attention Is All You Need」(アテンションが必要なすべてです。アテンションだけあれば良い)の意味になっています。

次回は、ベクトル同士の内積を使って関係の深さを数値化することの直感的な理解を深めるためにレコメンダーシステムを具体例として取り上げます。

(続く)


いいなと思ったら応援しよう!