Tiefe generative Modelle

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.

Abb. 1. Latenter Vektor, abgebildet auf die Datenverteilung unter Verwendung des Parameters ө

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 :-

Die obige Gleichung hat eine sehr schöne Interpretation. Der Term Q(z|X) ist im Grunde unser Kodiernetz, z ist unsere kodierte Darstellung der Daten x(x ∈ X) und P(X|z) ist unser Dekodiernetz. In der obigen Gleichung besteht unser Ziel also darin, die logarithmische Wahrscheinlichkeit unserer Datenverteilung unter einem durch D_KL gegebenen Fehler zu maximieren. Es ist leicht zu erkennen, dass VAE versucht, die untere Schranke von log(P(X)) zu minimieren, da P(z|X) nicht handhabbar ist, aber der KL-Divergenz-Term >=0 ist. Dies ist dasselbe wie die Maximierung von E und die Minimierung von D_KL. Wir wissen, dass die Maximierung von E eine Maximum-Likelihood-Schätzung ist und mit einem Decodernetz modelliert wird. Wie ich bereits sagte, wollen wir, dass unsere latente Repräsentation nahe an Gauß liegt, und daher nehmen wir an, dass P(z) N(0, 1) ist. Dieser Annahme folgend, sollte auch Q(z|X) nahe an dieser Verteilung liegen. Wenn wir annehmen, dass es sich um eine Gaußverteilung mit den Parametern μ(X) und Ʃ(X) handelt, ist der Fehler aufgrund der Differenz zwischen diesen beiden Verteilungen, d. h., P(z) und Q(z|X), gegeben durch die KL-Divergenz, führt zu einer geschlossenen Lösung, die unten angegeben ist.

Betrachtet man, dass wir die untere Variationsschranke optimieren, ist unsere Optimierungsfunktion :

log(P(X|z)) – D_KL, wobei die Lösung der zweiten Funktion oben gezeigt ist.

Daher enthält unsere Verlustfunktion zwei Terme. Der erste ist der Rekonstruktionsverlust der Eingabe zur Ausgabe und der zweite Verlust ist der KL-Divergenzterm. Jetzt können wir das Netz mit dem Backpropagation-Algorithmus trainieren. Es gibt jedoch ein Problem, und zwar hängt der erste Term nicht nur von den Parametern von P, sondern auch von den Parametern von Q ab, aber diese Abhängigkeit erscheint nicht in der obigen Gleichung. Wie kann man also durch die Schicht, in der z zufällig aus der Verteilung Q(z|X) oder N entnommen wird, zurückfließen, damit P dekodieren kann? Gradienten können nicht durch Zufallsknoten fließen. Wir verwenden den Trick der Reparametrisierung (siehe Abbildung), um das Netz differenzierbar zu machen. Wir nehmen eine Stichprobe aus N(μ(X), Σ(X)), indem wir zuerst ε ∼ N(0, I) nehmen und dann z=μ(X) + Σ1/2(X)∗ε berechnen.

Dies ist sehr schön in der Abbildung 2 dargestellt ? . Es ist zu beachten, dass der Feedforward-Schritt für beide Netze identisch ist (links & rechts), aber Gradienten können nur durch das rechte Netz backpropagieren.

Abb.2. Reparametrisierungstrick, der verwendet wird, um sich durch zufällige Knoten rückwärts fortzupflanzen

Zur Inferenzzeit können wir einfach eine Stichprobe von z aus N(0, 1) nehmen und sie in das Decodernetz einspeisen, um einen neuen Datenpunkt zu erzeugen. Da wir die untere Variationsschranke optimieren, ist die Qualität des erzeugten Bildes etwas schlechter als bei modernen Techniken wie Generative Adversarial Networks.

Das Beste an VAE ist, dass es sowohl das generative Modell als auch ein Inferenzmodell lernt. Obwohl sowohl VAE als auch GANs sehr interessante Ansätze sind, um die zugrundeliegende Datenverteilung durch unüberwachtes Lernen zu erlernen, liefern GANs im Vergleich zu VAE bessere Ergebnisse. Bei VAE optimieren wir die untere Variationsschranke, während es bei GAN keine solche Annahme gibt. GANs befassen sich in der Tat nicht mit einer expliziten Wahrscheinlichkeitsdichteschätzung. Das Versagen der VAE bei der Erzeugung scharfer Bilder bedeutet, dass das Modell nicht in der Lage ist, die wahre Posterior-Verteilung zu lernen. VAE und GAN unterscheiden sich hauptsächlich in der Art des Trainings. Lassen Sie uns nun in Generative Adversarial Networks eintauchen.

Generative Adversarial Networks

