Eine sanfte Einführung in probabilistische Programmiersprachen

Die probabilistische Programmierung wird zu einem der aktivsten Entwicklungsbereiche im Bereich des maschinellen Lernens. Was sind die wichtigsten Sprachen, die wir kennen sollten?

Jesus Rodriguez

Folgen

Aug 7, 2020 · 7 min Lesezeit

Quelle: https://devclass.com/2019/07/01/mit-presents-gen-to-get-probabilistic-programming-for-ai-up-and-running/

Ich habe kürzlich einen neuen Newsletter mit dem Schwerpunkt KI-Bildung gestartet. TheSequence ist ein No-BS-Newsletter (dh kein Hype, keine Nachrichten usw.), dessen Lesen 5 Minuten dauert. Ziel ist es, Sie über Machine Learning-Projekte, Forschungsarbeiten und Konzepte auf dem Laufenden zu halten. Bitte probieren Sie es aus, indem Sie unten abonnieren:

Probabilistisches Denken ist ein unglaublich wertvolles Werkzeug für die Entscheidungsfindung. Von Ökonomen bis zu Pokerspielern, Menschen, die in Wahrscheinlichkeiten denken können, neigen dazu, bessere Entscheidungen zu treffen, wenn sie mit unsicheren Situationen konfrontiert werden. Die Bereiche Wahrscheinlichkeiten und Spieltheorie sind seit Jahrhunderten und Jahrzehnten etabliert, erleben aber mit der rasanten Entwicklung der künstlichen Intelligenz (KI) keine Renaissance. Können wir Wahrscheinlichkeiten als erstklassige Bürger von Software-Code integrieren? Willkommen in der Welt der probabilistischen Programmiersprachen(PPLs)

Die Verwendung von Statistiken zur Überwindung von Unsicherheit ist eine der Säulen eines großen Segments des Marktes für maschinelles Lernen. Probabilistisches Denken gilt seit langem als eine der Grundlagen von Inferenzalgorithmen und ist in allen wichtigen Frameworks und Plattformen für maschinelles Lernen vertreten. In letzter Zeit hat probabilistisches Denken bei Technologiegiganten wie Uber, Facebook oder Microsoft eine große Akzeptanz gefunden, um die Forschungs- und Technologieagenda im Weltraum voranzutreiben. Insbesondere haben sich PPLs zu einem der aktivsten Entwicklungsbereiche im Bereich des maschinellen Lernens entwickelt und die Veröffentlichung einiger neuer und aufregender Technologien ausgelöst.

Konzeptionell sind probabilistische Programmiersprachen (PPLs) domänenspezifische Sprachen, die probabilistische Modelle und die Mechanismen zur Durchführung von Inferenzen in diesen Modellen beschreiben. Die Magie von PPL beruht auf der Kombination der Inferenzfähigkeiten probabilistischer Methoden mit der Darstellungskraft von Programmiersprachen.

In einem PPL-Programm werden Annahmen mit vorherigen Verteilungen über die Variablen des Modells codiert. Während der Ausführung startet ein PPL-Programm eine Inferenzprozedur, um die posterioren Verteilungen der Parameter des Modells basierend auf beobachteten Daten automatisch zu berechnen. Mit anderen Worten, Inferenz passt die vorherige Verteilung unter Verwendung der beobachteten Daten an, um einen genaueren Modus zu erhalten. Die Ausgabe eines PPL-Programms ist eine Wahrscheinlichkeitsverteilung, die es dem Programmierer ermöglicht, die mit einem Ergebnis verbundene Unsicherheit explizit zu visualisieren und zu manipulieren.

Um die Einfachheit von PPLs zu veranschaulichen, verwenden wir eines der bekanntesten Probleme der modernen Statistik: einen voreingenommenen Münzwurf. Die Idee dieses Problems ist es, die Verzerrung einer Münze zu berechnen. Nehmen wir an, dass xi = 1 ist, wenn das Ergebnis des i-ten Münzwurfs Kopf ist, und xi = 0, wenn es Schwanz ist. Unser Kontext geht davon aus, dass einzelne Münzwürfe unabhängig und identisch verteilt sind (IID) und dass jeder Wurf einer Bernoulli−Verteilung mit dem Parameter θ folgt: p(xi = 1 | θ) = θ und p(xi = 0 | θ) = 1 – θ. Die latente (d. H. unbeobachtete) Variable θ ist die Vorspannung der Münze. Die Aufgabe besteht darin, θ angesichts der Ergebnisse zuvor beobachteter Münzwürfe abzuleiten, dh p (θ | x1, x2, . . . , xN ).

Die Modellierung eines einfachen Programms wie der voreingenommene Münzwurf in einer Allzweck-Programmiersprache kann zu Hunderten von Codezeilen führen. PPLs wie Edward drücken dieses Problem jedoch in ein paar einfachen Codes aus:

Der Heilige Gral: Deep PPL

Jahrzehntelang war der Bereich des maschinellen Lernens in zwei unvereinbare Lager unterteilt: Statistik und neuronale Netze. Ein Lager brachte probabilistische Programmierung hervor, während das andere hinter Transformationsbewegungen wie Deep Learning stand. Vor kurzem haben sich die beiden Denkschulen zusammengeschlossen, um Deep Learning und Bayes’sche Modellierung in einzelnen Programmen zu kombinieren. Der ultimative Ausdruck dieser Bemühungen sind Deep Probabilistic Programming Languages (Deep PPLs).

