ホームへ戻る

GitHub Repo

PyTorchコミュニティがCTC損失の異常を報告、特定のCUDA入力で誤った損失と勾配が生じる可能性

10月28日のPyTorchコミュニティからの報告によると、特定の整数型と非連続テンソルの組み合わせにより、CUDA上のCTC損失で一貫しない結果が生じる可能性があります。報告にはCPUとの比較と最小再現例が含まれていますが、確認時点でメンテナーによる確認や正式な修正はありません。

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に、系列認識の学習精度に関する問題が新たに報告されました。F.ctc_lossでラベルと長さの引数にint32を使い、バッチ内で入力長が異なる場合、報告者は非連続なlog_probsによって誤った損失が生じ、呼び出すたびに損失が変わることさえあると観察しました。一部の設定では、有効な入力長の範囲外にもゼロでない勾配が現れました。問題の報告

再現環境はWindows、RTX 4060 Laptop GPU、PyTorch 2.14.1+cu130です。テストでは、モデル出力にlog_softmaxとpermuteを適用し、CTCが必要とする配置に変換しています。同じ値を連続テンソルに変換すると、順伝播の損失はCPUの結果と一致し、cuDNNを無効にした場合も一貫した結果が得られました。ただし、.contiguous()を追加するだけでは報告された勾配の問題を解消できず、完全な解決策とはみなせません。再現コードと出力

公式ドキュメントによると、CTCは入力系列とターゲット系列の間で可能なアラインメントを合計し、各サンプルの長さを使ってパディング部分をマスクします。また、cuDNN経路ではすべてのinput_lengthsが時間次元Tと等しいことが求められ、整数型の引数にはint32を使う必要があります。通常の実装ではtorch.longが使われます。今回の報告では、入力長が異なる場合にもcuDNN経路が選ばれたとされています。このため、バックエンド選択時に制約が十分確認されているかを調べる価値がありますが、根本原因はまだ確認されていません。CTCLossドキュメント

系列認識のエンジニアにとって、この報告は学習時のデバッグで順伝播の損失とパディング領域の勾配の両方を確認する必要性を示しています。ドキュメントにはcuDNNが非決定的なアルゴリズムを使う場合があると記されていますが、それだけで今回の差異が正常な挙動だとは判断できません。現時点の証拠を踏まえると、影響を受ける可能性のあるチームは、実際のバッチでCPU、cuDNNを無効にした場合、int64の引数を使った場合の結果を比較できます。今後は、メンテナーが再現できるか、他のプラットフォームにも影響するか、損失と勾配の回帰テストを含む修正が追加されるかを確認する必要があります。ドキュメントの制約 報告の状況

出典

  1. F.ctc_loss on CUDA:非連續輸入損失與長度外梯度問題 #202338
  2. CTCLoss — PyTorch 2.14 documentation