Ich mag die erzwungene Einrückung von Python, die viele nicht mögen, weil ich das Schreiben in Klammern und redundante Semikolons hasse. Ich mag die Shell-Oberfläche, aber warum denken manche, dass Python de facto für maschinelles Lernen geeignet ist ?
Selbst bei einer gerade gleichgerichteten linearen Aktivierung stellt die Simulation von Schaltkreisen aus künstlichen Neuronen aufgrund der bloßen Dimensionalität hohe Anforderungen an die Rechenressourcen. Die Verarbeitung von Videos in einem typischen gegnerischen künstlichen Netzwerkalgorithmus erfordert sieben verschachtelte Schleifen.
- Widersprüchliche Paariteration
- Tiefe der neuronalen Netzschicht
- Beispielindex
- Rahmenindex
- Pixeltiefe
- Vertikale
- Horizontal
Wir nennen den Filter für die Faltung einen "Kernel" und verpfänden ihn an DSPs in GPUs, um die Leistung zu verringern, und verwenden dann eine Skriptsprache zum Codieren.
Warum sollten wir keinen Deep-Learning-Code schreiben, wie Linus Torvalds Kernel-Code mit schreibt? gcc -S
damit wir sicherstellen können, dass die Assemblersprache effizient ist und fast keine Cache-Fehler auftreten? Unter Performance-Gesichtspunkten konnte man mit C zum Mond und zurück fliegen, bevor Python überhaupt die Baumgrenze durchbrach.
In Bezug auf das einfache Experimentieren ist C ++ viel objektorientiert, so dass saubere Abstraktionen als .hpp-Dateien geschrieben werden können, um das kerneffiziente C zu konfigurieren und zu steuern, das die Mechanik der Parameteroptimierung übernimmt.
Wir tippen auf Tastaturen, um Code und Block zu schreiben, wir programmieren Mikrowellenherde und einige von uns spielen musikalische Tastaturen, die Klaviere gut simulieren. Wir vergessen dann, dass es C / C ++ unter diesen sehr intuitiven Benutzeroberflächen ist. Ich kaufe ehrlich gesagt das Python-Argument noch nicht.
Die meisten von uns verstehen, dass Python-Wrapper um die in FORTRAN geschriebenen und nach C portierten effizienten Matrixalgorithmen erstellt wurden und dass die Python-Konstrukte für ML relativ elegant sind. Dies ist jedoch ein guter Grund, die Tatsache zu verwerfen, dass viele C ++ - Bibliotheken für ML vorhanden sind das sind auch elegant entwickelt worden?
quelle
Antworten:
Weil es für Python eine Bibliothek namens NumPy gibt .
Es kann extrem schnelle Berechnungen auf n-dimensionalen Arrays von Zahlen durchführen, und alle Arten von Bibliotheken für wissenschaftliches / maschinelles Lernen / Bildverarbeitung usw. sind darauf aufgebaut.
Sie führen in Python keine eigentlichen Berechnungen durch
for
Schleifen durch, das ist sehr langsam. Sie nennen Numpy-Matrix-Operationen, und sie sind selbst in C geschrieben (und teilweise in Fortran, wenn ich mich richtig erinnere, nicht sicher, ob dies immer noch der Fall ist) und im Laufe der Jahre gnadenlos auf Geschwindigkeit optimiert.quelle
Das, wonach Sie wahrscheinlich suchen, ist:
Lassen Sie uns diese Frage aus zwei Blickwinkeln betrachten:
Anfänger: Aus Sicht des Anfängers muss er verstehen, wie ein Modell implementiert wird, bevor es optimiert wird. Er muss zuerst das Modell visualisieren, die Arten von Fehlern erkennen, die sich einschleichen, und mit dem Modell experimentieren, um mehr Intuition zu erlangen. Sicherlich möglich in C / C ++. Aber ist es das wert? Die Zeit, die die Person zum Schreiben / Debuggen des Codes in C / C ++ benötigt, überwiegt bei weitem die Zeit zum Erstellen von i in Python / MATLAB / R. Nachdem er einige Kenntnisse in der Zwischenimplementierung erworben hat, kann er mit C / C ++ fortfahren.
Experten: Mit Experten meine ich Programmierexperten. Sie verwenden mit Sicherheit und einfach C / C ++. Die wichtigsten Informationen, die Sie verpasst haben, sind TensorFlow, eine eigenständige ML-Bibliothek, die auch als Kern für andere hochrangige ML-Bibliotheken dient, z. B. Keras, das in C ++ selbst programmiert ist. Hier gibt es mehr Infos dazu. Wenn ich mich nicht irre, erstellt TensorFlow vor der Aufnahme von Daten ein Berechnungsdiagramm und führt dieses Diagramm dann für die Daten aus, die im Allgemeinen vollständig in den RAM geladen sind . Also keine Interferenz von Python dazwischen.
Auch die Lesbarkeit von Code ist ein großes Problem (zumindest sehe ich mich damit konfrontiert). Das Schreiben eines ML-Algorithmus in C / C ++ erfordert große Mengen an Code, die möglicherweise unlesbar werden, wenn Sie sie nach etwa einer Woche betrachten, wenn sie nicht gut dokumentiert sind. Aufgrund der eingebauten Python-Funktionen können Sie das Programm leicht lesen.
Ratschläge des Experten für maschinelles Lernen, Andrew Ng, verwenden Sie Sprachen wie C / C ++, um Ihr Modell zu implementieren, sobald Sie überprüft haben, dass Ihr Modell in einer höheren Sprache wie MATLAB funktioniert.
Da die von @FauChristian erwähnte Bibliotheksunterstützung einwandfrei ist, können Sie verschiedene andere Bibliotheken in anderen Feldern kombinieren, um Daten in ein ML-Formular zu konvertieren, das dann in Ihrem ML-Modell verwendet wird.
quelle
In der KI (und wahrscheinlich auch in vielen anderen Bereichen) ist die von den menschlichen Programmierern verbrachte Zeit in der Regel wesentlich wertvoller / teurer als die Zeit, die für die Ausführung eines Programms aufgewendet wird. Natürlich ist dies nicht immer der Fall (genauso wie es nicht immer der Fall ist, dass Python anstelle von C oder C ++ verwendet wird), aber es ist oft wahr.
Gerade bei der Forschung ist es äußerst wichtig, Ideen schnell durchlaufen zu können. Wir müssen in der Lage sein, neue Ideen schnell umzusetzen, zu testen, wahrscheinlich einige Iterationen von Bugfixing zu durchlaufen, erneut zu testen usw. Es ist ziemlich selten, dass der Engpass bei dieser Iteration von Ideen die Laufzeit einer neuen Idee / eines neuen Algorithmus ist. Die Programmierzeit des Menschen ist viel häufiger ein Engpass. Ideen können oft schnell auf kleine Spielzeugprobleme getestet werden, die ohnehin nicht viel Laufzeit benötigen, oder über Nacht ausgeführt werden, während der Programmierer damit beschäftigt ist, anderen Code zu schreiben.
Das ganze Iterieren, schnelle Implementieren neuer Ideen usw. ist in Python in der Regel einfacher / schneller als in C oder C ++. Dies gilt natürlich nicht unbedingt für alle. Wenn jemand bereits viel Erfahrung in C ++ und wenig Erfahrung in Python hat, kann er möglicherweise neue Ideen schneller in C ++ implementieren. Dies scheint jedoch bei der Mehrheit der Menschen nicht der Fall zu sein. Zu den klaren Vorteilen, die Python in Bezug auf die schnelle Umsetzung neuer Ideen hat, gehören:
results = []
in Python oderstd::vector<double> results;
in C ++, um eine leere Liste zu erstellen, an die wir in einem Experiment einige Ergebnisse anhängen können).config = {'algorithm': 'RandomForest', 'n_trees': 50}
in Python vs .... keine Ahnung in C ++)Ein weiterer wichtiger Punkt ist, dass der Großteil des Codes, den Menschen in AI schreiben, nicht die leistungsabhängigen Teile sind . Auch dies gilt möglicherweise nicht für alle, gilt jedoch insbesondere für Forschungsumgebungen. Die meisten Forscher verbringen den größten Teil ihrer Zeit nicht damit, Code für Vorwärts- / Rückwärtsdurchläufe in einem neuronalen Netzwerk zu schreiben. Sie verbringen viel mehr Zeit mit Dingen wie:
Nun, dieser letzte Punkt kann in einigen Fällen leistungsabhängig sein, aber das anfängliche Problem wird nicht die Leistung sein. Die anfängliche Sorge wird sein; wird es überhaupt funktionieren? Dies kann bei einfacheren Problemen oder bei weniger leistungsfähigem Code ausgewertet werden, indem einfach etwas länger gewartet wird. Es ist jedoch noch wichtiger, ihn zuerst implementieren zu können. Wie in anderen Antworten erwähnt, können diese dank C-basierter Frameworks wie
Tensorflow
undnumpy
auch von Python aus oftmals performant sein.Schließlich ist die Existenz bekannter, benutzerfreundlicher, etablierter Open-Source-Bibliotheken und Frameworks, die sich im Laufe der Zeit bewährt haben, äußerst wichtig. In Python haben wir:
Wiederum haben viele davon Teile in C / C ++ implementiert, wenn es auch um die Leistung geht.
Wenn ich über Forschung spreche, bedeutet dies nicht nur "Wissenschaft". KI in der Industrie hat auch oft einen gewissen Forschungsgeschmack. Es ist unwahrscheinlich, dass Menschen in der Industrie neuronale Netze immer und immer wieder von Grund auf neu implementieren. Es ist viel wahrscheinlicher, dass sie Implementierungen wiederverwenden, die bereits effizient sind (z. B. Tensorflow), aber versuchen, sie auf neue Daten anzuwenden (wo sie einen neuen Code für das Boilerplate schreiben müssen, was schnell und einfach ist in Python) oder versuchen Sie es mit neuen Architekturen oder versuchen Sie, Daten und / oder Ergebnisse usw. zu visualisieren.
quelle
Der Hauptgrund für die Bevorzugung von Python ist der Overhead. C ++ bedeutet automatisch einen höheren Overhead in Bezug auf die Menge an Code, die für bestimmte Aufgaben erforderlich ist. Künstliche Intelligenz ist konzeptionell bereits schwer zu verstehen, was den Programmieraufwand zu einem größeren Problem macht.
Da C ++ - Module eine Möglichkeit sind, die Python-Sprache zu erweitern, gibt es kaum einen Grund, Python nicht zu verwenden. Es ist einfacher, Programmierkenntnisse in C ++ auf Python zu übertragen, als eine Möglichkeit zu finden, eine Bibliothek in C ++ so zu programmieren, dass sie dem aktuellen Wissensbestand entspricht, der bereits in Python enthalten ist.
quelle
Python ist aus mehreren Gründen für Rapid Prototyping beliebt.
quelle
Denn während C / C ++ nicht tot ist , sind sie schwer zu bedienen und schwer zu lernen. Früher mochte ich sie, aber jetzt würde mich niemand dazu bringen, etwas mit Funktionen wie undefiniertem Verhalten zu lernen . Auf keinen Fall! Speicherverwaltung? Warum sollte ich? Ich möchte einfach nicht meine Zeit mit solchen Dingen verschwenden ... und ich denke, das ist die übliche Einstellung unter Studenten.
Es wird immer Leute geben, die "das alte gute niedrige C" lieben, und das ist gut so, denn wir brauchen Kernel und Treiber und so. Es hat seinen Platz.
C ++ ist ein höheres Level, aber für die meisten von uns, die lieber Zeit mit Algorithmen als mit der Sprache selbst verbringen, ist es viel zu kompliziert geworden.
Alles, was vernünftigerweise mit weniger Aufwand getan werden kann, sollte nicht mit mehr Aufwand getan werden. Ich habe C ++ jahrelang (vor einiger Zeit) verwendet und nur ein paar Stunden mit Python verbracht, aber ich habe mich wegen der Effizienz der Codierung immer für ein paar tausend Zeilen Projekt entschieden.
Die Effizienz der Ausführung kann später verbessert werden, möglicherweise sogar durch Umschreiben eines kleinen Teils in C ++. Oft kann durch die Implementierung eines intelligenteren Algorithmus mehr erreicht werden.
quelle