Überanpassung und was man dagegen tut
Das Netz liegt auf der Trainingsmenge immer richtig, wird auf unbekannten Daten aber nicht besser – das heißt Überanpassung. Wir erzeugen absichtlich eine Überanpassung und probieren Weight Decay, Dropout, Early Stopping und mehr Daten aus, um an echten Ergebnissen zu sehen, was am meisten hilft.
- Etwa 40 Minuten
- Niveau: Fortgeschritten
- Getestet: 2026-09-14 torch 2.14, scikit-learn 1.9, CPU, fester Zufallsstartwert
Code und Programmausgaben stehen genau so da, wie sie gelaufen sind – Kommentare und Ausgaben sind daher auf Chinesisch.
Das Netz der vorigen Lektion erreichte auf der Trainingsmenge 100 %, auf der Testmenge 97,8 %. Diese 2,2 Prozentpunkte Unterschied sind der Teil, den das Netz „auswendig gelernt“ und nicht wirklich verstanden hat.
Ist der Unterschied klein, spielt er keine Rolle. Sind die Trainingsdaten aber knapp und das Modell groß, lernt das Netz die ganze Trainingsmenge auswendig: Auf der Trainingsmenge ist alles richtig, bei neuen Daten zeigt sich sein wahres Gesicht. Das heißt Überanpassung (overfitting). Diese Lektion erzeugt absichtlich eine Überanpassung und probiert einige übliche Gegenmittel aus.
python overfitting.py
Drei Datenmengen
Diese Lektion teilt die Daten in drei Teile:
X_pool, X_rest, y_pool, y_rest = train_test_split(X, y, test_size=0.5, random_state=0)
X_val, X_test, y_val, y_test = train_test_split(X_rest, y_rest, test_size=0.5, random_state=0)
X_small, y_small = X_pool[:100], y_pool[:100] # 故意只用 100 张
可用于训练的图 898 张(先只用其中 100 张),验证集 449 张,测试集 450 张
模型共 301066 个参数
- Trainingsmenge: zum Aktualisieren der Parameter.
- Validierungsmenge: zum Beobachten während des Trainings und zum Anpassen der Einstellungen (wie groß die Lernrate, wann aufhören), aber nicht zum Aktualisieren der Parameter.
- Testmenge: wird ganz am Ende einmal angesehen, wenn alle Einstellungen feststehen, als endgültiges Ergebnis.
Warum noch eine Validierungsmenge? Jedes Mal, wenn du das Ergebnis auf der Testmenge ansiehst und danach Einstellungen änderst, sickert ein wenig Information der Testmenge in deine Entscheidungen. Nach Dutzenden Anpassungen passen die ausgewählten Einstellungen vielleicht nur zufällig zu dieser Testmenge. Deshalb schaut man beim Einstellen auf die Validierungsmenge und hebt die Testmenge fürs Ende auf.
Das Modell ist absichtlich groß: zwei verborgene Schichten mit je 512 Neuronen, 300.000 Parameter, aber nur 100 Bilder. Auf jedes Bild kommen dreitausend Parameter; auswendig lernen ist ein Leichtes.
Wie Überanpassung aussieht
== 什么都不加
第 1 轮 训练损失 2.2147 准确率 26.0% | 验证损失 2.2507 准确率 16.5%
第 10 轮 训练损失 1.3077 准确率 79.0% | 验证损失 1.5603 准确率 62.6%
第 25 轮 训练损失 0.1552 准确率 98.0% | 验证损失 0.4420 准确率 87.3%
第 50 轮 训练损失 0.0058 准确率 100.0% | 验证损失 0.3772 准确率 88.4%
第 100 轮 训练损失 0.0013 准确率 100.0% | 验证损失 0.4038 准确率 89.8%
第 200 轮 训练损失 0.0004 准确率 100.0% | 验证损失 0.4371 准确率 90.0%
第 300 轮 训练损失 0.0002 准确率 100.0% | 验证损失 0.4667 准确率 89.8%
最终:测试集准确率 88.7%,测试损失 0.5089
(Der Verlust der ersten Runde, 2,21, liegt nahe an den 2,30 aus der vorigen Lektion: Anfangs weiß das Netz nichts.)
In Runde 50 ist die Trainingsmenge schon zu 100 % richtig, der Trainingsverlust bei 0,006, und er fällt danach weiter bis 0,0002. Die Genauigkeit auf der Validierungsmenge bleibt aber um 90 % stehen, und der Validierungsverlust steigt ab Runde 50 von 0,377 auf 0,467 in Runde 300.
Die beiden Kurven laufen auseinander: Der Trainingsverlust sinkt noch, der Validierungsverlust steigt. Das ist das Kennzeichen der Überanpassung. Der Validierungsverlust steigt, weil das Netz auf der Trainingsmenge immer „selbstsicherer“ wird und bei unbekannten Bildern auch selbstsicher falsch antwortet, und die Kreuzentropie bestraft solche Fehler schwer.
Als Grafik ungefähr so:
损失
│ \
│ \ 验证损失
│ \____/ ̄ ̄ ̄ ̄
│ \
│ \_ 训练损失
│  ̄ ̄______
└──────────────────────── 轮
↑
验证损失最低的地方
Einige Mittel ausprobieren
Die folgenden sind übliche Mittel gegen Überanpassung. Jedes ändert nur eine Stelle, alles andere bleibt gleich (derselbe Zufallsstartwert, dieselben 100 Bilder).
Weight Decay (weight decay): Bei jeder Aktualisierung werden alle Gewichte ein wenig Richtung 0 gezogen. Die Idee: Ein Modell mit kleinen Parameterwerten ist „einfacher“ und reagiert weniger übertrieben auf einzelne Beispiele. Der Parameter weight_decay des Optimierers AdamW steuert die Stärke:
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=weight_decay)
Dropout: Beim Training wird bei jedem Schritt zufällig ein Teil der Neuronen „pausiert“ (Ausgabe auf 0 gesetzt). Hier auf 0,5 eingestellt, arbeitet bei jedem Schritt die Hälfte der verborgenen Neuronen nicht. Das Netz kann sich dann nicht auf bestimmte Neuronen verlassen, um sich ein bestimmtes Bild zu merken, und muss robustere Muster lernen. Bei der Evaluation schaltet model.eval() Dropout ab, beim Training model.train() wieder an:
nn.Linear(64, 512), nn.ReLU(), nn.Dropout(dropout),
Early Stopping (early stopping): In jeder Runde den Validierungsverlust ansehen und die Parameter des Moments mit dem niedrigsten Wert festhalten. Erreicht der Validierungsverlust 20 Runden lang keinen neuen Tiefstwert, wird gestoppt und zum Moment des Tiefstwerts zurückgekehrt:
if val_loss < best_val:
best_val, best_epoch, patience = val_loss, epoch, 0
best_state = {k: v.clone() for k, v in model.state_dict().items()}
else:
patience += 1
if early_stop and patience >= 20: # 验证损失连续 20 轮没有创新低,就停下来
break
Und das schlichteste Mittel: mehr Daten. Alle 898 für das Training verfügbaren Bilder werden genutzt.
Ergebnisse: ein etwas anderes Fazit
== 权重衰减 weight_decay=0.1
第 50 轮 训练损失 0.0059 准确率 100.0% | 验证损失 0.3762 准确率 88.4%
第 300 轮 训练损失 0.0002 准确率 100.0% | 验证损失 0.4543 准确率 89.8%
最终:测试集准确率 88.0%,测试损失 0.5008
== 权重衰减 weight_decay=1.0
第 50 轮 训练损失 0.0079 准确率 100.0% | 验证损失 0.3674 准确率 89.1%
第 300 轮 训练损失 0.0012 准确率 100.0% | 验证损失 0.4243 准确率 89.3%
最终:测试集准确率 88.0%,测试损失 0.4574
== dropout 0.5
第 50 轮 训练损失 0.0561 准确率 100.0% | 验证损失 0.3784 准确率 88.4%
第 300 轮 训练损失 0.0003 准确率 100.0% | 验证损失 0.3879 准确率 90.2%
最终:测试集准确率 88.2%,测试损失 0.4321
== 早停
第 55 轮停止:验证损失从第 35 轮之后就没再下降
最终:测试集准确率 87.3%,测试损失 0.4053
== 什么都不加,但用 898 张图训练
第 1 轮 训练损失 2.2261 准确率 34.6% | 验证损失 2.2390 准确率 27.4%
第 10 轮 训练损失 1.3170 准确率 88.1% | 验证损失 1.3714 准确率 84.4%
第 25 轮 训练损失 0.2208 准确率 94.4% | 验证损失 0.2675 准确率 91.1%
第 50 轮 训练损失 0.0437 准确率 99.3% | 验证损失 0.1072 准确率 96.9%
第 100 轮 训练损失 0.0074 准确率 100.0% | 验证损失 0.0854 准确率 97.1%
第 200 轮 训练损失 0.0016 准确率 100.0% | 验证损失 0.0850 准确率 97.1%
第 300 轮 训练损失 0.0007 准确率 100.0% | 验证损失 0.0875 准确率 97.3%
最终:测试集准确率 96.2%,测试损失 0.1682
测试集汇总:
什么都不加 准确率 88.7% 损失 0.5089
权重衰减 0.1 准确率 88.0% 损失 0.5008
权重衰减 1.0 准确率 88.0% 损失 0.4574
dropout 0.5 准确率 88.2% 损失 0.4321
早停 准确率 87.3% 损失 0.4053
898 张训练数据 准确率 96.2% 损失 0.1682
Diese Ergebnisse weichen von dem ab, was viele Tutorials sagen, und verdienen einen genauen Blick.
Weight Decay, Dropout und Early Stopping haben die Genauigkeit nicht erhöht. Die Testgenauigkeit liegt überall zwischen 87 % und 89 %, etwa wie die 88,7 % ohne alles; Early Stopping liegt sogar etwas darunter. Bei 450 Testbildern ist 1 Prozentpunkt nur vier, fünf Bilder; so ein Unterschied sagt nichts darüber, was besser ist.
Sie haben den Testverlust gesenkt. Von 0,51 auf 0,40 bis 0,50, am deutlichsten bei Early Stopping. Das Netz beantwortet also dieselben Fragen richtig, antwortet aber nicht mehr so „selbstsicher falsch“, und seine Wahrscheinlichkeiten sind verlässlicher. Manchmal ist das wichtig, etwa wenn man anhand der Wahrscheinlichkeit entscheidet, ob ein Ergebnis zur Nachprüfung an einen Menschen geht.
Mehr Daten wirken weit stärker als alle anderen Mittel. Dasselbe Modell, ebenfalls ohne Zusätze, die Trainingsdaten von 100 auf 898 Bilder, und die Testgenauigkeit springt von 88,7 % auf 96,2 %, der Testverlust fällt von 0,51 auf 0,17. Auch der Validierungsverlust steigt nicht mehr deutlich, sondern stabilisiert sich bei etwa 0,085.
Wie man das versteht
Diese Regularisierungsmethoden (Weight Decay, Dropout und Early Stopping heißen zusammen Regularisierung) sind nicht nutzlos, haben aber ihren Anwendungsbereich. Sie mildern Überanpassung, können aber keine Information erzeugen, die nicht in den Daten steckt. Bei 100 Bildern hat jede Ziffer im Schnitt nur 10, die vielen Schreibweisen derselben Ziffer sind längst nicht alle vertreten. So sehr man das Modell auch beschränkt, es kann keine Schreibweise erkennen, die es nie gesehen hat.
Beim echten Training geht man gegen Überanpassung ungefähr in dieser Reihenfolge vor:
- Zuerst versuchen, mehr Daten zu bekommen. Mehr und vielfältigere Daten sind fast immer am wirksamsten.
- Unbedingt eine Validierungsmenge haben und sie im Auge behalten. So schön der Trainingsverlust auch fällt: Steigen die Validierungskennzahlen nicht, bringt es nichts. Early Stopping kostet fast nichts und ist standardmäßig an.
- Dann mit Regularisierung feinjustieren. Die Stärke von Weight Decay und Dropout muss man auf der Validierungsmenge ausprobieren; es gibt keine Werte, die überall passen.
- Das Modell muss nicht von Anfang an groß sein. Bei wenigen Daten reicht oft ein kleineres Modell.
Beim Training großer Modelle gilt dasselbe. Ihre Regularisierung ist nicht kompliziert; entscheidend sind riesige, vielfältige, saubere Trainingsdaten. Beim Training des kleinen GPT in Modul 09 wirst du selbst sehen, dass es bei zu wenig Daten Gedichtzeilen wörtlich auswendig lernt, statt Gedichte schreiben zu lernen.
Übungen
- Setz die Trainingsdaten auf 200 und auf 400 Bilder und stell eine Tabelle „Menge der Trainingsdaten → Testgenauigkeit“ auf. Steigt die Genauigkeit gleichmäßig mit der Datenmenge?
- Ändere die verborgenen Schichten des Modells von 512 auf 32 und trainiere nur mit 100 Bildern. Ist die Testgenauigkeit höher oder niedriger als beim großen Modell mit 300.000 Parametern?
- Stell Dropout auf 0,2 und 0,8, Weight Decay auf 0,01 und 5,0, such auf der Validierungsmenge die beste Kombination und sieh dir zum Schluss einmal die Testmenge an.
Selbsttest
1. Woran erkennt man am Trainingsverlauf, dass Überanpassung auftritt?
Der Trainingsverlust sinkt weiter, der Validierungsverlust sinkt nicht mehr oder steigt sogar; die beiden Kurven laufen auseinander. Eine Genauigkeit auf der Trainingsmenge weit über der auf der Validierungsmenge ist ebenfalls ein Signal.
2. Es gibt schon eine Testmenge. Warum braucht man noch eine Validierungsmenge?
Beim Einstellen sieht man immer wieder Ergebnisse an und ändert dann Einstellungen. Schaut man dabei auf die Testmenge, passen die nach vielen Anpassungen gewählten Einstellungen vielleicht nur zufällig zu dieser Testmenge, und das Testergebnis steht nicht mehr für die Leistung auf neuen Daten. Deshalb stellt man mit der Validierungsmenge ein und sieht die Testmenge nur ganz am Ende einmal an.
3. Im Experiment dieser Lektion haben Weight Decay, Dropout und Early Stopping die Genauigkeit nicht erhöht. Warum haben mehr Daten sie stark erhöht?
Regularisierungsmethoden können das Modell nur daran hindern, sich zu sehr auf Details der Trainingsmenge zu verlassen, liefern aber keine neuen Informationen. Bei 100 Bildern hat jede Ziffer nur etwa 10, viele Schreibweisen wurden nie gesehen, und so sehr man das Modell auch beschränkt, es erkennt sie nicht. Mehr Daten zeigen dem Modell direkt mehr Schreibweisen, deshalb wirken sie weit stärker als die anderen Mittel. Die anderen Methoden haben in diesem Experiment vor allem den Testverlust gesenkt, sodass das Modell nicht mehr selbstsicher falsch antwortet.
Fragen und Diskussion
Hängst du in dieser Lektion fest? Frag hier. Und wenn du die Frage von jemandem beantworten kannst, tu es gern.
Eine Frage bringt 3 Punkte, eine Antwort 6. Beiträge erscheinen nach der Prüfung.
Diskussion wird geladen…