STEP 14:ドロップアウト

🎲 STEP 14: ドロップアウト(Dropout)

過学習を防ぐ「ランダムにニューロンを無効化」するテクニック

📋 このステップで学ぶこと

  • 過学習(Overfitting)とは何か?
  • ドロップアウトの仕組み
  • なぜドロップアウトが効果的なのか?
  • Kerasでの実装方法
  • ドロップアウト率の設定指針
  • バッチ正規化との組み合わせ

😰 1. 過学習(Overfitting)とは?

1-1. 過学習の定義

過学習(Overfitting)とは、モデルが訓練データに過度に適合してしまい、未知のデータに対する予測精度が低下する現象です。

📚 テスト勉強の例え

適切な学習:
過去問の「解き方のパターン」を理解する
→ 初見の問題も解ける

過学習:
過去問の「答え」を丸暗記する
→ 同じ問題は解けるが、初見の問題は解けない

ニューラルネットワークも同じ!
訓練データを「暗記」すると、新しいデータに対応できなくなります。

1-2. 過学習の見分け方

以下の図は横スクロールできます。

【過学習の典型的なパターン】 損失(Loss) │ │ 訓練損失 検証損失 │ ↓ ↓ │ ╲ ╱────── ← 検証損失が上昇し始める │ ╲ ╱ │ ╲ ╱ │ ╲ ╱ │ ╲ ╱ │ ╲ ╱ │ ╲ ╱ │ ╲╱ │ ╲ │ ╲────────── ← 訓練損失は下がり続ける │ └──────────────────────→ エポック ↑ この時点から過学習が始まっている! 【判断基準】 ✅ 正常:訓練損失と検証損失が両方下がる ⚠️ 過学習:訓練損失は下がるが、検証損失が上がり始める

1-3. 過学習の原因

⚠️ 過学習が起きやすい条件
  • モデルが複雑すぎる:パラメータ数が多すぎる
  • 訓練データが少ない:十分なパターンを学習できない
  • 訓練しすぎる:エポック数が多すぎる
  • 特徴量が多すぎる:ノイズまで学習してしまう

🎲 2. ドロップアウトとは?

2-1. ドロップアウトの基本アイデア

ドロップアウト(Dropout)は、学習時にランダムにニューロンを無効化(ドロップ)する正則化手法です。

✅ ドロップアウトの仕組み

1. 学習の各ステップで、指定した割合のニューロンをランダムに選ぶ
2. 選ばれたニューロンの出力を0にする(無効化)
3. 残りのニューロンだけで学習を進める
4. 次のステップでは、また別のニューロンがランダムに選ばれる

2-2. ドロップアウトの視覚的理解

以下の図は横スクロールできます。

【ドロップアウトなし(通常のネットワーク)】 入力層 隠れ層 出力層 ○──────────○──────────○ ○──────────○──────────○ ○──────────○──────────○ ○──────────○──────────○ すべてのニューロンが常に活性化 【ドロップアウトあり(学習時)】 ステップ1: ステップ2: 入力層 隠れ層 出力層 入力層 隠れ層 出力層 ○──────────○──────────○ ○──────────✗──────────○ ○──────────✗──────────○ ○──────────○──────────○ ○──────────○──────────○ ○──────────○──────────○ ○──────────○──────────○ ○──────────✗──────────○ ✗ = ドロップされたニューロン(出力が0) 毎回異なるニューロンがランダムに無効化される → 特定のニューロンに依存しない「頑健な」特徴を学習

2-3. なぜドロップアウトが効くのか?

👥 チーム作業の例え

ドロップアウトなし:
毎回同じ5人のチームで仕事
→ 特定のメンバーに依存してしまう
→ そのメンバーがいないと仕事が回らない

ドロップアウトあり:
毎回ランダムに3人が欠席
→ 誰がいなくても仕事ができるようになる
→ 各メンバーが自立して働けるようになる

ニューロンも同じ!
特定のニューロンに頼らず、各ニューロンが独立して有用な特徴を学習します。

📌 ドロップアウトの効果
  • アンサンブル効果:異なるサブネットワークを同時に学習(疑似的なアンサンブル)
  • 共適応の防止:ニューロン同士の過度な依存関係を防ぐ
  • 頑健な特徴学習:より汎化性能の高い特徴を学習

