※本記事は、Stanford大学のオンライン講座「CS224N: NLP with Deep Learning」の第6回講義「Sequence to Sequence Models」の内容を基に作成されています。講義の詳細や登録方法はhttps://online.stanford.edu でご確認いただけます。本記事では講義内容を要約しておりますが、正確な情報や文脈については、オリジナルの講義をご視聴いただくことをお勧めいたします。
登壇者:Christopher Manning教授(スタンフォード大学トーマス・M・シーベル機械学習教授、言語学・コンピュータサイエンス教授、スタンフォード人工知能研究所(SAIL)所長)
1. 言語モデルの評価
1.1 言語モデルの評価手法:パープレキシティ
言語モデルを評価する方法の一つとして、前回の授業では生成されたテキストを見て「これは良いテキストに見えるか」と評価しました。しかし、もっと厳密な評価方法が必要です。言語モデルの標準的な評価方法は、モデルがテキストにどれだけの確率を割り当てるかを測定することです。
言語モデルの基準となるのは人間が作成したテキストです。そこで、モデルがトレーニングに使用されていない新しいテキストを見せ、そのテキストの単語を予測する能力を測定します。より正確に人間が書いたテキストを予測できるモデルほど、より優れた言語モデルと言えます。
この測定に使用される標準的な指標がパープレキシティです。パープレキシティでは、言語モデルからの予測確率を取り、それを反転させます(例えば0.002を500のような数値に変換)。そして、テキストの各位置でこれらの数値の積を取り、その幾何平均を計算します。これが通常使用される指標です。
このクラスでは、負の対数尤度とクロスエントロピーを見てきましたが、パープレキシティはクロスエントロピーの指数関数にすぎません。単語あたりの負の対数尤度を既に理解している場合、それを指数関数化するとパープレキシティが得られます。
ただし、対数と指数関数のどの底を使用するかによって、計算結果は異なってきます。伝統的にパープレキシティの測定には2を底とする対数が使われることが多かったですが、最近では自然対数を使うことが増えています。パープレキシティの数値を比較する際には、どの底を使用しているかを認識することが重要です。
パープレキシティの値が低いほど、モデルの性能が良いということになります。良い言語モデルを持つということは、次の単語を予測する能力が高いということを意味します。
1.2 パープレキシティの歴史的背景と計算方法
現代の観点から見ると、なぜパープレキシティが使用されているのかは少し不思議に思えるかもしれません。パープレキシティが使われるようになった背景には興味深い歴史があります。
この話はIBMのFred Jelinek氏が語っていたものですが、1970年代後半から1980年代初頭、ジョン・マッカーシーやエド・フェンバムのような記号的人工知能の時代に、IBM内の研究者たちが音声認識などのための確率的手法の探索を始めました。当時、Jelinek氏によると、彼が話そうとしていたAI研究者たちは実際の数学を理解せず、クロスエントロピーやクロスエントロピーレートなどの情報理論の概念も理解していませんでした。そのため、彼らが理解できるもっとシンプルな指標を考え出す必要がありました。
そこでJelinek氏が考案したのが、クロスエントロピーを指数関数化したパープレキシティでした。パープレキシティの数値は、「均一な選択肢からいくつ選んでいるか」と考えることができます。例えば、パープレキシティが64であれば、それは64面のサイコロを毎回振っているようなものであり、そのサイコロで1が出る確率が正しい単語を推測する確率に相当します。
これがパープレキシティが導入された理由ですが、この指標はその後も定着し、現在も言語モデルのスコアとしてパープレキシティの値が一般的に使われています。パープレキシティの値が低いほど、モデルの性能が優れていることを示します。
計算方法としては、言語モデルが予測する確率の逆数を取り、テキスト全体にわたってそれらの積の幾何平均を計算します。これはクロスエントロピーを指数関数化したものと同等です。対数の底については、伝統的には二進法の考えからベース2を使うことが多かったですが、最近では自然対数を使うことが増えています。パープレキシティの数値を比較する際には、どの底を使用しているかに注意が必要です。
1.3 ニューラル言語モデルによる進歩の数値的指標
ニューラル言語モデルによって達成された進歩について、具体的な数値でお見せしましょう。ニューラル言語モデル以前は、n-gram言語モデルが使われており、それらは前回少し触れたAdd-k平滑化やバックオフなどの賢い方法でスムージングされていました。2000年代に知られていたn-gram言語モデルのスムージングの最も賢い方法は「補間Kneser-Ney平滑化」というものでした。この方法を使った大規模な言語モデルのパープレキシティは約67でした。これは次の単語の予測があまり得意ではなかったことを意味しますが、それでも大きな進歩がありました。私が若かった頃のNLPでは、パープレキシティは3桁の数値、例えば150といった値であることが一般的でした。
RNNが最初に導入されたとき、純粋なRNNだけでは実際にはあまり改善できませんでしたが、RNNを最大エントロピーモデルのような他のものと組み合わせることで改善でき、パープレキシティは51のような数値になりました。
しかし、本当の進歩が始まったのは、RNNの改良版としてLSTMが使われるようになったときでした。LSTMモデルでは、パープレキシティが43や30といった数値に改善されました。パープレキシティが30というのは、以前の半分になったということで、クロスエントロピー項では約1ビット分のクロスエントロピーが減少したことになります。これは言語モデリングにおける実質的な進歩でした。
現代の基準から見ると、これらの数値はまだかなり高いものです。現在最高の言語モデルでは、パープレキシティは一桁台の値が得られています。これらのモデルは、次に何の単語が言われるかを正確に予測できることが多くなっています(もちろん常にではありませんが、誰も多くの状況で次に言われる単語を100%予測することはできません)。
これらの数値はニューラル言語モデルの進歩を実証するものであり、従来のn-gramモデルと比較して大幅な改善が見られたことを示しています。
2. RNNの問題点:勾配消失と勾配爆発
2.1 勾配消失問題の概要と長距離依存関係への影響
LSTMに移る前に、RNNの問題点とそれが修正が必要になった理由について説明したいと思います。これらの問題は勾配消失と勾配爆発と呼ばれるものです。
例えば、位置4の単語を予測しようとしていて、通常は100%の確率で予測できるわけではないので、その単語に対して負の対数尤度という損失が発生します。私たちはこの損失をシーケンスを通じてバックプロパゲートし、いつもやるように勾配を計算します。
前回の授業でシーケンス全体を通じてバックプロパゲートしていることを示しましたが、これは各時間ステップで行っています。時間ステップ2、3、4、5、6、7からの損失をバックプロパゲートし、それぞれに対して行います。前回はこれらの損失をすべて合計するか、平均損失を計算する方法について議論しました。
この損失をバックプロパゲートするとき、何が起こるかというと、各時間ステップで部分導関数の連鎖律を適用します。例えば、30ステップの長いシーケンスがあるとすると、各時間でH(k)をH(k-1)で偏微分した部分を掛けていくことになります。
では、これらの値が小さい場合や大きい場合、どんな効果があるでしょうか?値が小さい場合、勾配はシーケンスをバックプロパゲートするにつれて徐々に小さくなり、消失していきます。
数学的に考えると、HtをHt-1で偏微分するとき、簡略化のために非線形性がないと仮定すると(つまりシグマが恒等関数の場合)、その偏微分は行列Whになります。RNNをバックプロパゲートし続けると、行列Whのべき乗を計算していることになります。
この行列を高いべき乗にした場合どうなるかという問題になります。ここで行列を固有ベクトルと固有値で表現できます。そうすると、2つの可能性があります:すべての固有値が1未満の場合、その数はべき乗を高くするにつれてどんどん小さくなります。または、1より大きい固有値を持つことがあり、その場合はさらに遡るにつれてどんどん大きくなります。
つまり、勾配をバックプロパゲートするとき、行列の最大固有ベクトルの固有値がちょうど1に近くない限り、勾配消失か勾配爆発のいずれかが発生します。どちらも悪い結果をもたらします。
勾配消失が問題である理由は、一般的に最も近い単語が最も関連性が高いため、そこでパラメータを最も更新すべきだという点では問題ではないように思えるかもしれません。しかしこのモデルでの勾配消失は非常に激しく発生し、後の位置からの損失と前の位置からの損失を比較すると、更新は主に非常に近い損失によって決定され、遠くからの損失の勾配信号は非常に小さくなります。
これが問題である理由は、言語モデリングでは長距離の信号を伝達したい多くのケースがあるからです。例えば次のテキストを考えてみましょう:「彼女はチケットを印刷しようとしたとき、プリンターのトナーが切れていることが分かりました。彼女はトナーを買うために文房具店に行きました。それはとても高価でした。トナーをプリンターに取り付けた後、彼女はついに彼女の...」
人間であれば、次に「チケット」という単語が来ることはほぼ100%の確率で予測できます。しかしこれは約20語前に出てきた「チケット」に戻ることに依存しています。単に「トナーをプリンターに取り付けた後、彼女はついに彼女の」という部分だけを見ていると、次に来るのは「紙」や「招待状」や「小説」など何でもあり得るので、「チケット」と予測することはできません。
このような長距離依存関係を学習するためには、「チケット」という単語が20語前に出現していることが、ここで「チケット」を予測するための良い手がかりだということを学習できるように、その位置と単語「チケット」が最初に現れる場所との間に十分な信号があることが必要です。
しかし、勾配が非常に小さくなると、RNNはこのような長距離依存関係を学習できず、テスト時にこのような予測をうまく行うことができません。
かなりざっくりとした推定ですが、人々が実際に発見したのは、ここまで紹介した単純なRNNでは、効果的に条件付けできる量は約7トークン前までだということです。それより遠くにあるものに対しては、条件付けを学習することはありませんでした。
n-gramの話のときに、通常の上限は5-gramで、時々もう少し大きくなることもあると言いましたが、指数関数的な爆発の事実のために、理論的にはずっと良い解決策を手に入れましたが、実際には勾配消失のために、8-gramと同等のものしか得られていないように感じます。それほど大きな進歩はありませんでした。
2.2 勾配爆発問題とその影響
反対の問題として勾配爆発も発生する可能性があります。行列の固有値が大きい場合、勾配が非常に大きくなると、パラメータ更新のために何をしているかというと、学習率があるものの、基本的に勾配が非常に大きい場合、非常に大きなパラメータ更新を行うことになります。
これは非常に悪い更新を引き起こす可能性があります。なぜなら、勾配の方向に一歩進み、少し行き過ぎるかもしれないが、おおよそ正しい領域にいるだろうと仮定しているからです。しかし、もし非常に爆発した勾配があれば、どこにでも行ってしまう可能性があります。シエラネバダ山脈を目指していたのに、アイオワ州に到着してしまうようなものです。任意に遠くまで行ってしまい、最終的にどこに着くかは全く進歩しない可能性があります。
勾配爆発は問題です。無限大やNaN(非数)の値を引き起こす可能性もあり、モデルをトレーニングする際には常に問題となります。
勾配爆発に対処するための受け入れられている知恵は、残念ながら高度な数学ではありません。勾配爆発に対しては、粗いハックを使用します。勾配をクリップするのです。これは非常に上手く機能し、本当に知っておくべきことです。勾配クリッピングはニューラルネットワークが問題を起こさないようにするために不可欠なことが多いからです。
しかし、勾配消失の修正はより難しい問題に見えました。これはRNNが多くの時間ステップにわたって情報を効果的に保存できないという問題でした。問題は、情報を保存するのが非常に困難なアーキテクチャを持っているように思われました。ある時間ステップから次の時間ステップへの隠れ状態を見ると、それは完全に書き換えられています。前の時間ステップの隠れベクトルを行列で掛け、入力からの他の情報を加えると、一般的に完全に変わってしまいます。
もし「有用な情報がある前の状態を少し保持してください」と言いたいなら、この定式化ではそれを行うのは簡単ではありません。以前の状態をほとんど保持するWベクトルを学習することは、全く自明なことではないからです。
2.3 勾配爆発への対処法:勾配クリッピング
勾配爆発に対処するための受け入れられている方法は、残念ながら高度な数学ではありません。勾配爆発に対して人々が使用しているのは粗いハックです—勾配クリッピングです。しかし、これは非常に効果的に機能しますし、本当に知っておくべきことです。勾配クリッピングはニューラルネットワークが問題を起こさないようにするために、しばしば不可欠だからです。
勾配クリッピングで行うことは、勾配のノルム(大きさ)を計算し、それが大きすぎると判断された場合(これは状況によって異なりますが、通常は5、10、20あたりの値が勾配のノルムとして許容される上限と見なされます)、あらゆる方向で勾配をスケールダウンし、より小さな勾配更新を適用します。
このシンプルな方法は実際にうまく機能します。したがって、勾配爆発の問題は解決可能です。しかし、勾配消失の問題を修正することはより困難な問題に見えました。これはRNNが多くの時間ステップにわたって情報を効果的に保存できないという問題でした。
問題は情報を保存するのが非常に困難なアーキテクチャを持っていることでした。ある時間ステップから次の時間ステップへの隠れ状態を見ると、それは完全に書き換えられています。前の時間ステップの隠れベクトルを行列で掛け、入力からの他の情報を加えると、一般的に完全に変化します。
もし「HT-1には有用な情報があるから、それをしばらく保持できますか?」と言いたい場合、この定式化ではそれを行うのはそれほど簡単ではありません。なぜなら、以前の状態をほとんど保持するようなWベクトルを学習することは、全く自明なことではないからです。
そこで、情報が簡単に保存できるようなメモリを持つRNNを設計できるかという疑問が生じました。この疑問に対する答えは「はい」であり、それが次に説明するLSTM(Long Short-Term Memory)の導入につながりました。
3. LSTM(Long Short-Term Memory)
3.1 LSTMの背景と命名の由来
LSTM(Long Short-Term Memory)は、勾配消失問題に対する解決策として1997年にHochreiterとSchmidhuberによって提案された新しいタイプのニューラルネットワークです。この名前の由来を説明すると、人間の場合、短期記憶(最近聞いたこと)と長期記憶(永続的に保存されていること)を区別しますが、会話の中では数ターン前に相手が言ったことを覚えているなど、短期記憶でもかなり長い間情報を保持できます。
しかし問題は、単純なRNNの短期記憶は約7トークンしかなく、それより良くする必要がありました。そこで「長い短期記憶」(Long Short-Term Memory)という名前が生まれました。
興味深い歴史的背景として、多くの人が引用する1997年の論文だけでなく、2000年にGersとSchmidhuberによる2番目の重要な論文があります。この2番目の論文は、21世紀に使われたLSTMの重要な部分である「忘却ゲート」を導入しました。これは元の論文には含まれていなかった機能です。
Schmidhuberと彼の学生たちは、ほとんどの人がニューラルネットワークを諦めていた1990年代後半に、ニューラルネットワークの基礎的な重要な仕事を多く行いました。現在のように、ニューラルネットワークの先駆的な仕事がGoogle、Meta、OpenAIなどで高額な報酬を得る仕事に直結するのとは違い、当時はそうではありませんでした。
その後の研究者の道を追跡すると、Hochreiterの学生だったGersは、AIとニューラルネットワークを完全に諦め、マルチメディアの分野で仕事をするようになりました。同じくSchmidhuberの学生だったHochreiterは機械学習にとどまりましたが、長い間より一般的なニューラルネットワークの仕事を基本的に諦め、バイオインフォマティクスに進みました。彼の2002年から2015年頃の論文は、すべてバイオインフォマティクスに関するもので、そのほとんどはニューラルネットワークを使用していませんでした。ただし、最近になって再びニューラルネットワークに戻り、再びニューラルネットワークに関する論文を発表しています。
当時、この研究にはほとんど注目が集まらず、その後徐々に広がっていきました。2000年代半ばに、SchmidhuberはAlex Graves(音声認識でよく使われるCTC損失とデコーディングを発明した人物)という別の学生を持ち、GravesはLSTMでさらに研究を進めました。その後、GravesはJeff Hintonのポスドクとしてトロントに行き、LSTMが良いモデルであることにより多くの注目を集めました。そして2013年にHintonがGoogleに入社し、2014年から2016年にかけてGoogleでのLSTMの使用が世界に広まり、しばらくの間、世界中のニューラルネットワークで完全に支配的なフレームワークとなりました。
スタートアップの世界で言うところの「最初の人々には早すぎる」という状況でした。
3.3 ゲート機構:忘却ゲート、入力ゲート、出力ゲート
LSTMでは、情報の流れを制御するために3つのゲート機構を使用します。これらのゲートはそれぞれベクトルとして計算され、隠れ状態と同じ長さを持ちます。計算方法は基本的にリカレントニューラルネットワークで使っていたものと同じ形をしていますが、シグマは必ず0から1の間の確率を得るためのロジスティック関数を使用します。
これら3つのゲートは以下のように計算されます:
- 忘却ゲート (f_t): これは前の時間ステップの隠れ状態からどれだけ記憶するかを制御します。計算式は以下の通りです:
- 入力ゲート (i_t): このゲートは新しい入力x_tにどれだけ注意を払い、それを隠れ状態に取り入れるかを決定します。計算式は以下の通りです:
- 出力ゲート (o_t): このゲートは、主記憶であるセルの内容からどれだけを隠れ状態に転送するかを制御します。計算式は以下の通りです:
f_t = σ(W_f · [h_{t-1}, x_t] + b_f)
実は「忘却ゲート」という名前は少し誤解を招きやすいものです。「記憶ゲート」と考えた方が理解しやすいかもしれません。なぜなら、実際に計算しているのは何をどれだけ記憶するかだからです。
i_t = σ(W_i · [h_{t-1}, x_t] + b_i)
o_t = σ(W_o · [h_{t-1}, x_t] + b_o)
これらのゲートを計算した後、次のようにしてセル状態と隠れ状態を更新します:
まず、潜在的な新しいセル内容を計算します:
c̃_t = tanh(W_c · [h_{t-1}, x_t] + b_c)
この潜在的な更新は、前回のリカレントネットワークで見たものと全く同じ種類の方程式を使って計算されます。2つの行列(セルW_cとセルU_c)があり、一方を前回の隠れ状態に、もう一方を新しい入力に掛け、バイアスを加えます。
次に、これらのゲートを使ってセル状態を実際に更新します:
c_t = f_t ⊙ c_{t-1} + i_t ⊙ c̃_t
ここで⊙はアダマール積(要素ごとの積)を表します。新しいセルの内容は、古いセルの内容と忘却ゲートのアダマール積(どれだけ以前のセル内容を記憶するか)に、計算された更新と入力ゲートのアダマール積(この新しい潜在的な更新にどれだけ注意を払うか)を加えたものになります。
最後に、新しい隠れ状態を計算します:
h_t = o_t ⊙ tanh(c_t)
これは出力ゲートとセルにtanhを適用したもののアダマール積を取ることで計算されます。
このようにして、LSTMはセル状態に情報を徐々に蓄積し、必要に応じて忘れ、その一部を隠れ状態に出力することができます。これによって、長距離依存関係を効果的に学習することが可能になります。
3.4 LSTMが勾配消失問題を解決する理由(加算操作の重要性)
これらはすべて非常に複雑で入り組んだ設計に見えるかもしれません。実際、2016年や2017年頃、このLSTMが言語モデリングに使える最高のニューラルネットワークだった頃は、LSTMとその異なる特性を持つバリエーションについて、授業の数時間を費やして詳しく解説していました。ゲーティングを行う様々な方法があり、ゲートの数を減らしたり増やしたり、異なることを行ったりできます。
2024年の今、これが最も重要なことであるとは言えないかもしれませんが、LSTMは認識しておくべきものです。課題3でLSTMを使うことになりますが、PyTorchにLSTMを要求するだけで、これらのことをすべて行うものが得られます。
しかし、私が本当に強調したいのは、LSTMが達成する良いこととその根本的に異なる動作の秘密です。それは、あそこにあるプラス記号にあります。単純なリカレントニューラルネットワークでは、各時点で次の隠れ状態は乗算的な操作の結果でした。そのため、情報を保存するのは非常に困難でした。
LSTMの本質は、「見てきた過去のメモリがあり、そこに新しい情報を追加したい」ということであり、これは人間の記憶にとって基本的に正しいことのように思えます。人間の記憶は基本的に加算的なものです。
先ほど、LSTMの重要な部分を導入した2番目のGersの論文について言及しましたが、LSTMの最初のバージョンには忘却ゲートがありませんでした。それは純粋に加算的なメカニズムで、シーケンスを進みながら記憶に何を追加するかを決定していました。
しかし、それは完全に完璧ではないことが証明されました。なぜなら、長いシーケンスにわたって次々と多くのものを追加し続けると、ある時点で機能しなくなる傾向があるからです。そこで大きな改良は、この忘却ゲートを追加することでした。これにより一部の情報が消えていきますが、それでも基本的に加算的なものであることは変わらず、勾配フローの問題を修正し、より記憶のようなものになります。情報を知りながら、あなたが知っていることに追加しているのです。
LSTMアーキテクチャでは、多くの時間ステップにわたってセル内の情報を保存することができます。忘却ゲートを1に設定し、入力ゲートを0に設定すると、同じ情報を無期限に線形に受け渡しているだけになります。
これは長距離情報フローを実現する唯一の方法ではありません。将来の講義では、長距離情報フローを実現する他の方法についてもますます見ていきます。これには、他のアーキテクチャについて考えることも含まれます。
加算操作は勾配消失問題の解決にも役立ちますが、同時に勾配爆発問題にも役立ちます。なぜなら、常に一連の掛け算を行うのではなく、この加算演算子があるからです。
勾配消失と爆発はリカレントニューラルネットワークだけの問題ではないということも考えられます。長いシーケンスがある場合に早く、より悪くなりますが、非常に深いニューラルネットワークを構築し始めると、同じことが起こります。パラメーターは同じではないので、それは単に一つの行列を累乗することと同じではありませんが、行列によっては勾配が消失するか爆発するという同じ問題が生じる傾向があります。
これは実際に人々が発見したことであり、初期の人々が深いニューラルネットワークの構築にあまり成功しなかった理由の一つでした。このような問題に悩まされていたからです。基本的に深いニューラルネットワークで勾配消失があると、下層では非常に少ない勾配信号しか得られず、パラメーターが実際に更新されないため、下層では何も学習せず、したがってネットワークがうまく機能しないということでした。これが2000年代初頭に深いネットワークが機能しなかった理由の一部でした。
4. その他のRNN応用と拡張
4.1 様々なNLPタスクでのRNN応用例
RNN(またはLSTMを含むRNN)を持っていると、シーケンスを扱う他のあらゆるタスクにそれらを使用することができます。NLPでは多くの場所で使われています。
例えば、単語に品詞(名詞や動詞など)を割り当てる場合、これは通常、品詞タグ付けLSTMで行われます。また、単語に名前付きエンティティラベル(位置情報など)を割り当てる場合も、LSTMを使用した固有表現認識に利用できます。私はウィンドウの真ん中にラベルを割り当てるというおもちゃのバージョンを以前やりましたが、各位置にラベルを割り当てたい場合はLSTMを使用できます。
RNNを文全体のエンコーダモデルとして使用することもできます。テキストがポジティブかネガティブかを判断する感情分類を行いたい場合、LSTMをその上で実行し、それを文の表現として使用して、テキストがポジティブかネガティブかを判断できます。最も単純な方法は最終的な隠れ状態を使用することです。その最終的な隠れ状態は、文全体を見た後に得られた隠れ状態だからです。これを使用して、その上にロジスティック回帰などの分類層を置き、ポジティブかネガティブかを判断します。
実際には、人々は全ての隠れ状態を使用し、何らかの平均または要素ごとの最大値を取り、それを文エンコーディングとして入力する方が効果的であることが多いと発見しています。
また、他の情報に基づいてテキストを生成するために、RNNを他の多くの目的にも使用できます。音声認識、要約、機械翻訳(後で触れます)などを行いたい場合、ネットワークを条件付けするための入力ソースがあり、その後、音声認識や機械翻訳を生成します。これらを「条件付き言語モデル」と呼びます。なぜなら、何もない状態や開始トークンから単にテキストを生成するのではなく、何らかの情報ソースに条件付けてテキストを生成しているからです。
人々がこれらを使用する際にもう一つよく起こることについて、少し考えてみましょう。これらの隠れ状態表現を考えると、例えば「terribly」という単語の隠れ状態表現には、「the movie was terribly」という前に来た内容についての情報が含まれていますが、その後に来る内容についての情報は含まれていません。「terribly」の表現として、前に来たものだけでなく、後に来るものについても知っている表現があるといいのではないかと思うかもしれません。
そこで、人々は次の明らかなアイデアを思いつきました。それは、双方向LSTMを構築することです。前向きのLSTMを実行してから、もう一つのLSTM(緑色またはティール色で示されている)を開始し、それを逆向きに実行します。そうすると、各位置に前向きと後ろ向きのベクトルが得られ、それらを連結して、単語の意味の表現のために両側のコンテキストを持つことになります。
これらのネットワークは広く使われており、前向きRNNと後ろ向きRNNを実行し、それらの状態を連結していました。これらは簡潔に「双方向RNN」と書かれることが多く、その意味を示唆していました。これらは言語分析には非常に人気がありましたが、テキスト生成をしたい場合には機能しませんでした。しかし最近では、その役割はトランスフォーマーモデルに取って代わられています。
4.2 双方向LSTM(Bidirectional LSTM)
これらの隠れ状態表現について考えると、ある位置の隠れ状態表現、例えば「terribly」という単語の隠れ状態表現は、その単語だけについてのものではありません。それには「the movie was terribly」という、それ以前に来たものについての情報が含まれています。しかし、それに続くものについての情報は含まれていません。
単語の表現として、その前に来たものだけでなく、後に来るものについても知っている表現が欲しいと思うかもしれません。そこで、人々は次の明らかなアイデアを思いつきました。それは、双方向LSTMを構築することです。
双方向LSTMでは、まず前向きのLSTMを実行します。そして、別のLSTM(スライドでは緑色またはティール色で示されているもの)を開始し、それを逆向きに実行します。そうすると、各位置に前向きと後ろ向きのベクトルがあり、それらを連結することで、単語の意味表現のために両側のコンテキストを持つことになります。
これらのネットワークは広く使われていました。前向きRNNと後ろ向きRNNを実行し、それらの状態を連結していたのです。これらは簡潔に「双方向RNN」と書かれることが多く、その意味を示唆していました。
双方向RNNは言語分析のために非常に人気がありました。テキストを生成したい場合には機能しないものの、表現として多くの場所で使われていました。しかし最近では、その役割はトランスフォーマーモデルに取って代わられることが多くなっています。
4.3 多層RNN(Stacked RNN)
機械翻訳のためにも使用できるもう一つのアイデアは、RNNは多くの時間ステップにわたって展開されるという意味で「深い」ですが、これまで紹介したRNNは1つの隠れ状態しか持たないという意味では「浅い」RNNでした。これらを複数の隠れ状態の層を持つ「深い」RNNにすることもできます。これはよく「積み重ねられたRNN」(Stacked RNN)とも呼ばれます。
積み重ねられたRNNでは、複数層のRNNが互いの上に構築されています。ここで疑問に思うかもしれません。これは実際に何か効果があるのでしょうか?それらは単に単語の上にある大きなベクトルではないのでしょうか?しかし、こことここの間にこの追加のニューラルネットワーク層があるからこそ、他のニューラルネットワークで得られるのと同じ力の優位性を得ることができます。つまり、連続した特徴抽出の層を持つことができ、そのためニューラルネットワークからより多くの力を引き出すことができます。
RNNの時代に人々が発見したことの一つは、複数の層を持つことは確かに役立つということでした。しかし、当時の他の種類のニューラルネットワーク(ビジョンなど)で起こっていたこととは異なり、人々はまだ比較的浅いRNNを使用していました。
常に2層のほうが1層よりも大きな効果が得られましたが、3層や4層からさらなる価値を得られるかどうかは、一般的に不確かになり始めました。そのため、一般的に人々は2層か3層のLSTMを実行していました。
しかし、これはトランスフォーマーの世界で完全に変わりました。現在では、言語理解のために非常に深いトランスフォーマーネットワークを構築しています。
4.4 勾配問題への他のアプローチ:残差ネットワーク、Highway Net
勾配消失と爆発の問題はリカレントニューラルネットワークだけの問題ではありません。長いシーケンスがある場合に早く、より顕著になりますが、非常に深いニューラルネットワークを構築し始めると、同じことが起こる傾向があります。パラメータは同じではないので、単に一つの行列を累乗することではありませんが、行列によっては、勾配が消失するか爆発するという同じ問題が生じる傾向があります。
これは人々が発見したことであり、2000年代初頭に深いネットワークが機能しなかった理由の一部でした。基本的に深いニューラルネットワークで勾配消失があると、下層では非常に少ない勾配信号しか得られず、パラメータが実際に更新されないため、モデルは下層で何も学習せず、ネットワークがうまく機能しないということでした。
これを修正する他の方法を考えることができます。一般的な修正方法の一つは、より直接的な接続を追加することです。私たちがリカレントステップで見た問題は、行列の乗算などの中間処理を行うことで間接性が生じ、物事が爆発したり消失したりする可能性があることでした。
(ここで示される図は論文から借用したため上下が逆になっていますが、それに対応して説明します)この図では、上から下に次の層へと進みます。重みの層を通って何度も重みの層を通るのではなく、同じトリックを垂直ネットワークに適用して次のように言うことができます:「入力をアイデンティティ関数で運び、ここに加えることもできます」。そうすると、情報の直接的な伝達が得られます。
これが「残差ネットワーク」(Residual Network)につながりました。残差ネットワークは、これらの残差接続を持つことで、コンピュータビジョンモデルを完全に変革し、純粋な残差接続のないネットワークよりもはるかに学習しやすくしました。
このアプローチに沿って考え始めると、「なぜ一歩だけ進む残差ループだけを提供するのか、各層を後続のすべての層に直接接続できるのではないか」と考えることができます。人々はそのアイデアを探求し、それが「DenseNet」と呼ばれるものにつながりました。DenseNetでは、これらのスキップ接続が他のすべての層にリンクしています。
残差ネットワークのバリアントとして、実際にSchmidhuberとその学生たちによって再び導入されたのが、「入力を直接加えるのではなく、入力がどれだけスキップアラウンドするかをゲートで決定した方がよいのではないか」というアイデアでした。これが「Highway Net」(ハイウェイネット)というバリアントにつながりました。ここではゲート付きの残差ネットワークを持っています。
これらは勾配問題に対処するためのさまざまなアプローチであり、それぞれに利点があります。
5. 機械翻訳の歴史と発展
5.1 機械翻訳の起源と初期の課題
機械翻訳は、ある言語の文から別の言語の文へと翻訳する主要な自然言語処理タスクの一つです。フランス語などの言語で文を始め、それを別の言語、ここでは英語に出力します。
実は、機械翻訳はNLPの始まりでした。1950年代初期には、まだ人工知能という分野は存在せず、NLPという分野もありませんでしたが、人々は機械翻訳に取り組み始めました。機械翻訳に取り組み始めた理由の背景には、コンピュータが第二次世界大戦中に初めて開発され、当時のコンピュータは主に2つの目的で使用されていました。一つは砲兵の射撃表ターゲットを計算すること、つまり砲を正しい場所に着弾させるために何度の角度に設定するかを計算することでした。もう一つはコード解読でした。
第二次世界大戦後、すぐに冷戦に移行し、両側で科学の発展に遅れをとらないようにするという懸念がありました。人々は「言語間の翻訳をコード解読のように考えられるのではないか」というアイデアを思いつきました。このアイデアは科学資金提供機関の重要な関係者に届き、コンピュータを使って言語間の機械翻訳ができるかどうかというこのアイデアに多くの資金が投入されました。
しかし、1950年代の初期の印象的なデモの後、基本的に完全な失敗に終わりました。失敗した理由はたくさんあります。一つは人間の言語の構造についてほとんど何も知られていなかったことです。特に前日に言及したチョムスキー階層、つまり文脈自由言語について知ることについて、その時点ではチョムスキー階層さえまだ発明されておらず、言語の形式的特性についての研究はされていませんでした。
また、1950年代に人々が持っていたコンピュータの計算能力やメモリなどは、今日から見れば笑えるほど小さなものでした。現在では、ラップトップの小さな電源アダプターの中に、当時使われていた大型のメインフレームコンピュータよりも多くの計算能力が含まれています。
基本的に、人々は非常に単純な辞書と規則ベースの置換規則しか構築できず、人間の言語の複雑さには全く対応できませんでした。人間の言語の複雑さは、徐々に理解され始めたものです。
しかし、機械翻訳は1990年代と2000年代に、人々がより多くのデータに基づく経験的モデルを構築し始めると、より活発になり始めました。このアプローチは統計的機械翻訳と呼ばれていました。Google翻訳が世界に初めて紹介されたとき、それは統計的フレーズベース機械翻訳システムの世界への大きな公開でした。
この方法では、一方の言語から別の言語に翻訳された大量の並行データを収集していました。すべての言語ではありませんが、かなり多くの言語について、かなり多くの並行データのソースがありました。例えば、欧州連合はヨーロッパ言語間の膨大な量の並行データを生成しています。香港のような場所では英語と中国語(特定の方言)の並行データが得られます。国連も多くの並行データを生成しています。
5.2 統計的機械翻訳の手法と限界
1990年代から2000年代にかけて、機械翻訳はより活発になり始めました。人々が大量のデータに基づく経験的モデルを構築し始めたからです。このアプローチは統計的機械翻訳と呼ばれていました。Google翻訳が世界に初めて紹介されたとき、それは統計的フレーズベース機械翻訳システムの世界への大きな公開でした。
このシステムでは、並列データのソースを見つけ、モデルを構築しようとしていました。その仕組みは翻訳のための確率モデルを学習することに基づいていました。つまり、ソース文が与えられたときの翻訳の確率を計算します。当時の方法は、ベイズの法則を使用して2つのサブ問題に分解することでした。
翻訳がソースに対してどれくらいの確率を持つかは、翻訳が与えられた時のソースの確率に翻訳自体の確率を掛けたものとなります。一見すると、これはXとYの順序を逆にしただけで、何も単純化していないように思えるかもしれません。しかし、これが進歩を可能にし、人々が前進できた理由は、翻訳モデルが非常に単純なモデルとして扱われ、一方の言語の単語が他方の言語の単語にどのように翻訳される傾向があるかについてのみ考慮すればよかったからです。このモデルは、他の言語の単語順序、文法、構造などについて何も知る必要がありませんでした。
これらはすべて、単に翻訳の確率P(Y)によって処理されていました。これは、我々が以前に話した純粋な言語モデルでした。つまり、フランス語で「homme」という単語を見た場合、それを「man」や「person」などに翻訳し、それに確率を付ける単純な翻訳モデルを持つことができました。そして、賢さのほとんどは言語モデルにあり、それはターゲット言語で何が良い文になるかを教えてくれました。
これは重要でした。翻訳は非常に複雑になるからです。単語の翻訳方法を知るだけでなく、それらの単語の翻訳はコンテキストによって変わります。また、文中で単語の順序が大幅に入れ替わることもあります。
言語によって大きく異なる点の一つは、どのような小さな単語を持っているかです。英語では、多くの助動詞や冠詞を入れますが、中国語ではそれらはありません。そのため、方向によっては、多くの単語を追加したり削除したりする必要があり、これはソース上に構築している場合には非常に難しいことです。
5.3 Google翻訳の例と誤訳の分析
しばらくの間、私のお気に入りの機械翻訳の例文がありました。これは実際に翻訳された文で、元はジャレッド・ダイアモンドの「銃・病原菌・鉄」という本からのものです。この本は中国語に翻訳されていました。
2000年代に、私は統計的機械翻訳システムの構築に関わっていて、私たちのシステムがこの文で非常に悪い結果を出したMT評価がありました。そこでGoogle翻訳でも試してみましたが、やはりこの文では良い結果を出せませんでした。
元の文が言おうとしていたことは、「1519年、600人のスペイン人がメキシコに上陸し、数百万人の人口を持つアステカ帝国を征服しようとした。彼らは最初の衝突で兵士の3分の2を失った」というものです。
Google翻訳は2009年にこれを次のように訳しました:「2009年 1519年 600人のスペイン人がメキシコに上陸し、数百万人がアステカ帝国を征服するために。最初の3分の2の兵士が彼らの損失に対して」
翻訳が部分的に悪いのは、単語の選択がとても良くないからですが、特に修飾関係を捉えて使うことができていないため、特に悪いのです。
中国語のテキストを見ると、「アステカ帝国」という部分と、オレンジ色で「数百万人」という部分があります。中国語にはここに「dur」という明示的な小さな文字があり、オレンジ色の部分が緑色の部分を修飾していることを示しています。これは正確な翻訳では「数百万人の人口を持つアステカ帝国」となるべきです。
しかしGoogle翻訳はこれを完全に失敗し、突然「数百万人がアステカ帝国を征服する」という意味になってしまいました。これが起きている中で最も悪い部分ですが、「1519年600」も非常に良い翻訳ではありませんし、「最初の3分の2の兵士が彼らの損失に対して」も良くありません。
しばらくの間、これを更新して何が起こるか見ていました。2013年には進歩があったように見えましたが、2015年には再び以前のようになってしまいました。2013年に幸運だっただけで、システムが実際に改善されたわけではないようでした。
これが問題のように思えました。機械翻訳において何らかの進歩はあったものの、これらのシステムは実際には決してそれほど優れたものではなかったのです。これが、2014年に驚くべきブレークスルーへとつながりました。そこで、ニューラル機械翻訳に移行し、ニューラル機械翻訳は遥かに優れたものになりました。
6. ニューラル機械翻訳
6.1 シーケンス・ツー・シーケンスモデルの基本構造
ニューラル機械翻訳では、単一のエンドツーエンドニューラルネットワークとして機械翻訳システムを構築しました。これは、ニューラルネットワークシステム全般、特にNLPにおいて強力なアイデアでした。単一の大きなシステムを持ち、その最後に損失関数を置き、その誤差をシステム全体に逆伝播させることができれば、最終的に達成したいタスクのために学習を全て調整できるということです。これはそれ以前のモデルではできなかったことで、非常に効果的でした。
私たちはシーケンス・ツー・シーケンスモデルでこれを構築しました。これはLSTMのように聞こえますが、意味するところは、ソース文をエンコードするものと、ターゲット文を生成するものの2つを持つということです。これが私たちが構築しているものです。
ソース文については、ここではRNNと書いてありますが、実際にはLSTMを使うと考えましょう。なぜなら実際にはそれがはるかに優れているからです。このRNNを使ってソース文をチャンク分けしてエンコードします。このRNNは何も出力しません。ソース文の内容を知っている隠れ状態を構築しているだけです。つまり、ソース文のエンコーディングです。
そして、その最終的な隠れ状態を使って、デコーダRNNに条件付けします。デコーダRNNもLSTMですが、異なるパラメータを持つLSTMになります。一つのソースエンコーディングパラメータを持つLSTMセットを学習し、次に異なる言語のために異なるLSTMを学習します。
スタートを与え、「エンコーダRNNからエンコードしたものを、あなたの出発点として入力してください」と言います。それが前の隠れ状態としてLSTMに入力されるものとしてカウントされます。そして、翻訳の最初の単語を生成し、前回行ったように、その翻訳された単語をコピーダウンして、生成モデルとしてこれを使用します。「he hit me with a pie」というように翻訳していきます。
これでモデルは理解できましたか?良いでしょう。
小さなピンクのノートがここにあります。実行時に私が見せたのは、ソースをエンコードし、その後翻訳の単語を生成するときの様子です。トレーニング時には並列テキストがあり、それぞれの翻訳を持っています。同じアーキテクチャで実行しますが、前回のように、デコーダネットワークでは各単語を予測し、「実際の次の単語にどれくらいの確率を割り当てましたか?」と尋ねます。これが損失を与え、各位置での損失を計算し、平均損失を計算し、勾配を計算し、それをネットワーク全体(デコーダRNNとエンコーダRNN両方)に逆伝播させ、モデルの全パラメータを更新します。これがエンドツーエンドでトレーニングされる意味です。
これは、エンコーダ・デコーダモデルという一般的な概念であり、私たちが様々な場所で使用する非常に一般的なものです。何かをエンコードする一つのネットワークがあり、それが表現を生成し、それを別のネットワークに供給してデコードします。LSTMではなくトランスフォーマーなど他のものを使用する場合でも、機械翻訳だけでなく、要約やテキスト音声変換など他のタスクを行いたい場合でも、エンコーダ・デコーダネットワークを使用することが一般的です。
6.2 エンコーダ・デコーダアーキテクチャ
このシーケンスツーシーケンスモデルは、エンコーダとデコーダアーキテクチャとして知られています。ソース言語の入力シーケンス(例えば中国語の文)を取り、それをエンコーダRNNに通して固定長の表現(最終的な隠れ状態)に変換します。そして、この表現を使用してデコーダRNNを初期化し、ターゲット言語(例えば英語)で単語を1つずつ生成していきます。
ここでの大きな利点は、エンコーダとデコーダが異なる長さの入出力シーケンスを扱えることです。入力が8単語でも、出力は5単語や12単語になることがあります。これは、前に触れた言語間の重要な違いを処理できるということです。例えば、英語では冠詞や助動詞をたくさん使いますが、中国語ではそれらを使いません。そのため、翻訳方向によっては、多くの単語を追加したり削除したりする必要があります。
エンコーダは入力を処理して隠れ状態を構築するだけで、何も出力しません。デコーダは、エンコーダの最終隠れ状態を初期状態として受け取り、そこから翻訳を生成します。デコーダが最初の単語を生成した後、その単語と前の隠れ状態を使って次の単語を生成し、これを繰り返します。このプロセスは、特殊な終了トークンが生成されるか、最大長に達するまで続きます。
実際には、より強力なモデルを構築するために、これらのRNNを多層(スタック)にすることが一般的です。Googleで最初に大きな成功を収めた実装では、多層双方向LSTMをエンコーダに、多層一方向LSTMをデコーダに使用していました。
トレーニング時には、並列コーパス(同じ内容の2つの言語での文のペア)を使用します。エンコーダは入力言語の文を処理し、デコーダは出力言語の文を予測します。各時間ステップでの予測と実際の単語の間の損失(交差エントロピー)を計算し、この損失をネットワーク全体に逆伝播させてパラメータを更新します。
実用的には、デコーダの予測を改善するために、「教師強制」という技術がよく使われます。これは、トレーニング中にデコーダに「実際の」前の単語を与え(予測した単語ではなく)、それに基づいて次の単語を予測させるというものです。これにより、トレーニングが速くなり、よりよい結果が得られます。
このエンコーダ・デコーダアーキテクチャは、機械翻訳以外にも多くのシーケンスツーシーケンスタスクに適用できる非常に汎用的な枠組みです。
6.3 ニューラル機械翻訳の成功と業界への影響
ニューラル機械翻訳システムの構築は、実はこの意味での自然言語処理ディープラーニングの最初の大きな成功でした。ディープラーニングのルネサンスの歴史を見ると、ディープラーニングが最初に非常に成功したのは音声認識システムの分野でした。2番目に大きく成功したのは物体認識とビジョン、そして3番目に成功したのが機械翻訳システムの構築でした。
Googleは大規模な統計的機械翻訳システムを持っていましたが、人々が初めてこの種のLSTMディープラーニング機械翻訳システムを構築したのは2014年でした。それは明らかに非常に優れていたため、わずか2年後にはGoogleで実際に稼働するシステムとして展開されました。
しかし、ニューラル機械翻訳が使われたのはGoogleだけではありませんでした。ニューラル機械翻訳は以前のものよりもはるかに優れていたため、その数年後には、アメリカの企業も中国の企業も、Microsoft、Facebook、Tencent、Baiduなど、絶対に誰もがニューラル機械翻訳システムを使うようになりました。これらは単に遥かに優れたシステムだったからです。
これは驚くべき成功でした。Googleシステムのような統計的機械翻訳システムは、約10年間にわたって開発され、何百人もの人々が取り組み、何百万行ものコードがあり、特定の言語や言語ペアのために多くのハックが組み込まれていました。しかし、シンプルで小さなニューラル機械翻訳システムがはるかに優れた働きをしたのです。
それが実際に稼働し始めたとき、ニューヨーク・タイムズでその記事が掲載されました。少し称賛的な記事で、批判的な面もあるかもしれませんが、基本的には品質の違いが非常に明らかだったため、Googleが発表する前でさえ、誰もが「機械翻訳がとても良くなった」と気づいたことについて語っていました。
以上が今日の内容です。今日学んだのは、LSTMは強力であり、リカレントニューラルネットワークで何かをする場合、おそらくLSTMを使いたいということです。勾配のクリッピングについて知っておくべきであり、双方向LSTMはエンコーダには良いですが、新しいテキストを生成するには使用できません。エンコーダデコーダのニューラル機械翻訳システムは、分野を進歩させた素晴らしい新技術でした。