🧠

中学生でもわかる機械学習の基礎【第6回】~時間を記憶するニューラルネットワーク~RNNの世界へ~

に公開

中学生でもわかる機械学習の基礎【第6回】

時間を記憶するニューラルネットワーク~RNNの世界へ~


📺 はじめに:映画を見ないと続きがわからない理由

想像してください。あなたが大好きな映画の、第5章だけを見始めたとします。

画面に出てくるのに......

  • キャラクターの背景や過去がわからない
  • なぜこのキャラクターが怒っているのか理由がわからない
  • 今、何が起きているのか理解できない

こういう経験ありませんか? 😅

これと同じ問題が、前までのニューラルネットワークにはありました。

前回学んだニューラルネットワークは、今の情報だけで判断しているのです。まるで毎回新しい映画を見ているみたいに。

❌ 普通のニューラルネットワーク
  
  入力1 → [脳] → 出力1  (前の情報は捨てる)
  
  入力2 → [脳] → 出力2  (前の情報は捨てる)
  
  入力3 → [脳] → 出力3  (前の情報は捨てる)
  
  毎回リセット!記憶がない!

でも、実世界のデータは違います

  • 文章は前の単語に影響される
  • 会話は前の話題に関連している
  • ゲームは前のターンの状態が大事

「ああ、だから記憶が必要なんだ!」 ← こう気づくことが大事です。

そこで登場するのが RNN(リカレントニューラルネットワーク) です!


🎯 第1章:RNNって何?

1-1. RNNの基本的な考え方

RNN は「リカレント」という言葉が入っています。これは何を意味するのか?

「リカレント」= 何度も繰り返される、戻ってくる

つまり、RNNは 自分自身に情報を戻す循環するニューラルネットワークなのです!

✅ RNNのイメージ

    ┌─────────────────┐
    │                 │
    ▼                 │
  入力1 → [脳🧠] → 出力1
             ▲        │
             │        │
             └────────┘
          「前の情報を覚えている!」

    ┌─────────────────┐
    │                 │
    ▼                 │
  入力2 → [脳🧠] → 出力2
             ▲        │
             │        │
             └────────┘
          「前の状態を使う!」

1-2. 会話AIの例で理解しよう

あなたが AI と会話しているとします。

あなた:「こんにちは」
AI:「こんにちは!」

あなた:「今、何時ですか?」
AI:「今は15時です」  ← 「こんにちは」の情報を使って
                        丁寧な返答をしている

もし AI が記憶を持たなかったら......

あなた:「こんにちは」
AI:「こんにちは」

あなた:「今、何時ですか?」
AI:「時刻情報がありません」  ← 前の文脈を忘れている!

RNNは 「前の状態を次の判断に使う」 ことができるので、こういう自然な会話ができるのです。


🧮 第2章:RNNの仕組みを学ぼう

2-1. 「隠れ状態」という記憶装置

RNNには 「隠れ状態」 という特別な部分があります。

「隠れ状態」読み方:かくれじょうたい

これは何かというと......コンピューターの記憶メモ帳 です。

┌──────────────────────────────┐
│   RNNの脳の中                │
│                              │
│  ┌────────────────┐         │
│  │  隠れ状態      │ ← 記憶メモ│
│  │  (h と書く)    │         │
│  └────────────────┘         │
│           ▲                  │
│           │                  │
│   前のターンからの          │
│   情報が流れてくる          │
└──────────────────────────────┘

具体例:カレーライスの調理

あなたがカレーを作るときのことを思い出してください。

ターン1:玉ねぎを切って炒める
  → 「甘い香りがする」を覚える

ターン2:じゃがいもを切って加える
  → 「前に炒めた玉ねぎの味」を思い出しながら
     「今の硬さをチェック」

ターン3:カレールーを加える
  → 「玉ねぎとじゃがいもの状態」を思い出しながら
     「ルーの量を決める」

RNNの隠れ状態も同じ!

