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.

Vom Autoencoder zum VAE

Motivation: probabilistische Modelle

Beim klassischen Autoencoder bildet der Encoder einen Datenpunkt xx aus dem Datenraum RD\mathbb{R}^D auf einen Punkt enc⁡(x)\operatorname{enc}(x) im latenten Raum RL\mathbb{R}^L ab, der Decoder einen Punkt y∈RLy \in \mathbb{R}^L zurück in den Datenraum (DD und LL sind dieselben Dimensionen wie im Kapitel „Autoencoder“); Ziel ist MSE⁡(x,dec⁡(enc⁡(x)))\operatorname{MSE}(x, \operatorname{dec}(\operatorname{enc}(x))) möglichst klein. Die Modellannahme war aber: Die Punkte x∈Dx \in D sind eine Stichprobe aus einer Verteilung. Können wir die Verteilung direkt mit modellieren, in enc⁡(x)\operatorname{enc}(x)?

Variation des Ziels: Auch MSE⁡(x,dec⁡(enc⁡(x)+ε))\operatorname{MSE}(x, \operatorname{dec}(\operatorname{enc}(x) + \varepsilon)) soll möglichst klein sein, für einen normalverteilten Fehler ε∼N(0,1)\varepsilon \sim \mathcal{N}(0, 1). Variation des Trainings: Nach enc⁡(x)\operatorname{enc}(x) ein ε\varepsilon sampeln, addieren, dann dec⁡\operatorname{dec}. Der Decoder muss dann nicht nur den Punkt enc⁡(x)\operatorname{enc}(x), sondern eine ganze Umgebung davon auf xx abbilden – der latente Raum wird „glatt“.

Oh: Wie geht Backpropagation für „ein ε\varepsilon sampeln“? Da ε\varepsilon nicht von den Gewichten abhängt, ganz normal mit der Kettenregel:

ddwencdec⁡(enc⁡(x)+ε)=dec⁡′(enc⁡(x)+ε)⋅ddwencenc⁡(x).\frac{d}{dw_{\text{enc}}} \operatorname{dec}(\operatorname{enc}(x) + \varepsilon) = \operatorname{dec}'(\operatorname{enc}(x) + \varepsilon) \cdot \frac{d}{dw_{\text{enc}}} \operatorname{enc}(x).

Das gesampelte ε\varepsilon ist im Rückwärtsdurchlauf einfach eine Konstante.

Beispiel im latenten Raum. Mit 3 Datenpunkten: Klassisch sind das 3 Punkte. Mit +ε+\varepsilon werden es 3 Wolken gleicher Größe. Mit +σε+\sigma\varepsilon für einen Skalierungsfaktor σ\sigma kann man die Wolkengröße steuern. (In diesem Kapitel ist σ\sigma durchgehend eine Streuung, nicht die logistische Sigmoidfunktion aus dem Kapitel „Logistische Regression“.) Mit 300 Datenpunkten: Klassisch eine Punktwolke mit Löchern und Ausreißern; gut wäre eine Verteilung, die den latenten Raum lückenlos und gleichmäßig füllt, sodass man an jeder Stelle dekodieren kann.

Drei Datenpunkte im latenten Raum – klassisch, mit gleichem Rauschen +\varepsilon, mit datenabhängigem Rauschen +\sigma_x\varepsilon.

Drei Datenpunkte im latenten Raum – klassisch, mit gleichem Rauschen +ε+\varepsilon, mit datenabhängigem Rauschen +σxε+\sigma_x\varepsilon.

300 Datenpunkte – ein klassischer Autoencoder lässt Löcher und Ausreißer, ein VAE zieht die Codes zur Standardnormalverteilung.

300 Datenpunkte – ein klassischer Autoencoder lässt Löcher und Ausreißer, ein VAE zieht die Codes zur Standardnormalverteilung.

Modelliere die Verteilung also mit einer gaußschen Mischung im latenten Raum, in der die Störung ε\varepsilon von den Daten abhängt: Zu jedem Datenpunkt x∈Dx \in D brauchen wir zusätzlich zu enc⁡(x)∈L\operatorname{enc}(x) \in L auch eine Standardabweichung σx\sigma_x (bzw. besser noch eine Kovarianzmatrix cov⁡(x)\operatorname{cov}(x)), dann dec⁡(enc⁡(x)+ε)\operatorname{dec}(\operatorname{enc}(x) + \varepsilon) mit ε∼N(0,σx2)\varepsilon \sim \mathcal{N}(0, \sigma_x^2). Aber Sampling aus einer Verteilung, deren Parameter σx\sigma_x von den Gewichten abhängen, lässt sich nicht ableiten. Reparametrisierungstrick: statt ε∼N(0,σx2)\varepsilon \sim \mathcal{N}(0, \sigma_x^2) besser

y:=enc⁡(x)+σxε,ε∼N(0,1),y := \operatorname{enc}(x) + \sigma_x \varepsilon, \qquad \varepsilon \sim \mathcal{N}(0, 1),

denn dann ist ε\varepsilon wieder eine Konstante und σx\sigma_x ein ganz normaler Ausgang des Encoders, durch den Gradienten fließen.

Training