Konzeptionell können tiefe PPLs Bayesianische neuronale Netze mit probabilistischen Gewichten und Verzerrungen ausdrücken. Praktisch gesehen haben sich Deep PPLs als neue probabilistische Sprachen und Bibliotheken materialisiert, die sich nahtlos in gängige Deep-Learning-Frameworks integrieren lassen.

3 Tiefe PPLs, die Sie kennen müssen

Der Bereich der probabilistischen Programmiersprachen(PPLs) ist in den letzten Jahren mit Forschung und Innovation explodiert. Die meisten dieser Innovationen stammen aus der Kombination von PPLs und Deep-Learning-Methoden, um neuronale Netze aufzubauen, die effizient mit Unsicherheit umgehen können. Technologiegiganten wie Google, Microsoft oder Uber waren dafür verantwortlich, die Grenzen tiefer PPLs in große Szenarien zu verschieben. Diese Bemühungen haben zu völlig neuen tiefen PPLs-Stacks geführt, die in der Community für maschinelles Lernen immer beliebter werden. Lassen Sie uns einige der jüngsten Fortschritte im Deep-PPL-Bereich untersuchen.

Edward

Edward ist eine Turing-vollständige probabilistische Programmiersprache (PPL), die in Python geschrieben ist. Edward wurde ursprünglich vom Google Brain-Team verfochten, hat aber jetzt eine umfangreiche Liste von Mitwirkenden. Das ursprüngliche Forschungspapier von Edward wurde im März 2017 veröffentlicht und seitdem hat der Stack eine große Akzeptanz in der Community für maschinelles Lernen erfahren. Edward verbindet drei Bereiche: Bayes’sche Statistik und maschinelles Lernen, Deep Learning und probabilistische Programmierung. Die Bibliothek lässt sich nahtlos in Deep-Learning-Frameworks wie Keras und TensorFlow integrieren.

Pyro

Pyro ist eine Deep Probabilistic Programming Language(PPL), die von Uber AI Labs veröffentlicht wurde. Pyro basiert auf PyTorch und basiert auf vier Grundprinzipien:

  • Universal: Pyro ist eine universelle PPL — sie kann jede berechenbare Wahrscheinlichkeitsverteilung darstellen. Wie? Indem Sie von einer universellen Sprache mit Iteration und Rekursion (beliebigem Python-Code) ausgehen und dann Zufallsstichproben, Beobachtung und Inferenz hinzufügen.
  • Skalierbar: Pyro skaliert auf große Datensätze mit wenig Overhead über handgeschriebenem Code. Wie? Durch den Aufbau moderner Black-Box-Optimierungstechniken, die Mini-Batches von Daten verwenden, um die Inferenz zu approximieren.
  • Minimal: Pyro ist agil und wartbar. Wie? Pyro wird mit einem kleinen Kern leistungsfähiger, zusammensetzbarer Abstraktionen implementiert. Wo immer möglich, wird das schwere Heben an PyTorch und andere Bibliotheken delegiert.
  • Flexibel: Pyro zielt auf Automatisierung, wenn Sie es wollen, und Kontrolle, wenn Sie es brauchen. Wie? Pyro verwendet Abstraktionen auf hoher Ebene, um generative und Inferenzmodelle auszudrücken, während Experten die Inferenz einfach anpassen können.

Genau wie andere PPLs kombiniert Pyro Deep-Learning-Modelle und statistische Inferenz mit einer einfachen Syntax, wie im folgenden Code dargestellt:

Infer.Net

Microsoft vor kurzem Open Source Infer.Net ein Framework, das die probabilistische Programmierung für .Net-Entwickler vereinfacht. Microsoft Research hat an Infer gearbeitet.Net seit 2004 aber erst vor kurzem, mit dem Aufkommen von Deep Learning, ist das Framework wirklich populär geworden. Infer.Net bietet einige starke Unterscheidungsmerkmale, die es zu einer starken Wahl für Entwickler machen, die sich in den tiefen PPL-Raum wagen:

  • Rich modelling language“ Unterstützung für univariate und multivariate Variablen, sowohl kontinuierliche als auch diskrete. Modelle können aus einer Vielzahl von Faktoren erstellt werden, darunter arithmetische Operationen, lineare Algebra, Bereichs- und Positivitätsbeschränkungen, Boolesche Operatoren, Dirichlet-Diskrete, Gaußsche und viele andere.
  • Multiple Inferenzalgorithmen“ Integrierte Algorithmen umfassen Erwartungsausbreitung, Glaubensausbreitung (ein Sonderfall von EP), Variationsnachrichtenübergabe und Gibbs-Abtastung.
  • Entwickelt für groß angelegte Inferenz: Infer.NET kompiliert Modelle in Inferenzquellcode, der unabhängig und ohne Overhead ausgeführt werden kann. Es kann auch direkt in Ihre Anwendung integriert werden.
  • Vom Benutzer erweiterbar: Wahrscheinlichkeitsverteilungen, Faktoren, Nachrichtenoperationen und Inferenzalgorithmen können vom Benutzer hinzugefügt werden. Ableiten.NET verwendet eine Plug-In-Architektur, die es offen und anpassungsfähig macht.

Schauen wir uns unser Münzwurf-Beispiel in Infer.Net

Der Bereich Deep Learning entwickelt sich stetig zu einem wichtigen Grundbaustein des Machine Learning Ökosystems. Pyro, Edward und Infer.Net sind nur drei aktuelle Beispiele für tiefe PPLs, aber nicht die einzigen relevanten. Die Überschneidung von Deep Learning Frameworks und PPL bietet eine unglaublich große Innovationsfläche, und neue Anwendungsfälle werden wahrscheinlich in naher Zukunft die Grenzen von Deep PPLs verschieben.

Schreibe einen Kommentar

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