Modul 08 · Lektion 1

Lineare Regression mit numpy

Wir beginnen mit dem einfachsten Problem – den Hauspreis aus der Wohnfläche vorhersagen. Eine Gerade als Modell, die mittlere quadratische Abweichung als Gütemaß, und dann auf die dümmste Art 90.000 Geraden eine nach der anderen ausprobieren, um klar zu sehen, wonach „Training“ eigentlich sucht.

  • Etwa 35 Minuten
  • Niveau: Einsteiger
  • Getestet: 2026-09-14 numpy 2.5, fester Zufallsstartwert

Code und Programmausgaben stehen genau so da, wie sie gelaufen sind – Kommentare und Ausgaben sind daher auf Chinesisch.

In Teil 1 haben wir immer fertig trainierte Sprachmodelle benutzt. Teil 2 beantwortet eine Frage: Wie wird ein Modell trainiert?

Wir beginnen mit dem einfachsten Beispiel. Kein neuronales Netz, kein Sprachmodell, nur eine Gerade. Unterschätz sie nicht: Alle Begriffe der nächsten Lektionen – Verlust, Gradient, Lernrate, Backpropagation – lassen sich zuerst an dieser Geraden klar erkennen und dann unverändert auf neuronale Netze übertragen, und schließlich auf GPT.

Diese Lektion braucht nur numpy:

uv add numpy

Das Problem: den Hauspreis aus der Fläche vorhersagen

Angenommen, du hast Fläche und Verkaufspreis von 50 Wohnungen gesammelt und willst eine Gesetzmäßigkeit finden, um künftig aus der Fläche einer Wohnung ihren Preis zu schätzen.

Wir erzeugen die Daten selbst; so kennen wir die „richtige Antwort“ und können leicht prüfen:

import numpy as np

rng = np.random.default_rng(0)

# 造一组数据:房价(万元)= 1.2 × 面积(平方米)+ 20,再加上一些随机的波动
area = rng.uniform(40, 150, size=50)
price = 1.2 * area + 20 + rng.normal(0, 12, size=50)

default_rng(0) legt den Startwert des Zufallsgenerators fest; du bekommst beim Ausführen genau dieselben Daten wie ich. Die wahre Gesetzmäßigkeit ist „1,2 (in 10.000 Yuan) pro Quadratmeter, plus 20“, aber jede Wohnung hat eine zufällige Abweichung (Standardabweichung 12), so wie in der echten Welt Ausrichtung, Stockwerk und Ausstattung den Preis schwanken lassen. (Die Preise im Code sind in 万, also Einheiten von 10.000 Yuan.)

Die ersten 5 Wohnungen sehen so aus:

前 5 套房子:
   110.1 平方米   156.4 万元
    69.7 平方米    89.1 万元
    44.5 平方米    73.4 万元
    41.8 平方米    78.1 万元
   129.5 平方米   159.9 万元

Das Modell: eine Gerade

Die einfachste Vermutung: Zwischen Preis und Fläche besteht eine lineare Beziehung.

预测价格 = w × 面积 + b

w ist die Steigung, also wie viel der Preis pro zusätzlichem Quadratmeter steigt; b ist der Achsenabschnitt, der Preis bei Fläche 0 (man kann ihn als festen Grundpreis verstehen). Diese beiden Zahlen heißen die Parameter des Modells.

def predict(w, b, x):
    """模型:一条直线。w 是斜率(每平方米多少万),b 是截距。"""
    return w * x + b

„Ein Modell trainieren“ heißt letztlich: die beste Menge von Parametern finden. Bei diesem Modell also die besten w und b.

Bei großen Modellen wie GPT ist es genauso, nur hat es nicht 2 Parameter, sondern Milliarden oder Hunderte Milliarden, und das Modell ist keine Gerade, sondern eine äußerst komplexe Funktion. In Modul 09 trainierst du selbst ein kleines GPT mit über einer Million Parametern und tust im Kern immer noch dasselbe.

Verlust: wie man „gut“ misst

Was ist „die beste Gerade“? Es braucht ein konkretes Kriterium, das eine Zahl liefert.

Für jede Wohnung gibt das Modell einen vorhergesagten Preis, der vom wahren Preis um eine Differenz abweicht. Alle Differenzen quadrieren und den Mittelwert bilden: Diese Zahl heißt mittlere quadratische Abweichung (Mean Squared Error, MSE):

均方误差 = 平均值( (预测价格 - 真实价格)² )
def mse(w, b):
    """损失:预测值和真实值之差的平方,取平均。"""
    errors = predict(w, b, area) - price
    return np.mean(errors ** 2)

Warum quadrieren? Aus zwei Gründen. Erstens sind Differenzen teils positiv, teils negativ und würden sich beim direkten Mitteln aufheben; nach dem Quadrieren sind alle positiv. Zweitens macht das Quadrieren große Fehler „auffälliger“: Eine Abweichung von 10 ergibt quadriert 100, eine von 30 ergibt 900. Das Modell muss sich zuerst um die Punkte kümmern, bei denen es krass danebenliegt.

Diese Zahl, die misst, „wie schlecht das Modell ist“, heißt allgemein Verlust (loss). Je kleiner der Verlust, desto besser das Modell. Das Ziel des Trainings lässt sich genauer fassen: die Parameter finden, die den Verlust minimieren.

Ein paar Geraden raten

Zuerst raten wir nach Gefühl einige w und b und sehen uns den Verlust an:

for w, b in [(1.0, 0.0), (1.0, 30.0), (1.5, 0.0), (1.2, 20.0)]:
    print(f"  w={w:<4} b={b:<5} 均方误差 {mse(w, b):9.1f}")
