Ich versuche, den Softmax-Regressionsalgorithmus zu implementieren, um das K-Klassifikator-Problem zu lösen, nachdem ich Professor Andrew Ngs Vorlesungen über GLM gesehen habe. Ich dachte Ich verstand alles, was er sagte, bis es schließlich zum Schreiben des Codes kam, um die Kostenfunktion für die Softmax-Regression zu implementieren, die wie folgt ist:
Das Problem, das ich habe, versucht einen Weg zu finden, dies zu vektorisieren. Wieder habe ich gedacht, dass ich verstanden habe, wie man solche Gleichungen vektorisiert, da ich es für lineare und logistische Regression tun konnte, aber nachdem ich diese Formel betrachtet habe, stecke ich fest.
Ich würde zwar gerne eine vektorisierte Lösung dafür finden (ich weiß, dass es bereits eine ähnliche Frage gibt: Vectorized Implementation of Softmax Regression ), was mich mehr interessiert, ist, ob jemand von euch mir einen Weg (zu Ihrem Weg) zu methodisch Gleichungen wie diese in vektorisiert umwandeln kann Formen. Zum Beispiel für diejenigen von Ihnen, die Experten oder erfahrene Veteranen in ML sind, wenn Sie zum ersten Mal von neuen Algorithmen in der Literatur lesen und sie in ähnlicher Notation wie in der obigen Gleichung geschrieben sehen, wie gehen Sie danach, sie zu konvertieren? vektorisierte Formen?
Mir ist klar, dass ich davon ausgehen könnte, dass ich der Student bin, der Mozart fragt: "Wie spielst du so gut Klavier?" Aber meine Frage ist einfach motiviert von dem Wunsch, in diesem Material besser zu werden, und unter der Annahme, dass nicht jeder geboren wurde, der Gleichungen zu vektorisieren wusste, und so muss jemand da draußen sein eigenes System entwickelt haben, und wenn ja, bitte teilen! Vielen Dank im Voraus!
Prost
Die Hilfedateien, die mit Octave geliefert werden, haben diesen Eintrag:
Zu einer sehr guten ersten Annäherung ist das Ziel bei der Vektorisierung schreibe Code, der Schleifen vermeidet und ganze Array-Operationen verwendet. Als ein trivial Beispiel, betrachten
%Vor%verglichen mit dem viel einfacheren
%Vor%Dies ist nicht nur einfacher zu schreiben; es ist auch intern viel einfacher optimieren. Octave delegiert diese Operation an einen Basiswert Implementierung, die unter anderen Optimierungen speziellen Vektor verwenden kann Hardware - Anweisungen oder könnten die Additionen möglicherweise sogar durchführen parallel. Im Allgemeinen, wenn der Code vektorisiert ist, der zugrunde liegende Die Umsetzung hat mehr Freiheiten hinsichtlich der Annahmen, die sie treffen kann um eine schnellere Ausführung zu erreichen.
Dies ist besonders wichtig für Schleifen mit "billigen" Körpern. Oftmals reicht aus, um nur die innerste Schleife zu vektorisieren, um akzeptabel zu werden Performance. Eine allgemeine Faustregel ist, dass die "Reihenfolge" der Der vektorisierte Körper sollte größer oder gleich der "Ordnung" des. sein einschließende Schleife.
Als weniger triviales Beispiel anstelle von
%Vor%schreibe
%Vor%Dies zeigt ein wichtiges allgemeines Konzept zur Verwendung von Arrays für Indizierung statt Schleife über eine Indexvariable.  Indexausdrücke. Nutzen Sie auch die boolesche Indizierung großzügig. Wenn eine Bedingung muss getestet werden, diese Bedingung kann auch als Boolean geschrieben werden Index. Zum Beispiel statt
%Vor%schreibe
%Vor%welches die Tatsache ausnutzt, dass 'a & gt; 5 'erzeugt einen booleschen Index.
Verwenden Sie elementweise Vektoroperatoren wann immer möglich, um Schleifen zu vermeiden (Operatoren wie '. *' und '. ^').  Arithmetische Ops. Für einfach Inline-Funktionen, die 'Vectorize'-Funktion kann dies automatisch tun.
- Integrierte Funktion: vektorisieren (FUN) Erstellen Sie eine vektorisierte Version der Inline-Funktion FUN durch Ersetzen alle Vorkommen von '', '/' usw. mit '. ', './', etc.
%Vor% Nutzen Sie auch Rundfunk in diesen elementweisen Operatoren aus
Vermeiden Sie Schleifen und unnötige Zwischenspeicherzuweisungen.
 Rundfunk.
Verwenden Sie nach Möglichkeit integrierte und Bibliotheksfunktionen. Eingebaut und kompilierte Funktionen sind sehr schnell. Selbst mit einer m-file-Bibliotheksfunktion Die Chancen stehen gut, dass es bereits optimiert ist oder mehr optimiert wird in einer zukünftigen Version.
Zum Beispiel, sogar besser als
%Vor%ist
%Vor%Die meisten Octave-Funktionen werden mit Vektor- und Array-Argumenten in geschrieben Verstand. Wenn Sie eine Schleife mit einer sehr einfachen Operation schreiben, Wahrscheinlichkeiten sind, dass eine solche Funktion bereits existiert. Folgende Funktionen treten häufig in vektorisiertem Code auf:
Indexmanipulation
%Vor%Wiederholung
%Vor%Vektorisierte Arithmetik
%Vor%Form von höherdimensionalen Arrays
%Vor%Sieh dir auch diese Seiten aus einem Stanford ML-Wiki an, um weitere Anleitungen mit Beispielen zu erhalten.
Dieser Vektor sieht ziemlich schwer zu vektorisieren aus, da Sie innerhalb Ihrer Summierungen Exponentialfunktionen ausführen. Ich nehme an, dass Sie e zu willkürlichen Mächten erheben. Was Sie vektorisieren können, ist der zweite Ausdruck des Ausdrucks \ sum \ sum theta ^ 2 stellen Sie sicher, nur zu verwenden. * Operator in Matlab Geben Sie die Linkbeschreibung hier zu Computer \ theta ^ 2
einGleiches gilt für die inneren Terme des Verhältnisses des Logarithmus. \ theta 'x ^ (i) ist vektorisierbarer Ausdruck.
Sie können auch von einer Memoization- oder dynamischen Programmiertechnik profitieren und versuchen, die Ergebnisse der Berechnungen von e ^ \ theta 'x ^ (i) zu verwenden.
Nach meiner Erfahrung besteht der Weg zur Vektorisierung zuerst darin, dass die nicht vektorisierte Implementierung funktioniert. Versuchen Sie dann, die offensichtlichsten Teile Ihrer Berechnung zu vektorisieren. Bei jedem Schritt optimieren Sie Ihre Funktion sehr wenig und prüfen Sie immer, ob Sie das gleiche Ergebnis wie bei der nicht vektorisierten Berechnung erhalten. Außerdem ist es sehr hilfreich, mehrere Testfälle zu haben.
Tags und Links math machine-learning regression glm