Kerasでモデルを学習させていると、こんな状況に出くわすことがあります。
- accuracyがずっと上がらない(0.1付近で止まる、など)
- lossが全然下がらない(最初から高いまま)
- 学習は進んでいるのにval_accuracyだけ伸びない
どれも原因が複数考えられるため、何から調べればいいか迷いがちです。
この記事では、よくある原因を12項目のチェックリストとして整理し、CIFAR-10での実験結果と合わせて解説します。
📘 この記事でわかること
- accuracyが上がらない・lossが下がらない、症状ごとの原因の違い
- よくある12の原因と、それぞれの確認・対処方法
- Kerasコードでの確認ポイント
accuracyが上がらない vs lossが下がらない:何が違う?
まず症状を整理します。
| 症状 | 主な意味 | 最初に疑うこと |
|---|---|---|
| lossが下がらない | モデルが学習できていない | 学習率・損失関数・データの問題 |
| lossは下がるがaccuracyが上がらない | 分類がうまくいっていない | 損失関数とタスクの不一致・クラス不均衡 |
| train↑ val↓(乖離) | 過学習 | 正則化・Dropout・データ量の問題 |
| 両方とも全く動かない | 学習が始まっていない | 学習率が極端・モデルの構造的問題 |
まず最初に確認すべき5項目
- 学習率
- データ正規化
- 損失関数
- ラベル形式
- 過学習の有無
症状によって原因が異なるため、まずどのパターンかを確認してから以下のチェックリストを使ってください。
チェックリスト12選
チェック① 学習率が高すぎる・低すぎる
最も多い原因のひとつです。
- 高すぎる場合:lossがNaNになる、または発散してランダムな値になる
- 低すぎる場合:lossは下がるが非常に遅い、途中で止まる
# Adamのデフォルト学習率は0.001
model.compile(optimizer=keras.optimizers.Adam(learning_rate=0.001), ...)
対処:まず 0.001(Adamのデフォルト)で試し、lossが発散するなら 0.0001、遅すぎるなら 0.01 に変更します。
→ 学習率の比較実験については Adam学習率の最適値は?3パターンの比較実験【Keras】 も参照してください。
チェック② データの正規化ができていない
画像データの場合、ピクセル値(0〜255)をそのまま入力するとlossが下がりにくくなります。
# NG:正規化なし
x_train = x_train # 値が0〜255
# OK:0〜1に正規化
x_train = x_train.astype('float32') / 255.0
CIFAR-10では正規化の有無で精度に明確な差が出ます。まず確認すべき項目です。
チェック③ 損失関数とタスクが合っていない
損失関数の選択ミスはlossが下がらない原因として見落とされやすいです。
| タスク | 正しい損失関数 | よくあるミス |
|---|---|---|
| 多クラス分類(one-hot) | categorical_crossentropy | mseを使ってしまう |
| 多クラス分類(整数ラベル) | sparse_categorical_crossentropy | categorical_crossentropyを使う |
| 2値分類 | binary_crossentropy | categorical_crossentropyを使う |
→ 損失関数の詳細は Keras損失関数を一覧で解説|MSE・交差エントロピーの選び方 を参照してください。
チェック④ 過学習が起きている(train↑ val↓)
accuracyは上がっているのにval_accuracyが伸びない・下がる場合は過学習です。
確認方法:学習曲線(loss・accuracy)をグラフで見る
import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'], label='train')
plt.plot(history.history['val_accuracy'], label='val')
plt.legend()
plt.show()
対処:Dropout追加・L2正則化・データ拡張・EarlyStoppingなど。
→ CIFAR-10で学ぶ:過学習(オーバーフィッティング)の判定方法と実践的対策 も参照してください。
チェック⑤ バッチサイズが大きすぎる
バッチサイズが大きいと、勾配が平均化されて更新が鈍くなり、汎化性能が落ちることがあります。
# 256は大きすぎる場合がある
model.fit(x_train, y_train, batch_size=256, ...)
# 64が多くのタスクで無難な出発点
model.fit(x_train, y_train, batch_size=64, ...)
→ バッチサイズを変えると精度はどう変わる?(16 vs 64 vs 256)【Keras×CIFAR-10実験】 で実験結果を確認できます。
チェック⑥ エポック数が少なすぎる
学習が収束する前に終わっている場合、lossはまだ下がっている途中です。
確認方法:最後のエポックでlossがまだ下がり続けているかを確認する
# EarlyStoppingで自動的に適切なエポック数を見つける
early_stop = keras.callbacks.EarlyStopping(
monitor='val_loss', restore_best_weights=True
)
patienceなどの詳細な設定はチェック⑫を参照してください。
→ EarlyStoppingで過学習防止:精度低下の原因と対策 を参照してください。
チェック⑦ モデルの表現力が足りない(underfitting)
シンプルすぎるモデルは、データの複雑さを学習しきれません。
症状:train・val両方のaccuracyが低いまま
対処:層を増やす・ユニット数を増やす・より複雑なモデルに変更する
# 表現力が低い例
model.add(Dense(16, activation='relu'))
# 改善例
model.add(Dense(128, activation='relu'))
model.add(Dense(128, activation='relu'))
チェック⑧ 活性化関数が合っていない
出力層の活性化関数が間違っていると、どれだけ学習してもaccuracyが上がりません。
| 層の役割 | 正しい活性化関数 |
|---|---|
| 隠れ層(中間層) | relu(基本)、gelu |
| 多クラス分類の出力層 | softmax |
| 2値分類の出力層 | sigmoid |
| 回帰の出力層 | linear(なし) |
チェック⑨ 重みの初期化が不適切
活性化関数がReLUなのにglorot_uniform(Xavier初期化)を使っていると、学習初期のlossが高止まりすることがあります。
# ReLU系にはhe_normalが推奨
Dense(128, activation='relu', kernel_initializer='he_normal')
→ glorot_uniformとhe_normalの違いをCNNで比較 を参照してください。
チェック⑩ オプティマイザの選択
SGDはAdamに比べて収束が遅く、デフォルト設定ではlossが下がりにくい場合があります。
# SGDは学習率の調整が必要
optimizer = keras.optimizers.SGD(learning_rate=0.01, momentum=0.9)
# まず試すならAdam
optimizer = keras.optimizers.Adam(learning_rate=0.001)
→ optimizerを変えると精度はどう変わる?(Adam vs SGD vs RMSprop) で比較実験の結果を確認できます。
チェック⑪ データのラベル形式が間違っている
one-hotエンコードが必要な損失関数に整数ラベルをそのまま渡している、またはその逆のケースです。
# sparse_categorical_crossentropyには整数ラベル
y_train.shape # (50000,) ← OK
# categorical_crossentropyにはone-hotラベル
y_train = keras.utils.to_categorical(y_train, 10)
y_train.shape # (50000, 10) ← OK
チェック⑫ コールバックの設定が厳しすぎる
EarlyStoppingや ReduceLROnPlateau の patience を小さく設定しすぎると、
本来まだ改善できるタイミングで学習が止まったり学習率が下がったりしてしまいます。
# patienceが小さすぎる例
EarlyStopping(patience=1) # 1エポックで判断してしまう
# 推奨
EarlyStopping(patience=10, restore_best_weights=True)
ReduceLROnPlateau(patience=5, factor=0.5)
→ 【Keras】EarlyStopping の使い方|patience・monitor の設定と誤作動の原因 を参照してください。
まとめ
症状別に最初に確認すべき項目をまとめます。
| 症状 | まず確認すること |
|---|---|
| lossが全く下がらない | ①学習率 ②正規化 ③損失関数 |
| lossは下がるがaccuracyが上がらない | ③損失関数 ⑧活性化関数 ⑪ラベル形式 |
| 学習は進むがval_accuracyが伸びない | ④過学習 ⑥エポック数 ⑫コールバック設定 |
| train・val両方低い | ⑦モデル表現力 ⑨重み初期化 ⑩オプティマイザ |
複数の原因が重なることも多いため、1つ変更したら必ず学習曲線を確認しながら進めるのがポイントです。

0 件のコメント:
コメントを投稿