ターン1:入力x₁(玉ねぎ)
  → 隠れ状態h₁に「玉ねぎのデータ」を保存
  
ターン2:入力x₂(じゃがいも)
  → h₁の情報を使いながら、h₂に更新
  
ターン3:入力x₃(ルー)
  → h₂の情報を使いながら、h₃に更新

2-2. RNNの3つの大事な部分

     ┌─────────────────────┐
     │   RNNの全体図       │
     └─────────────────────┘

入力層          隠れ層              出力層
(データが      (処理の中心)        (答え)
 入ってくる)

x₁ ──┐         ┌──────┐
     ├──→【U】→│      │         ┌──────┐
h₀ ──┤         │ 隠れ │→【W】→ │ 出力 │
     ├──→【V】→│ 状態 │         └──────┘
     │         │  h   │
     │         └──────┘
     └─────────────────┘

RNNには 3つの重要なパーツ があります:

パーツ 役割 例え
U(ユー) 入力を処理する 玉ねぎを切る包丁
V(ブイ) 前の状態を処理する 前のターンの料理を思い出す
W(ダブリュー) 出力を作る カレーの味を完成させる

2-3. RNNの簡単な計算式

画像に出ていた式を、簡単に説明します。

h_t = f(U × x_t + V × h_{t-1} + b)

これを日本語で説明すると......

「今の隠れ状態 = 関数(今の入力を処理 + 前の状態を処理 + バイアス)」

さらに簡単にすると:

新しい記憶 = 今のデータ + 前の記憶 + 調整値

ターン別で見ると:

ターン1:
  前の記憶h₀ = 0(最初は空)
  今のデータx₁ = 「玉ねぎ」
  
  新しい記憶h₁ = f(U × x₁ + V × 0 + b)
             = f(「玉ねぎ」を処理 + 前は何もない)
             = 「玉ねぎの情報」を保存


ターン2:
  前の記憶h₁ = 「玉ねぎの情報」
  今のデータx₂ = 「じゃがいも」
  
  新しい記憶h₂ = f(U × x₂ + V × h₁ + b)
             = f(「じゃがいも」を処理 + 「玉ねぎの情報」を思い出す)
             = 「玉ねぎとじゃがいもの情報」を保存

2-4. なぜこんな計算をするの?

良い質問ですね! 🙋

RNNが情報を「足し算」で結合する理由は:

  • U × x_t:今の新しい情報
  • V × h_{t-1}:過去の大事な情報
  • これらを合わせて判断する

つまり、「新しい情報と過去の情報の両方を考える」 ためです!

例:文字列予測

「りんご」の次の文字を予測するAI

ター ン1:「り」を読んで
  → 「この単語は何かな?」と考える

ター ン2:「ん」を読んで
  → 「前は『り』だった。『り』の次が『ん』...」
     「『りん』で始まる単語は......」と予測を更新

ター ン3:「ご」を読んで
  → 「『りんご』か『りんご飯』か『りんご酒』か...」
     前2文字の情報を使って判断

最終出力:「『りんご』は果物だ!」

🎮 第3章:実例で学ぶRNN

3-1. ゲームキャラの動きの予測

あなたがゲーム開発者だとします。
キャラの「次のターンの行動」を AI が決めるとします。

ターン1:プレイヤーがキャラに「右に移動」と命令
  キャラの位置:(0, 0) → (1, 0)
  RNN内部:「右方向に移動しているな」と記憶

ターン2:プレイヤーがまた「右に移動」と命令
  キャラの位置:(1, 0) → (2, 0)
  RNN内部:「ずっと右に移動しているな」と
           「次も右に移動しそう」と予測

ターン3:プレイヤーが「上に移動」に変更
  キャラの位置:(2, 0) → (2, 1)
  RNN内部:「あ、今度は上だ。方向が変わった」と更新

時系列を覚えているから、
キャラは「スムーズに動く」ように見える!

この例で大事なのは:「前のターンを記憶している」 こと。

