Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Im ersten Abschnitt basteln wir eine S-förmige Kurve aus dem tanh⁡\tanh, haben aber keine Interpretation dafür. Danach bauen wir die S-Kurve von der Wahrscheinlichkeitsrechnung her auf, und dann fällt die Interpretation von selbst ab.

Lineare Regression zur Klassifikation

Wenn wir an Regression denken, dann oft an eine Regressionsgerade in einem xx-yy-Plot, bei dem auf der xx-Achse die unabhängige Variable (der Regressor) und auf der yy-Achse die abhängige Variable (der Regressand) aufgetragen ist. Bei der Klassifikation ist der Regressand die Klasse, y∈{0,1}y \in \{0, 1\}.

Schauen wir uns das Schritt für Schritt an, für einen eindimensionalen Regressor x∈Rx \in \mathbb{R} mit zwei Klassen, deren xx-Werte sich überlappen:

  1. Im eindimensionalen Plot liegen alle Punkte der Klasse 0 auf der Höhe y=0y = 0 und alle Punkte der Klasse 1 auf y=1y = 1.

  2. Die lineare Regression fittet eine Gerade y^=wx+b\hat{y} = w x + b durch diese Punktwolke. Die Gerade nimmt Werte in ganz R\mathbb{R} an, auch weit außerhalb von [0,1][0, 1].

  3. Harte Klassifikation: Wir entscheiden für Klasse 1, wenn y^>12\hat{y} > \tfrac12. Die Entscheidungsgrenze ist der Punkt x∗x^* mit wx∗+b=12w x^* + b = \tfrac12; die vorhergesagte Klasse als Funktion von xx ist eine Sprungfunktion.

  4. Für einen zweidimensionalen Regressor x∈R2x \in \mathbb{R}^2 wird aus der Geraden eine Regressionshyperebene über der (x1,x2)(x_1, x_2)-Ebene, und die Entscheidungsgrenze {w⋅x+b=12}\{ w \cdot x + b = \tfrac12 \} ist eine Gerade in der (x1,x2)(x_1, x_2)-Ebene – genau wie beim Perzeptron.

Lineare Regression zur Klassifikation, eindimensionaler Regressor: Regressionsgerade durch die 0/1-Daten, harte Klassifikation mit Entscheidungsgrenze x^*, und die \tanh-Variante.

Lineare Regression zur Klassifikation, eindimensionaler Regressor: Regressionsgerade durch die 0/1-Daten, harte Klassifikation mit Entscheidungsgrenze x∗x^*, und die tanh⁡\tanh-Variante.

Zweidimensionaler Regressor: Die Entscheidungsgrenze ist eine Gerade, die Regressionsfunktion eine Ebene.

Zweidimensionaler Regressor: Die Entscheidungsgrenze ist eine Gerade, die Regressionsfunktion eine Ebene.

S-Förmigkeit herstellen

Die Sprungfunktion [y^>12][\hat{y} > \tfrac12] ist unbefriedigend: Sie ist nicht differenzierbar, und sie verrät nicht, wie sicher die Entscheidung ist. Anstelle von [y^>12][\hat{y} > \tfrac12] könnte man [tanh⁡(y^)>0][\tanh(\hat{y}) > 0] verwenden; tanh⁡\tanh liegt zwischen -1 und +1. Um zwischen 0 und 1 zu landen, kann man z.B.

12(tanh⁡(y^)+1)\tfrac12 \left( \tanh(\hat{y}) + 1 \right)

nutzen. Das liefert eine S-förmige Kurve, die glatt von 0 nach 1 übergeht. Aber: Die Interpretation einer Zahl zwischen 0 und 1 als Wahrscheinlichkeit ist damit noch unklar. Genau das klären die nächsten Abschnitte dieses Kapitels, über Odds und Logit.

Wahrscheinlichkeiten und Chancen (Odds)

Chancen für ein Bernoulli-Experiment