🔄 3. 訓練時と推論時の違い

3-1. 重要な違い

💡 ドロップアウトは訓練時のみ適用

訓練時:ニューロンをランダムにドロップ
推論時(予測時):すべてのニューロンを使用

3-2. スケーリングの問題

訓練時と推論時で、ニューロンの数が異なると出力のスケールが変わってしまいます。

【スケーリングの問題】 訓練時:ドロップアウト率 0.5(50%のニューロンを無効化) → 残りの50%のニューロンだけで出力を計算 推論時:すべてのニューロンを使用 → 出力が訓練時の約2倍になってしまう! 【解決策:Inverted Dropout(Kerasのデフォルト)】 訓練時に、残っているニューロンの出力を (1 / (1 – dropout_rate)) 倍する 例:dropout_rate = 0.5 の場合 訓練時の出力 = 元の出力 × (1 / 0.5) = 元の出力 × 2 これにより、推論時に特別な処理が不要になる → Kerasでは自動的に処理されるので、意識する必要なし!

3-3. Kerasでの自動処理

✅ Kerasは自動的に処理

model.fit():ドロップアウトが適用される(訓練モード)
model.predict():ドロップアウトが無効(推論モード)
model.evaluate():ドロップアウトが無効(推論モード)

→ 特別なコードは不要!

💻 4. Kerasでの実装

4-1. Dropoutレイヤーの基本

📝 コードの解説

Dropout(rate)

rate:ドロップアウト率(0〜1)
例:rate=0.5 → 50%のニューロンをランダムに無効化

from tensorflow.keras.layers import Dropout # Dropoutレイヤーの追加 Dropout(0.5) # 50%のニューロンをドロップ Dropout(0.3) # 30%のニューロンをドロップ Dropout(0.2) # 20%のニューロンをドロップ

4-2. モデルへの組み込み

from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Flatten from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical # データ準備 (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train / 255.0 X_test = X_test / 255.0 y_train = to_categorical(y_train) y_test = to_categorical(y_test) # ドロップアウトなしのモデル model_without_dropout = Sequential([ Flatten(input_shape=(28, 28)), Dense(512, activation=’relu’), Dense(256, activation=’relu’), Dense(128, activation=’relu’), Dense(10, activation=’softmax’) ]) # ドロップアウトありのモデル model_with_dropout = Sequential([ Flatten(input_shape=(28, 28)), Dense(512, activation=’relu’), Dropout(0.5), # ★ 50%ドロップアウト Dense(256, activation=’relu’), Dropout(0.5), # ★ 50%ドロップアウト Dense(128, activation=’relu’), Dropout(0.3), # ★ 30%ドロップアウト Dense(10, activation=’softmax’) # 出力層にはDropoutを入れない ])
⚠️ 重要:出力層にはDropoutを入れない

出力層にDropoutを入れると、予測結果が不安定になります。
Dropoutは隠れ層の間に入れましょう。

4-3. 効果の比較実験

# 両モデルをコンパイル model_without_dropout.compile( optimizer=’adam’, loss=’categorical_crossentropy’, metrics=[‘accuracy’] ) model_with_dropout.compile( optimizer=’adam’, loss=’categorical_crossentropy’, metrics=[‘accuracy’] ) # 訓練(ドロップアウトなし) print(“=== ドロップアウトなし ===”) history_without = model_without_dropout.fit( X_train, y_train, epochs=20, batch_size=128, validation_split=0.2, verbose=0 ) # 訓練(ドロップアウトあり) print(“=== ドロップアウトあり ===”) history_with = model_with_dropout.fit( X_train, y_train, epochs=20, batch_size=128, validation_split=0.2, verbose=0 ) # 結果比較 print(“\n=== 結果比較 ===”) print(“ドロップアウトなし:”) print(f” 訓練精度: {history_without.history[‘accuracy’][-1]:.4f}”) print(f” 検証精度: {history_without.history[‘val_accuracy’][-1]:.4f}”) print(“\nドロップアウトあり:”) print(f” 訓練精度: {history_with.history[‘accuracy’][-1]:.4f}”) print(f” 検証精度: {history_with.history[‘val_accuracy’][-1]:.4f}”)
実行結果:
=== 結果比較 ===
ドロップアウトなし:
  訓練精度: 0.9998  ← 訓練データにほぼ完璧に適合
  検証精度: 0.9756  ← 検証精度との差が大きい(過学習の兆候)