3-2. 天気予報の例

3日間の気温変化を予測する例

月曜日:気温20℃ 📊
  RNN:「気温が20℃だ」と記憶
  予測:「明日は......」

火曜日:気温22℃ 📈
  RNN:「月曜は20℃で、今日は22℃。上がってるね」と記憶
  予測:「明日も上がるかも」

水曜日:気温19℃ 📉
  RNN:「月曜20℃→火曜22℃→水曜19℃」の流れを見て
        「天気が変わるサイン?」と気づく
  予測:「金曜日の気温は......」

このように、複数ターンの流れから予測が良くなります!

3-3. テキスト予測(LINEの自動返信)

あなたのスマホの LINE の自動返信機能を知ってますか?

友達:「これ見た?」
AI:「見ました!」

友達:「どう思った?」
AI:「面白かった」  ← 前の文脈を考えて返信

友達:「本当に?」
AI:「本当です」 ← 流れから「疑いを払拭する返信」を選ぶ

RNNはこの「流れに沿った返信」ができるから、自然な会話になるのです。


📐 第4章:数式に慣れよう(超簡単版)

4-1. 数式を分解して読む

画像に出ていた式をもう一度見ます:

h_t = f(U·x_t + V·h_{t-1} + b)

それぞれの記号を説明します:

記号 読み方 意味 例え
h_t エイチ ティー t番目のターンの隠れ状態 今の記憶メモ帳
x_t エックス ティー t番目のターンの入力 今読んだ文字
h_{t-1} h_{t-1} 前のターンの隠れ状態 前の記憶メモ帳
U ユー 入力用の重み(行列) 入力を処理する能力
V ブイ 前の状態用の重み 過去を思い出す能力
b ビー バイアス(調整値) 微調整ツール
f( ) エフ 活性化関数 脳の活動の仕組み

4-2. ステップバイステップで計算

実例:数字を足す例

ターン1:
  入力x₁ = 3
  前の記憶h₀ = 0
  
  計算:U × 3 + V × 0 + b
       = 2 × 3 + 1 × 0 + 0
       = 6
  新しい記憶h₁ = 6


ターン2:
  入力x₂ = 5
  前の記憶h₁ = 6
  
  計算:U × 5 + V × 6 + b
       = 2 × 5 + 1 × 6 + 0
       = 10 + 6
       = 16
  新しい記憶h₂ = 16


ターン3:
  入力x₃ = 2
  前の記憶h₂ = 16
  
  計算:U × 2 + V × 16 + b
       = 2 × 2 + 1 × 16 + 0
       = 4 + 16
       = 20
  新しい記憶h₃ = 20

見てください!記憶がずっと累積してます! 📈

4-3. 出力の式

もう1つの式が出力を計算します:

ŷ_t = g(W·h_t + c)

日本語では:

「t番目のターンの出力 = 関数(隠れ状態を処理 + 調整値)」

ŷ_t:予測された出力(「ŷ」はワイハット、推測値という意味)
W:隠れ状態を出力に変換する重み
c:出力用の調整値
g( ):出力層の活性化関数

4-4. 全体の流れをイラストで

🎬 RNNの完全な動き(3ターン)

ターン1:
  入力 x₁

  [U × x₁ + V × 0 + b] → h₁ 記憶保存!

  [W × h₁ + c] → ŷ₁ 出力!


ターン2:
  入力 x₂

  [U × x₂ + V × h₁ + b] → h₂ 記憶更新!
    ↓                        ↑
  [W × h₂ + c] → ŷ₂ 出力!  前の記憶を使う!


ターン3:
  入力 x₃

  [U × x₃ + V × h₂ + b] → h₃ 記憶更新!
    ↓                        ↑
  [W × h₃ + c] → ŷ₃ 出力!  前の記憶を使う!

💡 第5章:なぜRNNが大事なのか?

5-1. 通常のニューラルネット vs RNN