Angenommen, wir haben ein Bernoulli-Experiment (Münzwurf) mit Parameter p∈(0,1)p \in (0, 1) – zur Vereinfachung mit p≠0p \neq 0 und p≠1p \neq 1. Die Wahrscheinlichkeit (probability) für Erfolg ist P(Erfolg)=pP(\text{Erfolg}) = p. Die Chancen (odds) für Erfolg sind p:(1−p)p : (1-p).

Beispiel: Einen Standardwürfel (D6) rollen und gucken, ob es eine 6 ist. Dann ist P(D=6)=16=pP(D = 6) = \tfrac16 = p die Wahrscheinlichkeit, und 1:5=151 : 5 = \tfrac15 sind die Chancen für eine 6; 5:1=55 : 1 = 5 sind die Chancen für eine Nicht-6. Als Formel:

odds⁡(D=6)=P(D=6)P(D≠6)=1/65/6=15.\operatorname{odds}(D = 6) = \frac{P(D = 6)}{P(D \neq 6)} = \frac{1/6}{5/6} = \frac15 .

Allgemein rechnet man von Wahrscheinlichkeiten zu Odds und zurück über

odds⁡(p)=p1−p,p=odds⁡1+odds⁡.\operatorname{odds}(p) = \frac{p}{1 - p}, \qquad p = \frac{\operatorname{odds}}{1 + \operatorname{odds}} .

Die Skala für Odds

Wahrscheinlichkeiten liegen immer in [0,1][0, 1]. Wie sieht die Skala für Odds aus?

Die Fälle p<12p < \tfrac12 und p>12p > \tfrac12 sind symmetrisch, d.h. Erfolg und Misserfolg sind äquivalent – aber odds⁡(p)∈(0,∞)\operatorname{odds}(p) \in (0, \infty) ist nicht symmetrisch: (0,1)(0, 1) ist beschränkt, (1,∞)(1, \infty) ist unbeschränkt. Die Odds für eine 6 sind 15\tfrac15, die Odds für eine Nicht-6 sind 5.

Beachte: Logarithmieren rettet die Symmetrie. Es ist

ln⁡(p1−p)=ln⁡(p)−ln⁡(1−p),\ln\left(\frac{p}{1-p}\right) = \ln(p) - \ln(1-p),

und damit ln⁡(1:5)=−ln⁡(5:1)\ln(1 : 5) = -\ln(5 : 1). Die Werte liegen in (−∞,+∞)(-\infty, +\infty).

Logistic Unit

Schon mal irgendwo gesehen? Im Data-Science-Skript haben wir den Informationsgehalt (die Überraschung) eines Ereignisses mit Wahrscheinlichkeit pp als −log⁡p-\log p definiert und die Entropie als erwartete Überraschung (Informationsgehalt, Entropie). Der Logarithmus steht dort aus einem Grund, der uns noch oft nützen wird: Für unabhängige Ereignisse multiplizieren sich die Wahrscheinlichkeiten, und log⁡\log macht daraus eine Summe. Zwei Überraschungen addieren sich. Ein fairer Münzwurf ist 1 bit Überraschung, eine 6 beim Würfeln log⁡26≈2,58\log_2 6 \approx 2{,}58 bit, beides zusammen 3,583{,}58 bit.

Für das Bernoulli-Experiment ist die Entropie

H(p)=−pln⁡p−(1−p)ln⁡(1−p),H(p) = -p \ln p - (1 - p) \ln(1 - p),

und ihre Ableitung nach pp ist

H′(p)=−ln⁡p−1+ln⁡(1−p)+1=−logit⁡(p)H'(p) = -\ln p - 1 + \ln(1-p) + 1 = -\operatorname{logit}(p)

(im DS-Skript: Die binäre Entropiefunktion, dort mit log⁡2\log_2 und kleinem hh). Interpretation: Bei Erhöhen von pp ist die Abnahme an Informationsgewinn durch logit⁡(p)\operatorname{logit}(p) gegeben. Entropie misst man in bit (log⁡2\log_2) oder nat (ln⁡\ln), die Ableitung in logit. Zum Beispiel ist H(0,5)=1 bit=0,69 natH(0{,}5) = 1 \text{ bit} = 0{,}69 \text{ nat}.

