Eine kurze Einführung in GANs

Mit Erläuterungen zu Mathematik und Code

GANs (Generative Adversarial Networks) sind eine Art neuronaler Netzwerkarchitektur, mit der neuronale Netzwerke Daten generieren können. In den letzten Jahren haben sie sich zu einem der heißesten Teilbereiche des Tiefenlernens entwickelt, von der Erzeugung verschwommener Bilder von Ziffern bis hin zu fotorealistischen Bildern von Gesichtern.

Vorher: unscharfe Ziffern, Nachher: ​​fotorealistische Gesichter

Varianten von GANs haben jetzt verrückte Dinge getan, wie das Umwandeln von Bildern von Zebras in Pferde und umgekehrt.

Ich fand GANs faszinierend. Um sie besser zu verstehen, dachte ich, ich würde diesen Artikel schreiben, und während ich die Mathematik und den Code dahinter erläutere, verstehe ich sie selbst besser.

Hier ist ein Link zu einem Github-Repo, das ich für GAN-Ressourcen erstellt habe:

Wie funktionieren GANs?

GANs lernen eine Wahrscheinlichkeitsverteilung eines Datensatzes, indem sie zwei neuronale Netze gegeneinander austauschen.

Hier ist ein großartiger Artikel, der Wahrscheinlichkeitsverteilungen und andere Konzepte für diejenigen erklärt, die nicht mit ihnen vertraut sind:

Ein Modell, der Generator, wirkt wie ein Gemäldefälscher. Es wird versucht, Bilder zu erstellen, die dem Datensatz sehr ähnlich sind. Das andere Modell, der Diskriminator, verhält sich wie die Polizei und versucht festzustellen, ob die erzeugten Bilder gefälscht waren oder nicht.

Was im Grunde passiert, ist, dass der Fälscher immer besser Fälschungen macht, während die Polizei immer besser Fälschungen erkennt. Tatsächlich versuchen diese beiden Modelle immer wieder, sich gegenseitig zu schlagen, bis der Generator nach vielen Iterationen Bilder erzeugt, die nicht vom tatsächlichen Datensatz zu unterscheiden sind.

Das Training generativer kontradiktorischer Netzwerke beinhaltet zwei Ziele:

  1. Der Diskriminator maximiert die Wahrscheinlichkeit, dass sowohl Trainingsbeispielen als auch vom Generator erzeugten Bildern das richtige Etikett zugewiesen wird. Das heißt, der Polizist kann besser zwischen gefälschten und echten Gemälden unterscheiden.
  2. Der Generator minimiert die Wahrscheinlichkeit, dass der Diskriminator vorhersagen kann, dass das, was er erzeugt, gefälscht ist. Das heißt, der Generator kann besser Fälschungen erzeugen

Versuchen wir, diese beiden Ideen in ein Programm zu kodieren.

Wir werden diesen Code in diesem Tutorial befolgen

Die Daten

GANs benötigen einen zu verwendenden Datensatz. In diesem Lernprogramm verwenden wir die klassische Hallo-Welt zum maschinellen Lernen - MNIST, einen Datensatz aus handgeschriebenen Ziffern.

Der Generator benötigt auch Zufallseingabevektoren, um Bilder zu generieren. Dazu verwenden wir numpy

Die GAN-Funktion

Das GAN spielt ein Minimax-Spiel, bei dem das gesamte Netzwerk versucht, die Funktion V (D, G) zu optimieren. Dies ist die Gleichung, die definiert, was ein GAN tut:

Für jeden, der sich mit der Mathematik dahinter nicht auskennt, sieht es erschreckend aus, aber die Idee, die sie darstellt, ist einfach und doch mächtig. Es ist nur eine mathematische Darstellung der beiden oben definierten Ziele.

Der Generator wird durch G (z) definiert, das Rauschen, das wir eingeben, in Daten wie Bilder umwandelt.

Der Diskriminator wird durch D (x) definiert, der die Wahrscheinlichkeit ausgibt, dass die Eingabe x aus dem realen Datensatz stammt oder nicht.

Der Diskriminator verhält sich wie die Polizei

Wir möchten, dass die Vorhersagen für den Datensatz des Diskriminators so nahe wie möglich bei 1 und für den Generator so nahe wie möglich bei 0 liegen. Um dies zu erreichen, verwenden wir die log-Wahrscheinlichkeit von D (x) und 1-D (z) in der Zielfunktion.

Das Protokoll stellt nur sicher, dass es umso mehr bestraft wird, je näher es an einem falschen Wert liegt.

Im Folgenden finden Sie eine Erklärung für den Protokollverlust, wenn Sie nicht sicher sind, was dies bewirkt:

Codierung des Generators

Der Generator ist lediglich ein Vanille-Neuronales-Netzwerk-Modell, das einen Zufallseingabevektor verwendet und einen 784-dim-Vektor ausgibt, der, wenn er umgeformt wird, zu einem 28 × 28-Pixel-Bild wird.

Codierung des Diskriminators

Der Diskriminator ist ein weiteres neuronales Netzwerk, das die Ausgabe des vorherigen Netzwerks, einen 784-dimensionalen Vektor, verwendet und eine Wahrscheinlichkeit zwischen 0 und 1 ausgibt, dass es aus dem Trainingsdatensatz stammt.

Kompilieren in eine GAN

Wir kompilieren nun beide Modelle zu einem einzigen gegnerischen Netzwerk und setzen die Eingabe als 100-dimensionalen Vektor und die Ausgabe als Ausgabe des Diskriminators.

Training der GAN

  1. Zuerst laden wir die Daten und teilen sie in mehrere Stapel auf, um sie in unser Modell einzuspeisen
  2. Hier initialisieren wir einfach unser GAN-Netzwerk basierend auf den oben definierten Methoden
  3. Dies ist unsere Trainingsrunde, in der wir für die angegebene Anzahl von Epochen laufen.
  4. Wir erzeugen zufälliges Rauschen und entnehmen einige Bilder aus unserem Datensatz
  5. Wir erzeugen einige Bilder mit dem Generator und erzeugen einen Vektor X, der einige gefälschte Bilder und einige echte Bilder enthält
  6. Wir erstellen einen Vektor Y mit den „richtigen Antworten“, die X entsprechen, wobei die gefälschten Bilder mit 0 und die realen Bilder mit 0,9 gekennzeichnet sind. Sie sind mit 0,9 anstatt mit 1 gekennzeichnet, da dies dem GAN hilft, besser zu trainieren. Diese Methode wird als einseitige Etikettenglättung bezeichnet.
  7. Wir müssen das Training zwischen Diskriminator und Generator abwechseln, also aktualisieren wir hier den Diskriminator
  8. Schließlich aktualisieren wir den Diskriminator.

Unsere erste GAN

Sobald wir den obigen Code ausgeführt haben, haben wir effektiv unsere erste GAN erstellt, die Ziffern von Grund auf neu generiert!

Von der GAN erzeugte Bilder haben wir trainiert!

Hoffentlich bot dieser Artikel eine Einführung in Generative Adversarial Networks und wie man eines erstellt. In naher Zukunft werde ich viel mehr über maschinelles Lernen schreiben. Bleiben Sie auf dem Laufenden!

Danke fürs Lesen,

Sarvasv

Möchte chatten? Finde mich auf Twitter und Linkedin

Hier sind einige andere Posts, die ich geschrieben habe