Yann LeCun sagt, dass adversariales Training die coolste Sache seit geschnittenem Brot ist. Angesichts der Popularität von Generative Adversarial Networks und der Qualität der Ergebnisse, die sie liefern, würden ihm wohl die meisten von uns zustimmen. Adversariales Training hat die Art und Weise, wie wir den neuronalen Netzen eine bestimmte Aufgabe beibringen, völlig verändert. Generative Adversarial Networks arbeiten nicht mit einer expliziten Dichteschätzung wie Variational Autoencoders. Stattdessen basiert es auf einem spieltheoretischen Ansatz mit dem Ziel, ein Nash-Gleichgewicht zwischen den beiden Netzen, Generator und Diskriminator, zu finden. Die Idee besteht darin, von einer einfachen Verteilung wie der Gauß-Verteilung abzutasten und dann zu lernen, dieses Rauschen mit Hilfe von universellen Funktionsapproximatoren wie neuronalen Netzen in eine Datenverteilung umzuwandeln.

Dies wird durch kontradiktorisches Training dieser beiden Netze erreicht. Ein Generatormodell G lernt, die Datenverteilung zu erfassen, und ein Diskriminatormodell D schätzt die Wahrscheinlichkeit, dass eine Probe aus der Datenverteilung und nicht aus der Modellverteilung stammt. Grundsätzlich besteht die Aufgabe des Generators darin, natürlich aussehende Bilder zu erzeugen, und die Aufgabe des Diskriminators ist es, zu entscheiden, ob das Bild gefälscht oder echt ist. Man kann sich dies als ein Mini-Max-Spiel für zwei Spieler vorstellen, bei dem sich die Leistung beider Netzwerke mit der Zeit verbessert. In diesem Spiel versucht der Generator, den Diskriminator zu täuschen, indem er so weit wie möglich echte Bilder erzeugt, und der Generator versucht, nicht vom Diskriminator getäuscht zu werden, indem er seine Unterscheidungsfähigkeit verbessert. Die folgende Abbildung zeigt die grundlegende Architektur von GAN.

Abb.3. Baustein eines generativen adversen Netzwerks

Wir definieren einen Prior für die Eingangsrauschvariablen P(z) und der Generator bildet diese auf die Datenverteilung ab, indem er eine komplexe differenzierbare Funktion mit den Parametern өg verwendet. Darüber hinaus haben wir ein weiteres Netz namens Diskriminator, das die Eingabe x aufnimmt und unter Verwendung einer weiteren differenzierbaren Funktion mit Parametern өd einen einzelnen skalaren Wert ausgibt, der die Wahrscheinlichkeit angibt, dass x aus der wahren Datenverteilung Pdata(x) stammt. Die Zielfunktion des GAN ist definiert als

In der obigen Gleichung sollte D(x) 1 ausgeben, wenn die Eingabe in den Diskriminator aus der wahren Datenverteilung stammt, um die obige Zielfunktion zu maximieren.t D zu maximieren, während, wenn das Bild vom Generator erzeugt wurde, D(G(z)) 1 ausgeben sollte, um die Zielfunktion in Bezug auf G zu minimieren. Letzteres impliziert im Grunde, dass G solche realistischen Bilder erzeugen sollte, die D täuschen können. Wir maximieren die obige Funktion in Bezug auf die Parameter des Diskriminators mit Gradientenaufstieg und minimieren dieselbe in Bezug auf die Parameter des Generators mit Gradientenabstieg. Es gibt jedoch ein Problem bei der Optimierung des Generator-Ziels. Zu Beginn des Spiels, wenn der Generator noch nichts gelernt hat, ist der Gradient normalerweise sehr klein, und wenn er sehr gut abschneidet, sind die Gradienten sehr hoch (siehe Abb. 4). Wir wollen aber das gegenteilige Verhalten. Deshalb maximieren wir E, anstatt E zu minimieren

Abb.4. Kosten für den Generator als Funktion der Diskriminatorreaktion auf das erzeugte Bild

Der Trainingsprozess besteht aus der gleichzeitigen Anwendung des stochastischen Gradientenabstiegs auf den Diskriminator und den Generator. Während des Trainings werden abwechselnd k Schritte zur Optimierung von D und ein Schritt zur Optimierung von G auf die Mini-Batch angewendet. Der Trainingsprozess endet, wenn der Diskriminator nicht in der Lage ist, ρg und ρdata zu unterscheiden, d.h. wenn D(x, өd) = ½ oder wenn ρg = ρdata.

