中学生でもわかる機械学習の基礎【第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