Path: blob/master/site/ja/tutorials/optimization/compression.ipynb
25118 views
Copyright 2022 The TensorFlow Compression Authors.
スケーラブルなモデル圧縮
概要
このノートブックでは、TensorFlow Compression を使用してモデルを圧縮する方法を説明します。
以下の例では、分類精度を維持しながら、MNIST 分類器の重みを浮動小数点表現よりもはるかに小さいサイズに圧縮します。これは、論文 Scalable Model Compression by Entropy Penalized Reparameterization に基づく 2 段階のプロセスによって行われます。
トレーニング中に明示的なエントロピーペナルティを使用して「圧縮可能な」モデルをトレーニングします。これにより、モデルパラメータの圧縮性が促進されます。このペナルティの重み により、圧縮されたモデルのサイズとその精度の間のトレードオフを継続的に制御できます。
ペナルティと一致するコーディングスキームを使用して、圧縮可能なモデルを圧縮モデルにエンコードします。つまり、ペナルティはモデルサイズの予測因子となります。これにより、微調整するためにモデルのトレーニング、圧縮、再トレーニングを複数回繰り返す必要がなくなります。
この方法は、計算の複雑さではなく、圧縮されたモデルのサイズに厳密に関係しています。モデルのプルーニングなどの手法と組み合わせて、サイズと複雑さを軽減できます。
さまざまなモデルでの圧縮結果の例:
モデル(データセット) | モデルサイズ | 圧縮比 | トップ-1 エラー圧縮(非圧縮) |
---|---|---|---|
LeNet300-100(MNIST) | 8.56 KB | 124x | 1.9%(1.6%) |
LeNet5-Caffe(MNIST) | 2.84 KB | 606x | 1.0%(0.7%) |
VGG-16(CIFAR-10) | 101 KB | 590x | 10.0%(6.6%) |
ResNet-20-4(CIFAR-10) | 128 KB | 134x | 8.8%(5.0%) |
ResNet-18(ImageNet) | 1.97 MB | 24x | 30.0%(30.0%) |
ResNet-50(ImageNet) | 5.49 MB | 19x | 26.0%(25.0%) |
使用例:
モデルを大規模にエッジデバイスにデプロイ/ブロードキャスト。転送中の帯域幅の使用量を低減できます。
フェデレーテッドラーニングでグローバルモデルの状態をクライアントに伝える。モデルのアーキテクチャ(隠れユニットの数など)は初期モデルから変更されておらず、クライアントは解凍されたモデルで学習を続けることができます。
非常にメモリが制限されたクライアントでの推論の実行。推論中、各レイヤーの重みを順次解凍し、アクティベーションが計算された直後に破棄することができます。
セットアップ
pip
で Tensorflow Compression をインストールします。
ライブラリ依存関係をインポートします。
基本的な MNIST 分類器を定義してトレーニングする
高密度レイヤーと畳み込みレイヤーを効果的に圧縮するには、カスタムレイヤークラスを定義する必要があります。これらは tf.keras.layers
の下のレイヤーに似ていますが、Entropy Penalized Reparameterization(EPR)を効果的に実装するために後でサブクラス化します。このために、コピーコンストラクタも追加します。
まず、標準の高密度レイヤーを定義します。
同様に、2D 畳み込みレイヤーを定義します。
モデルの圧縮に進む前に、通常の分類器を正常にトレーニングできることを確認します。
モデルアーキテクチャを定義します。
トレーニングデータを読み込みます。
最後に、モデルをトレーニングします。
成功しました! モデルは適切にトレーニングされ、5 エポック以内に検証セットで 98% を超える精度に達しました。
圧縮可能な分類器をトレーニングする
Entropy Penalized Reparameterization(EPR)には、次の 2 つの主要な要素があります。
トレーニング中にモデルの重みにペナルティを適用します。これは、確率モデルの下でのエントロピーに対応し、重みのエンコードスキームと一致します。以下では、このペナルティを実装する Keras
Regularizer
を定義します。重みを再パラメータ化します。つまり、重みをより圧縮可能な潜在表現にします(圧縮性とモデルのパフォーマンスのトレードオフを改善します)。畳み込みカーネルの場合、フーリエドメインが適切な表現であることが示されています。他のパラメータについては、以下の例では、さまざまな量子化ステップサイズで単純にスカラー量子化(丸め)を使用しています。
まず、ペナルティを定義します。
以下の例では、論文 Optimizing the Communication-Accuracy Trade-off in Federated Learning with Rate-Distortion Theory に着想を得て、tfc.PowerLawEntropyModel
クラスに実装されたコード/確率モデルを使用しています。ペナルティは と定義されます。 はモデルパラメータまたはその潜在表現の 1 つの要素であり、 は小さい定数で、数値は 0 付近で安定します。
ペナルティは正則化の損失です(「重み損失」と呼ばれることもあります)。ゼロの場合、カスプが凹形状であり、重みのスパース性を助長します。重みを圧縮するために適用されるコーディングスキームである Elias ガンマ コードは、要素の大きさの長さが ビットのコードを生成します。つまり、それはペナルティに一致し、ペナルティを適用すると、予想されるコード長が最小化されます。
次に、次の追加機能を持つ CustomDense
と CustomConv2D
のサブクラスを定義します。
これらは上記の正則化のインスタンスを取得し、トレーニング中にそれをカーネルとバイアスに適用します。
これらは、カーネルとバイアスを
@property
として定義し、変数にアクセスするたびに直接勾配で量子化を実行します。これは、後で圧縮モデルで実行される計算を正確に反映します。これらは、量子化ステップサイズの対数を表す追加の
log_step
変数を定義します。量子化が粗いほど、モデルのサイズは小さくなりますが、精度は低くなります。量子化ステップサイズは各モデルパラメータに対してトレーニング可能であるため、ペナルティ付き損失関数で最適化を実行すると、最適な量子化ステップサイズが決定されます。
量子化ステップは次のように定義されます。
これで、高密度レイヤーを定義できます。
畳み込みレイヤーも同様です。さらに、畳み込みカーネルは、カーネルが設定されるたびに実数値の離散フーリエ変換(RDFT)として格納され、カーネルが使用されるたびに変換が反転されます。カーネルのさまざまな周波数成分は多かれ少なかれ圧縮可能である傾向があるため、それぞれに独自の量子化ステップサイズが割り当てられます。
フーリエ変換とその逆を次のように定義します。
次に畳み込みレイヤーを以下のように定義します。
上記と同じアーキテクチャで分類器モデルを定義しますが、これらの変更されたレイヤーを使用します。
モデルをトレーニングします。
圧縮可能なモデルは、単純な分類器と同様の精度に達しています。
ただし、モデルは実際にはまだ圧縮されていません。これを行うためには、カーネルとバイアスを圧縮された形式(一連のビット)で格納するサブクラスの別のセットを定義します。
分類器を圧縮する
以下に定義されている CustomDense
と Custom Conv2D
のサブクラスは、圧縮可能な高密度レイヤーの重みをバイナリ文字列に変換します。さらに、スペースを節約するために、量子化ステップサイズの対数を半精度で格納します。カーネルまたはバイアスが @property
を介してアクセスされるたびに、それらは文字列表現から解凍され、逆量子化されます。
まず、モデルパラメータを圧縮および解凍する関数を定義します。
これらを使用して、CompressedDense
を定義します。
畳み込みレイヤークラスは上記に類似しています。
圧縮可能なモデルを圧縮モデルに変換するには、便利な clone_model
関数を使用できます。compress_layer
は、圧縮可能なレイヤーを圧縮レイヤーに変換し、他のタイプのレイヤー(Flatten
など)を単純に通過させます。
ここで、圧縮されたモデルの精度が期待どおりであることを検証します。
圧縮されたモデルの分類精度は、トレーニング中に達成されたものと同じです!
さらに、圧縮されたモデルの重みのサイズは、元のモデルのサイズよりもはるかに小さくなっています。
モデルをディスクに保存するには、モデルアーキテクチャ、関数グラフなどを保存するためのオーバーヘッドが必要です。
ZIP などの可逆圧縮方法は、このようなデータの圧縮には適していますが、重み自体の圧縮には適していません。そのため、ZIP 圧縮を適用した後でも、そのオーバーヘッドを含めたモデルのサイズを数えると、EPR には大きな利点があります。
正則化効果とサイズと精度のトレードオフ
上記では、 ハイパーパラメータが 2 に設定されています(モデル内のパラメータの数によって正規化されています)。 を大きくすると、モデルの重みは圧縮性に対してますます不利になります。
低い値の場合、ペナルティは重みの正則化のように機能します。実際には、分類器の一般化パフォーマンスに有益な効果があり、検証データセットの精度がわずかに高くなる可能性があります。
値が高いほど、モデルのサイズは小さくなりますが、精度は徐々に低下します。このことを確認するために、いくつかのモデルをトレーニングして、サイズと精度をプロットしてみます。
プロットは、理想的にはエルボー型のサイズと精度のトレードオフを示す必要がありますが、精度メトリクスに多少のノイズがあるのは正常です。初期化によっては、曲線にねじれが生じる場合があります。
正則化効果により、EPR 圧縮モデルは、 の値が小さい場合、元のモデルよりもテストセットでより正確です。追加の ZIP 圧縮後のサイズを比較しても、EPR 圧縮モデルは何倍も小さくなっています。
分類器を解凍する
CompressedDense
と CompressedConv2D
は、フォワードパスごとに重みを解凍します。そのため、メモリが制限されたデバイスに最適ですが、圧縮解凍は、特に小さなバッチサイズの場合、計算コストが高くなる可能性があります。
モデルを一度解凍し、それをさらにトレーニングや推論に使用するには、通常のレイヤーまたは圧縮可能なレイヤーを使用してモデルに戻すことができます。これは、モデルのデプロイまたはフェデレーションラーニングのシナリオで役立ちます。
まず、単純なモデルに戻すと、推論を実行したり、圧縮ペナルティなしで通常のトレーニングを継続したりできます。
トレーニングは正則化なしで行われるため、追加エポックのトレーニング後に検証精度が低下することに注意してください。
または、モデルを「圧縮可能な」モデルに変換して、圧縮ペナルティを使用して推論やさらなるトレーニングを行うことができます。
ここでは、追加のエポックのトレーニング後に精度が向上しています。