👻

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 ClippingGhost Clippingについて紹介します。これらの手法は、従来の勾配クリッピング手法と比べて、メモリ使用量を大幅に削減することができ、PyTorch向けのDP-SGDライブラリであるOpacusでも実装されています。

https://github.com/pytorch/opacus

従来の勾配クリッピング

従来の勾配クリッピングは、すべてのレイヤーについてサンプルごとの勾配を計算・保持し、そのノルム(大きさ)が閾値を超える場合に、勾配を閾値内に収まるように調整します。

以下はOpacusにおける勾配クリッピングのイメージです。
従来の勾配クリッピング
サンプルごとの勾配の大きさper_sample_grad_normgrad_sampleから計算し、その値が閾値を超えないように、grad_sampleをクリッピングします。その後、ミニバッチで集約された勾配summed_gradにノイズを加えた勾配gradをモデルの更新に用います。

この方法の欠点は、すべてのレイヤーについてサンプルごとの勾配grad_sampleをメモリに保持する必要があることです。これにより、メモリ使用量が増加し、計算コストが高くなります。

Fast Gradient Clipping

Fast Gradient Clippingは、このメモリ使用量を削減するために提案された手法です。上記手法との大きな違いは、サンプルごとの勾配grad_sampleを直接クリッピングする代わりに、以下の重み付き損失\bar{L}を利用する点です。

\bar{L} = \sum_i R_i L_i, \; where \; R_i = \min\left(\frac{C}{C_i}, 1\right)

ただし、L_ii番目のサンプルの損失、Cは閾値ノルム、C_ii番目のサンプルの勾配ノルムです。

以下はOpacusにおけるFast Gradient Clippingのイメージです。
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に実装されており、簡単に利用できます。

参考記事

https://pytorch.org/blog/clipping-in-opacus/

Discussion