Logistische Sigmoidfunktion

Allgemeine S-Förmigkeit

Sigma ≈\approx S, Sigmoid ≈\approx S-förmig.

MM ist der Maximalwert (die obere Asymptote), kk die Steilheit, μ\mu die Position des Wendepunkts. Bei σ(w⋅x+b)\sigma(w \cdot x + b) übernimmt ∥w∥\|w\| die Rolle von kk, siehe Kapitel „Neuron und Perzeptron“: Die Länge von ww bestimmt, wie steil die Wahrscheinlichkeit mit dem Abstand zur Entscheidungsgrenze wächst. Das Standardsigmoid steigt monoton von 0 (für x→−∞x \to -\infty) nach 1 (für x→+∞x \to +\infty) und hat bei x=0x = 0 den Wert σ(0)=12\sigma(0) = \tfrac12.

Das Standardsigmoid \sigma, der Tangens hyperbolicus als umskaliertes Sigmoid, und die Ableitung \sigma' = \sigma(1-\sigma) mit Maximum \tfrac14 bei 0.

Das Standardsigmoid σ\sigma, der Tangens hyperbolicus als umskaliertes Sigmoid, und die Ableitung σ′=σ(1−σ)\sigma' = \sigma(1-\sigma) mit Maximum 14\tfrac14 bei 0.

Symmetrie

Es gilt

σ(−x)=11+ex=e−xe−x+1=1+e−x−11+e−x=1−σ(x),\sigma(-x) = \frac{1}{1 + e^{x}} = \frac{e^{-x}}{e^{-x} + 1} = \frac{1 + e^{-x} - 1}{1 + e^{-x}} = 1 - \sigma(x),

also σ(−x)=1−σ(x)\sigma(-x) = 1 - \sigma(x): Der Graph ist punktsymmetrisch um (0,12)(0, \tfrac12).

Andere Sigmoidfunktionen: Tangens hyperbolicus

Die Parameter MM und kk sind Skalierungsfaktoren. Möchte man die Skala des Standardsigmoids von [0,1][0, 1] auf z.B. [−1,1][-1, 1] bringen, so nimmt man 2σ(x)−12\sigma(x) - 1, und mit k=2k = 2:

2σ(2x)−1=21+e−2x−1=1−e−2x1+e−2x=ex−e−xex+e−x=tanh⁡(x).2\sigma(2x) - 1 = \frac{2}{1 + e^{-2x}} - 1 = \frac{1 - e^{-2x}}{1 + e^{-2x}} = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} = \tanh(x).

Der Tangens hyperbolicus ist also nur ein umskaliertes Standardsigmoid, tanh⁡(x)=2σ(2x)−1\tanh(x) = 2\sigma(2x) - 1.

Ableitung

Wir benötigen später die Ableitung der Sigmoidfunktion. Eventuell bekannt ist tanh⁡′(x)=1−tanh⁡2(x)\tanh'(x) = 1 - \tanh^2(x). Ähnlich gilt

σ′(x)=σ(x) (1−σ(x))=σ(x) σ(−x).\sigma'(x) = \sigma(x)\,\bigl(1 - \sigma(x)\bigr) = \sigma(x)\,\sigma(-x).

Der Beweis mit der Quotientenregel ist eine lohnende Übung. Bemerkenswert daran: Die Ableitung lässt sich aus dem Funktionswert berechnen, ohne e−xe^{-x} noch einmal auszuwerten – das ist beim Training praktisch.

Sigmoid und Logit

Wir haben zwei Funktionen:

σ ⁣:R→(0,1),logit⁡ ⁣:(0,1)→R.\sigma \colon \mathbb{R} \to (0, 1), \qquad \operatorname{logit} \colon (0, 1) \to \mathbb{R}.

