Computer lehren, wie Van Gogh zu malen

Der Stanford Campus von AI Van Gogh

Einer der faszinierendsten Bereiche des Deep Learning ist zweifellos die Kunstgeneration.

Warte was?

Ich erinnere mich, als ich das zum ersten Mal sah, war mein Verstand überwältigt. Bei näherer Betrachtung könnte es nach meinen Maßstäben ein menschliches Meisterwerk gewesen sein (nicht, dass ich viel über Kunst weiß). Aber es war nicht so.

Es stellt sich heraus, dass diese Art von Dingen als Neural Style Transfer (NST) bezeichnet wird, das erstmals 2015 in einem Artikel veröffentlicht wurde, und im Grunde genommen Mathematik. Also beschloss ich, selbst etwas über ein NST-Modell zu lernen und es zu bauen.

Ein sternenklarer Nachttag in Toronto von Alex 'Laptop

Es ist eigentlich nicht so schwer wie du denkst.

So geht's:

In einem normalen Convolutional Neural Net (das wir zur Objekterkennung, zum Selbstfahren und zur Gesichtserkennung usw. verwenden) trainieren wir es, um den Fehler zu minimieren, den verschiedene Parameter jeder Schicht verursachen, wenn versucht wird, ein Objekt zu erkennen oder ein Bild zu klassifizieren . Wenn die Parameter die CNN-Vermutung falsch machen, gehen wir zurück und ändern sie, damit sie beim nächsten Mal ein bisschen näher an der Richtigkeit liegen.

Für NST initialisieren wir zuerst ein Bild, das zufällig RGB-Werte für jedes Pixel generiert hat:

Anschließend trainieren wir das CNN, um den Fehler zu minimieren, den Pixelwerte aufgrund eines von uns festgelegten willkürlichen Ziels verursachen. Anstatt die Parameter nach jedem Backpropagation-Schritt zu ändern, um den Fehler zu minimieren, aktualisieren wir die tatsächlichen Pixel des Bildes.

Unsere Aufgabe ist also theoretisch einfach:

Wir müssen eine Kostenfunktion schreiben, die minimiert werden kann, wobei das Endergebnis nach einer bestimmten Anzahl von Trainingsiterationen das erzeugte Bild ist, das den Stil eines Van-Gogh-Gemäldes mit dem Inhalt des Eingabebildes kombiniert, wie oben gezeigt.

OK, aber dazu müssen wir Stil und Inhalt noch mathematisch darstellen. Lassen Sie uns zunächst die Kostenfunktion in drei Teile aufteilen:

  1. Schreiben Sie eine Kostenfunktion für den Inhalt des Bildes
  2. Schreiben Sie eine Kostenfunktion für den Bildstil
  3. Kombinieren Sie die beiden vorherigen Kosten in einer gewichteten Gesamtkostenfunktion.

Lass uns anfangen.

1. Inhaltskosten

Wie stellen wir Inhalte mathematisch dar? Das heißt, wie stellen wir sicher, dass unser generiertes Bild, wenn unser Inhaltsbild ein Objekt enthält, auch eine erkennbare Form dieses Objekts enthält, in der wir ihre Merkmale leicht korrelieren und sagen können: „Hey, es ist dasselbe, nur anders gemalt '?

Dies hat damit zu tun, wie ein CNN tatsächlich lernt. Nehmen wir als Beispiel das leistungsstarke VGG-19-Neuronale Netz. Wir werden es am Ende auch verwenden, um NST anzuwenden.

VGG-19 gewann bei der ISLVRC-2014 Challenge

Ein CNN wie dieses erkennt zunächst sehr kleine Details aus Matrizen von R-, G- und B-Werten, die jedem Pixel entsprechen, wie z. B. die winzigen Kanten von Objekten, und erkennt dann größere, komplexere Formen, bis er erraten kann, was die sind Das Bild wird anhand seiner winzigen Komponenten dargestellt. Hier ist eine großartige Visualisierung:

Die obigen Bilder zeigen verschiedene Funktionen, die die Aktivierung jeder Ebene maximieren. Dies bedeutet, dass für jede Schicht jede 3x3-Box im Raster in gewissem Sinne zeigt, wonach ein Neuron sucht. (Wir wenden nach jeder Schicht eine sogenannte Aktivierungsfunktion an, um Daten, die wir erkennen, von den Daten zu trennen, die wir nicht erkennen. daher "Aktivierungen").

Hier kommt speziell VGG-19 ins Spiel. Das CNN mit 19 Schichten wurde im ImageNet-Datensatz vorab trainiert, der tausend Bildklassen und viele Trainingsbilder in jeder Klasse enthält. Dies macht es für das Modell wahrscheinlicher, den Inhalt des Bildes beizubehalten, da der Inhalt unabhängig von seinem Inhalt wahrscheinlich in eine der tausend Klassen passt, und wenn nicht, ist es wahrscheinlich, dass eines der Neuronen nach etwas Ähnlichem sucht die Komponenten des Inhaltsobjekts.

Jetzt müssen wir nur noch die Kostenfunktion über alle Ebenen des CNN ausführen und sicherstellen, dass alle Darstellungen des Inhalts vorhanden sind. Wir können dies tun, weil wir bereits die Intuition entwickelt haben, dass, wenn alle Aktivierungen einer bestimmten Ebene ähnlich sind, die Bilder, die durch die Ebene gehen, bei ihrer gegebenen Granularität ebenfalls ähnlich sind.

