2017-10-06 165 views
2

標準是FLOAT32但我在什麼條件下是確定使用float16疑惑?float16 VS FLOAT32卷積神經網絡

我一直運行比較兩者的數據類型相同covnet,並沒有發現任何問題。對於大型數據集,我更喜歡float16,因爲我可以少擔心內存問題..

+0

隨着float16,你可能會有更多的消失漸變問題。並且,如果您的漸變過低,那麼應該不同的漸變可能會相同。 –

回答

2

出人意料的是,這是完全正常使用16位,甚至不只是爲了好玩,但在生產中也是如此。例如,在this video傑夫院長談到16位計算在谷歌,周圍52:00。從滑梯的報價:

神經網絡訓練非常寬容的精度降低

由於GPU內存是ML計算的主要瓶頸,出現了精密減少了大量的研究。例如。

  • Gupta at al paper 「深度學習與有限數值精度」 關於固定(不浮動)16位訓練,但與隨機四捨五入

  • Courbariaux at al10位激活和12位參數更新「精度低乘法訓練深層神經網絡」。

  • 而且這還不是極限。 Courbariaux et al,「BinaryNet:訓練具有約束爲+1或-1的權重和激活的深度神經網絡」。在這裏,他們討論1位激活和權重(雖然梯度更高的精度),這使得正向傳遞超快。

當然,我可以想像一些網絡可能需要高精度的訓練,但我會建議至少嘗試16位訓練一個大的網絡,並切換到32位,如果它被證明工作雪上加霜。

1

float16培訓很棘手:使用標準float16時,您的模型可能不會收斂,但float16確實可以節省內存,而且如果您使用最新的Volta GPU,速度也會更快。 NVIDIA建議的最新docpaper「混合精密訓練」。

要更好地使用float16,您需要手動並仔細選擇loss_scale。如果loss_scale太大,可能會得到NAN和INF;如果loss_scale太小,模型可能不會收斂。不幸的是,所有型號都沒有常見的loss_scale,所以您必須爲您的特定型號仔細選擇它。

如果您只是想減少內存使用量,您也可以嘗試tf。 to_bfloat16,這可能會更好地收斂。

0

根據這一研究:

古普塔,S.,阿格拉瓦爾,A.,戈帕拉克里希南,K.,&納拉亞南,P。(2015年, 6月)。深度學習的數值精度有限。在 國際機器學習會議(pp。1737-1746)。於: https://arxiv.org/pdf/1502.02551.pdf

隨機

被要求使用舍入的半浮點精度(float16)時獲得收斂;然而,當使用這種舍入技術時,他們聲稱取得了非常好的結果。

下面是該文件相關報價:(Chen等,2014)

「最近的工作提出了對於採用 定點計算單元深層神經網絡訓練硬件加速器 ,但發現它對 使用32位定點表示來實現收斂 ,同時在MNIST數據集上訓練卷積神經網絡 。相比之下,我們的結果顯示 有可能訓練這些網絡只使用16位 fixed-只要使用隨機舍入 杜裏ng定點計算「。

以供參考,在這裏是在人的引文陳2014:

陳,Y.,羅,T.,劉,S.,張,S.,他,L.,王,J.,... & Temam, O.(2014年12月)。 Dadiannao:機器學習超級計算機。在 第47屆年度IEEE/ACM國際研討會 微體系結構(第609-622)。 IEEE計算機協會。在: http://ieeexplore.ieee.org/document/7011421/?part=1