Ein generatives Modell ist ein leistungsfähiges Verfahren zum Erlernen jeder Art von Datenverteilung durch unüberwachtes Lernen und hat in nur wenigen Jahren einen enormen Erfolg erzielt. Alle Arten von generativen Modellen zielen darauf ab, die wahre Datenverteilung des Trainingssatzes zu lernen, um neue Datenpunkte mit einigen Variationen zu erzeugen. Es ist jedoch nicht immer möglich, die exakte Verteilung unserer Daten zu lernen, weder implizit noch explizit, und so versuchen wir, eine Verteilung zu modellieren, die der wahren Datenverteilung so ähnlich wie möglich ist. Zu diesem Zweck können wir die Leistungsfähigkeit neuronaler Netze nutzen, um eine Funktion zu erlernen, die die Modellverteilung an die wahre Verteilung annähert.
Zwei der am häufigsten verwendeten und effizientesten Ansätze sind Variational Autoencoders (VAE) und Generative Adversarial Networks (GAN). VAE zielt darauf ab, die untere Grenze der Log-Likelihood der Daten zu maximieren, und GAN zielt darauf ab, ein Gleichgewicht zwischen Generator und Diskriminator zu erreichen. In diesem Blogpost werde ich die Funktionsweise von VAE und GANs und die Intuition dahinter erklären.
Variationaler Autoencoder
Ich gehe davon aus, dass der Leser bereits mit der Funktionsweise eines Vanilla Autoencoders vertraut ist. Wir wissen, dass wir einen Autoencoder verwenden können, um ein Eingangsbild in eine viel kleinere dimensionale Darstellung zu kodieren, die latente Informationen über die Verteilung der Eingangsdaten speichern kann. Aber in einem Vanilla-Autoencoder kann der kodierte Vektor nur mit Hilfe eines Decoders auf die entsprechende Eingabe abgebildet werden. Er kann sicherlich nicht verwendet werden, um ähnliche Bilder mit einer gewissen Variabilität zu erzeugen.
Um dies zu erreichen, muss das Modell die Wahrscheinlichkeitsverteilung der Trainingsdaten lernen. VAE ist einer der populärsten Ansätze, um die komplizierte Verteilung von Daten wie Bildern mit Hilfe von neuronalen Netzen auf unüberwachte Weise zu lernen. Es handelt sich um ein probabilistisches grafisches Modell, das auf der Bayes’schen Inferenz beruht, d. h. das Modell zielt darauf ab, die zugrundeliegende Wahrscheinlichkeitsverteilung der Trainingsdaten zu erlernen, so dass es problemlos neue Daten aus dieser erlernten Verteilung entnehmen kann. Die Idee besteht darin, eine niedrigdimensionale latente Repräsentation der Trainingsdaten zu erlernen, die als latente Variablen bezeichnet werden (Variablen, die nicht direkt beobachtet, sondern vielmehr durch ein mathematisches Modell abgeleitet werden), von denen wir annehmen, dass sie unsere tatsächlichen Trainingsdaten erzeugt haben. Diese latenten Variablen können nützliche Informationen über die Art des Outputs speichern, den das Modell erzeugen soll. Die Wahrscheinlichkeitsverteilung der latenten Variablen z wird mit P(z) bezeichnet. Zum Erlernen der Verteilung P(z) wird eine Gauß-Verteilung als Prior gewählt, um während der Inferenzzeit leicht neue Datenpunkte zu erfassen.
Das Hauptziel besteht nun darin, die Daten mit einigen Parametern zu modellieren, die die Wahrscheinlichkeit der Trainingsdaten X maximieren. Kurz gesagt, wir gehen davon aus, dass ein niedrigdimensionaler latenter Vektor unsere Daten x (x ∈ X) generiert hat, und wir können diesen latenten Vektor mit Hilfe einer deterministischen Funktion f(z;θ), die durch Theta parametrisiert ist, auf die Daten x abbilden, die wir auswerten müssen (siehe Abb. 1). Im Rahmen dieses generativen Prozesses ist unser Ziel die Maximierung der Wahrscheinlichkeit der einzelnen Daten in X, die gegeben ist als,
Pө(X) = ∫Pө(X, z)dz = ∫Pө(X|z)Pө(z)dz (1)
Hier wurde f(z;θ)durch eine Verteilung Pө(X|z) ersetzt worden.
Die Intuition hinter dieser Maximum-Likelihood-Schätzung ist, dass, wenn das Modell Trainingsstichproben aus diesen latenten Variablen generieren kann, es auch ähnliche Stichproben mit einigen Variationen generieren kann. Mit anderen Worten: Wenn wir eine große Anzahl latenter Variablen aus P(z) entnehmen und x aus diesen Variablen generieren, sollte das generierte x mit der Datenverteilung Pdata(x) übereinstimmen. Nun stellen sich zwei Fragen, die wir beantworten müssen. Wie erfasst man die Verteilung der latenten Variablen und wie integriert man Gleichung 1 über alle Dimensionen von z?
Es ist offensichtlich eine mühsame Aufgabe, die relevanten Informationen, die wir in den latenten Vektor kodieren möchten, manuell zu spezifizieren, um das Ausgangsbild zu erzeugen. Stattdessen stützen wir uns bei der Berechnung von z auf neuronale Netze, wobei wir davon ausgehen, dass dieser latente Vektor gut als Normalverteilung approximiert werden kann, so dass die Stichprobenziehung zum Zeitpunkt der Inferenz einfach ist. Wenn wir eine Normalverteilung von z im n-dimensionalen Raum haben, dann ist es immer möglich, jede Art von Verteilung mit einer hinreichend komplizierten Funktion zu erzeugen, und die Inverse dieser Funktion kann verwendet werden, um die latenten Variablen selbst zu lernen.
In Gleichung 1 wird die Integration über alle Dimensionen von z durchgeführt und ist daher unlösbar. Sie kann jedoch mit Methoden der Monte-Carlo-Integration berechnet werden, was jedoch nicht einfach zu implementieren ist. Daher verfolgen wir einen anderen Ansatz, um Pө(X) in Gleichung 1 näherungsweise zu maximieren. Die Idee der VAE ist es, P(z) aus P(z|X) abzuleiten, das wir nicht kennen. Wir leiten P(z|X) mit einer Methode ab, die als Variationsinferenz bezeichnet wird und im Grunde ein Optimierungsproblem der Bayes’schen Statistik darstellt. Zunächst modellieren wir P(z|X) mit Hilfe der einfacheren Verteilung Q(z|X), die leicht zu finden ist, und versuchen, die Differenz zwischen P(z|X) und Q(z|X) mit Hilfe der KL-Divergenzmetrik zu minimieren, damit unsere Hypothese nahe an der wahren Verteilung liegt. Es folgen eine Menge mathematischer Gleichungen, die ich hier nicht erläutern werde, aber Sie können sie in der Originalarbeit finden. Aber ich muss sagen, dass diese Gleichungen nicht sehr schwer zu verstehen sind, sobald man die Intuition hinter VAE verstanden hat.
Die endgültige Zielfunktion von VAE ist :-