L2・Dropout・AdamWを組み合わせると過学習は防げる?【Keras×CIFAR-10実験】

投稿日:2026年5月7日木曜日 最終更新日:

AdamW CIFAR-10 CNN Dropout Google Colab Keras L2正則化 過学習 過学習対策

X f B! P L
L2・Dropout・AdamWを組み合わせると過学習は防げる?【Keras×CIFAR-10実験】 アイキャッチ画像

正則化を重ねれば重ねるほど良いのか?

過学習を防ぐ手段として、L2正則化・Dropout・AdamW はどれもよく知られています。でも、「全部まとめて使えば最強では?」と思ったことはありませんか?

今回はGoogle ColabとCIFAR-10を使い、この3つを単体・組み合わせの計5パターンで比較しました。正則化を重ねることで何が起きるのか、実験で確かめます。

📘 この記事でわかること

  • L2正則化・Dropout・AdamW それぞれ単体の効果の違い
  • 正則化を3つ重ねたときに何が起きるか
  • CIFAR-10ベースのCNNで最も効果的な正則化の選び方

3つの正則化手法のおさらい

手法 仕組み 設定箇所
L2正則化 重みの二乗和をlossに加算し、重みが大きくなりすぎるのを抑制 Conv2D・Dense の kernel_regularizer
Dropout 学習時にランダムにニューロンを無効化し、特定の特徴への依存を防ぐ Dense層の後に Dropout(rate) を追加
AdamW Adamの更新ルールとは独立に weight decay を適用する最適化アルゴリズム optimizer='adamw' で指定

L2正則化と AdamW はどちらも「重みを小さく保つ」働きがありますが、適用のタイミングと計算の仕方が異なります。L2はlossに直接加算、AdamWはoptimizerの更新ステップで独立に引き算します。


実験コード

使用環境はGoogle Colab(GPU:T4)、データセットはCIFAR-10です。正則化の有無・組み合わせ以外の条件はすべて同一にし、正則化手法の影響だけを取り出します。

環境準備(最初に一度だけ実行)

# ── 環境準備(最初に一度だけ実行)──────────────────────
!apt-get -y install fonts-ipafont-gothic
!rm -rf /root/.cache/matplotlib
!pip install -q japanize_matplotlib
print("環境準備完了")
実行結果をクリックして内容を開く
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  fonts-ipafont-mincho
The following NEW packages will be installed:
  fonts-ipafont-gothic fonts-ipafont-mincho
0 upgraded, 2 newly installed, 0 to remove and 42 not upgraded.
Need to get 8,237 kB of archives.
After this operation, 28.7 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fonts-ipafont-gothic all 00303-21ubuntu1 [3,513 kB]
Get:2 http://archive.ubuntu.com/ubuntu jammy/universe amd64 fonts-ipafont-mincho all 00303-21ubuntu1 [4,724 kB]
Fetched 8,237 kB in 0s (16.9 MB/s)
Selecting previously unselected package fonts-ipafont-gothic.
(Reading database ... 122354 files and directories currently installed.)
Preparing to unpack .../fonts-ipafont-gothic_00303-21ubuntu1_all.deb ...
Unpacking fonts-ipafont-gothic (00303-21ubuntu1) ...
Selecting previously unselected package fonts-ipafont-mincho.
Preparing to unpack .../fonts-ipafont-mincho_00303-21ubuntu1_all.deb ...
Unpacking fonts-ipafont-mincho (00303-21ubuntu1) ...
Setting up fonts-ipafont-mincho (00303-21ubuntu1) ...
update-alternatives: using /usr/share/fonts/opentype/ipafont-mincho/ipam.ttf to provide /usr/share/fonts/truetype/fonts-japanese-mincho.ttf (fonts-japanese-mincho.ttf) in auto mode
Setting up fonts-ipafont-gothic (00303-21ubuntu1) ...
update-alternatives: using /usr/share/fonts/opentype/ipafont-gothic/ipag.ttf to provide /usr/share/fonts/truetype/fonts-japanese-gothic.ttf (fonts-japanese-gothic.ttf) in auto mode
Processing triggers for fontconfig (2.13.1-4.2ubuntu5) ...
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 4.1/4.1 MB 62.3 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
  Building wheel for japanize_matplotlib (setup.py) ... done
