Hallo Kollegen!
Aus den neuesten Nachrichten zu unseren bevorstehenden Innovationen im Bereich ML / DL:
Nishant Shakla, "
Maschinelles Lernen mit Tensorflow " - ein Buch im Layout, das im Januar in den Läden erwartet wird
Delip Rao, Brian McMahan, "
Verarbeitung natürlicher Sprache in PyTorch " - der Vertrag ist unterzeichnet, wir planen, die Übersetzung im Januar zu beginnen.
In diesem Zusammenhang wollten wir noch einmal auf ein schmerzhaftes Thema zurückkommen - eine schlechte Untersuchung des ML / DL-Themas in der Java-Sprache. Aufgrund der offensichtlichen Unreife dieser Java-Lösungen und -Algorithmen haben wir uns einmal entschlossen, das DL4J-Buch von Gibson und Patterson aufzugeben, und der heute veröffentlichte Artikel von Humphrey Sheil legt nahe, dass wir wahrscheinlich Recht hatten. Wir laden Sie ein, sich mit den Gedanken des Autors darüber vertraut zu machen, wie Java beim maschinellen Lernen endlich mit Python konkurrieren kann
Kürzlich hielt ich einen
Vortrag über die Gegenwart und Zukunft des maschinellen und tiefen Lernens (ML / DL) in Unternehmen. Im Kontext eines großen Unternehmens sind mehr angewandte Themen und Themen relevant als auf einer Forschungskonferenz - zum Beispiel, wie mein Team und ich ML einsetzen können und wie ML am besten in die Systeme integriert werden kann, die wir in Betrieb haben. Dann begann eine Podiumsdiskussion über Java und maschinelles Lernen.
Die Java-Sprache fehlt im Segment des maschinellen Lernens praktisch. Es gibt fast keine ML-Frameworks, die in Java geschrieben wären (es gibt
DL4J , aber ich persönlich kenne niemanden, der es verwenden würde,
MXNet hat eine API in Scala, aber nicht in Java, und dieses Framework selbst ist nicht in Java geschrieben). . Tensorflow verfügt über
eine unvollständige Java-API , Java hat jedoch einen großen Anteil an der Unternehmensentwicklung. In den letzten 20 Jahren wurden in fast allen denkbaren Themenbereichen Billionen von Dollar in diese Sprache investiert: Finanzdienstleistungen, elektronische Transaktionen, Online-Shops, Telekommunikationsliste kann für immer weitergehen. Beim maschinellen Lernen ist Python der erste unter Gleichen, nicht Java. Persönlich programmiere ich sehr gerne sowohl in Python als auch in Java, aber
Frank Greco formulierte eine interessante Frage, die mich zum Nachdenken anregte:
Warum sollte Java in ML mit Python konkurrieren? Warum nicht die Aufgabe übernehmen, ernsthafte ML-Unterstützung in Erinnerung zu rufen?
Ist es wichtigBegründen wir dieses Thema. Seit 1998 ist die Java-Sprache in der Premier League vertreten, ohne sie gab es keine evolutionären und revolutionären Ereignisse im Unternehmen. Wir sprechen über Webtechnologien und mobile Technologien, über den Vergleich von Browser- und nativen Lösungen, über Messagingsysteme, Unterstützung für die Globalisierung von i18n und l10n, horizontale Skalierung und Speicherunterstützung für alle Unternehmensinformationen, die Sie sich vorstellen können - von relationalen Datenbanken bis hin zu Elasticsearch
Dieses Maß an bedingungsloser Unterstützung bietet eine sehr gesunde Kultur, die sich in Java-Befehlen entwickelt hat: "Wir können", "Ärmel hochkrempeln und Code schreiben". Es gibt keine solche magische Komponente oder API, die nicht durch ein gutes Team von Java-Entwicklern ergänzt oder ersetzt werden könnte.
Dieses Prinzip funktioniert jedoch beim maschinellen Lernen nicht. Hier haben die Java-Befehle zwei Optionen:
- Retrain / Retrain in Python.
- Verwenden Sie eine Drittanbieter-API, um Ihrem vorhandenen Unternehmenssystem Funktionen für maschinelles Lernen hinzuzufügen.
Keine dieser Optionen kann als wirklich harmlos bezeichnet werden. Die erste erfordert viel Zeit und Investitionen im Voraus sowie laufende Supportkosten. Bei der zweiten Option laufen wir Gefahr, vom Lieferanten abhängig zu werden, den Lieferanten-Support zu verlieren und mit Komponenten von Drittanbietern arbeiten zu müssen (gleichzeitig den Preis für den Netzwerkübergang zu zahlen) und auf ein System zu migrieren, in dem möglicherweise kritische Sicherheitsanforderungen bestehen und mit dem Informationen ausgetauscht werden müssen von jemandem außerhalb Ihrer Organisation. In einigen Situationen ist dies nicht akzeptabel.
Das zerstörerischste in diesem Fall (meiner Meinung nach) ist das Potenzial für eine
kulturelle Verschlechterung - Teams können den Code, den sie nicht verstehen oder nicht pflegen können, nicht ändern, sodass die Verantwortlichkeiten verschwimmen und die Hauptarbeit an eine andere Person delegiert werden muss. Teams, die nur aus Java-Entwicklern bestehen, laufen Gefahr, die nächste große Welle zu verpassen, die in das Enterprise Computing übergeht - die Welle des maschinellen Lernens.
Daher ist es wichtig und wünschenswert, dass erstklassige Unterstützung für maschinelles Lernen in der Sprache und auf der Java-Plattform angezeigt wird. Andernfalls besteht das Risiko, dass Java in den nächsten 5 bis 10 Jahren von anderen Sprachen abgelöst wird, in denen ML besser unterstützt wird.
Warum ist Python in ML so dominant?Lassen Sie uns zunächst diskutieren, warum Python führend im Bereich maschinelles Lernen und Deep Learning geworden ist.
Ich vermute, dass alles mit einer völlig unschuldigen Funktion begann - Unterstützung für das Aufteilen von Listen. Diese Unterstützung ist erweiterbar: Jede Python-Klasse, die die Methoden
__getitem__
und
__setitem__
, kann mit dieser Syntax geschnitten werden. Die folgende Auflistung zeigt, wie einfach und natürlich diese Funktion von Python ist.
a = [1, 2, 3, 4, 5, 6, 7, 8] print(a[1:4])
Das ist natürlich nicht alles. Python-Code ist viel kompakter und prägnanter als der "alte" Java-Code. Ausnahmen werden unterstützt, aber nicht überprüft, und Entwickler können problemlos Python-Skripte schreiben, die als Verbrauchsmaterial geeignet sind. Probieren Sie „wie es funktioniert“ aus, ohne in der Java-Weltanschauung „Alles ist eine Klasse“ zu ertrinken. Python ist einfach zu engagieren.
Meiner Meinung nach ist der wichtigste Überlegenheitsfaktor (der mich nicht daran hindert, die harte Arbeit der Python-Community zur Aufrechterhaltung der Verbindung zwischen Python 2.7 und Python 3 zu erkennen), dass es ihnen gelungen ist, eine viel besser gestaltete und schnellere Bibliothek für Operationen zu erstellen mit Zahlen - NumPy. Numpy basiert auf
ndarray , einem Objekt, das ein N-dimensionales Array ist. Ich zitiere die Dokumentation: „
Das Hauptobjekt in NumPy ist ein homogenes mehrdimensionales Array. Dies ist eine Tabelle von Elementen (normalerweise Zahlen) vom gleichen Typ, die durch ein Tupel positiver Ganzzahlen indiziert sind. “ Alle NumPy-Arbeiten basieren auf dem Schreiben Ihrer Daten in ndarray und nachfolgenden Vorgängen. NumPy unterstützt eine Vielzahl von Indizierungs-, Rundfunk- und Vektorisierungsoptionen für die Geschwindigkeit und ermöglicht Entwicklern im Allgemeinen das einfache Erstellen und Bearbeiten großer numerischer Arrays.
Die folgende Auflistung zeigt in der Praxis die Indizierung und Ausstrahlung in ndarray - dies sind Schlüsseloperationen in ML / DL.
import numpy as np
Wir arbeiten mit großen mehrdimensionalen numerischen Arrays und markieren das Herzstück der Programmierung für maschinelles Lernen und insbesondere für tiefes Lernen. Tiefe neuronale Netze sind Gitter von Knoten und Kanten, die auf der Ebene von Zahlen modelliert werden. Laufzeitoperationen beim Trainieren eines Netzwerks oder beim Ausführen einer darauf basierenden Ausgabe erfordern eine schnelle Matrixmultiplikation.
Dank NumPy wurde noch viel mehr getan -
Scipy ,
Pandas und viele andere NumPy-basierte Bibliotheken. Führende Deep-Learning-Bibliotheken (
Tensorflow von Google,
PyTorch von Facebook) entwickeln Python ernsthaft weiter. Tensorflow verfügt über andere APIs für Go, Java und JavaScript, die jedoch unvollständig sind und als instabil gelten. PyTorch wurde ursprünglich in Lua geschrieben und erlebte einen echten Anstieg der Popularität, als es 2017 von dieser offenen Nischensprache zum wichtigsten ML Python-Ökosystem wechselte.
Python-FehlerPython ist weder eine ideale Sprache noch die beliebteste Laufzeit, CPython. Es verfügt über eine globale Interpretersperre (
GIL ), sodass die Skalierung nicht einfach ist. Darüber hinaus geben Python-Deep-Learning-Frameworks wie PyTorch und Tensorflow weiterhin wichtige Methoden an undurchsichtige Implementierungen weiter. Beispielsweise hatte die
cuDNN- Bibliothek von
NVidia einen großen Einfluss auf den Umfang der PyTorch
RNN / LSTM- Implementierung. RNN und LSTM (wiederkehrende neuronale Netze und Langzeit-Kurzzeitgedächtnis) sind sehr wichtige DL-Tools für Geschäftsanwendungen, insbesondere weil sie sich auf die Klassifizierung und Vorhersage aufeinanderfolgender Reihen variabler Längen spezialisiert haben - zum Beispiel. Webnavigation, Clickstream-Analyse, Analyse von Textfragmenten, Benutzerereignissen usw.
Aus Gründen der Unparteilichkeit gegenüber Python sollte beachtet werden, dass eine solche Deckkraft / Einschränkung für fast jedes Framework für ML / DL gilt, außer für das Schreiben in C oder C ++. Warum? Denn um maximale Leistung für grundlegende, hoch belastete Operationen wie die Matrixmultiplikation zu erzielen, gehen Entwickler so nah wie möglich an das Metall heran.
Was braucht Java, um in diesem Bereich bestehen zu können?Ich gehe davon aus, dass die Java-Plattform drei wichtige Ergänzungen benötigt. Wenn es implementiert wird, wird sich ein gesundes und prosperierendes Ökosystem für maschinelles Lernen ausbreiten:
- Fügen Sie dem Kern der Sprache native Indizierungs- / Slicing-Unterstützung hinzu, damit Sie mit Python mit all seiner Benutzerfreundlichkeit und Ausdruckskraft konkurrieren können. Es ist möglich, dass solche Funktionen in Java um eine vorhandene geordnete Sammlung, die List <E> -Schnittstelle, erstellt werden . Für eine solche Unterstützung muss auch die Notwendigkeit einer Überlastung erkannt werden - dies ist erforderlich, um Punkt 2 zu erfüllen.
- Erstellen Sie eine Tensor- Implementierung - wahrscheinlich im Paket
java.math
, aber auch mit einem Exit zur Collections-API. Diese Klassen von Klassen und Schnittstellen könnten mit ndarray
und zusätzliche Unterstützung für die Indizierung bieten, insbesondere für die drei in NumPy verfügbaren Indizierungsarten : Zugriff auf Felder, einfache Slices und erweiterte Indizierung, die für die Programmierung erforderlich sind. - Bereitstellung von Rundfunk - Skalaren und Tensoren mit beliebigen (aber kompatiblen) Dimensionen.
Wenn diese drei Aufgaben im Kern der Java-Sprache und der Laufzeit ausgeführt werden könnten, hätten wir den Weg für die Erstellung von
"NumJava" eröffnet , das NumPy entspricht.
Das Panama-Projekt könnte auch nützlich sein, um einen vektorisierten Low-Level-Zugriff auf schnelle Tensoroperationen bereitzustellen, die auf der CPU, GPU, TPU ausgeführt werden, und nicht nur, damit Java ML zum schnellsten seiner Art wird.
Ich sage überhaupt nicht, dass diese Add-Ons trivial sind - nein, weit davon entfernt, aber ihre potenziellen Vorteile für die gesamte Java-Plattform sind enorm.
Die folgende Auflistung zeigt, wie unser Broadcast- und Indexierungsbeispiel von NumPy in NumJava mit der
Tensor
Klasse aussehen könnte, wobei die sprachbasierte Slicing-Syntax und die aktuellen Einschränkungen für das Überladen von Operatoren unterstützt werden.
Perspektive und Aufruf zum HandelnWir alle wissen, dass maschinelles Lernen die Geschäftswelt nicht weniger verändern wird als in seiner Zeit - relationale Datenbanken, das Internet und mobile Technologien. Es gibt viel Hype um ihn, aber einige sehr überzeugende Artikel und Schlussfolgerungen erscheinen. In
diesem Artikel wird beispielsweise die Zukunft beschrieben, in der das System mithilfe von maschinellem Lernen im Hintergrund die optimalen Konfigurationen von Datenbankserver, Webserver und Anwendungsserver lernen kann. Sie müssen ML nicht einmal selbst in Ihrem eigenen System bereitstellen - definitiv kann einer Ihrer Anbieter dies tun.
Basierend auf den pragmatischen Positionen, die in diesem Artikel vorgestellt werden, können Sie in Java nicht weniger Frameworks für maschinelles Lernen und Deep Learning (Arbeiten an JRE) schreiben als vorhandene Frameworks für das Web, Langzeitspeicher oder XML-Parsing - stellen Sie sich vor! Sie können sich Java-Frameworks vorstellen, die
Faltungs-Neuronale Netze (CNNs) für hochmoderne Computer-Vision-Implementierungen unterstützen, z. B. Implementierungen von wiederkehrenden LSTMs für neuronale Netze für serielle Datensätze (die für Unternehmen von zentraler Bedeutung sind), mit den fortschrittlichsten ML-Funktionen wie automatischer Differenzierung und mehr. Dann würden diese Frameworks dazu beitragen, die nächste Generation von Unternehmenssystemen zu implementieren und voranzutreiben, die mit denselben Tools nahtlos in vorhandene Java-Systeme integriert werden könnten - IDEs, Test-Frameworks, kontinuierliche Integration. Am wichtigsten ist, dass sie von unseren Mitarbeitern geschrieben und unterstützt werden. Wenn Sie ein Java-Fan sind - mögen Sie diese Aussicht nicht?