Also lassen sich beide Verkettungen bilden, σ∘logit⁡ ⁣:(0,1)→(0,1)\sigma \circ \operatorname{logit} \colon (0, 1) \to (0, 1) und logit⁡∘σ ⁣:R→R\operatorname{logit} \circ \sigma \colon \mathbb{R} \to \mathbb{R}. Was haben die Funktionen miteinander zu tun?

Für p∈(0,1)p \in (0, 1) ist

σ(logit⁡(p))=11+e−ln⁡p1−p=11+1−pp=pp+1−p=p.\sigma(\operatorname{logit}(p)) = \frac{1}{1 + e^{-\ln\frac{p}{1-p}}} = \frac{1}{1 + \frac{1-p}{p}} = \frac{p}{p + 1 - p} = p.

Für x∈Rx \in \mathbb{R} ist – erst σ(x)\sigma(x) mit exe^x erweitern, dann ln⁡\ln anwenden und ln⁡(ex)=x\ln(e^x) = x nutzen –

logit⁡(σ(x))=ln⁡σ(x)1−σ(x)=ln⁡exex+11ex+1=ln⁡ex=x.\operatorname{logit}(\sigma(x)) = \ln \frac{\sigma(x)}{1 - \sigma(x)} = \ln \frac{\frac{e^x}{e^x + 1}}{\frac{1}{e^x + 1}} = \ln e^x = x.

Wir haben gesehen: σ\sigma und logit⁡\operatorname{logit} sind Inverse zueinander,

σ∘logit⁡=id⁡(0,1),logit⁡∘σ=id⁡R.\sigma \circ \operatorname{logit} = \operatorname{id}_{(0,1)}, \qquad \operatorname{logit} \circ \sigma = \operatorname{id}_{\mathbb{R}}.

Darum nennt man σ\sigma als Inverse von logit⁡\operatorname{logit} auch expit.

Wie interpretieren wir das?

Gegeben einen Wert x∈Rx \in \mathbb{R} gibt σ(x)\sigma(x) einen Wert p:=σ(x)∈(0,1)p := \sigma(x) \in (0, 1), sodass x=logit⁡(p)x = \operatorname{logit}(p). Jeder Wert xx lässt sich also als Logit auffassen – als logarithmierte Chance –, und σ(x)\sigma(x) gibt die Wahrscheinlichkeit des Bernoulli-Experiments an, zu der xx der Logit-Wert ist. Das ist die Interpretation, die uns im ersten Abschnitt gefehlt hat: Eine Zahl zwischen 0 und 1, die aus σ\sigma kommt, ist eine Wahrscheinlichkeit, wenn die Eingabe ein Logit war.

Logistische Regression

Alle Zutaten sind bereit, jetzt wird gekocht. Die lineare Regression spuckt y^\hat{y}-Werte aus, die in ganz R\mathbb{R} liegen. Wenn y=0y = 0 und y=1y = 1 zu den zwei Klassen korrespondieren, so fassen wir y^=w⋅x+b\hat{y} = w \cdot x + b als Logit auf, und die Werte σ(y^)\sigma(\hat{y}) geben die Wahrscheinlichkeit an, in Klasse 1 zu liegen. Wenn σ(y^)>12\sigma(\hat{y}) > \tfrac12, so entscheiden wir für Klasse 1 – und weil σ\sigma monoton mit σ(0)=12\sigma(0) = \tfrac12 ist, ist das dasselbe wie y^>0\hat{y} > 0.

In Scikit-Learn wird in der logistischen Regression unterschieden zwischen predict und predict_proba. Den Wert y^=w⋅x+b\hat{y} = w \cdot x + b selbst liefert decision_function, und damit ist

