ホームへ戻る

GitHub Repo

PyTorchコミュニティが逆双曲線関数の勾配消失を報告、float16入力256で発生

10月24日のPyTorchコミュニティ報告によると、asinhとacoshは特定の入力で中間演算がオーバーフローし、勾配がゼロになる可能性がある。報告には再現コードと修正案が添えられているが、分析はAIの支援で作成されており、正式な修正と影響範囲は未確認だ。

Pytorch Deepdream (https://github.com/gordicaleksa/pytorch-deepdream) by gordicaleksa (https://github.com/gordicaleksa/pytorch-deepdream/commits?author=gordicaleksa) · MIT · Image source
zh-Hant

PyTorchリポジトリで10月24日、数値安定性に関する報告があった。2.14.1のCPU eagerモードで、torch.asinhとtorch.acoshに特定の有限値を入力すると、順伝播の結果は正常でも、逆伝播で勾配がゼロになるという。確認時点でissueはオープンのままで、正式な修正版はまだない。コミュニティ報告

報告の主な再現例は、float16入力の256だ。どちらの演算でも勾配はゼロになるが、演算を一時的にfloat32へ昇格すると、約0.00390625の勾配が得られる。作者は、導関数の式がまず入力を二乗し、その後に平方根の逆数を計算する点を原因として挙げている。256の二乗はfloat16の範囲を超えるため、最終的な勾配自体は表現可能でも、途中でのオーバーフローによって結果が失われる。再現と分析

この誤差は計算グラフ内で広がる可能性がある。報告ではasinh(256 * u)、u=1の例を示しており、本来は約1となるuに対する勾配もゼロになった。半精度テンソルを独自に使い、こうした関数を微分可能な変換に組み込むエンジニアにとって、順伝播の出力が有限かどうかだけを確認しても、学習信号の途絶を見落とすおそれがある。合成演算の例

公式の数値精度ドキュメントでは、入力値と最終結果がデータ型で表現できても、中間ステップでオーバーフローしないとは限らないと、すでに説明されている。また、バックエンドによって異なるアルゴリズムが使われる場合もある。そのため、この報告は改善可能な安定性の問題として捉えるのが適切であり、すべての半精度学習に影響すると直ちに結論づけることはできない。公式ドキュメント

作者は、低精度の中間値をより高い精度で処理する修正案を提示している。ただし報告には、分析、テスト、修正案の準備にCodexの支援を利用したと明記されている。CUDAと標準的なAMPの挙動は未検証だ。エンジニアリングチームは、局所的にfloat32で演算した場合としない場合の勾配を比較し、メンテナーによる確認、修正のマージ、デバイス間テストの結果を追ってから、デプロイ上の対応を判断できる。検証上の制約

出典

  1. asinh/acosh backward silently returns zero for large finite inputs
  2. Numerical accuracy — PyTorch 2.14 documentation