Wie viele FLOPs braucht tanh?

8

Ich möchte berechnen, wie viele Flops jede Schicht von LeNet-5 ( Papier ) braucht. Einige Artikel enthalten FLOPs für andere Architekturen ( 1 , 2 , 3 ) Diese Papiere geben Sie keine Details darüber an, wie die Anzahl der FLOPs zu berechnen ist und ich habe keine Ahnung, wie viele FLOPs für die nichtlinearen Aktivierungsfunktionen notwendig sind. Zum Beispiel, wie viele FLOPs sind notwendig, um tanh(x) zu berechnen?

Ich denke, das wird die Implementierung sein und wahrscheinlich auch hardwarespezifisch. Ich bin jedoch hauptsächlich daran interessiert, eine Größenordnung zu bekommen. Sprechen wir über 10 FLOPs? 100 FLOPs? 1000 FLOPs? Wählen Sie also eine beliebige Architektur / Implementierung für Ihre Antwort. (Obwohl ich Antworten schätzen würde, die nah an "üblichen" Setups sind, wie eine Intel i5 / nvidia GPU / Tensorflow)

    
Martin Thoma 20.12.2016, 21:42
quelle

2 Antworten

6

Hinweis: Diese Antwort ist nicht pythonspezifisch, aber ich denke nicht, dass etwas wie tanh in den verschiedenen Sprachen grundlegend anders ist.

Tanh wird normalerweise implementiert, indem eine obere und untere Grenze definiert wird, für die jeweils 1 und -1 zurückgegeben werden. Der Zwischenteil wird wie folgt mit verschiedenen Funktionen angenähert:

%Vor%

Es gibt Polynome, die bis zu einzelnen Präzisions-Fließkommawerten genau sind, und auch für doppelte Genauigkeit. Dieser Algorithmus wird Cody-Waite-Algorithmus genannt.

Zitieren diese Beschreibung (mehr Informationen zur Mathematik gibt es dort als Nun, zB wie man x_medium bestimmt, Die rationale Form von Cody und Waite erfordert vier Multiplikationen, drei Additionen und eine Division in einfacher Genauigkeit und sieben Multiplikationen, sechs Additionen und eine Division in doppelter Genauigkeit.

Bei negativem x können Sie | x | berechnen und drehe das Zeichen um. Sie benötigen also Vergleiche, für die das Intervall x gilt, und werten die entsprechende Approximation aus. Das ist eine Summe von:

  1. Nimmt den absoluten Wert von x
  2. 3 Vergleiche für das Intervall
  3. Je nach Intervall und Float-Genauigkeit 0 bis einige FLOPS für das Exponential, überprüfen Sie diese Frage zur Berechnung der Exponentialfunktion.
  4. Ein Vergleich, um zu entscheiden, ob das Zeichen umgedreht werden soll.

Nun, das ist ein Bericht von 1993, aber ich glaube nicht, dass sich hier viel geändert hat.

    
RunOrVeith 25.03.2017, 10:32
quelle
4

Wenn wir uns die glibc-Implementierung von tanh(x) anschauen, sehen wir:

  1. für x -Werte größer 22.0 und doppelte Genauigkeit, tanh(x) kann mit Sicherheit als 1.0 angenommen werden, so dass fast keine Kosten anfallen.
  2. für sehr kleine x , (sagen wir x<2^(-55) ) ist eine andere billige Approximation möglich: tanh(x)=x(1+x) , also werden nur zwei Fließkommaoperationen benötigt.
  3. für die Werte in beetween kann man tanh(x)=(1-exp(-2x))/(1+exp(-2x)) umschreiben. Allerdings muss man genau sein, denn 1-exp(t) ist sehr problematisch für kleine t-Werte wegen Signifikanzverlust, also verwendet man expm(x)=exp(x)-1 und berechnet tanh(x)=-expm1(-2x)/(expm1(-2x)+2) .

Im Grunde genommen ist der schlimmste Fall ungefähr die doppelte Anzahl von Operationen, die für expm1 benötigt werden, was eine ziemlich komplizierte Funktion ist. Der beste Weg ist wahrscheinlich, die Zeit zu messen, die benötigt wird, um tanh(x) zu berechnen, verglichen mit einer Zeit, die für eine einfache Multiplikation von zwei Doppelungen benötigt wird.

Meine (schlampigen) Experimente an einem Intel-Prozessor ergaben folgendes Ergebnis, das eine grobe Vorstellung liefert:

Also für sehr kleine und Zahlen & gt; 22 gibt es fast keine Kosten, für Zahlen bis zu 0.1 zahlen wir 6 FLOPS, dann steigen die Kosten auf etwa 20 FLOPS pro tanh -cacclulation.

Der Schlüssel zum Erfolg: Die Kosten für die Berechnung von tanh(x) sind abhängig vom Parameter x und die maximalen Kosten liegen zwischen 10 und 100 FLOPs.

Es gibt eine Intel-Anweisung namens F2XM1 , die 2^x-1 für -1.0<x<1.0 berechnet könnte für die Berechnung von tanh verwendet werden, zumindest für einen bestimmten Bereich. Wenn jedoch Agner-Tabellen zu glauben sind, betragen die Kosten dieser Operation etwa 60 FLOPs.

Ein weiteres Problem ist die Vektorisierung - die normale glibc-Implementierung ist nicht vektorisiert, soweit ich das sehen kann. Wenn also Ihr Programm die Vektorisierung verwendet und eine unverschlüsselte tanh -Implementierung verwenden muss, wird es das Programm noch mehr verlangsamen. Dafür hat der Intel-Compiler die mkl-Bibliothek, die vektorisiert tanh unter den anderen.

Wie Sie in den Tabellen sehen können, betragen die maximalen Kosten ca. 10 Uhren pro Betrieb (Kosten für einen Float-Betrieb liegen bei ca. 1 Uhr).

Ich schätze, es gibt eine Chance, dass Sie einige FLOPs mit der -ffast-math -Compileroption gewinnen können, was zu einem schnelleren, aber weniger präzisen Programm führt (das ist eine Option für Cuda oder c / c ++, nicht sicher, ob dies möglich ist) für python / numpy).

Der C ++ Code, der die Daten für die Figur erzeugt (kompiliert mit g ++ -std = c ++ 11 -O2). Es ist nicht beabsichtigt, die genaue Nummer, sondern den ersten Eindruck über die Kosten zu geben:

%Vor%     
ead 25.03.2017 20:51
quelle

Tags und Links