decision_function(x)=y^,predict_proba(x)=(1−σ(y^),  σ(y^)),predict(x)=[ σ(y^)>12 ].\texttt{decision\_function}(x) = \hat{y}, \qquad \texttt{predict\_proba}(x) = \bigl(1 - \sigma(\hat{y}),\; \sigma(\hat{y})\bigr), \qquad \texttt{predict}(x) = [\, \sigma(\hat{y}) > \tfrac12 \,].

predict_proba gibt also eine Spalte pro Klasse zurück, in der Reihenfolge von classes_: bei Labels 0/10/1 zuerst P(Y=0)P(Y = 0), dann P(Y=1)P(Y = 1). Die Wahrscheinlichkeit für Klasse 1 steht in der zweiten Spalte. Beim Softmax weiter unten begegnet uns dieselbe Form für KK Klassen.

Lineare Regression in PyTorch

In PyTorch macht man eine lineare Regression so:

import torch
import torch.nn as nn

class LinearRegression(nn.Module):
    def __init__(self, input_dim, output_dim):
        super().__init__()
        self.linear = nn.Linear(input_dim, output_dim)

    def forward(self, x):
        return self.linear(x)

Ein Modell ist eine Unterklasse von nn.Module; im Konstruktor werden die Bausteine mit Parametern angelegt (hier eine einzige lineare Schicht nn.Linear, das ist x↦Wx+bx \mapsto Wx + b), und forward beschreibt die Inferenz. Das Training:

import numpy as np

x = np.linspace(0, 10, 50)                      # irgendein eindimensionaler Datensatz
y = 2.5 * x + 1.0 + np.random.normal(0, 1, 50)  # verrauschte Gerade

model = LinearRegression(1, 1)
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

inputs = torch.from_numpy(x.reshape(-1, 1).astype("float32"))
labels = torch.from_numpy(y.reshape(-1, 1).astype("float32"))

number_of_epochs = 100
losses = np.zeros(number_of_epochs, dtype="float32")

for epoch in range(number_of_epochs):
    optimizer.zero_grad()
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()
    losses[epoch] = loss.item()

y_pred = model(inputs).detach().numpy()

Die fünf Zeilen in der Schleife sind die Trainingsschleife von PyTorch, die uns in allen weiteren Kapiteln begleitet: Gradienten auf null setzen, Vorwärtsrechnung, Loss berechnen, Gradienten rückwärts berechnen (backward), Parameter anpassen (step). Was criterion (die Loss-Funktion, hier der mittlere quadratische Fehler MSE) und optimizer (hier stochastischer Gradientenabstieg SGD mit Lernrate 0,010{,}01) genau tun, klären die nächsten beiden Kapitel.

Dieselben 0/1-Daten, einmal mit linearer Regression (MSE-Loss) und einmal mit logistischer Regression (BCE-Loss) gefittet.

Dieselben 0/1-Daten, einmal mit linearer Regression (MSE-Loss) und einmal mit logistischer Regression (BCE-Loss) gefittet.

Logistische Regression in PyTorch

Für die logistische Regression ändern sich genau zwei Zeilen: Die Aktivierungsfunktion in forward

class LogisticRegression(nn.Module):
    def __init__(self, input_dim, output_dim):
        super().__init__()
        self.linear = nn.Linear(input_dim, output_dim)

    def forward(self, x):
        return torch.sigmoid(self.linear(x))  # <---

und die Loss-Funktion:

model = LogisticRegression(1, 1)
criterion = nn.BCELoss()  # <---
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

Der Rest der Trainingsschleife bleibt identisch. BCELoss ist die binäre Kreuzentropie: die erwartete Überraschung, wenn man mit den vorhergesagten Wahrscheinlichkeiten (σ(y^),1−σ(y^))(\sigma(\hat{y}), 1 - \sigma(\hat{y})) rechnet, die Wahrheit aber (y,1−y)(y, 1 - y) ist. Sie ist bis auf eine Konstante die Kullback-Leibler-Divergenz aus dem DS-Skript (dort H(p∥r)H(p \Vert r) geschrieben); den genauen Zusammenhang und woher diese Loss-Funktion kommt, klärt das nächste Kapitel.

