Path: blob/master/site/ja/tutorials/generative/data_compression.ipynb
25118 views
Copyright 2022 The TensorFlow Compression Authors.
学習データの圧縮
概要
このノートブックでは、ニューラルネットワークと TensorFlow Compression を使って非可逆データ圧縮を行う方法を説明します。
非可逆圧縮には、レート、サンプルの安藤かに必要な期待されるビット数、およびサンプルの再構築における期待誤差を示すひずみ間のトレードオフが伴います。
以下の例では、オートエンコーダのようなモデルを使用して、MNIST データセットの画像を圧縮します。この手法は、『End-to-end Optimized Image Compression』という論文を基としています。
学習データの圧縮に関する背景情報については、古典的なデータ圧縮に精通した人を対象としたこちらの論文か、機械学習分野のユーザーを対象としたこちらの調査をご覧ください。
セットアップ
pip
で Tensorflow Compression をインストールします。
ライブラリ依存関係をインポートします。
トレーナーモデルを定義する
このモデルはオートエンコーダに似ているため、またトレーニングと推論中に異なる機能を実行する必要があるため、このセットアップは、たとえば分類器などとは少し異なります。
トレーニングモデルは、以下の 3 つで構成されています。
分析(またはエンコーダ)変換: 画像を潜在空間に変換します。
合成(またはデコーダ)変換: 潜在空間から画像空間に変換します。
事前確率とエントロピーモデル: 潜在空間の周辺分布をモデル化します。
まず、変換を定義します。
トレーナーは、両方の変換のインスタンスと事前確率のパラメータを保有します。
その call
メソッドは、以下を計算するようにセットアップされます。
レート: 数字のバッチを表現するために必要なビット数の推定
ひずみ: 元の数字と再構築された数字のピクセルの平均絶対差
レートとひずみを計算する
では、トレーニングセットの画像を 1 つ使用して、順を追って説明します。トレーニングと検証用の MNIST データセットを読み込みます。
1 つの画像 を抽出します。
潜在の表現 を取得するには、float32
にキャストして batch 次元を追加し、それを分析変換に通す必要があります。
潜在は、テスト時に量子化されます。これをトレーニング中に区別可能な方法でモデル化するために、 の間隔で一様ノイズを追加し、その結果を をとします。これは、『End-to-end Optimized Image Compression』論文で使用されているのと同じです。
「事前確率」は、ノイズを含む潜在の周辺分布をモデル化するためにトレーニングする分布の密度です。たとえば、潜在次元ごとに異なるスケールを持つ独立した一連のロジスティック分布であることがあります。tfc.NoisyLogistic
は、潜在には追加ノイズがあるという事実を考慮します。スケールがゼロに近づくにつれ、ロジスティック分布はディラックのデルタ(スパイク)に近づくものですが、追加ノイズにより、「ノイズの多い」分布は一様分布に近づきます。
トレーニング中、tfc.ContinuousBatchedEntropyModel
は一様ノイズを追加し、そのノイズと事前確率を使用して(区別可能な)レート(潜在表現をエンコードするために必要な平均ビット数)の上限を計算します。この上限は、損失として最小化できます。
最後に、ノイズのある潜在が合成変換を通過し、画像の再構築 が生成されます。明らかに、変換はトレーニングされていないため、この再構築にはあまり利用価値がありません。
数字のバッチごとに MNISTCompressionTrainer
を呼び出すと、レートとそのバッチの平均としてのひずみが生成されます。
次のセクションでは、これらの 2 つの損失で勾配降下を行うようにモデルをセットアップします。
モデルをトレーニングする
レートとひずみのラグアンジアン、つまりレートとひずみの和を最適化するようにトレーナーをコンパイルします。ここで、いずれかの項はラグランジュ関数パラメータ で重み付けされます。
この損失関数は、モデルのさまざまな箇所に異なる影響を与えます。
分析変換は、レートとひずみの目的のトレードオフを達成する潜在表現を生成するようにトレーニングされます。
合成変換は、特定の潜在表現でひずみを最小化するようにトレーニングされます。
事前確率のパラメータは、特定の潜在表現でレートを最小化するようにトレーニングされます。これは、事前確率を最大尤度において潜在の周辺分布に適合するのと同じです。
次に、モデルをトレーニングします。ここでは、画像を圧縮するだけであるため、人間による注釈付けは必要ありません。そのため、map
を使って注釈を削除し、レートとひずみの「ダミー」ターゲットを追加します。
MNIST 画像を圧縮する
テスト時の圧縮と解凍用に、トレーニング済みのモデルを以下の 2 つに分割します。
エンコーダ側には、分析変換とエントロピーモデルが含まれます。
デコーダ側には、合成変換と同じエントロピーモデルが含まれます。
テスト時には、潜在に追加ノイズが含まれませんが、量子化されてから非可逆的に圧縮されるため、それらに新しい名前を指定します。それらと再構築の と をそれぞれに呼び出します(『End-to-end Optimized Image Compression』に従います)。
compression=True
でインスタンス化すると、エントロピーモデルは、学習した事前確率をレンジコーディングアルゴリズムのテーブルに変換します。compress()
を呼び出すと、このアルゴリズムが呼び出され、潜在空間ベクトルをビットシーケンスに変換します。各バイナリ文字列の長さは、潜在の情報コンテンツに近似します(事前確率の下の潜在の負の対数尤度)。
圧縮と解凍のエントロピーモデルは、同じインスタンスである必要があります。これは、レンジコーディングテーブルが両側でまったく同じである必要があるためです。そうでない場合、解凍エラーが発生します。
検証データセットから 16 個の画像を取得します。skip
の引数を変えることで、さまざまなサブセットを選択できます。
これらを文字列に圧縮し、それぞれの情報コンテンツをビットで追跡します。
画像を文字列から解凍します。
各 16 個の元の数字を圧縮されたバイナリ表現と再構築された数字と共に表示します。
エンコードされた文字列の長さが各数字の情報コンテンツと異なることに注目してください。
これは、レンジコーディングプロセスが離散確率を使用し、少量のオーバーヘッドがあるためです。そのため、特に短い文字列の場合、対応するものは近似でしかありません。ただし、レンジコーディングは漸近的に最適です。限界では、予想されるビット数は、トレーニングモデルのレート項が上限であるクロスエントロピー(予想される情報コンテンツ)に近づきます。
レートとひずみのトレードオフ
上記では、モデルは、各数字を表現するために使用されるビットの平均数と再構築で発生した誤差の間の特定のトレードオフのためにトレーニングされました(lmbda=2000
で指定)。
異なる値でこの実験を繰り返した場合はどうなるでしょうか?
まずは、 を 500 に減らしてみましょう。
コードのビットレートが下がり、数字の信頼性も下がります。ただし、ほとんどの数字は認識可能のままです。
さらに を減らしてみましょう。
数字当たり 1 バイトの順に、文字列がさらに短くなり始めました。ただし、これにはコストが伴い、さらに多くの数字が認識できなくなってしまいました。
これは、このモデルが人間による誤差の認識に左右されず、ピクセル値の観点で絶対偏差を測定していることを示します。画像の品質をさらに高めるには、ピクセル損失を知覚損失に置き換える必要があります。
デコーダーを生成モデルとして使用する
デコーダーにランダムなビットを供給すると、これは、モデルが数字を表すことを学習した分布から効果的にサンプリングされます。
まず、入力文字列が完全にデコードされていないかどうかを検出するサニティチェックを行わずに、コンプレッサー/デコンプレッサーを再インスタンス化します。
次に、十分な長さのランダムな文字列をデコンプレッサに入力して、それらから数字をデコード/サンプリングできるようにします。