Eines der ersten GAN-Modelle, das ein Convolutional Neural Network verwendet, ist DCGAN, was für Deep Convolutional Generative Adversarial Networks steht. Dieses Netz nimmt als Eingabe 100 Zufallszahlen, die aus einer gleichmäßigen Verteilung gezogen werden, und gibt ein Bild mit der gewünschten Form aus. Das Netzwerk besteht aus vielen Faltungsschichten, Entfaltungsschichten und vollständig verbundenen Schichten. Das Netzwerk verwendet viele dekonvolutionäre Schichten, um das Eingangsrauschen auf das gewünschte Ausgangsbild abzubilden. Die Batch-Normalisierung wird verwendet, um das Training des Netzes zu stabilisieren. Die ReLU-Aktivierung wird im Generator für alle Schichten verwendet, mit Ausnahme der Ausgabeschicht, die die tanh-Schicht verwendet, und Leaky ReLU wird für alle Schichten im Discriminator verwendet. Dieses Netz wurde mit dem stochastischen Mini-Batch-Gradientenabstieg trainiert und der Adam-Optimierer wurde verwendet, um das Training mit abgestimmten Hyperparametern zu beschleunigen. Die Ergebnisse der Arbeit waren recht interessant. Die Autoren zeigten, dass die Generatoren interessante vektorarithmetische Eigenschaften haben, mit denen wir Bilder in der gewünschten Weise manipulieren können.

Abb.5. Generator von DCGAN

Abb.6. Discriminator von DCGAN

Eine der am weitesten verbreiteten Variationen von GANs ist das bedingte GAN, das durch einfaches Hinzufügen des bedingten Vektors zusammen mit dem Rauschvektor konstruiert wird (siehe Abb. 7). Vor cGAN haben wir Bilder nach dem Zufallsprinzip aus Zufallsstichproben des Rauschens z generiert. Was ist, wenn wir ein Bild mit einigen gewünschten Merkmalen erzeugen wollen? Gibt es eine Möglichkeit, dem Modell diese zusätzlichen Informationen darüber zu geben, welche Art von Bild wir erzeugen wollen? Die Antwort ist ja, und Conditional GAN ist der Weg dazu. Durch die Konditionierung des Modells auf zusätzliche Informationen, die sowohl dem Generator als auch dem Diskriminator zur Verfügung gestellt werden, ist es möglich, den Datengenerierungsprozess zu steuern. Conditional GANs werden bei einer Vielzahl von Aufgaben eingesetzt, wie z. B. bei der Generierung von Text in Bilder, der Übersetzung von Bildern in Bilder, der automatischen Kennzeichnung von Bildern usw. Eine einheitliche Struktur beider Netze ist im folgenden Diagramm dargestellt.

Abb. 7. Ein grundlegendes Beispiel für cGAN mit y als Konditionierungsvektor

Eine der coolen Sachen an GANs ist, dass sie sogar mit kleinen Trainingsdaten trainiert werden können. In der Tat sind die Ergebnisse von GANs vielversprechend, aber das Trainingsverfahren ist nicht trivial, insbesondere die Festlegung der Hyperparameter des Netzes. Außerdem sind GANs schwer zu optimieren, da sie nicht leicht konvergieren. Natürlich gibt es einige Tipps und Tricks, um GANs zu hacken, aber sie sind nicht immer hilfreich. Sie können einige dieser Tipps hier finden. Außerdem haben wir keine Kriterien für die quantitative Bewertung der Ergebnisse, außer um zu prüfen, ob die erzeugten Bilder wahrnehmungsmäßig realistisch sind oder nicht.

Fazit

Deep-Learning-Modelle erreichen beim überwachten Lernen tatsächlich Leistungen auf menschlichem Niveau, aber das Gleiche gilt nicht für das unüberwachte Lernen. Dennoch arbeiten Deep-Learning-Wissenschaftler hart daran, die Leistung von unüberwachten Modellen zu verbessern. In diesem Blogpost haben wir gesehen, wie zwei der berühmtesten Frameworks für unüberwachtes Lernen von generativen Modellen tatsächlich funktionieren. Wir haben die Probleme von Variational Autoencodern kennengelernt und erfahren, warum Adversarial Networks besser geeignet sind, realistische Bilder zu erzeugen. Es gibt jedoch Probleme mit GANs, wie z.B. die Stabilisierung ihres Trainings, was immer noch ein aktives Forschungsgebiet ist. GANs sind jedoch sehr leistungsfähig und werden derzeit für eine Vielzahl von Aufgaben eingesetzt, z. B. zur Erzeugung hochwertiger Bilder (siehe dieses Video) und Videos, zur Übersetzung von Text in Bilder, zur Bildverbesserung, zur Rekonstruktion von 3D-Objektmodellen aus Bildern, zur Musikerzeugung, zur Entdeckung von Krebsmedikamenten usw. Darüber hinaus arbeiten viele Deep-Learning-Forscher auch daran, diese beiden Modelle zu vereinheitlichen und das Beste aus beiden Modellen herauszuholen. Angesichts der zunehmenden Fortschritte beim Deep Learning glaube ich, dass GANs viele verschlossene Türen der künstlichen Intelligenz öffnen werden, wie z. B. das semi-überwachte Lernen und das Reinforcement Learning. In den nächsten Jahren werden generative Modelle sehr hilfreich für das Grafikdesign, die Gestaltung attraktiver Benutzeroberflächen usw. sein. Es könnte auch möglich sein, Texte in natürlicher Sprache mit Hilfe von generativen adversarischen Netzen zu generieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.