Weg von der 2-Klassen-Gesellschaft: Softmax

Von Bernoulli zu Multinoulli

Von binomial (2 Klassen) zu multinomial (KK Klassen): Anstelle eines einzelnen y^\hat{y}-Werts der linearen Regression, der uns mit σ\sigma die Wahrscheinlichkeit für Klasse 1 angibt, benötigen wir nun einen Vektor der Länge KK, der sich auf 1 aufsummiert. Für K=2K = 2 erwarten wir den Vektor (σ(y^),1−σ(y^))(\sigma(\hat{y}), 1 - \sigma(\hat{y})).

Wenn wir die Klasse one-hot kodieren, also Vektoren der Länge KK mit einer 1 an Stelle kk und sonst Nullen als Labels verwenden, dann liefert multinomiale lineare Regression – eine Matrix W∈RK×nW \in \mathbb{R}^{K \times n} statt eines Vektors ww – Vorhersagevektoren v=Wx+b∈RKv = Wx + b \in \mathbb{R}^K. Die Entscheidung für Klasse k∈{1,…,K}k \in \{1, \dots, K\} fällt, wenn der Eintrag des Vektors an Index kk am größten ist, argmax⁡jvj=k\operatorname{argmax}_j v_j = k. Gesucht ist, analog zu σ\sigma, ein „soft argmax“.

Man darf sich das zweistufig vorstellen: Im ersten Schritt wird der Vektor vv komponentenweise exponenziert (alle Einträge werden positiv, und die Reihenfolge bleibt erhalten), im zweiten Schritt wird der Vektor normiert, sodass die Summe 1 ist. Für den Fall K=2K = 2 mit v=(x,y)v = (x, y) können wir leicht einsehen, dass

sm⁡1(v)=exex+ey=11+ey−x=σ(x−y),\operatorname{sm}_1(v) = \frac{e^x}{e^x + e^y} = \frac{1}{1 + e^{y - x}} = \sigma(x - y),

Softmax verallgemeinert also tatsächlich das Sigmoid, wobei nur die Differenz der Logits zählt. Obacht beim Vergleich mit σ\sigma: In der Softmax-Formel steht kein Minus im Exponenten. Das Minus in σ(x)=1/(1+e−x)\sigma(x) = 1/(1 + e^{-x}) entsteht erst beim Kürzen für K=2K = 2, wie eben gerechnet. Die Probe, dass sm⁡(v)\operatorname{sm}(v) wirklich eine Wahrscheinlichkeitsverteilung ist: Alle Einträge sind positiv, und die Summe ist ∑jevj/∑kevk=1\sum_j e^{v_j} \big/ \sum_k e^{v_k} = 1.

Übung

  1. Zeigen Sie σ(−x)=1−σ(x)\sigma(-x) = 1 - \sigma(x). Tipp: Erweitern Sie σ(−x)=11+ex\sigma(-x) = \frac{1}{1+e^{x}} mit e−xe^{-x}.

  2. Zeigen Sie σ′(x)=σ(x) σ(−x)\sigma'(x) = \sigma(x)\,\sigma(-x). Tipp: Quotientenregel, dann mit 1/σ(−x)1/\sigma(-x) multiplizieren und so lange umformen, bis die Definition von σ(x)\sigma(x) dasteht. Mit Teil 1 ist das dasselbe wie die aus der Literatur bekannte Form σ(x)(1−σ(x))\sigma(x)(1-\sigma(x)).

  3. Wie groß ist σ′(0)\sigma'(0)? Und wie groß sind die Odds bei p=0,5p = 0{,}5?

Antwortprobe: Die Odds sind 1. Die andere Zahl ist nach Teil 2 ein Produkt aus zwei gleichen Faktoren, also eine Quadratzahl; steht bei Ihnen 12\tfrac12, haben Sie σ(0)\sigma(0) statt σ′(0)\sigma'(0) ausgerechnet.