DP-SGDにおけるFast Gradient ClippingとGhost Clipping
はじめに
差分プライバシー(Differential Privacy, DP)は、機械学習モデルの訓練において、個々のデータサンプルの情報漏洩を防ぐための強力なフレームワークです。DPを深層学習に適用する際の主要な手法の1つが、DP-SGD(Differentially Private Stochastic Gradient Descent)です。
DP-SGDは、通常の確率的勾配降下法(SGD)をDPを満たすように拡張したものです。DP-SGDでは、通常のSGDによる最適化を行う前に、各サンプルの勾配の大きさを制限し、勾配にノイズを加えます。この勾配の大きさを制限することを勾配クリッピングと呼び、各サンプルがモデルの更新に与える影響をある範囲内に収める目的があります。
本記事では、DP-SGDにおける新たな勾配クリッピング手法であるFast Gradient ClippingとGhost Clippingについて紹介します。これらの手法は、従来の勾配クリッピング手法と比べて、メモリ使用量を大幅に削減することができ、PyTorch向けのDP-SGDライブラリであるOpacusでも実装されています。
従来の勾配クリッピング
従来の勾配クリッピングは、すべてのレイヤーについてサンプルごとの勾配を計算・保持し、そのノルム(大きさ)が閾値を超える場合に、勾配を閾値内に収まるように調整します。
以下はOpacusにおける勾配クリッピングのイメージです。
サンプルごとの勾配の大きさper_sample_grad_norm
をgrad_sample
から計算し、その値が閾値を超えないように、grad_sample
をクリッピングします。その後、ミニバッチで集約された勾配summed_grad
にノイズを加えた勾配grad
をモデルの更新に用います。
この方法の欠点は、すべてのレイヤーについてサンプルごとの勾配grad_sample
をメモリに保持する必要があることです。これにより、メモリ使用量が増加し、計算コストが高くなります。
Fast Gradient Clipping
Fast Gradient Clippingは、このメモリ使用量を削減するために提案された手法です。上記手法との大きな違いは、サンプルごとの勾配grad_sample
を直接クリッピングする代わりに、以下の重み付き損失
ただし、
以下はOpacusにおけるFast Gradient Clippingのイメージです。
サンプルごとの勾配の大きさper_sample_grad_norm
から重み付き損失を計算し、2回目の誤差逆伝播を行います。この誤差逆伝播で得られる勾配は、従来手法でクリッピングを行った後の集約勾配summed_grad
と同じになります。
per_sample_grad_norm
は、レイヤーごとの勾配の大きさper_layer_grad_norm
から計算できるため、grad_sample
は各レイヤーの処理が終われば破棄されます。これにより、メモリ使用量を削減することができます。
Ghost Clipping
Ghost Clippingは、さらにメモリ効率を高めるための手法です。この手法では、grad_sample
を計算せずに、per_sample_grad_norm
を求めます。
具体的には、サンプルごとの順伝播の入力activations
と出力に対する損失の勾配backprops
のノルムから、per_sample_grad_norm
を直接求めます。詳細は割愛しますが、Linear層など一部のレイヤーでのみ計算することができます。
この手法では、サンプルごとの勾配grad_sample
をメモリに保持する必要がないため、メモリ使用量を大幅に削減できます。
まとめ
Fast Gradient ClippingとGhost Clippingは、DP-SGDにおける勾配クリッピングのメモリ使用量を削減するための有効な手法です。これらの手法を用いることで、より効率的な差分プライベートな深層学習モデルの訓練が可能になります。
これらの手法は、PyTorch向けのDP-SGDライブラリであるOpacusに実装されており、簡単に利用できます。
参考記事
Discussion