ドロップアウトあり:
  訓練精度: 0.9823  ← 訓練精度は少し低い
  検証精度: 0.9801  ← 検証精度との差が小さい(汎化性能が高い)

→ ドロップアウトにより、過学習が抑制されている!

⚙️ 5. ドロップアウト率の設定指針

5-1. 一般的な指針

レイヤーの種類 推奨ドロップアウト率 備考
入力層の直後 0.1〜0.2 入力情報を失いすぎないように
隠れ層(全結合層) 0.3〜0.5 最も一般的な設定
CNN(畳み込み層後) 0.2〜0.3 空間情報を保持するため低め
RNN/LSTM 0.2〜0.5 recurrent_dropoutも検討
出力層 使用しない 予測が不安定になる

5-2. 調整のコツ

📌 ドロップアウト率の調整方法
  • 過学習が強い場合:ドロップアウト率を上げる(0.5 → 0.6)
  • 学習が進まない場合:ドロップアウト率を下げる(0.5 → 0.3)
  • 層が深い場合:後半の層で率を下げる傾向
  • データが多い場合:ドロップアウトの必要性が減る

5-3. レイヤーごとに異なる率を設定

# 層ごとに異なるドロップアウト率 model = Sequential([ Flatten(input_shape=(28, 28)), Dense(512, activation=’relu’), Dropout(0.5), # 最初の隠れ層後:高め Dense(256, activation=’relu’), Dropout(0.4), # 2番目の隠れ層後:やや高め Dense(128, activation=’relu’), Dropout(0.3), # 3番目の隠れ層後:低め Dense(10, activation=’softmax’) ]) # 層が深くなるにつれてドロップアウト率を下げるパターン

🔧 6. バッチ正規化との組み合わせ

6-1. 組み合わせの順序

STEP 13で学んだバッチ正規化と組み合わせる場合、順序が重要です。

📊 推奨される順序

Dense → BatchNormalization → Activation → Dropout

または

Dense(activation=’relu’) → BatchNormalization → Dropout

6-2. 実装例

from tensorflow.keras.layers import Dense, Dropout, BatchNormalization, Flatten # バッチ正規化 + ドロップアウトの組み合わせ model = Sequential([ Flatten(input_shape=(28, 28)), # パターン1: Dense → BN → Activation → Dropout Dense(512), BatchNormalization(), Activation(‘relu’), Dropout(0.5), # パターン2: Dense(activation) → BN → Dropout(シンプル版) Dense(256, activation=’relu’), BatchNormalization(), Dropout(0.4), Dense(128, activation=’relu’), BatchNormalization(), Dropout(0.3), Dense(10, activation=’softmax’) ])

6-3. 注意点

⚠️ 組み合わせ時の注意点
  • 両方使うと効果が薄れることも:バッチ正規化自体に正則化効果がある
  • 実験で確認:両方使う場合は、ドロップアウト率を低めに(0.2〜0.3)
  • どちらか一方でも十分:過学習が軽度なら、どちらか一方で対応

📝 STEP 14 のまとめ

✅ このステップで学んだこと
  • 過学習:訓練データに過度に適合し、汎化性能が低下する現象
  • ドロップアウト:学習時にランダムにニューロンを無効化する正則化手法
  • 訓練時のみ適用:推論時はすべてのニューロンを使用
  • 推奨率:隠れ層では0.3〜0.5、出力層には使用しない
  • 効果:特定のニューロンへの依存を防ぎ、頑健な特徴を学習
  • バッチ正規化との組み合わせ:BN → Activation → Dropoutの順序
💡 覚えておくべきコード
# ドロップアウトの基本的な使い方 from tensorflow.keras.layers import Dense, Dropout model = Sequential([ Dense(512, activation=’relu’, input_shape=(784,)), Dropout(0.5), # 隠れ層の後にDropoutを追加 Dense(256, activation=’relu’), Dropout(0.3), Dense(10, activation=’softmax’) # 出力層にはDropoutを入れない ])
🚀 次のステップへ

