はじめに
これまで私たちは、TF-IDFやBM25といったアルゴリズムを学び、単語の「重要度」や「レア度」に基づいて文書の関連性をスコアリングする技術を探求してきました。これらは非常に強力ですが、一つの根本的な限界を抱えています。
それは、「単語の順序を考慮しない(Bag-of-Words)」 という点です。
「犬が人を噛んだ」と「人が犬を噛んだ」では、使われている単語は同じでも意味は全く異なります。従来のモデルでは、この違いを捉えることが困難でした。
自然言語処理の世界に本当の意味での革命が起きたのは、機械が 「順序」 、すなわち 「文脈」 を理解し始めた時です。その中心的な役割を果たしたのが、今回解説する RNN(Recurrent Neural Network) であり、それを応用した RNN言語モデル(RNNLM) です。
この記事は、二部構成になっています。
- 【初心者編】 では、数式を一切使わず、RNNLMが「なぜ革命だったのか」「何がすごいのか」を、直感的なイメージと例え話で完全に理解します。
- 【応用編】 では、その内部で何が行われているのか、具体的な数式とアーキテクチャを追いながら、RNNLMの仕組みを技術的に解き明かしていきます。
この長い旅を終える頃には、あなたは現代の自然言語処理技術の礎を築いた、この美しいアイデアの虜になっているはずです。
【初心者編】RNNLMの核心を直感でつかむ
1. そもそも「言語モデル」って何?
RNNの話に入る前に、まず「言語モデル」という言葉を理解しましょう。
言語モデル = "それっぽい"文章を生成・評価するためのモデル
もっと簡単に言えば、「次に来る単語を予測するモデル」 のことです。
例えば、「今日の天気はとても良いので、公園に__」という文章があった時、__には「行こう」「散歩しよう」といった単語が来そうだと、私たちは自然に予測できますよね。
この「次に来る単語の予測」を、コンピュータにやらせるのが言語モデルの役割です。この予測精度が高ければ高いほど、そのモデルは「言語をよく理解している」と言えます。
2. RNNの登場:機械が「記憶」を手に入れた日
従来の言語モデル(N-gramモデルなど)にも、次に来る単語を予測する機能はありました。しかし、それらは非常に「忘れっぽい」という欠点がありました。せいぜい2〜3個前の単語までしか覚えていられないのです。
ここで革命を起こしたのがRNN (Recurrent Neural Network) です。
RNNの最大の特徴は、たった一つ。「記憶(Memory)」 を持つことです。
RNNは、文章を単語の集まりとしてではなく、単語の連続した流れ(シーケンス) として扱います。そして、単語を一つ読むたびに、「これまでの話の要約」 を更新し、次の単語を読むときにその要約を参考にします。
(出典: "A friendly introduction to Recurrent Neural Networks" by Luis Serrano)
これを、私たちが小説を読むときの体験に例えてみましょう。
-
1単語目: 主人公の名前「アレックス」が登場。
- RNNの記憶:「主人公はアレックス」
-
2単語目以降: 「は、古い城に住んでいた。」という文章が続く。
- RNNの記憶:「主人公のアレックスは、古い城に住んでいる」
-
ずっと後: 「彼の故郷は…」という文章が出てくる。
- この「彼」が誰を指すか?私たちは文脈から「アレックス」のことだと分かります。RNNも、ずっと保持してきた 「記憶(これまでの話の要約)」 を頼りに、「彼」がアレックスを指すことを理解しようとします。
この「過去の情報を記憶し、未来の予測に活かす」という仕組みこそ、RNNが革命的だった理由です。
3. RNNLMはどうやって文章を作るのか?
では、この「記憶」を持つRNNは、どうやって次々と単語を予測し、文章を生成していくのでしょうか?
そのプロセスは、まるで連想ゲームのようです。
- スタート: 最初に「私」という単語を与えます。
- 予測1: RNNは「私」を読み込み、記憶を更新し、次に最も来そうな単語として「は」を予測(出力)します。
- 予測2: 次に、今予測した「は」を、あたかも最初からそこにあったかのようにRNNに再び入力します。RNNは「私」「は」という文脈(記憶)を頼りに、次に「猫」を予測します。
- 予測3: さらに、今予測した「猫」を入力します。RNNは「私は猫」という文脈から、次に「が」を予測します。
- 予測4: さらに「が」を入力し、「私は猫が」という文脈から「好き」を予測します…。
このように、「予測した単語を次の入力に使う」 というループを繰り返すことで、RNNLMは次々と"それっぽい"文章を生成していくことができるのです。このシンプルかつ強力なアイデアが、機械による自然な文章生成への扉を開きました。
【応用編】RNNLMの内部構造を解き明かす
さて、ここからはRNNLMのブラックボックスを開け、その内部でどのような計算が行われているのかを、数式と共に見ていきましょう。
4. RNNLMのアーキテクチャ
RNNLMは、大きく分けて3つの層から構成されています。
- 入力層 (Input Layer): 単語をベクトル(数字の列)に変換して、ネットワークに入力します。
- 隠れ層 (Hidden Layer): RNNの心臓部。ここで「記憶」の計算が行われます。
- 出力層 (Output Layer): 次に来る単語の確率分布を出力します。
(出典: "The Unreasonable Effectiveness of Recurrent Neural Networks" by Andrej Karpathy)
上図の緑色の箱が隠れ層です。時刻tの隠れ層は、時刻tの入力x_tと、一つ前の時刻t-1の隠れ層の出力h_{t-1} の2つを受け取っていることに注目してください。
この 「前の自分からの出力」 こそが、「記憶」の正体です。
5. 中核となる数式
RNNLMの動きは、主に2つの数式で記述できます。
式1:隠れ状態(記憶)の更新
$$
h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t + b_h)
$$
- $h_t$: 時刻t(今)の隠れ状態(記憶)。
- $h_{t-1}$: 時刻t-1(一個前)の隠れ状態。
- $x_t$: 時刻t(今)の入力単語のベクトル。
- $W_{hh}, W_{xh}, b_h$: ネットワークが学習する重みとバイアス(パラメータ)。
- $\tanh$: 活性化関数。計算結果を-1から1の間に収める役割。
この式が言っているのは、「今の記憶($h_t$)は、一個前の記憶($h_{t-1}$)と、今の入力($x_t$)を、いい感じに混ぜ合わせて(重みをかけて足して)作る」 ということです。これが、記憶が単語を読むたびに更新されていく仕組みです。
式2:次の単語の予測
$$
y_t = \text{softmax}(W_{hy} h_t + b_y)
$$
- $y_t$: 時刻tにおける、次の単語の予測確率分布。
- $h_t$: 上で計算した、今の隠れ状態(記憶)。
- $W_{hy}, b_y$: これもネットワークが学習するパラメータ。
- $\text{softmax}$: 全ての単語のスコアを、合計が1になる確率に変換する関数。
こちらは、「更新された今の記憶($h_t$)を元に、語彙(全ての単語リスト)の中で、どの単語が次に来る確率が高いかを計算する」 という処理を表しています。
softmax関数の出力は、「猫: 30%, 犬: 15%, ...」のような確率のリストになり、この中で最も確率の高い単語が、次の単語として予測されます。
6. 課題、そして次なる進化へ
このRNNLMは革命的でしたが、完璧ではありませんでした。最大の課題は 「長期記憶の喪失」 です。
文章が非常に長くなると、隠れ状態 $h_t$ を更新し続ける過程で、はるか昔の情報(例えば、小説の冒頭に出てきた登場人物の名前など)が、だんだんと薄れて消えていってしまいます。これを勾配消失問題と呼びます。
この課題を克服するために、RNNの隠れ層をより複雑で高性能なゲート付きのユニットに置き換えた、LSTM (Long Short-Term Memory) や GRU (Gated Recurrent Unit) が発明されました。
そして、この流れはさらに、文中のどの単語に注目すべきかを動的に切り替えるAttention機構を経て、現代の自然言語処理を席巻するTransformer(BERTやGPTの基礎技術)へと繋がっていきます。
まとめ
今回は、自然言語処理に革命をもたらしたRNNLMについて、その直感的なアイデアから具体的な数式までを旅してきました。
- RNNLMの核心は「記憶」: 過去の文脈を隠れ状態として保持し、未来の予測に活かす。
- 文章生成は「連想ゲーム」: 予測した単語を次の入力に使うループで文を紡いでいく。
- 数式の意味: 記憶の更新式と、次の単語の予測式の2つが中心的な役割を担う。
- 進化の系譜: RNNLMの登場が、LSTM、Attention、そしてTransformerといった現代技術への道を切り開いた。
TF-IDFが単語の「点」を見ていたとすれば、RNNLMは単語を結ぶ「線」を見始めました。この「点」から「線」へのパラダイムシフトこそが、機械が真に言語を理解するための一大飛躍だったのです。