Also, da hast du es. Wenn Sie ähnliche Aktivierungen in einer Ebene haben, haben Sie ähnliche Inhalte. Für unsere Kostenfunktion müssen wir nur sicherstellen, dass wir in jeder Ebene nach ähnlichen Inhalten suchen, wenn wir den Stil ändern.

Es klappt so etwas. Wenn Sie neugierig sind:

Wir versuchen, die normalisierte Summe über die Unterschiede aller versteckten Aktivierungen im Inhalt zu reduzieren und Bilder zu generieren, die ihre Merkmale darstellen

2. Stilkosten

Jetzt, da wir die Inhaltskosten haben, möchten wir nicht, dass unser Modell weiterhin für denselben Inhalt geändert wird. Wenn dies der Fall wäre, würde das gleiche Bild ausgegeben, das wir ihm gegeben haben.

Wir wollen es mit dem Stil des "künstlerischeren" Bildes ausgleichen. Das Problem hierbei ist jedoch, wie wir den 'Stil' mathematisch extrahieren können.

Wenn Sie darüber nachdenken, ist der Stil wirklich die Korrelation zwischen bestimmten Inhalten hinsichtlich ihrer Position in einem Bild. Wenn beispielsweise vertikale Striche an denselben Stellen wie orangefarbene Flecken vorhanden sind, würde dies einen charakteristischen Stil darstellen. Wenn mehr Funktionen korrelieren, können Sie sehen, wie wir so etwas wie Van Goghs Stil nachbauen können.

Für unser Stilbild korrelieren wir also grundsätzlich jedes Merkmal mit jedem anderen Merkmal auf einer Ebene, indem wir sie alle miteinander multiplizieren, um eine Stilmatrix (oder Gram-Matrix, wie es sonst bekannt ist) für das Bild zu erstellen. Etwas wie das:

Unter Verwendung dessen, was wir über Aktivierungen aus den Inhaltskosten wissen, würden die Stilkosten dann den Unterschied zwischen der Stilmatrix im Stilbild und der Stilmatrix im generierten Bild verringern und versuchen, sie näher zu bringen.

Dies ist die Kostenfunktion für die Matrix auf einer Ebene:

Aber das ist nicht alles. Der Grund, warum ich immer wieder eine Ebene betone, ist der folgende. Angenommen, wir haben die Stilkostenfunktion auf Schicht 1 des CNN berechnet. Die Merkmale, die diese Schicht erkennt, wären extrem klein. wahrscheinlich nicht einmal groß genug, um von Menschen als "Stil" bezeichnet zu werden. Das hätte nicht das gewünschte Ergebnis gebracht, auf das wir gehofft hatten. Was wäre, wenn ein Künstler größere künstlerische Stile hätte, die sich auf die Symmetrie oder Geometrie bestimmter Formen im gesamten Bild beziehen? Das könnten wir auch in unserem generierten Bild nicht widerspiegeln.

Aus diesem Grund müssen wir eine Stilmatrix und Stilkosten für mehrere bestimmte Ebenen im CNN berechnen. So was:

Summiert über alle ausgewählten Ebenen Stilkosten multipliziert mit einem Gewicht Lambda

Diese Formel ermöglicht es uns, den Stil des Künstlers viel umfassender zu reflektieren.

Das war's für Stil.

3. Gesamtkosten

Der Rest ist ziemlich einfach. Wir müssen nur diese beiden Funktionen übernehmen; den Stil und den Inhalt, und setzen Sie sie in eine große Funktion, die ein vernünftiges Gleichgewicht zwischen ihnen schafft:

Summe aus Gewicht Alpha gegen Inhaltskosten und Gewicht Beta gegen Stilkosten. Alpha und Beta sind als Hyperparameter abgestimmt

Alles einpacken

Mit diesen Algorithmen wird NST in den folgenden Schritten ausgeführt:

  1. Führen Sie das Inhaltsbild über VGG-19 aus und sammeln Sie die Aktivierungen auf einer bestimmten Ebene
  2. Führen Sie das Stilbild über VGG-19 aus, sammeln Sie Aktivierungen und berechnen Sie Stilmatrizen auf mehreren Ebenen.
  3. Rauschbild erzeugen
  4. Führen Sie die Diagrammberechnung aus, die das Rauschbild über VGG-19 ausführt, Aktivierungen sammelt, gegen die Gesamtkosten berechnet und das Diagramm eine Rückausbreitung durchführt, wobei das eingegebene Rauschbild geändert wird, das als Eingabe für die nächste Iteration verwendet wird. Wiederholungen für die gewünschte Anzahl von Iterationen

Sie können meine Implementierung auf Github hier ansehen.

Einen Schritt zurück machen

Wenn wir uns nun ansehen, was wir getan haben und was die Autoren des NST-Papiers uns gezeigt haben, ist dies möglich, sollten wir dies wirklich wieder in die richtige Perspektive rücken.

Eine Maschine hat Kunst gemacht.

Selbst wenn NST keine weltverändernden Anwendungen hat, zeigt es uns, dass die Grenzen dessen, was KI unserer Meinung nach tun kann, jeden Tag erweitert werden. Und das macht den Unterschied.

Dies ist das erste einer Reihe von Themen des maschinellen Lernens, über die ich schreiben werde.

Wenn Sie Fragen haben, können Sie sich gerne auf Linkedin mit mir in Verbindung setzen oder mir eine E-Mail an zhual@utschools.ca senden.

Danke fürs Lesen!