ドロップアウトを習得したので、次のSTEP 15ではEarly Stoppingとコールバックを学びます。

「いつ学習を止めるか」を自動で判断する、実務必須のテクニックです!

📝 練習問題

問題1 やさしい

ドロップアウトの適用タイミング

ドロップアウトが適用されるタイミングとして、正しいものを選んでください。

  • A. 訓練時のみ
  • B. 推論時のみ
  • C. 訓練時と推論時の両方
  • D. モデルのコンパイル時のみ
正解:A

ドロップアウトは訓練時のみ適用

【ドロップアウトの適用タイミング】 訓練時(model.fit()): → ドロップアウトが適用される → ニューロンがランダムに無効化される 推論時(model.predict(), model.evaluate()): → ドロップアウトは無効 → すべてのニューロンが使用される Kerasでは自動的に切り替わるので、 特別なコードは不要です。
問題2 やさしい

ドロップアウトを入れる位置

ドロップアウトを入れる位置として、適切でないものを選んでください。

  • A. 入力層と隠れ層の間
  • B. 隠れ層と隠れ層の間
  • C. 隠れ層と出力層の間
  • D. 出力層の後
正解:D

出力層の後にはDropoutを入れない

【Dropoutを入れる位置】 ✅ A. 入力層と隠れ層の間:OK(率は低めに) ✅ B. 隠れ層と隠れ層の間:OK(最も一般的) ✅ C. 隠れ層と出力層の間:OK(出力層の直前) ❌ D. 出力層の後:NG 出力層の後にDropoutを入れると、 予測結果自体がランダムに欠落してしまい、 予測が不安定になります。
問題3 ふつう

過学習の判断

以下の学習結果から、過学習が発生していると判断できるものを選んでください。

  • A. 訓練精度: 85%, 検証精度: 83%
  • B. 訓練精度: 99%, 検証精度: 75%
  • C. 訓練精度: 70%, 検証精度: 68%
  • D. 訓練精度: 92%, 検証精度: 90%
正解:B

訓練精度と検証精度の差が大きいと過学習

【各選択肢の分析】 A. 訓練: 85%, 検証: 83% → 差: 2% → 正常(差が小さい) B. 訓練: 99%, 検証: 75% → 差: 24% → 過学習!(訓練データに過度に適合) C. 訓練: 70%, 検証: 68% → 差: 2% → 正常(ただし精度が低い→未学習の可能性) D. 訓練: 92%, 検証: 90% → 差: 2% → 正常(良好な状態) 【過学習の判断基準】 ・訓練精度が非常に高い(95%以上) ・検証精度との差が大きい(10%以上) ・検証損失が上昇し始める
問題4 むずかしい

正しいモデル構造

以下のモデル構造のうち、最も適切なものを選んでください。

  • A. Dense(512) → Dropout(0.5) → Dense(256) → Dropout(0.5) → Dense(10, softmax) → Dropout(0.5)
  • B. Dense(512) → Dropout(0.5) → Dense(256) → Dropout(0.3) → Dense(10, softmax)
  • C. Dropout(0.5) → Dense(512) → Dropout(0.5) → Dense(256) → Dense(10, softmax)
  • D. Dense(512) → Dense(256) → Dense(10, softmax) → Dropout(0.5)
正解:B

各選択肢の問題点

A. Dense(512) → Dropout(0.5) → Dense(256) → Dropout(0.5) → Dense(10, softmax) → Dropout(0.5) ❌ 出力層の後にDropoutがある B. Dense(512) → Dropout(0.5) → Dense(256) → Dropout(0.3) → Dense(10, softmax) ✅ 正しい構造! ・隠れ層の後にDropout ・後半で率を下げている ・出力層にはDropoutなし C. Dropout(0.5) → Dense(512) → Dropout(0.5) → Dense(256) → Dense(10, softmax) ❌ 最初にDropoutがある(入力がない状態でDropout) D. Dense(512) → Dense(256) → Dense(10, softmax) → Dropout(0.5) ❌ 出力層の後にDropoutがある
📝

学習メモ

ディープラーニング基礎 - Step 14

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE