
Mit vier Parametern kann ich einen Elefanten fragen, und mit fünf kann ich ihn dazu bringen, seinen Rüssel zu bewegen.
- John Von Neumann
Die Idee der " differenzierbaren Programmierung " ist in der Welt des maschinellen Lernens sehr beliebt. Für viele ist nicht klar, ob dieser Begriff eine echte Veränderung im Verständnis der Forscher für maschinelles Lernen widerspiegelt oder nur eine (andere) Umbenennung von „Deep Learning“. In diesem Beitrag wird erläutert, was neu an differenzierter Programmierung (oder ∂P) in der Tabelle für maschinelles Lernen ist.
Am wichtigsten ist, dass differenzierte Programmierung die Verschiebung entgegen der Richtung des tiefen Lernens ist; von zunehmend parametrisierten Modellen bis zu einfacheren Modellen, die die Problemstruktur in größerem Umfang nutzen.
Als nächstes blättern wir durch eine Leinwand mit uninteressantem Text, wollen herausfinden, was automatische Differenzierung ist, und füllen sie sogar aus einem Katapult!
Brute Force mit Vorteilen
Differenzierbarkeit ist eine Grundidee, die Deep Learning so erfolgreich macht. Wo Brute-Force-Suchen selbst nach einigen hundert Modellparametern zu teuer wären, ermöglichen Gradienten das pseudozufällige Durchlaufen interessanter Teile des Parameterraums und finden einen guten Satz. Wenn wir einen so scheinbar naiven Algorithmus ausführen, erhalten wir eine gute Allgemeinheit, aber es ist alles andere als offensichtlich, dass wir beispielsweise mit Sequenzen in der Sprachübersetzung differenzieren müssen, aber alles stellt sich als einfach heraus, wir zeigen ein wenig Einfallsreichtum.
Was ist mit biologischen Neuronen und ? Diese Formel hat nichts Besonderes; Dies ist ein einfaches und flexibles Beispiel für eine hochparametrische nichtlineare Funktion. In der Tat ist dies in den meisten Fällen wahrscheinlich das schlechteste Merkmal. Eine Schicht des neuronalen Netzwerks kann im Prinzip Bilder von Katzen klassifizieren, jedoch nur mit einem relativ uninteressanten Trick. Es funktioniert einwandfrei! - aber das Kleingedruckte warnt davor, dass Sie möglicherweise mehr Parameter als Atome im Universum benötigen. Damit diese Arbeit tatsächlich funktioniert, müssen Sie die problematische Struktur im Modell codieren - hier sieht sie eher wie herkömmliche Programmierung aus.
Zum Beispiel haben ConvNets einen großen Vorteil gegenüber dem Perzeptron, da sie mit Bildkernen arbeiten, von denen bekannt ist, dass sie Übersetzungsinvarianz verwenden. Gesicht - Es ist das Gesicht, unabhängig davon, ob es in der oberen linken Ecke des Bildes oder in der Mitte angezeigt wird. Wenn das Perzeptron diesen Fall jedoch jeweils untersuchen sollte, kann der Kernel sofort auf einen beliebigen Teil des Bildes reagieren. Es ist schwierig, Faltungsnetzwerke statistisch zu analysieren, aber es ist viel einfacher, sie als automatische Version dessen zu betrachten, was Bildverarbeitungsexperten von Hand geschrieben haben. Der Kernel des Bildes ist das erste und am einfachsten zu differenzierende Programm.
Kodierungsstruktur, Redux
ML-Toolkits unterstützen zunehmend die algorithmische Differenzierung (AD), mit der wir Modelle mithilfe von Schleifen, Verzweigungen und Rekursionen unterscheiden können - oder mit jedem Programm, das auf einer Reihe differenzierbarer mathematischer Grundelemente basiert. Dies führte zu einer komplexeren Architektur: NLP-Modelle ähneln immer mehr klassischen Grammatik-Parsern mit stapelerweiterten Modellen, und Sie können sogar ein Analogon einer Turing-Maschine oder einen Programmierspracheninterpreter unterscheiden .
Der letzte Schritt der differenzierten Programmierung besteht darin, Matrixmultiplikation, Faltung und RNN nicht mehr als grundlegende Bausteine des tiefen Lernens zu betrachten, sondern nur noch als Sonderfälle. Wir können Deep-Learning-Methoden auf jede parametrisierte differenzierbare Funktion anwenden . So komplexe Funktionen wie physikalische Simulatoren oder Raytracer können ebenfalls differenziert und optimiert werden. Sogar Quantencomputer können in diese Struktur passen.

Wissenschaftler verwenden seit langem mechanistische Modelle, die zwischen expliziter Programmierung und maschinellem Lernen liegen. Differentialgleichungen mit freien Parametern, die in der Physik, Epidemiologie oder Pharmakodynamik verwendet werden, entsprechen neuronalen Netzen in allen Bereichen außer der Terminologie. Sie zielen einfach darauf ab, eine viel engere Funktionalität bereitzustellen, weil es so einfacher ist.
Wirklich mächtiger Fortschritt ist folgender: Durchdringende Differenzierbarkeit bedeutet, dass alle diese Methoden wie Legosteine miteinander verbunden sind.
Anstatt immer neue Programme für ML zu schreiben, können wir vorhandene Programme mithilfe physischer Engines in Deep-Learning- Robotikmodellen wiederverwenden. Wo moderne Verstärkungslernalgorithmen ein detailliertes Modell der Außenwelt erstellen müssen, das nur auf dem basiert, wofür sie belohnt werden (klingt nach roher Gewalt ), können wir stattdessen einfach detaillierte, genaue Kenntnisse der physischen Systeme anwenden, bevor das Lernen überhaupt beginnt.
Selbst die ausgereiftesten Bereiche des tiefen Lernens stehen nicht beiseite; Nach dem Faltungskern ist der nächste natürliche Schritt für Bildmodelle ein differenzierbarer Raytracer . 3D-Rendering enthält viel strukturelles Wissen darüber, wie Szenen in Pixeln angezeigt werden, was in unserer Küche immer noch eine Rolle spielt. Angenommen, ein Modell trifft Entscheidungen in einer simulierten Umgebung, die als Pixel angezeigt wird und vom Modell als Eingabe verwendet wird. Im Prinzip können wir jetzt den gesamten Zyklus differenzierbar machen, wodurch wir den Einfluss der Umgebung auf die Entscheidungen des Modells direkt sehen können und umgekehrt. Dies kann die Leistung einer realistischen simulierten Umgebung für Trainingsmodelle wie Autos mit automatischem Fahren erheblich erhöhen.
Wie in der Wissenschaft können Hybridmodelle effizienter sein und einige der Kompromisse zwischen Deep Learning und expliziter Programmierung lösen. Beispielsweise kann ein Drohnenflugwegplaner eine neuronale Netzwerkkomponente aufweisen, die nur geringfügige Korrekturen an einem zuverlässigen expliziten Programm vornehmen kann, wodurch sein Gesamtverhalten analysiert und an empirische Daten angepasst werden kann. Dies ist auch gut für die Interpretierbarkeit: Die Parameter mechanistischer Modelle und Simulationen haben normalerweise klare physikalische Interpretationen. Wenn das Modell also die Parameter innerhalb bewertet, gibt es eine klare Aussage darüber, was seiner Meinung nach außerhalb geschieht.
Wenn das alles so wunderbar ist, warum haben dann nicht alle aufgegeben und sich beeilt, Differenzieren zu lernen? Leider machen es die Einschränkungen bestehender Frameworks schwierig, Modelle mit einer solchen Komplexität zu erstellen, und es ist unmöglich, den in den vorhandenen wissenschaftlichen Code eingebetteten Wissensschatz wiederzuverwenden. Die Notwendigkeit, physische Engines in einer sehr eingeschränkten Modellierungssprache von Grund auf neu zu implementieren, macht aus einem zehnzeiligen Skript ein mehrjähriges Forschungsprojekt. Aber Fortschritte in der Sprach- und Zusammenstellungstechnologie , insbesondere die automatische Differenzierung , bringen uns dem Heiligen Gral näher: "Differenzieren Sie bitte nur meine Spiel-Engine."
Was ist differenzierte Programmierung?
Durch differenzierte Programmierung können Sie Deep-Learning-Methoden auf komplexe vorhandene Programme anwenden und eine große Menge an darin eingebettetem Wissen wiederverwenden. Deep Learning, Statistik, Programmierung und Wissenschaft - alles, was versucht, sein Wort bei der Modellierung der Welt um uns herum zu sagen - es ist Zeit, alles zu kombinieren und es wie Teilchen in einem Hadron-Collider zusammenzuschieben . Dies wird sowohl aktuelle Modelle verbessern als auch die Anwendung von ML in Bereichen ermöglichen, in denen die aktuellen Einschränkungen - entweder Interpretierbarkeit oder Rechen- und Datenanforderungen - dazu führen, dass sie nicht einzeln anwendbar sind.
Differenzierbare Managementprobleme
Als nächstes zeigen wir, dass Differenzierbarkeit einige einfache, aber klassische Verwaltungsaufgaben mit sich bringen kann, bei denen wir normalerweise Reinforcement Learning (RL) als Black Box verwenden. Differenzierbare Modelle (∂P-Modelle) zeigen nicht nur viel effektivere Steuerungsstrategien, sondern lernen auch mehrere Größenordnungen schneller. Der Code steht zum Lernen zur Verfügung - in den meisten Fällen lernt er in wenigen Sekunden auf jedem Laptop.
Folgen Sie dem Gefälle
Differenzierung ist die treibende Kraft bei fast jedem Schritt des tiefen Lernens. für diese Funktion Wir benutzen den Gradienten um herauszufinden, wie sich eine Änderung von x
auf y
auswirkt. Trotz der mathematischen Natur sind Gradienten tatsächlich ein sehr allgemeines und intuitives Konzept. Vergessen Sie die Formeln, die Sie in der Schule beachten mussten. Lassen Sie uns etwas mehr Spaß machen, wie etwas auf einen parabolischen Pfad zu werfen.

Wenn wir Projektile mit Hilfe eines Dreischusses werfen, repräsentiert unser x
(Eingabe) die Einstellung (z. B. die Größe des Gegengewichts oder den Auswurfwinkel), und y
ist die Entfernung, die das Projektil vor der Landung zurücklegt. Wenn Sie versuchen zu zielen, sagt Ihnen der Verlauf etwas sehr Nützliches - Erhöhen oder Verringern eines bestimmten Parameters. Um die Entfernung zu maximieren, folgen Sie einfach dem Farbverlauf.
OK, aber wie bekommen wir den richtigen Parameter? Aber mit Hilfe einer kniffligen Sache namens algorithmische Differenzierung , mit der Sie nicht nur einfache Formeln unterscheiden können, die Sie in der Schule gelernt haben, sondern auch Programme jeder Komplexität - zum Beispiel unseren Trebuchet-Simulator . Infolgedessen können wir einen einfachen Simulator, der in Julia geschrieben ist, und ein Diff- Diff- Paket DiffEq ohne eingehende Untersuchung verwenden und Gradienten dafür in einem Funktionsaufruf erhalten.
Sachen werfen
Wir müssen das Trebuchet auf das Ziel richten und Gradienten verwenden, um den Auswurfwinkel fein abzustimmen. Dies wird als Parameterschätzung bezeichnet, und wir haben uns bereits ähnliche Beispiele angesehen . Wir können die Aufgabe interessanter machen, indem wir zur Metamethode übergehen: Anstatt das Trebuchet auf ein Ziel zu richten, optimieren wir das neuronale Netzwerk, das es auf jedes Ziel ausrichten kann. So funktioniert es: Ein neuronales Netzwerk akzeptiert zwei Eingaben, eine Zielentfernung in Metern und eine aktuelle Windgeschwindigkeit. Im Netzwerk werden die Einstellungen für das Trebuchet (Masse des Gegengewichts und Auslösewinkel) festgelegt, die einem Simulator zugeführt werden, der die zurückgelegte Strecke berechnet. Dann vergleichen wir mit unserem Ziel und bewegen uns entlang der gesamten Kette, um das Gewicht des Netzwerks anzupassen. Unser „Datensatz“ ist ein zufällig ausgewählter Satz von Zielen und Windgeschwindigkeiten.

Ein gutes Merkmal dieses einfachen Modells ist, dass das Lernen schnell ist, da wir genau das, was wir vom Modell wollen, auf völlig differenzierbare Weise ausgedrückt haben. Anfangs sieht es so aus:

Nach ungefähr fünf Minuten Training (auf demselben Prozessorkern meines Laptops) sieht es so aus:

Wenn Sie die Flugbahn beeinflussen möchten, erhöhen Sie die Windgeschwindigkeit:

Abweichung um 16 cm oder ca. 0,3%. Was ist mit dem direkten Zielen auf das Trebuchet? Dies ist mit Gradientenabstieg einfach zu tun, da wir Gradienten haben. Dies ist jedoch ein langsamer iterativer Prozess, der jedes Mal etwa 100 ms dauert. Im Gegenteil, der Betrieb eines neuronalen Netzwerks dauert 5 μs (zwanzigtausendmal schneller) mit einem leichten Genauigkeitsverlust. Dieser Trick, der als "ungefähre Funktionsinversion durch Gradienten" bezeichnet wird, ist sehr verbreitet und kann nicht nur mit dynamischen Systemen, sondern auch mit einem schnellen Übertragungsalgorithmus verwendet werden .
Dies ist das einfachste mögliche Verwaltungsproblem, das wir hauptsächlich zur Veranschaulichung verwenden. Wir können jedoch dieselben Methoden auf fortgeschrittenere Weise auf die klassischen RL-Probleme anwenden.
Wagen, Stange treffen
Eine erkennbarere Herausforderung für das Management ist CartPole , die „Hallo Welt“ für das verstärkte Lernen. Die Herausforderung besteht darin, zu lernen, wie man die vertikale Säule ausbalanciert, indem man ihre Basis nach links oder rechts drückt. Unser Setup ähnelt im Allgemeinen dem bei Trebuchet: Die Implementierung von Julia ermöglicht es uns, die von der Umwelt erhaltenen Belohnungen direkt als Verluste zu betrachten. Mit ∂P können wir nahtlos von einem einfachen Modell zu einem RL-Modell wechseln.

Ein kluger Leser kann einen Haken bemerken. Der Aktionsbereich für die Diele - ein Versatz nach links oder rechts - ist diskret und daher nicht differenzierbar. Wir lösen dieses Problem, indem wir eine differenzierbare Diskretisierung einführen, die wie folgt definiert ist:
f (x) = \ left \ {\ begin {matrix} \, 1, \, x \ geqslant0 \\ -1, \, x <0 \ end {matrix} \ right.
Mit anderen Worten, wir lassen den Gradienten so verhalten, als ob war eine identische Funktion. Angesichts der Tatsache, wie oft die mathematische Idee der Differenzierbarkeit bereits in ML verwendet wird, ist es vielleicht nicht verwunderlich, dass wir hier einfach einen Trick machen können. Für das Training benötigen wir lediglich ein Signal, um unseren pseudozufälligen Rundgang durch den Parameterraum zu informieren, und der Rest sind die Details. Die Ergebnisse sprechen für sich. In Fällen, in denen RL-Methoden in Hunderten von Episoden trainiert werden müssen, bevor das Problem gelöst werden kann, benötigen ∂P-Modelle nur etwa 5 Episoden, um endgültig zu gewinnen.

Das Pendel & Backprop durch die Zeit
Ein wichtiges Ziel für RL (Reinforcement Learning) ist die Behandlung der aufgeschobenen Vergütung, wenn eine Maßnahme nicht dazu beiträgt, die Ergebnisse mehrerer Schritte hintereinander zu verbessern. Wenn die Umgebung differenzierbar ist, können Sie mit ∂P den Agenten wie in einem rekursiven Netzwerk in der zeitlichen Rückausbreitung trainieren! In diesem Fall wird der Zustand der Umgebung zu einem „verborgenen Zustand“, der sich zwischen den Zeitschritten ändert.

Um diese Technik zu demonstrieren, betrachten Sie ein Pendelmodell , bei dem die Aufgabe darin besteht, das Pendel zu schwenken, bis es aufrecht steht, und es in einem instabilen Gleichgewicht zu halten. Dies ist für RL-Modelle schwierig. Nach ungefähr 20 Trainingseinheiten ist das Problem gelöst, aber oft ist der Weg zur Lösung eindeutig nicht optimal. Im Gegensatz dazu kann BPTT die Rangliste der RL- Führungskräfte in einer Trainingsphase übertreffen. Es ist lehrreich zu beobachten, wie sich diese Episode entwickelt. Zu Beginn der Aufzeichnung ist die Strategie zufällig und das Modell verbessert sich im Laufe der Zeit. Das Lerntempo ist fast alarmierend.

Das Modell eignet sich gut für die Bearbeitung jedes Anfangswinkels und hat etwas, das der optimalen Strategie nahe kommt. Beim Neustart sieht das Modell ungefähr so aus.

Dies ist nur der Anfang; Wir werden echten Erfolg erzielen, indem wir DP auf Umgebungen anwenden, mit denen RL im Allgemeinen zu schwierig zu bearbeiten ist, in denen bereits umfangreiche Simulationen und Modelle existieren (wie in den meisten Ingenieur- und Naturwissenschaften) und in denen die Interpretierbarkeit ein wichtiger Faktor ist (wie in der Medizin).
Die Karte ist nicht das Territorium
Eine Einschränkung dieser Spielzeugmodelle besteht darin, dass sie die simulierte Lernumgebung mit der Testumgebung gleichsetzen. Natürlich ist die reale Welt nicht differenzierbar. In einem realistischeren Modell liefert die Simulation ein grobes Verhaltensmuster, das durch die Daten verfeinert wird. Diese Daten informieren beispielsweise über die simulierten Auswirkungen des Windes, was wiederum die Qualität der Gradienten verbessert, die der Simulator an die Steuerung weitergibt. Modelle können sogar Teil des direkten Durchlaufs des Controllers sein, sodass er seine Prognosen verfeinern kann, ohne die Systemdynamik von Grund auf neu untersuchen zu müssen. Das Erlernen dieser neuen Architekturen wird eine spannende zukünftige Arbeit ermöglichen.
Coda
Die Grundidee ist, dass differenzierbare Programmierung, bei der wir einfach ein beliebiges numerisches Programm schreiben und es mithilfe von Verläufen optimieren, eine leistungsstarke Möglichkeit ist, bessere Modelle und Architekturen zu erstellen, die dem Deep Learning ähneln, insbesondere wenn wir eine große Bibliothek differenzierbarer Programme zur Hand haben . Die beschriebenen Modelle sind nur Vorschauen, aber wir hoffen, dass sie eine Vorstellung davon geben, wie diese Ideen realistischer umgesetzt werden können.
So wie funktionale Programmierung das Denken und Ausdrücken von Algorithmen unter Verwendung funktionaler Muster beinhaltet, beinhaltet differenzierbares Programmieren das Ausdrücken von Algorithmen unter Verwendung differenzierbarer Muster. Die Deep-Learning-Community hat bereits viele solcher Entwurfsmuster entwickelt, um beispielsweise Verwaltungsprobleme oder eine konsistente und baumartige Datenstruktur zu behandeln. Wenn das Gebiet wächst, wird viel mehr erfunden, und als Ergebnis dieser Programme werden wahrscheinlich sogar die fortschrittlichsten Deep-Learning-Architekturen unhöflich und rückständig aussehen.
Referenzen