環境準備完了

import・データ準備・モデル構築関数

import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import japanize_matplotlib
import time

# ── データ準備 ──────────────────────────────────────────
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
x_train = x_train.astype('float32') / 255.0
x_test  = x_test.astype('float32')  / 255.0

# ── モデル構築関数 ──────────────────────────────────────
def build_model(use_l2, use_dropout, name):
    reg = keras.regularizers.l2(1e-4) if use_l2 else None

    return keras.Sequential([
        keras.layers.Input(shape=(32, 32, 3)),
        keras.layers.Conv2D(64, (3, 3), activation='relu', padding='same',
                            kernel_regularizer=reg),
        keras.layers.MaxPooling2D((2, 2)),
        keras.layers.Conv2D(128, (3, 3), activation='relu', padding='same',
                            kernel_regularizer=reg),
        keras.layers.MaxPooling2D((2, 2)),
        keras.layers.GlobalAveragePooling2D(),
        keras.layers.Dense(128, activation='relu', kernel_regularizer=reg),
        keras.layers.Dropout(0.3) if use_dropout else keras.layers.Lambda(lambda x: x),
        keras.layers.Dense(10, activation='softmax'),
    ], name=name)

def compile_and_fit(model, use_adamw):
    optimizer = 'adamw' if use_adamw else 'adam'
    model.compile(optimizer=optimizer,
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    start = time.time()
    history = model.fit(x_train, y_train, epochs=30, batch_size=64,
                        validation_split=0.2, verbose=1)
    return history, time.time() - start
実行結果をクリックして内容を開く
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170498071/170498071 ━━━━━━━━━━━━━━━━━━━━ 324s 2us/step

5パターンの学習実行

# (name, use_l2, use_dropout, use_adamw)
configs = [
    ('A:なし',       False, False, False),
    ('B:L2のみ',     True,  False, False),
    ('C:Dropoutのみ',False, True,  False),
    ('D:AdamWのみ',  False, False, True),
    ('E:3種すべて',  True,  True,  True),
]
histories, times, scores = {}, {}, {}

for name, use_l2, use_dropout, use_adamw in configs:
    print(f"\n=== {name} ===")
    model = build_model(use_l2, use_dropout, name)
    h, t = compile_and_fit(model, use_adamw)
    s = model.evaluate(x_test, y_test, verbose=0)
    histories[name] = h
    times[name]     = t
    scores[name]    = s
    print(f"学習時間:{t:.1f}秒 test_accuracy:{s[1]:.4f}")
実行結果をクリックして内容を開く
=== A_none ===
Epoch 1/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 10s 9ms/step - accuracy: 0.2917 - loss: 1.8758 - val_accuracy: 0.3748 - val_loss: 1.6761
Epoch 2/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3990 - loss: 1.6201 - val_accuracy: 0.4421 - val_loss: 1.5263
Epoch 3/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4573 - loss: 1.4899 - val_accuracy: 0.4726 - val_loss: 1.4422
Epoch 4/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.4909 - loss: 1.3940 - val_accuracy: 0.4987 - val_loss: 1.3592
Epoch 5/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5194 - loss: 1.3251 - val_accuracy: 0.5267 - val_loss: 1.3022
Epoch 6/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5381 - loss: 1.2707 - val_accuracy: 0.5326 - val_loss: 1.2717
Epoch 7/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5535 - loss: 1.2356 - val_accuracy: 0.5601 - val_loss: 1.2159
Epoch 8/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5690 - loss: 1.1953 - val_accuracy: 0.5659 - val_loss: 1.1907
Epoch 9/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5793 - loss: 1.1652 - val_accuracy: 0.5517 - val_loss: 1.2180
Epoch 10/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5918 - loss: 1.1316 - val_accuracy: 0.5783 - val_loss: 1.1711
Epoch 11/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5978 - loss: 1.1117 - val_accuracy: 0.5865 - val_loss: 1.1279
Epoch 12/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6128 - loss: 1.0729 - val_accuracy: 0.6188 - val_loss: 1.0679
Epoch 13/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6207 - loss: 1.0531 - val_accuracy: 0.6092 - val_loss: 1.0966
Epoch 14/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6286 - loss: 1.0339 - val_accuracy: 0.6224 - val_loss: 1.0499
Epoch 15/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6388 - loss: 1.0084 - val_accuracy: 0.6318 - val_loss: 1.0254
Epoch 16/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6446 - loss: 0.9894 - val_accuracy: 0.6395 - val_loss: 1.0038
Epoch 17/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6506 - loss: 0.9728 - val_accuracy: 0.6401 - val_loss: 1.0044
Epoch 18/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6603 - loss: 0.9476 - val_accuracy: 0.6457 - val_loss: 0.9896
Epoch 19/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6661 - loss: 0.9324 - val_accuracy: 0.6388 - val_loss: 1.0111
Epoch 20/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6695 - loss: 0.9214 - val_accuracy: 0.6534 - val_loss: 0.9621
Epoch 21/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6750 - loss: 0.9045 - val_accuracy: 0.6538 - val_loss: 0.9621
Epoch 22/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6842 - loss: 0.8811 - val_accuracy: 0.6512 - val_loss: 0.9708
Epoch 23/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6871 - loss: 0.8722 - val_accuracy: 0.6736 - val_loss: 0.9170
Epoch 24/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6942 - loss: 0.8562 - val_accuracy: 0.6507 - val_loss: 0.9714
Epoch 25/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6997 - loss: 0.8415 - val_accuracy: 0.6742 - val_loss: 0.9022
Epoch 26/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7008 - loss: 0.8355 - val_accuracy: 0.6697 - val_loss: 0.9263
Epoch 27/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7069 - loss: 0.8184 - val_accuracy: 0.6676 - val_loss: 0.9227
Epoch 28/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7124 - loss: 0.8082 - val_accuracy: 0.6770 - val_loss: 0.9154
Epoch 29/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7145 - loss: 0.7950 - val_accuracy: 0.6772 - val_loss: 0.9125
Epoch 30/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7209 - loss: 0.7832 - val_accuracy: 0.6870 - val_loss: 0.8941
学習時間:122.7秒 test_accuracy:0.6842

=== B_l2 ===
Epoch 1/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 8s 9ms/step - accuracy: 0.2749 - loss: 1.9145 - val_accuracy: 0.3360 - val_loss: 1.7611
Epoch 2/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3853 - loss: 1.6773 - val_accuracy: 0.3957 - val_loss: 1.6441
Epoch 3/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4305 - loss: 1.5812 - val_accuracy: 0.4522 - val_loss: 1.5331
Epoch 4/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.4618 - loss: 1.5071 - val_accuracy: 0.4884 - val_loss: 1.4699
Epoch 5/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.4866 - loss: 1.4515 - val_accuracy: 0.4940 - val_loss: 1.4418
Epoch 6/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5057 - loss: 1.4031 - val_accuracy: 0.5007 - val_loss: 1.4116
Epoch 7/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 7ms/step - accuracy: 0.5185 - loss: 1.3692 - val_accuracy: 0.5289 - val_loss: 1.3486
Epoch 8/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5343 - loss: 1.3342 - val_accuracy: 0.5421 - val_loss: 1.3441
Epoch 9/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5451 - loss: 1.3090 - val_accuracy: 0.5560 - val_loss: 1.2910
Epoch 10/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5574 - loss: 1.2835 - val_accuracy: 0.5626 - val_loss: 1.2635
Epoch 11/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5690 - loss: 1.2544 - val_accuracy: 0.5639 - val_loss: 1.2624
Epoch 12/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5778 - loss: 1.2343 - val_accuracy: 0.5708 - val_loss: 1.2745
Epoch 13/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5860 - loss: 1.2117 - val_accuracy: 0.5872 - val_loss: 1.2109
Epoch 14/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5937 - loss: 1.1965 - val_accuracy: 0.5888 - val_loss: 1.2070
Epoch 15/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6022 - loss: 1.1770 - val_accuracy: 0.6013 - val_loss: 1.1845
Epoch 16/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6108 - loss: 1.1538 - val_accuracy: 0.6086 - val_loss: 1.1683
Epoch 17/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6203 - loss: 1.1381 - val_accuracy: 0.6133 - val_loss: 1.1561
Epoch 18/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6263 - loss: 1.1259 - val_accuracy: 0.6103 - val_loss: 1.1983
Epoch 19/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6287 - loss: 1.1160 - val_accuracy: 0.6194 - val_loss: 1.1311
Epoch 20/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6358 - loss: 1.0983 - val_accuracy: 0.6025 - val_loss: 1.1891
Epoch 21/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6397 - loss: 1.0852 - val_accuracy: 0.6360 - val_loss: 1.0899
Epoch 22/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6505 - loss: 1.0688 - val_accuracy: 0.6201 - val_loss: 1.1456
Epoch 23/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6503 - loss: 1.0685 - val_accuracy: 0.6214 - val_loss: 1.1333
Epoch 24/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6560 - loss: 1.0515 - val_accuracy: 0.6530 - val_loss: 1.0790
Epoch 25/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6640 - loss: 1.0308 - val_accuracy: 0.6381 - val_loss: 1.0946
Epoch 26/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6667 - loss: 1.0264 - val_accuracy: 0.6581 - val_loss: 1.0562
Epoch 27/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6703 - loss: 1.0144 - val_accuracy: 0.6655 - val_loss: 1.0400
Epoch 28/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.6721 - loss: 1.0131 - val_accuracy: 0.6662 - val_loss: 1.0340
Epoch 29/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6795 - loss: 0.9937 - val_accuracy: 0.6663 - val_loss: 1.0443
Epoch 30/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6831 - loss: 0.9875 - val_accuracy: 0.6627 - val_loss: 1.0359
学習時間:125.2秒 test_accuracy:0.6661

=== C_dropout ===
Epoch 1/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 8s 8ms/step - accuracy: 0.2775 - loss: 1.8966 - val_accuracy: 0.3629 - val_loss: 1.7034
Epoch 2/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3875 - loss: 1.6392 - val_accuracy: 0.4273 - val_loss: 1.5555
Epoch 3/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.4515 - loss: 1.5031 - val_accuracy: 0.4682 - val_loss: 1.4522
Epoch 4/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4832 - loss: 1.4110 - val_accuracy: 0.4963 - val_loss: 1.3713
Epoch 5/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5070 - loss: 1.3486 - val_accuracy: 0.5215 - val_loss: 1.3061
Epoch 6/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5309 - loss: 1.2911 - val_accuracy: 0.5356 - val_loss: 1.2671
Epoch 7/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5442 - loss: 1.2547 - val_accuracy: 0.5493 - val_loss: 1.2290
Epoch 8/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5572 - loss: 1.2203 - val_accuracy: 0.5590 - val_loss: 1.2193
Epoch 9/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5749 - loss: 1.1770 - val_accuracy: 0.5688 - val_loss: 1.1873
Epoch 10/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5868 - loss: 1.1491 - val_accuracy: 0.5818 - val_loss: 1.1589
Epoch 11/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5956 - loss: 1.1198 - val_accuracy: 0.5973 - val_loss: 1.1048
Epoch 12/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6018 - loss: 1.0999 - val_accuracy: 0.6133 - val_loss: 1.0660
Epoch 13/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6108 - loss: 1.0768 - val_accuracy: 0.6158 - val_loss: 1.0617
Epoch 14/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.6202 - loss: 1.0531 - val_accuracy: 0.6318 - val_loss: 1.0165
Epoch 15/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6282 - loss: 1.0298 - val_accuracy: 0.6280 - val_loss: 1.0358
Epoch 16/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6327 - loss: 1.0152 - val_accuracy: 0.6196 - val_loss: 1.0473
Epoch 17/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 5s 6ms/step - accuracy: 0.6439 - loss: 0.9906 - val_accuracy: 0.6387 - val_loss: 0.9978
Epoch 18/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6473 - loss: 0.9823 - val_accuracy: 0.6379 - val_loss: 1.0029
Epoch 19/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6544 - loss: 0.9590 - val_accuracy: 0.6498 - val_loss: 0.9859
Epoch 20/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6632 - loss: 0.9436 - val_accuracy: 0.6476 - val_loss: 0.9753
Epoch 21/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6646 - loss: 0.9325 - val_accuracy: 0.6587 - val_loss: 0.9552
Epoch 22/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6710 - loss: 0.9203 - val_accuracy: 0.6599 - val_loss: 0.9454
Epoch 23/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6778 - loss: 0.9064 - val_accuracy: 0.6579 - val_loss: 0.9478
Epoch 24/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6782 - loss: 0.8887 - val_accuracy: 0.6756 - val_loss: 0.9159
Epoch 25/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6841 - loss: 0.8767 - val_accuracy: 0.6664 - val_loss: 0.9211
Epoch 26/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6904 - loss: 0.8626 - val_accuracy: 0.6775 - val_loss: 0.8983
Epoch 27/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6935 - loss: 0.8512 - val_accuracy: 0.6650 - val_loss: 0.9293
Epoch 28/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6991 - loss: 0.8374 - val_accuracy: 0.6931 - val_loss: 0.8704
Epoch 29/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7053 - loss: 0.8222 - val_accuracy: 0.6765 - val_loss: 0.9064
Epoch 30/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7083 - loss: 0.8208 - val_accuracy: 0.6936 - val_loss: 0.8617
学習時間:124.3秒 test_accuracy:0.6936

=== D_adamw ===
Epoch 1/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 7s 8ms/step - accuracy: 0.2869 - loss: 1.8901 - val_accuracy: 0.3260 - val_loss: 1.7879
Epoch 2/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.3918 - loss: 1.6327 - val_accuracy: 0.4029 - val_loss: 1.6099
Epoch 3/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4486 - loss: 1.5039 - val_accuracy: 0.4846 - val_loss: 1.4236
Epoch 4/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4877 - loss: 1.4052 - val_accuracy: 0.4934 - val_loss: 1.4004
Epoch 5/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5107 - loss: 1.3453 - val_accuracy: 0.5076 - val_loss: 1.3435
Epoch 6/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5289 - loss: 1.2962 - val_accuracy: 0.5315 - val_loss: 1.2773
Epoch 7/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5452 - loss: 1.2542 - val_accuracy: 0.5357 - val_loss: 1.2677
Epoch 8/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5602 - loss: 1.2147 - val_accuracy: 0.5620 - val_loss: 1.2228
Epoch 9/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5737 - loss: 1.1801 - val_accuracy: 0.5670 - val_loss: 1.2008
Epoch 10/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5878 - loss: 1.1443 - val_accuracy: 0.5874 - val_loss: 1.1386
Epoch 11/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5963 - loss: 1.1154 - val_accuracy: 0.5856 - val_loss: 1.1413
Epoch 12/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6094 - loss: 1.0898 - val_accuracy: 0.6009 - val_loss: 1.1177
Epoch 13/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6195 - loss: 1.0595 - val_accuracy: 0.6032 - val_loss: 1.0962
Epoch 14/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6299 - loss: 1.0353 - val_accuracy: 0.6179 - val_loss: 1.0564
Epoch 15/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6345 - loss: 1.0179 - val_accuracy: 0.6253 - val_loss: 1.0518
Epoch 16/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6442 - loss: 0.9963 - val_accuracy: 0.6272 - val_loss: 1.0339
Epoch 17/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6539 - loss: 0.9700 - val_accuracy: 0.6187 - val_loss: 1.0840
Epoch 18/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6599 - loss: 0.9536 - val_accuracy: 0.6328 - val_loss: 1.0205
Epoch 19/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6703 - loss: 0.9324 - val_accuracy: 0.6020 - val_loss: 1.0985
Epoch 20/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6718 - loss: 0.9195 - val_accuracy: 0.6491 - val_loss: 0.9697
Epoch 21/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6818 - loss: 0.8942 - val_accuracy: 0.6454 - val_loss: 0.9916
Epoch 22/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6852 - loss: 0.8840 - val_accuracy: 0.6412 - val_loss: 0.9964
Epoch 23/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6888 - loss: 0.8719 - val_accuracy: 0.6517 - val_loss: 0.9785
Epoch 24/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6953 - loss: 0.8542 - val_accuracy: 0.6622 - val_loss: 0.9520
Epoch 25/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6995 - loss: 0.8424 - val_accuracy: 0.6671 - val_loss: 0.9266
Epoch 26/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7053 - loss: 0.8281 - val_accuracy: 0.6697 - val_loss: 0.9251
Epoch 27/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7093 - loss: 0.8134 - val_accuracy: 0.6579 - val_loss: 0.9600
Epoch 28/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7112 - loss: 0.8063 - val_accuracy: 0.6815 - val_loss: 0.9042
Epoch 29/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7164 - loss: 0.7964 - val_accuracy: 0.6846 - val_loss: 0.8795
Epoch 30/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.7211 - loss: 0.7841 - val_accuracy: 0.6878 - val_loss: 0.8842
学習時間:121.4秒 test_accuracy:0.6817

=== E_all ===
Epoch 1/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 9s 10ms/step - accuracy: 0.2604 - loss: 1.9505 - val_accuracy: 0.3232 - val_loss: 1.8040
Epoch 2/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.3607 - loss: 1.7145 - val_accuracy: 0.3978 - val_loss: 1.6496
Epoch 3/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4124 - loss: 1.6128 - val_accuracy: 0.4547 - val_loss: 1.5323
Epoch 4/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4491 - loss: 1.5321 - val_accuracy: 0.4660 - val_loss: 1.5082
Epoch 5/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.4816 - loss: 1.4619 - val_accuracy: 0.4730 - val_loss: 1.5193
Epoch 6/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5001 - loss: 1.4202 - val_accuracy: 0.5252 - val_loss: 1.3733
Epoch 7/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5181 - loss: 1.3778 - val_accuracy: 0.5325 - val_loss: 1.3525
Epoch 8/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5305 - loss: 1.3420 - val_accuracy: 0.5339 - val_loss: 1.3279
Epoch 9/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5458 - loss: 1.3094 - val_accuracy: 0.5543 - val_loss: 1.3026
Epoch 10/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 7ms/step - accuracy: 0.5573 - loss: 1.2787 - val_accuracy: 0.5608 - val_loss: 1.2665
Epoch 11/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5702 - loss: 1.2477 - val_accuracy: 0.5839 - val_loss: 1.2194
Epoch 12/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5769 - loss: 1.2365 - val_accuracy: 0.5764 - val_loss: 1.2276
Epoch 13/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.5882 - loss: 1.2090 - val_accuracy: 0.5885 - val_loss: 1.2050
Epoch 14/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.5949 - loss: 1.1882 - val_accuracy: 0.6034 - val_loss: 1.1679
Epoch 15/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6049 - loss: 1.1725 - val_accuracy: 0.6106 - val_loss: 1.1511
Epoch 16/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6123 - loss: 1.1518 - val_accuracy: 0.6174 - val_loss: 1.1415
Epoch 17/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6159 - loss: 1.1393 - val_accuracy: 0.6175 - val_loss: 1.1393
Epoch 18/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6246 - loss: 1.1250 - val_accuracy: 0.6235 - val_loss: 1.1156
Epoch 19/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 6s 7ms/step - accuracy: 0.6297 - loss: 1.1099 - val_accuracy: 0.6255 - val_loss: 1.1160
Epoch 20/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6325 - loss: 1.1027 - val_accuracy: 0.6224 - val_loss: 1.1382
Epoch 21/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6383 - loss: 1.0854 - val_accuracy: 0.6400 - val_loss: 1.0882
Epoch 22/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6453 - loss: 1.0707 - val_accuracy: 0.6250 - val_loss: 1.1200
Epoch 23/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6469 - loss: 1.0687 - val_accuracy: 0.6424 - val_loss: 1.0726
Epoch 24/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6556 - loss: 1.0498 - val_accuracy: 0.6356 - val_loss: 1.1097
Epoch 25/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6597 - loss: 1.0378 - val_accuracy: 0.6267 - val_loss: 1.1210
Epoch 26/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6639 - loss: 1.0320 - val_accuracy: 0.6708 - val_loss: 1.0169
Epoch 27/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6682 - loss: 1.0193 - val_accuracy: 0.6711 - val_loss: 1.0167
Epoch 28/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6676 - loss: 1.0160 - val_accuracy: 0.6587 - val_loss: 1.0498
Epoch 29/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 7ms/step - accuracy: 0.6762 - loss: 0.9978 - val_accuracy: 0.6671 - val_loss: 1.0322
Epoch 30/30
625/625 ━━━━━━━━━━━━━━━━━━━━ 4s 6ms/step - accuracy: 0.6787 - loss: 0.9991 - val_accuracy: 0.6693 - val_loss: 1.0342
学習時間:127.1秒 test_accuracy:0.6690

グラフ+サマリー

# ── val_accuracy / val_loss 比較グラフ ───────────────────
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
for name, h in histories.items():
    axes[0].plot(h.history['val_accuracy'], label=name)
    axes[1].plot(h.history['val_loss'],     label=name)
axes[0].set_title('val_accuracy の比較(全30エポック)')
axes[1].set_title('val_loss の比較(全30エポック)')
for ax in axes:
    ax.set_xlabel('Epoch'); ax.legend(fontsize=8); ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('regularization_comparison.png', dpi=150)
plt.show()

# ── train_loss vs val_loss(過学習の乖離)────────────────
fig2, axes2 = plt.subplots(5, 1, figsize=(7, 22))
for i, (name, h) in enumerate(histories.items()):
    axes2[i].plot(h.history['loss'],     label='train_loss')
    axes2[i].plot(h.history['val_loss'], label='val_loss')
    axes2[i].set_title(name)
    axes2[i].set_xlabel('Epoch'); axes2[i].legend(); axes2[i].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('regularization_overfit.png', dpi=150)
plt.show()

print("\n===== 最終結果サマリー =====")
print(f"{'Pattern':>16} | {'Val Acc':>8} | {'Test Acc':>9} | {'Val Loss':>9} | {'Time(s)':>8}")
print("-" * 62)
for name, h in histories.items():
    val_acc  = h.history['val_accuracy'][-1]
    val_loss = h.history['val_loss'][-1]
    test_acc = scores[name][1]
    t        = times[name]
    print(f"{name:>16} | {val_acc:>8.4f} | {test_acc:>9.4f} | {val_loss:>9.4f} | {t:>8.1f}")
print("-" * 62)

最終結果サマリー

===== 最終結果サマリー =====
         Pattern |  Val Acc |  Test Acc |  Val Loss |  Time(s)
--------------------------------------------------------------
            A:なし |   0.6870 |    0.6842 |    0.8941 |    122.7
          B:L2のみ |   0.6627 |    0.6661 |    1.0359 |    125.2
     C:Dropoutのみ |   0.6936 |    0.6936 |    0.8617 |    124.3
       D:AdamWのみ |   0.6878 |    0.6817 |    0.8842 |    121.4
         E:3種すべて |   0.6693 |    0.6690 |    1.0342 |    127.1
--------------------------------------------------------------

実験結果

実験は Google Colab(T4 GPU)、CIFAR-10、エポック数30・バッチサイズ64の条件で実施しました。

精度グラフ

精度グラフ

損失グラフ

損失グラフ

なし

正則化手法 なし

Dropoutのみ

正則化手法 Dropoutのみ

3種すべて

正則化手法 3種すべて

最終結果サマリー

パターン val_accuracy test_accuracy val_loss 学習時間
A:なし(ベースライン) 68.70% 68.42% 0.8941 122.7秒
B:L2のみ 66.27% 66.61% 1.0359 125.2秒
C:Dropoutのみ ✅ 69.36% 69.36% 0.8617 124.3秒
D:AdamWのみ 68.78% 68.17% 0.8842 121.4秒
E:3種すべて 66.93% 66.90% 1.0342 127.1秒

考察

① Dropout単体が最も効果的だった

今回の実験で最もtest_accuracyが高かったのはC:Dropoutのみ(69.36%)です。ベースライン(A:68.42%)と比べて+0.94%の改善、さらにval_lossも0.8617と5パターン中最小でした。

Dropoutはランダムにニューロンを無効化することで、モデルが特定のニューロンに頼りすぎるのを防ぎます。この「強制的な分散学習」が、今回のモデル規模とCIFAR-10の難易度にうまくマッチした結果と考えられます。

② L2正則化はベースラインより悪化した

意外な結果として、B:L2のみ(66.61%)はベースラインのA(68.42%)より約1.8%低い精度になりました。val_lossも1.0359とAの0.8941より大きく、正則化が強すぎてモデルの表現力が過度に制限された可能性があります。

L2正則化(l2=1e-4)をConv2D・Dense 全層に適用したため、抑制が全体に効きすぎた考えられます。Conv2Dには適用せず、Dense層のみに絞る、または係数を 1e-5 に下げるといった調整が有効かもしれません。

③ AdamWはベースラインとほぼ同等

D:AdamWのみ(68.17%)はAのベースライン(68.42%)と誤差の範囲内で、効果はほぼ中立でした。AdamWはweight decayをoptimizerの更新ステップで独立して適用するため、L2正則化とは異なる働き方をしますが、今回の条件では精度への寄与が小さかったようです。

ただし、学習時間が5パターン中最短(121.4秒)で、安定した学習曲線が期待できることから、精度を犠牲にせず速度・安定性を確保したい場面でのデフォルト選択肢として有効です。

④「全部盛り」は逆効果になった

最も注目すべき結果が E:3種すべて(66.90%) です。「強い正則化を3つ重ねれば最高精度になるはず」という直感に反して、ベースラインより約1.5%低下しています。val_lossも1.0342とBとほぼ同レベルで、明らかに過正則化の状態です。

比較 test_accuracy の差
A(なし) vs E(3種) −1.52%(全部盛りが下)
C(Dropout)vs E(3種) −2.46%(全部盛りが下)

今回のモデルはパラメータ数約93,000とそれほど大きくありません。このような小〜中規模のモデルに複数の正則化を重ねると、学習能力そのものが削がれることが起きます。正則化は「多いほど安全」ではなく、モデルの規模に合わせた適量がポイントです。

⑤ val_accuracy と test_accuracy の乖離に注目

すべてのパターンでval_accuracyとtest_accuracyの差が小さく(最大でも0.6%以内)、汎化性能は安定していました。特に C:Dropoutのみ ではval=69.36%・test=69.36%とほぼ一致しており、過学習なく安定した学習ができたことが確認できます。


まとめ

手法 効果 注意点
Dropout ✅ 精度・lossともに最良。今回の条件でベスト rate が高すぎると学習不足になる
AdamW ベースラインと同等。学習が安定・高速 単体では精度向上効果は小さい
L2正則化 ⚠️ 今回の設定ではベースライン以下に低下 係数・適用層の調整が必要
3種すべて ⚠️ 過正則化でベースラインより低下 小規模モデルへの多重適用は逆効果
💡 ひとことまとめ
正則化は「重ねれば重ねるほど良い」は間違いです。今回のCIFAR-10実験では、Dropout単体が最も精度・汎化性能ともに優れた結果になりました。L2・AdamW・Dropoutを全部まとめると過正則化が起きてベースラインより悪化します。まずはDropoutから試し、改善が頭打ちになったらAdamWを加える、という順番が現実的な戦略です。

関連記事もあわせてどうぞ: