📋 このステップで学ぶこと
過学習(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がある
×
artnasekai
#artnasekai #学習メモ