Variational Autoencoder (VAE): neue Bilder aus einem stetigen latenten Raum
Generatives Modell mit latenter Variable, ein VAE von Grund auf mit Reparametrisierungstrick, ein geordneter latenter Raum, Ziffern aus Rauschen im Vergleich zum gewöhnlichen Autoencoder, der Einfluss von β und der Kollaps, Interpolation und wo VAEs eingesetzt werden.
Serie KI-Grundlagen Teil 44 von 52
- Landkarte der künstlichen Intelligenz: was was ist und wie alles zusammenpasst
- Eine kurze Geschichte der künstlichen Intelligenz: von Turing bis zu Sprachmodellen
- Daten, Modell, Training, Inferenz: die Grundbegriffe an einem einzigen Beispiel
- Mathematische Notation lesen: Symbole, Indizes, Summen und Quantoren
- Mengen und Relationen: der Baukasten, aus dem Definitionen in der KI bestehen
- Funktionen und Abbildungen: warum jedes KI-Modell eine Funktion ist
- Logik und Beweise: die Regeln, nach denen KI schließt
- Graphen und Bäume: die Struktur, auf der Suche und neuronale Netze stehen
- Lineare Algebra für maschinelles Lernen: Vektoren, Matrizen und warum KI vor allem multipliziert
- Ableitungen, Gradient und Kettenregel: wie ein Modell herausfindet, in welche Richtung es lernen soll
- Gradientenabstieg: wie ein Modell lernt
- Was ist Wahrscheinlichkeit: vom Würfelwurf zu den Kolmogorow-Axiomen
- Bedingte Wahrscheinlichkeit und der Satz von Bayes: wie du deine Einschätzung änderst, wenn du etwas Neues erfährst
- Zufallsvariable und Verteilungsfunktion: eine Funktion, die alles über eine Verteilung verrät
- Dichtefunktion und Wahrscheinlichkeitsfunktion: warum eine stetige Zufallsvariable in einem Punkt die Wahrscheinlichkeit null hat
- Erwartungswert, Varianz und Kovarianz: wo eine Verteilung liegt, wie breit sie ist und was womit zusammenhängt
- Überblick über Wahrscheinlichkeitsverteilungen: Bernoulli-, Binomial-, Poisson-, Gleich-, Normal- und Exponentialverteilung
- Gesetz der großen Zahlen und zentraler Grenzwertsatz: Warum sich Durchschnitte so vorhersagbar verhalten
- Statistik und Parameterschätzung: Maximum Likelihood, MAP und Konfidenzintervalle
- Informationstheorie: Entropie, Kreuzentropie und KL-Divergenz — woher Verlustfunktionen kommen
- Zustandsraumsuche: BFS, DFS, UCS und A* mit Animationen
- Spiele und Gegner: Minimax, Alpha-Beta-Suche und Monte Carlo Tree Search
- Constraint Satisfaction: Backtracking, Constraint-Propagierung und AC-3 an Sudoku und einer Karte tschechischer Regionen
- Logik und wissensbasierte Systeme: Vorwärts- und Rückwärtsverkettung, Resolution und Expertensysteme
- Planung: STRIPS, die Blockwelt, Heuristiken aus Relaxierung und Planung in KI-Agenten
- Lokale Suche und simulierte Abkühlung: ein Handlungsreisender durch die tschechischen Regionalhauptstädte
- Genetische Algorithmen: Population, Kreuzung, Mutation und Selektion am Rucksack für die Wanderung
- Evolutionsstrategien und genetische Programmierung: von der 1/5-Erfolgsregel zum Keplerschen Gesetz
- Ameisenkolonieoptimierung: wie eine Pheromonspur einen kurzen Weg findet
- Partikelschwarmoptimierung: Trägheit, eigene Erfahrung und die Erfahrung des Schwarms
- Neuroevolution: Evolution der Gewichte und der Gestalt neuronaler Netze und der Algorithmus NEAT
- Fuzzy-Mengen und Zugehörigkeitsfunktionen: wie man „etwas warm“ aufschreibt
- Fuzzy-Logik und Wahrscheinlichkeit: warum „etwas warm“ nicht „wahrscheinlich warm“ bedeutet
- Fuzzy-Logik: t-Normen, Implikationen und WENN–DANN-Regeln
- Fuzzy-Regelung: Mamdani und Sugeno vom Ventilator bis zum Pendel auf dem Wagen
- Fuzzy-Clustering: der Algorithmus fuzzy c-means und Punkte zwischen den Clustern
- Neuro-Fuzzy-Systeme (ANFIS): Fuzzy-Regeln, die aus Daten lernen
- Markow-Ketten: Übergangsmatrix, stationäre Verteilung und PageRank
- Hidden-Markov-Modelle: der Viterbi-Algorithmus und das unehrliche Kasino
- Bayessche Netze: warum das Gras nass ist und was das für den Rasensprenger bedeutet
- Der Kalman-Filter: wie man aus ungenauen Messungen schätzt, wo ein Auto ist und wie schnell es fährt
- Arten des maschinellen Lernens: überwacht, unüberwacht, halbüberwacht und mehr
- Prompts, Kontext und RAG: wie man einem Modell die richtigen Informationen gibt
- Variational Autoencoder (VAE): neue Bilder aus einem stetigen latenten Raum
- Generative Adversarial Networks (GAN): der Fälscher gegen den Detektiv
- Diffusionsmodelle: wie aus reinem Rauschen ein Bild wird
- Markow-Entscheidungsprozesse: Zustände, Aktionen, Belohnungen und Bellman-Gleichungen
- Q-Learning und DQN: den Wert von Aktionen lernen, von der Tabelle bis zum neuronalen Netz
- Policy Gradient und PPO: die Strategie direkt lernen
- Wie ein KI-Agent funktioniert: ein Sprachmodell in einer Schleife mit Werkzeugen
- Programmieren mit KI-Agenten: Auftrag, Tests und Kontrolle
- Bewertung und Sicherheit von KI-Systemen: wie man misst und wie man überwacht
Der ganze Lehrplan der Serie 52 von 83 Themen fertig
- Warum man mit einem gewöhnlichen Autoencoder schlecht generieren kann.
- Wie ein VAE funktioniert: eine Verteilung statt eines Punkts, der KL-Strafterm und der Reparametrisierungstrick.
- Was β kostet, warum VAE-Bilder unscharf sind und wo VAEs heute eingesetzt werden.
Vorher gut zu wissen: Informationstheorie: Entropie, Kreuzentropie und KL-Divergenz — woher Verlustfunktionen kommen
Der Autoencoder aus dem Teil über Repräsentationen kann ein Bild in ein paar Zahlen pressen und es aus ihnen wieder zusammensetzen. Da liegt eine Frage nahe: Wenn der Decoder aus einem Code eine Ziffer machen kann, könnten wir ihm dann nicht einen Code geben, den wir uns ausgedacht haben, und eine neue Ziffer bekommen, die niemand gezeichnet hat? Beim gewöhnlichen Autoencoder funktioniert das kaum. Der Variational Autoencoder ist eine Abwandlung davon, die genau das möglich macht — und er ist das erste der generativen Modelle, mit denen wir uns in diesem Abschnitt der Serie beschäftigen.
Er baut auf den Teilen Autoencoder und Repräsentationen und Informationstheorie (KL-Divergenz) auf.
1. Von der Kompression zur Generierung
Definition — generatives Modell
Ein generatives Modell lernt aus Daten x1, …, xn eine Verteilung p(x), aus der man Stichproben ziehen kann — also neue x erzeugen, die wie die Daten aussehen, aber keine Kopien davon sind. Modelle mit einer latenten Variable tun das in zwei Schritten: Sie ziehen einen Code z aus einer einfachen Verteilung p(z) (etwa der Normalverteilung), und der Decoder berechnet daraus x.
Ein Klassifikator beantwortet „Was ist das?“. Ein generatives Modell kann auf „Zeig mir etwas, das in den Daten vorkommen könnte“ antworten. Das Rezept: Würfle ein paar Zahlen aus, gib sie einem Maler (dem Decoder), und der malt danach ein Bild.
p(x) = ∫ p(x | z) · p(z) dz
- p(z)
- Verteilung des Codes (Prior) — wir wählen sie selbst und einfach, bei uns N(0, I), weil wir beim Generieren dann aus ihr ziehen können
- p(x | z)
- Decoder — wie wahrscheinlich das Bild x ist, wenn wir den Code z bekommen; bei uns ein Netz, das für jedes Pixel die Wahrscheinlichkeit liefert, dass es leuchtet
- ∫ … dz
- Summe über alle möglichen Codes — das Bild könnte aus jedem beliebigen Code entstanden sein; das Integral über den ganzen latenten Raum können wir aber nicht berechnen, deshalb ersetzt der VAE es durch eine Schätzung (unten)
Der Haken beim gewöhnlichen Autoencoder: Wir wissen nicht, woher wir den Code ziehen sollen. Der Encoder legt die Ziffern im latenten Raum ab, wo es ihm gefällt. Bei unserem Netz mit zweidimensionalem Code liegen die Codes der Testziffern um den Punkt (-3,9; -0,9) mit der Standardabweichung 4,3 und 6,0, und zwischen den Gruppen gibt es Löcher, in denen der Decoder nie etwas gesehen hat.
2. Variational Autoencoder
Definition — Variational Autoencoder (VAE)
Ein VAE (Diederik Kingma und Max Welling, 2013) hat einen Encoder, der für ein Bild x nicht einen Punkt liefert, sondern eine Normalverteilung q(z | x) = N(μ(x), diag σ²(x)). Er lernt, indem er den Verlust
L = −Ez ~ q[log p(x | z)] + β · KL(q(z | x) ‖ N(0, I))
minimiert, wobei der erste Term der Rekonstruktionsfehler ist (bei uns die binäre Kreuzentropie der Pixel) und der zweite eine Strafe dafür, wie stark sich die Verteilung des Codes von der Standardnormalverteilung unterscheidet. Für Normalverteilungen gilt KL = ½ ∑j (μj² + σj² − log σj² − 1). Mit β = 1 ist −L eine untere Schranke der Log-Likelihood der Daten (ELBO).
Der Encoder darf nicht sagen „diese Sieben wohnt genau hier“, sondern nur „irgendwo in diesem Wölkchen“. Der Decoder muss dann aus jeder Stelle des Wölkchens eine Sieben zeichnen können. Und der KL-Strafterm schiebt alle Wölkchen zum Ursprung und lässt sie nicht zu klein werden — so überlappen sie sich, füllen den Raum aus, und zwischen ihnen bleiben keine Löcher.
L(x) = −Ez ~ q(z | x)[ log p(x | z) ] + β · KL( q(z | x) ‖ N(0, I) )
- −Ez ~ q[log p(x | z)]
- Rekonstruktionsfehler — wie schlecht der Decoder x aus einem Code zeichnet, der aus dem Wölkchen gezogen wurde. Der Erwartungswert über das ganze Wölkchen (nicht nur seine Mitte) zwingt den Decoder, in der ganzen Umgebung des Codes richtig zu zeichnen; das Minus steht da, weil wir den Logarithmus der Wahrscheinlichkeit möglichst groß und den Verlust möglichst klein haben wollen
- β
- Gewicht der Strafe — stellt den Kompromiss zwischen Genauigkeit und Ordnung im Raum ein; β = 1 ist genau der ELBO, andere Werte probieren wir im Abschnitt über β aus
- KL(q(z | x) ‖ N(0, I))
- Abstand des Wölkchens von der Verteilung, aus der wir ziehen werden — ohne ihn würde der Encoder die Wölkchen zu Punkten schrumpfen und weit auseinander verstreuen (die Rekonstruktion wäre besser), und wir hätten wieder einen gewöhnlichen Autoencoder
KL = ½ ∑j=1k ( μj² + σj² − log σj² − 1 )
- KL
- Strafterm aus der vorigen Formel, für Normalverteilungen exakt berechnet; die Koordinaten des Codes sind unabhängig, deshalb ist es eine Summe über j
- μj²
- Verschiebung der Wölkchenmitte vom Ursprung — wächst quadratisch, sodass weit entfernte Codes viel kosten und der Encoder sie zur Null zieht, wo wir ziehen werden
- σj² − log σj²
- Breite des Wölkchens — die Funktion s − log s hat ihr Minimum 1 genau bei s = 1; sie bestraft ein zu breites Wölkchen, vor allem aber ein zu schmales (−log σ² → ∞ für σ → 0), damit aus dem Wölkchen kein Punkt wird
Satz — der ELBO ist eine untere Schranke der Log-Likelihood
Für jede Verteilung q(z | x) gilt
log p(x) = Eq[log p(x | z)] − KL(q(z | x) ‖ p(z)) + KL(q(z | x) ‖ p(z | x)) ≥ Eq[log p(x | z)] − KL(q(z | x) ‖ p(z)).
Beweis. log p(x) hängt nicht von z ab, ist also gleich seinem Erwartungswert über q. Nach dem Satz von Bayes ist p(x) = p(x | z) p(z) / p(z | x); den Bruch erweitern wir mit q(z | x) / q(z | x):
log p(x) = Eq[log p(x | z)] + Eq[log (p(z) / q(z | x))] + Eq[log (q(z | x) / p(z | x))].
Der zweite Term ist −KL(q ‖ p(z)), der dritte KL(q ‖ p(z | x)). Die KL-Divergenz ist immer nichtnegativ (Gibbs-Ungleichung aus dem Teil über Informationstheorie), also erhalten wir durch Weglassen des dritten Terms die Ungleichung. ∎
Die rechte Seite ist der ELBO (evidence lower bound), und mit β = 1 ist das genau −L. Indem wir L minimieren, heben wir also die untere Schranke von log p(x) an, ohne das Integral berechnen zu müssen. Gleichheit tritt ein, wenn q(z | x) mit der tatsächlichen A-posteriori-Verteilung p(z | x) übereinstimmt.
Definition — binäre Kreuzentropie der Pixel
Der Decoder liefert für jedes der 64 Pixel eine Zahl yj ∈ (0, 1) und fasst sie als Wahrscheinlichkeit auf, dass das Pixel leuchtet. Für ein Bild mit Helligkeiten xj ∈ [0, 1] ist
−log p(x | z) = −∑j=164 [ xj log yj + (1 − xj) log(1 − yj) ].
Beispiel für ein Pixel: Es leuchtet (x = 1), und der Decoder sagt 0,9 → −ln 0,9 ≈ 0,105; er sagt 0,5 → ln 2 ≈ 0,693; es leuchtet nicht (x = 0), und der Decoder sagt 0,9 → −ln 0,1 ≈ 2,303. Ein selbstsicherer Irrtum kostet am meisten. Weil die Ausgabe eine Sigmoidfunktion ist, ist die Ableitung nach dem Eingang der Sigmoidfunktion einfach yj − xj — genau wie bei der logistischen Regression.
Definition — Reparametrisierungstrick (reparameterization trick)
Das Ziehen z ~ N(μ, σ²) lässt sich nicht nach μ und σ ableiten. Man schreibt es deshalb als z = μ + σ · ε, wobei ε ~ N(0, 1) ein von den Parametern unabhängiges Rauschen ist. Dann ist ∂z/∂μ = 1 und ∂z/∂σ = ε, und der Gradient gelangt per Backpropagation bis in den Encoder.
Wir „klammern den Zufall aus“: Statt „ziehe einen Punkt aus dem Wölkchen“ sagen wir „ziehe allgemeines Rauschen und verschiebe und strecke es so, wie der Encoder sagt“. Verschieben und Strecken sind gewöhnliche Rechnungen, und die lassen sich ableiten.
zj = μj(x) + σj(x) · εj, σj = exp(½ · log σj²), εj ~ N(0, 1)
- μj(x)
- Mitte des Wölkchens, Ausgabe des Encoders — ∂z/∂μ = 1, der Gradient des Decoders gelangt unverändert in den Encoder
- σj(x)
- Breite des Wölkchens — der Encoder liefert nicht σ, sondern log σ², das jede reelle Zahl sein darf; die Exponentialfunktion macht daraus immer eine positive Breite, sodass das Netz keine Nebenbedingung einhalten muss. ∂z/∂σ = ε
- εj ~ N(0, 1)
- der gesamte Zufall — hängt von keinem Parameter ab, also müssen wir durch ihn nichts ableiten; beim Generieren lassen wir den Encoder weg und ziehen z direkt aus N(0, I)
Beispiel — eine Testziffer (0) im trainierten VAE mit k = 2
Encoder: μ = (0,285; 1,587), log σ² = (−2,695; −1,931) → σ = (0,260; 0,381)
KL1 = ½ (0,081 + 0,068 + 2,695 − 1) ≈ 0,922
KL2 = ½ (2,518 + 0,145 + 1,931 − 1) ≈ 1,797 → KL ≈ 2,72 Nat
Reparametrisierung mit ε = (0,5; −1,0): z = (0,285 + 0,260 · 0,5; 1,587 − 0,381 · 1,0) = (0,415; 1,206)
Den Großteil der Strafe macht hier nicht der Abstand vom Ursprung aus, sondern die Schmalheit des Wölkchens: Der Term −log σ² trägt 2,695 und 1,931 bei. Der Encoder hätte den Code gern möglichst genau, die KL hält ihn breiter. Die durchschnittliche KL über die Testziffern beträgt 3,42 Nat. Der Rekonstruktionsfehler dieser Ziffer (aus der Mitte μ) beträgt 34,6 Nat auf 64 Pixel.
def krok_vae(davka, beta=1.0):
for x in davka:
mu, logvar = koder(x) # k + k Zahlen
sigma = exp(0.5 * logvar)
eps = normal(0, 1, size=len(mu)) # Zufall von außen
z = mu + sigma * eps # Reparametrisierungstrick
y = dekoder(z) # Pixelwahrscheinlichkeiten
rek = -sum(x * log(y) + (1 - x) * log(1 - y))
kl = 0.5 * sum(mu**2 + exp(logvar) - logvar - 1)
zpetne_sireni(rek + beta * kl) # Gradient fließt z → mu, sigma → Encoder
adam_krok() # mittlerer Gradient des Batches
Unser Netz: 64 Pixel → 32 Neuronen (tanh) → μ und log σ² (je k Zahlen) → 32 Neuronen → 64 Pixel (Sigmoidfunktion), trainiert mit Adam über 150 Epochen auf 600 synthetischen Ziffern. Dasselbe Netz, nur ohne das Rauschen ε und ohne den KL-Strafterm, ist ein gewöhnlicher Autoencoder — der Vergleich ist also fair.
3. Ein geordneter latenter Raum
Beide Netze gruppieren gleiche Ziffern zusammen. Der Autoencoder verstreut sie aber über eine große Fläche — beide Kreise der Normalverteilung sind im Vergleich dazu klein. Die Codes des VAE liegen um den Ursprung mit der Standardabweichung 1,14 und 1,04, also genau dort, woher wir ziehen werden.
Wie der ganze Raum aussieht, zeigt ein Gitter: regelmäßig verteilte Punkte des latenten Raums, jeder durch den Decoder geschickt.
Beim VAE gehen die Ziffern fließend ineinander über, und fast jedes Feld ist eine lesbare Ziffer. Um ehrlich zu sein: In der Ebene ist auch der Decoder des Autoencoders recht glatt, und sein Gitter enthält ebenfalls hauptsächlich Ziffern. Den Unterschied zeigt erst ein Code mit mehr Dimensionen in voller Deutlichkeit.
4. Generieren: neue Ziffern aus Rauschen
Wir ziehen 200 Codes und lassen sie decodieren: beim VAE aus N(0, I), beim Autoencoder (damit er eine faire Chance hat) aus einer Normalverteilung, die an seine tatsächlichen Codes angepasst ist. Die Qualität messen wir am Abstand (mittlere quadratische Abweichung) der Stichprobe zur nächstgelegenen Trainingsziffer. Echte Testziffern haben zur nächstgelegenen Trainingsziffer durchschnittlich 0,017, zufälliges Rauschen 0,159.
Definition — Abstand zur nächstgelegenen Trainingsziffer und angepasste Verteilung
Für eine Stichprobe y ∈ [0, 1]64 und Trainingsziffern x(1), …, x(600) ist
d(y) = mini (1/64) ∑j=164 (yj − x(i)j)²,
also die mittlere quadratische Abweichung (MSE) zur ähnlichsten Ziffer; die Qualität des Generators ist der Durchschnitt von d über 200 Stichproben. Ein kleines d bedeutet „sieht aus wie eine echte Ziffer“ — Vorsicht: Null bekäme auch ein Generator, der nur die Trainingsdaten kopiert.
Der Autoencoder zieht aus zj = mj + sj · εj, wobei mj und sj Mittelwert und Standardabweichung der j-ten Koordinate der Codes der Testziffern sind (für k = 2: m = (−3,9; −0,9), s = (4,3; 6,0)). Die Koordinaten werden unabhängig gezogen — eine etwaige Abhängigkeit zwischen ihnen erfasst die angepasste Verteilung nicht.
| Codegröße k | Rekonstruktion AE (MSE) | Rekonstruktion VAE (MSE) | Stichproben AE | Stichproben VAE |
|---|---|---|---|---|
| 2 | 0,051 | 0,063 | 0,042 | 0,044 |
| 8 | 0,025 | 0,036 | 0,090 | 0,054 |
| 16 | 0,017 | 0,039 | 0,112 | 0,055 |
Mit zweidimensionalem Code schneiden beide Netze ähnlich ab (0,042 gegenüber 0,044). Mit acht Dimensionen bricht der Autoencoder ein: Seine Stichproben haben den Abstand 0,090, mehr als auf halbem Weg zum Rauschen, während der VAE bei 0,054 bleibt. Mit sechzehn sind es 0,112 gegenüber 0,055. Die Codes des Autoencoders liegen in vielen Dimensionen auf einer dünnen, verbogenen Fläche, und ein zufälliger Punkt aus der angepassten Normalverteilung trifft sie praktisch nie.
Der Preis: Der VAE rekonstruiert schlechter. Mit k = 16 beträgt sein Rekonstruktionsfehler 0,039 gegenüber 0,017 beim Autoencoder, und seine Bilder sind unschärfer. Der Code ist verrauscht, also lernt der Decoder, den „Durchschnitt“ dessen zu zeichnen, was in der Umgebung des Codes sein könnte. Die Unschärfe ist eine bekannte Schwäche von VAEs.
5. Rekonstruktion gegen Ordnung: β
Das Gewicht β bestimmt, wie stark der KL-Strafterm die Codes zur Normalverteilung drückt. Fünf VAEs mit Code k = 2 und verschiedenem β:
| β | KL (Nat pro Bild) | Rekonstruktion (MSE) | Stichproben (Abstand) |
|---|---|---|---|
| 0,1 | 8,18 | 0,053 | 0,044 |
| 0,5 | 4,71 | 0,057 | 0,044 |
| 1 | 3,42 | 0,063 | 0,044 |
| 2 | 2,07 | 0,076 | 0,052 |
| 5 | 0,05 | 0,131 | 0,075 |
Ein kleines β lässt den Codes mehr Freiheit (KL 8,2), und die Rekonstruktion ist genauer. Ein großes β drückt sie zur Null. Bei β = 5 sinkt die KL auf 0,05: Der Encoder hat aufgehört, irgendetwas im Code zu speichern, und der Decoder zeichnet immer ungefähr dasselbe, egal welchen Code er bekommt. Das nennt man Posterior-Kollaps (posterior collapse).
Definition — Nat und KL als Preis des Codes
Das Nat ist die Informationseinheit mit dem natürlichen Logarithmus: 1 Nat = 1 / ln 2 ≈ 1,443 Bit. Die durchschnittliche KL über die Daten beschränkt die gegenseitige Information zwischen Bild und Code nach oben:
Ex KL(q(z | x) ‖ p(z)) = I(x; z) + KL(q(z) ‖ p(z)) ≥ I(x; z),
wobei q(z) = Ex q(z | x) die Verteilung der Codes aller Bilder zusammen ist. Die KL ist also der „Preis“, den der Encoder für das bezahlt, was er über das Bild im Code speichert.
Bei β = 0,1 sind das höchstens 8,18 Nat ≈ 11,8 Bit pro Bild, bei β = 5 nur 0,05 Nat ≈ 0,07 Bit — weniger als ein Zehntel Bit; der Code sagt also fast nichts über das Bild, und dem Decoder bleibt nichts anderes übrig, als immer dasselbe zu zeichnen.
Umgekehrt setzt der β-VAE (Irina Higgins u. a., 2017) bewusst β größer als 1 ein: Der stärkere Druck auf unabhängige Koordinaten des Codes führt dazu, dass einzelne Dimensionen oft verständlichen Eigenschaften entsprechen (Drehung, Strichstärke).
6. Fließende Übergänge
Wir nehmen die Codes zweier Testziffern (Netze mit achtdimensionalem Code, von jeder Ziffer das Bild, das der VAE am besten rekonstruiert) und gehen in acht Schritten die Gerade zwischen ihnen entlang: z(t) = (1 − t) · za + t · zb für t = 0, 1/7, 2/7, …, 1, wobei za, zb die Mitten μ beider Ziffern sind. Jeden Zwischenpunkt decodieren wir.
Der Übergang ist bei beiden Netzen fließend: Die Zwischenschritte sind glaubwürdige Formen zwischen beiden Ziffern. Auf der Geraden zwischen zwei echten Codes entfernen wir uns nicht weit von den Daten, deshalb fällt der gewöhnliche Autoencoder hier nicht zurück — seine Schwäche ist nur das blinde Ziehen. Dasselbe Prinzip erlaubt es bei großen Modellen, etwa den Gesichtsausdruck oder den Bildstil fließend zu verändern.
7. Wo VAEs eingesetzt werden
- Kompression für andere Generatoren. Stable Diffusion (latente Diffusion, Robin Rombach u. a., 2022) arbeitet nicht mit Pixeln, sondern mit dem Code eines Autoencoders mit kleinem KL-Strafterm: Ein Bild 512 × 512 × 3 wird auf 64 × 64 × 4 gepresst, und die Diffusion läuft in diesem kleineren Raum. Der Diffusion widmet sich einer der nächsten Teile.
- Diskrete Codes. VQ-VAE (Aäron van den Oord u. a., 2017) wählt statt eines stetigen Codes Einträge aus einem gelernten Wörterbuch. Ein Bild wird so zu einer Folge von „Tokens“, die ein Transformer generieren kann.
- Wissenschaftliche Daten. Moleküle, Zelldaten, Audio — überall, wo ein glatter Raum nützlich ist, in dem man suchen und interpolieren kann.
Bei der Bildschärfe verlieren VAEs gegen GANs und Diffusionsmodelle. Dafür haben sie ein stabiles Training, eine echte probabilistische Interpretation und einen Encoder gratis dazu.
8. Zusammenfassung
- Ein generatives Modell lernt die Verteilung der Daten, um aus ihr Stichproben ziehen zu können; mit einer latenten Variable zieht es einen Code und decodiert ihn.
- Der VAE codiert in eine Verteilung N(μ, σ²), und der Verlust = Rekonstruktion + β · KL zu N(0, I). Der Trick z = μ + σε macht das Ziehen ableitbar.
- Die Codes des VAE liegen um den Ursprung und füllen den Raum aus; die Codes des Autoencoders sind verstreut und voller Löcher.
- Mit 8 Dimensionen des Codes: Stichproben des Autoencoders 0,090, des VAE 0,054 (echte Ziffern 0,017, Rauschen 0,159).
- Der Preis sind schlechtere Rekonstruktion und Unschärfe; ein zu großes β führt zum Kollaps (KL 0,05).
Willst du es selbst ausprobieren? Lass einen KI-Agenten einen VAE mit zweidimensionalem Code auf dem Datensatz MNIST trainieren und ein Gitter decodierter Bilder zeichnen — du siehst dann die ganze „Landkarte“ handgeschriebener Ziffern.
Siehst du das anders? Schreib an support@coden-app.com.