Loss が下がらないときのチェックリスト12選【Keras/TensorFlow】
深層学習の学習がうまく進まず、Loss(損失)が全く下がらない・むしろ増える という現象は初心者から上級者までよく遭遇する問題です。
この記事では、Keras/TensorFlow を使った学習で Loss が下がらないときに確認すべきポイントを チェックリスト形式で12項目 にまとめました。
✔ 学習率(learning rate)が高すぎないか?
最もよくある原因です。
特に Adam や SGD で lr=0.001 のままにしているとモデルやデータによっては高すぎる場合があります。
- 対策:
1e-4や5e-5まで落としてみる ReduceLROnPlateauを使う( LearningRateScheduler の実例 )
✔ データのスケーリングは正しく行われているか?
画像なら 0〜1 正規化を忘れていたり、正規化前後が混在すると Loss が爆発します。
image = image.astype("float32") / 255.0
データ前処理の基礎は fit と GradientTape の違いまとめ の記事にも関連解説があります。
✔ ラベルがズレている・one-hot が間違っている
- 分類でカテゴリ番号が間違っている
- one-hot の次元がクラス数と一致しない
- ラベルの型が int でない
✔ 損失関数と出力層の組み合わせが合っているか
| タスク | 出力層 | 損失関数 |
|---|---|---|
| 多クラス分類 | softmax | categorical_crossentropy |
| 多クラス(整数ラベル) | softmax | sparse_categorical_crossentropy |
| 二値分類 | sigmoid | binary_crossentropy |
✔ バッチサイズが大きすぎる
32〜128あたりが無難。特に小規模データは 8 or 16 が効くことも。
✔ モデルが複雑すぎる or 単純すぎる
- 過学習気味 → dropout / batchnorm を追加( CIFAR-10 での過学習チェック )
- 単純すぎ → 層を増やす / フィルタ数を増やす
基礎的な層の違いは Dense 層とは?畳み込みとの違い が参考になります。
✔ 重みの初期化が不適切
Dense や Conv2D をカスタムで書いていると初期化ミスが起こりがち。
kernel_initializer="he_normal" が安全なことが多いです。
✔ データシャッフルが正しく動いていない
時系列データで shuffle=True にすると逆に悪化することがあります。用途に合わせて調整してください。
✔ 9. 学習データが少なすぎる、偏っている
同じ画像ばかり → augmentation が必須。
✔ Callback が学習を止めすぎている
EarlyStopping が「patience=1」など厳しすぎる設定だとモデルが育ちません。 ログを残したい場合は CSVLogger の使い方 で記録方法を解説しています。
✔ データのラベルと画像が対応していない
意外と多い致命的ミス。フォルダ名のタイポなど。
✔ グラデーションが消失している / 爆発している
深いモデルで Relu が多いと勾配消失が起こることがあります。
- BatchNorm を挟む
- Mish / GELU を試す
- Mixed Precision で改善する場合も
まとめ
Loss が下がらない原因は多岐にわたりますが、多くの場合は 学習率・データ前処理・損失関数の設定ミス のどれかに収まります。
この記事のチェックリストを順番に確認することで、ほとんどのケースで原因を特定できるはずです。

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