wake-up-neo.com

float16 vs float32 für neuronale Faltungsnetzwerke

Der Standard ist float32, aber ich frage mich, unter welchen Bedingungen es in Ordnung ist, float16 zu verwenden?

Ich habe das gleiche covnet mit beiden Datentypen verglichen und habe keine Probleme bemerkt. Bei großen Datenmengen bevorzuge ich float16, da ich mich weniger um Speicherprobleme kümmern kann.

8
megashigger

Überraschenderweise ist es absolut in Ordnung, 16 Bits zu verwenden, nicht nur zum Spaß, sondern auch in der Produktion. Zum Beispiel in diesem Video Jeff Dean spricht über 16-bit Berechnungen bei Google um 52:00 Uhr. Ein Zitat aus den Folien:

Neuronales Netztraining sehr tolerant bei reduzierter Präzision

Da der GPU-Speicher der größte Engpass bei der ML-Berechnung ist, wurde viel über die Präzisionsreduzierung geforscht. Z.B. 

  • Gupta at al paper "Deep Learning mit eingeschränkter numerischer Präzision" über behoben (nicht schwebend) 16-Bit training, jedoch mit stochastische Rundung

  • Courbariaux bei al "Tiefe neuronale Netze mit Low-Precision-Multiplikationen trainieren" über 10-Bit Aktivierungen und 12-Bit Parameteraktualisierungen. 

  • Und das ist nicht die Grenze. Courbariaux ua , "BinaryNet: Training von neuronalen Netzen mit Gewichten und Aktivierungen, die auf +1 oder -1 beschränkt sind". Hier diskutieren sie 1-Bit Aktivierungen und Gewichte (obwohl höhere Genauigkeit für die Gradienten), was den Vorwärtsdurchlauf sehr schnell macht.

Natürlich kann ich mir vorstellen, dass einige Netzwerke eine hohe Präzision für das Training erfordern, aber ich würde empfehlen, mindestens 16 Bit für das Training eines großen Netzwerks zu verwenden und auf 32 Bit zu wechseln, wenn sich herausstellt, dass es schlechter läuft.

5
Maxim

float16-Training ist knifflig: Ihr Modell konvergiert möglicherweise nicht, wenn Sie standardmäßiges Float16 verwenden, aber Float16 spart Speicher, ist jedoch schneller, wenn Sie die neuesten Volta-GPUs verwenden. Nvidia empfiehlt "Mixed Precision Training" in der neuesten doc und paper .

Um Float16 besser nutzen zu können, müssen Sie die loss_scale manuell und sorgfältig auswählen. Wenn loss_scale zu groß ist, erhalten Sie möglicherweise NANs und INFs. Wenn loss_scale zu klein ist, konvergiert das Modell möglicherweise nicht. Leider gibt es keine gängige loss_scale für alle Modelle. Daher müssen Sie sie sorgfältig für Ihr bestimmtes Modell auswählen.

Wenn Sie nur die Speicherbelegung reduzieren möchten, können Sie auch tf versuchen. to_bfloat16, die besser zusammenlaufen könnten. 

3
Max

Laut dieser Studie: 

Gupta, S., Agrawal, A., Gopalakrishnan, K. und Narayanan, P. (2015, Juni). Tiefes Lernen mit begrenzter numerischer Genauigkeit. In Internationale Konferenz über maschinelles Lernen (S. 1737-1746). At: https://arxiv.org/pdf/1502.02551.pdf

stochastische Rundung war erforderlich, um eine Konvergenz zu erzielen, wenn die halbe Punkt-Gleitgenauigkeit verwendet wird (float16); Als diese Rundungstechnik verwendet wurde, behaupteten sie jedoch, sehr gute Ergebnisse zu erzielen.

Hier ist ein relevantes Zitat aus diesem Artikel:

Eine kürzlich veröffentlichte Arbeit (Chen et al., 2014) stellt einen Hardware-Beschleuniger Für tiefes neuronales Netzwerk vor, bei dem Festkomma-Recheneinheiten verwendet werden, der jedoch Verwenden muss 32-Bit-Festkommadarstellung, um eine Konvergenz Zu erreichen, während ein neuronales Faltungsnetz auf Des MNIST-Datensatzes trainiert wird. Im Gegensatz dazu zeigen unsere Ergebnisse, dass Es möglich ist, diese Netzwerke zu trainieren unter Verwendung von nur 16-Bit Festkommazahlen, solange stochastische Rundung bei Festkomma-Berechnungen verwendet wird. "

Zur Veranschaulichung hier die Zitat für Chen auf al. 2014:

Chen, Y., Luo, T., Liu, S., Zhang, S., He, L., Wang, J., ... & Temam, O. (2014, Dezember). Dadiannao: Ein maschinenlernender Supercomputer. In Verfahren des 47. IEEE/ACM International Symposiums über Mikroarchitektur (S. 609-622). IEEE Computer Society. Um: http://ieeexplore.ieee.org/document/7011421/?part=1

1
devinbost