随手猜几条直线,看看误差:
  w=1.0  b=0.0   均方误差    1810.1
  w=1.0  b=30.0  均方误差     310.8
  w=1.5  b=0.0   均方误差     284.5
  w=1.2  b=20.0  均方误差     146.6

Die Gerade w=1.0, b=0 liegt weit von den Daten, Verlust 1810. Mit einem Achsenabschnitt von 30 sinkt er auf 311. w=1.2, b=20 ist genau die wahre Gesetzmäßigkeit, mit der wir die Daten erzeugt haben, Verlust nur 146,6.

Beachte: Selbst bei der wahren Gesetzmäßigkeit ist der Verlust nicht 0. Die Daten schwanken zufällig, und keine Gerade kann durch alle Punkte gehen. Der Verlust sinkt nie auf 0; bei echten Problemen ist das normal.

Die dümmste Methode: alles ausprobieren

Da sich der Verlust berechnen lässt, probieren wir einfach alle möglichen w und b durch und nehmen die Kombination mit dem kleinsten Verlust. w von 0 bis 3 in Schritten von 0,01; b von -50 bis 100 in Schritten von 0,5:

best = (None, None, float("inf"))
tries = 0
for w in np.arange(0.0, 3.0, 0.01):
    for b in np.arange(-50.0, 100.0, 0.5):
        tries += 1
        loss = mse(w, b)
        if loss < best[2]:
            best = (w, b, loss)
网格搜索:试了 90000 条直线,用了 0.2 秒
  最好的一条:w=1.26 b=14.5,均方误差 143.1

90.000 Geraden ausprobiert; die beste ist w=1.26, b=14.5 mit Verlust 143,1, sogar etwas niedriger als die 146,6 der wahren Gesetzmäßigkeit (w=1.2, b=20). Das überrascht nicht: Wir haben nur 50 Datenpunkte mit zufälligen Schwankungen, und die Gerade, die diese 50 Punkte am besten trifft, ist nicht unbedingt die, die sie erzeugt hat.

Dass die gefundenen w und b nicht genau den wahren Werten entsprechen, wird uns ständig begleiten: Das Modell lernt die Parameter, die „die vorliegenden Daten am besten erklären“; haben die Daten eine Verzerrung, haben auch die gelernten Parameter eine.

Die Rastersuche hat noch ein unscheinbares Problem: Sie findet nur Punkte auf dem Raster. w wird in Schritten von 0,01 probiert; ist das wirklich beste w 1,2571, kann sie nur 1,26 liefern. Macht man das Raster feiner, vervielfacht sich die Zahl der Versuche. Der Gradientenabstieg der nächsten Lektion hat diese Grenze nicht; er kann sich dem besten Wert beliebig annähern.

Warum diese Methode nicht taugt

Zwei Parameter mit je einigen Hundert Werten ergeben 90.000 Kombinationen, 0,2 Sekunden.

Bei 3 Parametern sind es Dutzende Millionen Kombinationen; bei 10 Parametern ist die Zahl astronomisch, das Alter des Universums reicht nicht zum Durchprobieren. Selbst das kleinste neuronale Netz hat Dutzende bis Hunderte Parameter, das kleine GPT aus Modul 09 über eine Million.

Wir brauchen eine viel klügere Methode: nicht blind probieren, sondern bei jedem Schritt wissen, in welche Richtung und wie stark man die Parameter ändern muss. Das ist der Gradientenabstieg der nächsten Lektion.

Übungen

  1. Setz die zufällige Schwankung der Daten von 12 auf 0 (rng.normal(0, 0, size=50)) und führ es erneut aus. Ist die beste Gerade genau w=1.2, b=20? Wie hoch ist der Verlust?
  2. Ersetze die Verlustfunktion durch die „mittlere absolute Abweichung“ np.mean(np.abs(errors)) und mach die Rastersuche noch einmal. Ist die gefundene Gerade dieselbe wie bei der mittleren quadratischen Abweichung?
  3. Füg den Daten einen Extrempunkt hinzu: eine 60-Quadratmeter-Wohnung für 500 (area = np.append(area, 60); price = np.append(price, 500)). Mach die Rastersuche einmal mit mittlerer quadratischer und einmal mit mittlerer absoluter Abweichung. Welche wird von diesem Punkt stärker beeinflusst? Warum?

Selbsttest

1. Was bedeutet „ein Modell trainieren“?

Die beste Menge von Parametern finden, die den Verlust des Modells auf den vorhandenen Daten minimiert. Bei einer Geraden heißt das, die beste Steigung w und den besten Achsenabschnitt b zu finden. Bei großen Modellen ist es genauso, nur mit viel mehr Parametern und einer viel komplexeren Form des Modells.

2. Warum quadriert die mittlere quadratische Abweichung die Fehler, statt sie direkt zu mitteln?

Fehler sind teils positiv, teils negativ und heben sich beim direkten Mitteln auf; selbst ein sehr schlechtes Modell könnte einen mittleren Fehler nahe 0 erhalten. Nach dem Quadrieren sind alle positiv, und große Fehler werden stärker verstärkt, sodass das Modell zuerst die krass falschen Vorhersagen verringert.

3. Die Rastersuche brauchte in diesem Beispiel nur 0,2 Sekunden. Warum kann man damit keine neuronalen Netze trainieren?

Die Zahl der auszuprobierenden Kombinationen wächst exponentiell mit der Zahl der Parameter. 2 Parameter ergeben 90.000 Kombinationen, 3 schon Dutzende Millionen; neuronale Netze haben Hunderte, Tausende oder sogar Milliarden Parameter, die Zahl der Kombinationen ist astronomisch und kann unmöglich durchprobiert werden.

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…