Praktikum VC20 - Thema 2
Generative Modelle für 2D Pixelbilder

Die Idee in diesem Praktikum ist es, generative Modelle für 2D Bilder auszuprobieren. Wir verwenden dazu - Gaußsche Modelle (lineare Dimensionsreduktion, PCA) - Autoencoder (nicht-lineare Dimensionsreduktion) - …und optional GANs (Generative Adversarial Networks).

Grundsätzlich geht es darum, ein generatives statistisches Modell zu lernen. Dass heißt, wir haben Beispielbilder \(\mathbf{x}_1,...,\mathbf{x}_n \in \mathbb{R}^d\) gegeben, wobei jeder Vektor \(\mathbf{x}_i\) einem Beispielbild (mit \(d=w\times h\) Pixel, zweilenweise linearisiert) entspricht. Unsere Aufgabe ist es nun, daraus eine Wahrscheinlichkeitsdichte

\[p:\mathbb{R}^d \rightarrow \mathbb{R}\]

zu rekonstruieren, so dass diese die Daten gut wiedergibt. Typischerweise geschieht dies (zumindest approximativ) mit einem maximum-likelihood Ansatz. Wenn wir mit \(\theta\) die Parameter der Verteilung \(p\) bezeichnen, dann versuchen wir, die Wahrscheinlichkeitsdichte der Daten zu maximieren:

\[\theta = \operatorname{arg\ max}_\theta \prod_{i=1}^n p_\theta(x_i)\]

Dies kann auf verschiedene Weise erfolgen.

PCA! …die Welt ist doch ungefähr linear, oder?

Spoiler: leider nein. Diesmal nicht.

Der einfachste Ansatz ist, eine Normalverteilung an die Daten zu fitten. Danach erhält man ein Modell, aus dem man nicht nur einfach samplen (also typische Beispiele erzeugen) kann, sondern, dass auch Hauptachsen (mit entsprechenden Parametern) hat, mit denen man das Modell kontinuierlich verändern kann.

Aufgabe: Implementieren Sie PCA für den CelebA-Datensatz (s.u.) ermöglichen Sie dem Benutzer Ihres Programms, interaktive, die (wichtigsten) Hauptachsen zu steuern (z.B. mit einem Schieberegler), und bestimmen Sie typische Beispiele nach dem Gausschen Modell (Sampling).

Untersuchen Sie danach, wie gut das ganze funktioniert (Tipp: Erwarten Sie nicht zu viel.)

Autoencoder

Die Dimensionsreduktion der PCA kann man auch nicht-linear durchführen, indem man ein neuronales Netzwerk benutzt (typischerweise ein CNN mit mehreren Striding-Layern; am besten, man googlet ein wenig nach Tutorials/Beispielen), dass die Bilddaten auf wenige Kanäle (ca. von einigen 10 bis einigen 100) reduziert, und danch wieder mit einem (entsprechend umgekehrt aufgebautem) Generator rekonstruiert.

Ein maximum-likelihood training von generativen Netzen ist ein immer noch im wesentlichen ungelöstes Problem. Daher beschränken wir uns hierbei auf die (wesentliche einfachere) nichtlineare Dimensionsreduktion. Sei also \(f: \mathbb{R}^d \rightarrow \mathbb{R}^k\) das Kompressionsnetz und \(g: \mathbb{R}^k \rightarrow \mathbb{R}^d\) das umgekehrte Generatornetz. Dann trainiert man den Autoencoder auf den least-squares loss

\[\theta = \operatorname{arg\ max}_\theta \sum_{i=1}^n ||g\big( f(x_i) \big) - x_i ||_2^2,\]

wobei \(\theta\) wiederum die Parameter (von encoder und decoder zusammen) beschreiben.

Aufgabe: Implementieren Sie den Autoencoder für den CelebA-Datensatz (s.u.) ermöglichen Sie dem Benutzer Ihres Programms, interaktive, die \(k\) nichtlinearen latenten Parameter zu stuern (z.B. mit einem Schieberegler). Versuchen Sie, aus dem Modell zu samplen, indem Sie ein PCA-Modell an die \(k\) latenten Paramter (Ausgaben von \(f\)) fitten, und dann daraus samplen, und das Ergebnis in \(g\) stecken. Teil der Aufgabe ist es, im Netz nach einer guten Architektur zu suchen.

Untersuchen Sie danach, wie gut das ganze funktioniert (Tipp: Klappt schon deutlich besser, aber da ist noch Luft nach oben.)

Generative Adversarial Networks

Am besten funktionieren derzeit GANs. Hier wird nur ein Generator \(g\) gelernt, ohne Encoder (der Prinzipbedingt viel Information vernichten muss, da die Aufgabe/Zielfunktion sonst keinen Sinn macht). In den Generator \(g\) steckt man einfach normalverteilte Zufallsvariablen. Das Problem, einen maximum-likelihood Generator für durch die Stichproben \(\mathbf{x}_i\) gegebenen Beispielbilder zu lernen, wird dabei durch einen adversarialen Ansatz ersetzt, in dem ein zweites Netzwerk versucht, dem Generator beizubringen, wie man richtige Stichproben generiert.

Die Implementation ist von GANs ist leider sehr viel schwarze Magie. Eine gute Diskussion findet sich im Paper “Progressive Growing of GANs”, die die WGAN-GP-Idee mit einer schrittweisen Steigerung der Auflösung verbinden. Das Papier enthält dabei eine ganze Reihe von Tipps, wie man die WGANs implementieren muss, damit es wirklich funktioniert (WGAN-GP ist wahrscheinlich noch am einfachsten zu implementieren, wenn man halbwegs gute Qualität möchte).

Aufgabe: Versuchen Sie sich daran, ein GAN für den Datensatz zu implementieren. Falls es Ihnen nicht gelingt (was nicht unwahrscheinlich ist), beschreiben Sie in Ihrer Abschlusspräsentation kurz, wo Sie in Probleme gelaufen sind. Falls es Ihnen gelingt - Glückwunsch, das ist gar nicht so einfach!

Datensatz, Hardware

Im Prinzip sind alle Bilddatensätze mit halbwegs ähnlichen Bildinhalten (damit das Lernverfahren eine Chance hat, ohne das man den Großrechner auf das Problem loslassen muss) geeignet. Eine Empfehlung ist der CelebA-Datensatz der Chinese University of Honkong, der Bilder von berühmten Persönlichkeiten enhält. Für das Training empfiehlt es sich, die Auflösung zu normieren und auf einen relativ geringen Wert zu setzen (bei GANs sollten Sie \(16^2-64^2\) Pixel probieren, wobei letzteres schon relativ ambitioniert ist). Für die neuronalen Netzwerke benötigen Sie eine starke Graphikkarte (GeForce 1070 oder besser ist zu empfehlen); im Zweifelsfall können wir Ihnen einen Zugang zu einem Laborrechner einrichten.

Abschlusspräsentation

Zeigen Sie die Ergebnisse in Ihrer Abschlusspräsentation (viele Beispiele, am besten mit Demo oder Video zu den Parameteränderungen) und diskutieren Sie, worin sich die Ansätze in Bezug auf die erzielten Ergebnisse unterscheiden, und worin die beobachteten Schwächen (Ihrer Meinung nach) begründet liegen.







Datenschutz     Impressum