【普通のニューラルネット】
- 毎回独立した判断をする
- 前のデータと関係ない
- 例:写真から「猫か犬か」を判断(1回きり)

【RNN】
- 過去とのつながりを覚えている
- 時系列データが得意
- 例:「『猫が』『走る』『様子』」というように
      単語の順序で意味が決まるデータ

5-2. RNNが活躍する場面

✅ RNNが得意なこと

📝 テキスト生成
   「次の単語は何か」を予測
   → チャットボット、自動返信

🎵 音声認識
   「前の音から何を予測するか」
   → Siri、Google Assistant

💹 株価予測
   「過去の値動きから次の値段を予測」
   → 金融予測

📞 ビデオ分析
   「前のフレームから次のフレームを予測」
   → 動画の人物追跡

5-3. 記憶があるとなぜ強いのか?

例:「りんご」という単語を予測

【記憶なし(普通のNN)】
「ご」を見ても:「『ご』?単語が何か分からない」

【記憶あり(RNN)】
「り」→「りん」→「りんご」
「3文字の流れから『りんご(果物)』だ!」

記憶があると、
文脈から正確に予測できるのです!

🎓 第6章:まとめと次へのステップ

6-1. 今回学んだポイント

🔑 RNNの5つの重要概念

1. 「リカレント」=循環・繰り返し
   └ 自分自身に情報を戻す構造

2. 「隠れ状態」=記憶メモ帳
   └ 前のターンの情報を保存する場所

3. 「U・V・W」=3つの処理
   └ 入力・記憶・出力をそれぞれ処理

4. 「時系列」=順序が大事
   └ 単語の順序、時間の流れが意味を持つ

5. 「記憶を継続」=強力な予測
   └ 過去と現在をつなぐから正確になる

6-2. RNNの弱点(次の章への予告)

RNNには実は弱点があります。

⚠️ RNNの課題

問題1:「昔のことを忘れてしまう」
  → 最初のデータが後ろの方で影響しなくなる

問題2:「計算が遅い」
  → ターンごとに計算するから時間がかかる

問題3:「勾配消失問題」
  → 学習がうまくいかないことがある

これを解決するのが LSTM(次回以降で!) です。

6-3. あなたへのチャレンジ

もう一度、この例を考えてみてください:

友達:「昨日のテスト、どうだった?」
あなた:「まあまあだった」
友達:「何点取った?」
あなた:「85点」
友達:「すごい!」
あなた:「ありがとう」

「あなた」のセリフが友達の質問に合わせて変わってますよね?

これが RNNの力です!💪


📚 用語集

用語 読み 意味
RNN アールエヌエヌ リカレントニューラルネットワーク
隠れ状態 かくれじょうたい ニューラルネットの記憶
リカレント - 循環する、何度も繰り返される
時系列データ じけいれつデータ 時間順に並んだデータ
活性化関数 かつせいかかんすう ニューロンの活動を制御する関数
バイアス - 調整値、微調整ツール
行列 ぎょうれつ 数字を表に並べたもの

🎯 次回への準備

次の第7回では、「LSTM:より強い記憶を持つRNN」を学びます。

  • 隠れ状態だけでは不十分なことがわかります
  • 「セルの状態」という新しい概念
  • 「ゲート」という選別機構

お楽しみに! 🚀


👨‍🏫 もっと学びたい人へ

実装してみたい! という人は:

  • Python の PyTorch や TensorFlow を調べてみてください
  • 最初は「MNIST(手書き数字)」や「IMDb(映画レビュー)」分類が簡単です

数学をもっと深く学びたい! という人は:

  • 大学の「深層学習」や「自然言語処理」の教科書
  • 論文:Hochreiter & Schmidhuber (1997) "Long Short-Term Memory"

次の記事への質問・感想は?
コメント欄で教えてください!🙏


このシリーズは「数学が苦手な人でも機械学習が理解できる」ことを目指しています。
わかりにくい部分があったら、ぜひフィードバックをお願いします!
📬

Discussion