Wie trainiert man einen Variational Autoencoder? Für jeden Datenpunkt x∈Dx \in D berechne enc⁡(x)=(μx,σx)\operatorname{enc}(x) = (\mu_x, \sigma_x) – der Encoder hat jetzt 2L2L Ausgänge –, generiere ein ε∼N(0,1)\varepsilon \sim \mathcal{N}(0, 1) und setze y:=μx+σxεy := \mu_x + \sigma_x \varepsilon. Die Loss-Funktion ist naiv MSE⁡(x,dec⁡(y))\operatorname{MSE}(x, \operatorname{dec}(y)). Das hat einen Haken, und zwar in beide Richtungen: Das Netz kann σx→0\sigma_x \to 0 lernen und ist dann wieder ein klassischer Autoencoder. Oder es lässt μx\mu_x und σx\sigma_x beliebig groß werden, dann explodieren die latenten Vektoren, die Wolken der einzelnen Datenpunkte liegen weit auseinander, und der latente Raum füllt sich nie lückenlos.

Stabileres Training mit dem Extra-Term Variational Loss:

LVAE=MSE⁡(x,dec⁡(y))+DKL(q(y∣x) ∥ N(0,1)),L_{\text{VAE}} = \operatorname{MSE}(x, \operatorname{dec}(y)) + D_{KL}\bigl( q(y \mid x) \,\|\, \mathcal{N}(0, 1) \bigr),

wobei q(y∣x)=N(μx,σx2)q(y \mid x) = \mathcal{N}(\mu_x, \sigma_x^2) die Dichte der latenten Verteilung für ein festes xx ist. Dabei sind die beiden Standardnormalverteilungen – das N(0,1)\mathcal{N}(0,1) für ε\varepsilon und das N(0,1)\mathcal{N}(0,1) im KL-Term – nicht „dieselben“!! Die erste ist die Rauschquelle, die zweite ist die Prior-Verteilung, an die sich die Gesamtheit der latenten Verteilungen anschmiegen soll, damit der latente Raum um den Ursprung herum lückenlos gefüllt ist. In der Praxis lässt man den Encoder statt σx\sigma_x den Logarithmus der Varianz ausgeben, ℓx:=ln⁡σx2\ell_x := \ln \sigma_x^2 (im Code meist logvar), damit kein Ausgang auf positive Werte eingeschränkt werden muss; dann ist σx=exp⁡(ℓx/2)\sigma_x = \exp(\ell_x / 2). Für Normalverteilungen hat der KL-Term eine geschlossene Form:

DKL(N(μ,σ2) ∥ N(0,1))=12(μ2+σ2−1−ln⁡σ2).D_{KL}\bigl( \mathcal{N}(\mu, \sigma^2) \,\|\, \mathcal{N}(0, 1) \bigr) = \tfrac12 \left( \mu^2 + \sigma^2 - 1 - \ln \sigma^2 \right).

Diese Loss-Funktion ist der negative ELBO (evidence lower bound) aus dem Kapitel Expectation Maximization in Data Science – bis auf einen Faktor und eine additive Konstante, die daher rühren, dass wir den Rekonstruktionsterm als schlichten MSE schreiben statt als negative Log-Likelihood eines gaußschen Decoders mit fester Varianz. Für die Optimierung macht das keinen Unterschied, für den Vergleich der Zahlenwerte schon.

Recap

Ein VAE ist ein Autoencoder, dessen Encoder statt eines Punkts eine Normalverteilung im latenten Raum ausgibt, dessen Decoder aus einer Stichprobe daraus rekonstruiert, und dessen Loss die Rekonstruktion plus die KL-Divergenz zum Standardnormal-Prior ist. Danach kann man neue Daten generieren, indem man y∼N(0,1)y \sim \mathcal{N}(0, 1) sampelt und dekodiert. Schön zusammengefasst in Lilian Wengs Blogpost From Autoencoder to Beta-VAE. VAEs sind heute noch eine Komponente der Bildgeneratoren (DALL-E, Midjourney, Stable Diffusion): Die Diffusion findet im latenten Raum eines VAE statt.

Der Variational Autoencoder mit Reparametrisierungstrick: Der Encoder liefert \mu_x und \sigma_x, das Rauschen \varepsilon ist eine Konstante für die Backpropagation, der KL-Term zieht die Codes zum Prior.

Der Variational Autoencoder mit Reparametrisierungstrick: Der Encoder liefert μx\mu_x und σx\sigma_x, das Rauschen ε\varepsilon ist eine Konstante für die Backpropagation, der KL-Term zieht die Codes zum Prior.

Übung

Der variational loss term für eine latente Dimension ist 12(μ2+σ2−ln⁡σ2−1)\tfrac12\left(\mu^2 + \sigma^2 - \ln \sigma^2 - 1\right).

  1. Für welches Paar (μ,σ)(\mu, \sigma) wird er null? Rechnen Sie nach, dass er dort ein Minimum hat. Tipp: Leiten Sie nach μ\mu und nach σ\sigma getrennt ab.

  2. Berechnen Sie den Wert für (μ,σ)=(2,1)(\mu,\sigma) = (2, 1) und für (0 , 0,5)(0\ ,\ 0{,}5). Welche der beiden Abweichungen bestraft der Term stärker?

  3. Der Reparametrisierungstrick schreibt z=μ+σεz = \mu + \sigma\varepsilon mit ε∼N(0,1)\varepsilon \sim \mathcal{N}(0,1). Warum lässt sich ohne ihn nicht nach μ\mu und σ\sigma ableiten?

Antwortprobe: Bei (2) ist genau ein Wert größer als 1.