標準はfloat32ですが、float16を使用しても問題ないのはどのような状況ですか?
同じcovnetを両方のデータ型で実行することを比較しましたが、問題に気づきませんでした。大きなデータセットでは、メモリの問題について心配する必要がないため、float16を選択します。
驚いたことに、楽しみのためだけでなく、本番環境でも16ビットを使用してもまったく問題ありません。たとえば、 this video で、Jeff DeanはGoogleでの16-bit計算について52:00頃に語っています。スライドからの引用:
精度の低下を非常に許容するニューラルネットトレーニング
GPUメモリはML計算の主要なボトルネックであるため、精度の低下について多くの研究が行われてきました。例えば。
Gupta at al paper 「数値精度が限定されたディープラーニング」について固定(浮動ではない)16ビットトレーニングあり確率的丸め。
Courbariaux at al "低精度の乗算を使用したディープニューラルネットワークのトレーニング" 10-bitアクティベーションおよび12-bitパラメータの更新について。
そして、これは限界ではありません。 Courbariaux et al 、 "BinaryNet:+1または-1に制限された重みとアクティブ化を使用したディープニューラルネットワークのトレーニング。ここで彼らは1-bitアクティベーションと重みについて議論します(勾配の精度は高くなります)。これにより、フォワードパスが超高速になります。
もちろん、一部のネットワークではトレーニングに高精度が必要になると想像できますが、大きなネットワークのトレーニングには少なくとも16ビットを試し、それがうまくいかない場合は32ビットに切り替えることをお勧めします。
float16のトレーニングは注意が必要です。標準のfloat16を使用するとモデルが収束しない可能性がありますが、float16はメモリを節約し、最新のVolta GPUを使用している場合は高速です。 Nvidiaは、最新の doc および paper で「混合精度トレーニング」を推奨しています。
Float16をより適切に使用するには、手動でloss_scaleを慎重に選択する必要があります。 loss_scaleが大きすぎると、NANとINFが発生する可能性があります。 loss_scaleが小さすぎると、モデルが収束しない可能性があります。残念ながら、すべてのモデルに共通のloss_scaleはないため、特定のモデルに合わせて慎重に選択する必要があります。
メモリ使用量を減らしたいだけの場合は、tfを試すこともできます。 to_bfloat16、これはよりよく収束する可能性があります。
この研究によると:
Gupta、S.、Agrawal、A.、Gopalakrishnan、K.、and Narayanan、P.(2015、June)限られた数値精度のディープラーニング。機械学習に関する国際会議(pp。1737-1746)。で: https://arxiv.org/pdf/1502.02551.pdf
半小数点浮動精度(float16)を使用する場合、収束を得るには確率的丸めが必要でした。しかし、その丸め手法を使用すると、非常に良い結果が得られると主張しました。
その論文の関連する引用は次のとおりです。
「最近の研究(Chen et al。、2014)は、固定小数点計算ユニットを使用するディープニューラルネットワークトレーニング用のハードウェアアクセラレータを示していますが、畳み込みニューラルをトレーニングしながら収束を達成するには32ビット固定小数点表現を使用する必要があることがわかりました。 MNISTデータセット上のネットワーク。対照的に、我々の結果は、固定小数点の計算中に確率的丸めが使用されている限り、16ビットの固定小数点数のみを使用してこれらのネットワークをトレーニングできることを示しています。
参考までに、Chenの2014年の引用を以下に示します。
Chen、Y.、Luo、T.、Liu、S.、Zhang、S.、He、L.、Wang、J.、...&Temam、O.(2014、December)。 Dadiannao:機械学習スーパーコンピューター。第47回年次IEEE/ACMマイクロアーキテクチャに関する国際シンポジウムの議事録(pp。609-622)。 IEEE Computer Society。で: http://ieeexplore.ieee.org/document/7011421/?part=1