正則化を重ねれば重ねるほど良いのか?
過学習を防ぐ手段として、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のみ
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を加える、という順番が現実的な戦略です。
関連記事もあわせてどうぞ:
- Dropoutの割合(0.0 vs 0.2 vs 0.5)比較 → Dropoutの割合を変えると過学習はどう変わる?【Keras×CIFAR-10実験】
- AdamW vs Adam 比較 → AdamWとAdamの違いを実験で確かめる【Keras】
- BatchNormalization vs Dropout 比較 → BatchNormalizationとDropout、どちらが過学習に強い?【Keras実験】
- Dense層のユニット数比較 → Dense層のユニット数を変えると精度はどう変わる?(32 vs 128 vs 512)






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