1. 概要

このチュートリアルでは、敵対的生成ネットワーク(GAN)を紹介します。

まず、生成モデルという用語とその分類法を紹介します。 次に、GANのアーキテクチャとトレーニングパイプラインについて説明し、詳細な例を示します。 最後に、GANの課題とアプリケーションについて説明します。

2. 生成モデル

機械学習には、主に2つのタイプの学習があります。

独立変数と対応するラベルが与えられ、事前定義された損失関数を最小化するマッピング関数を学習することを目標とする教師あり学習。これらのタスクでは、条件付き確率の学習を目的とした識別モデルをトレーニングします。 。 教師あり学習タスクの例には、分類、回帰などが含まれます。

教師なし学習。独立変数のみが与えられ、データの基礎となるパターンを学習することが目標です。これらのタスクでは、確率を取得することを目的とした生成モデルをトレーニングします。 教師なし学習タスクの例には、クラスタリング、次元削減などが含まれます。

一般に、生成モデルはデータの基礎となる分布を学習しようとします。次に、モデルは特定のサンプルの可能性を予測し、学習したデータ分布を使用していくつかの新しいサンプルを生成できます。

生成モデルには次の2つのタイプがあります。

一方では、データの事前分布を想定した明示的な密度モデルがあります。 ここでは、明示的な密度関数を定義してから、データに対するこの関数の可能性を最大化しようとします。 この関数をパラメトリック形式で定義できる場合は、扱いやすい密度関数について説明します。 ただし、画像のように多くの場合、すべてのデータ分布をキャプチャするパラメトリック関数を設計することは不可能であり、密度関数の近似を使用する必要があります。

一方、暗黙の密度モデルがあります。 これらのモデルは、データを直接生成する確率的手順を定義します。 GANは次のカテゴリに分類されます。

上記では、 IanGoodfellowによって提案された生成モデルの分類法を見ることができます。

3. 敵対的生成ネットワーク

3.1. 建築

2つのネットワークで構成されるGANの基本アーキテクチャから始めましょう。

まず、固定長のランダムベクトルを入力として受け取り、元のデータセットの分布を模倣するサンプルを生成するためのマッピングを学習するジェネレーターがあります。

次に、元のデータセットまたはジェネレーターの出力分布のいずれかから取得したサンプルを入力として受け取るDiscriminatorがあります。 元のデータセットから得られた確率を表す単一のスカラーを出力します

とは両方とも、ニューラルネットワークによって表される微分可能関数です。

3.2. 損失関数

偽造通貨を作成する偽造者のチームと考えることができますが、偽造通貨を検出しようとする警察と比較することもできます。目的は、偽造通貨を騙して使用することです。 両当事者は、ある時点で偽の通貨と本物の通貨を区別できなくなるまで、方法を改善しようとします。

より正式に、次の目的関数を使用して2人用ミニマックスゲームをプレイします。

ここで、は元のデータセットからのもので、はランダムベクトルです。

目的関数が両方のモデルのパラメーターを使用して定義されていることを確認します。 の目的は、偽のサンプルを実際のサンプルとして分類する際に識別器をだますために、用語を最小化することです。

並行して、の目標は、実際のサンプルとジェネレーターからのサンプルの両方に正しいラベルを割り当てる確率に対応する最大化です。

各モデルの目的関数は他のモデルのパラメーターに依存し、各モデルは独自のパラメーターのみを制御するため、これは通常の最適化問題ではないことに注意してください。そのため、ゲームについて話しますが、最適化問題。 最適化問題の解はローカルまたはグローバルの最小値ですが、ここでの解はナッシュ均衡です。

3.3. トレーニング

同時SGDはGANのトレーニングに使用されます。各ステップで、次の2つのバッチをサンプリングします。

  • 元のデータセットからのサンプル
  • 以前のランダム分布からのベクトル

次に、前の図のように、それらをそれぞれのモデルに通します。 最後に、2つの勾配ステップを同時に適用します。1つは目的関数に関してのパラメーターを更新し、もう1つはのパラメーターを更新します。

3.4. DCGAN

画像の最もよく知られているGANアーキテクチャの1つは、次の特性を持つ Deep Convolutional GAN(DCGAN)です。 バッチ正規化はジェネレーターとディスクリミネーターのすべてのレイヤーに適用されます。もちろん、画像分布の実際の平均とスケールを学習するために、それらの出力レイヤーは正規化されていません。

次に、ジェネレータは畳み込みアーキテクチャを使用します。

トレーニング中、SGDの代わりに Adamオプティマイザーが使用され、はジェネレーターでReLUアクティベーションを使用し、ディスクリミネーターでLeakyReLUアクティベーションを使用します。

3.5. 例

次に、GANが数字「7」の画像を生成する方法を学習する方法を説明しましょう。

まず、ジェネレーターはいくつかの単純な事前分布からベクトルをサンプリングし、画像を出力します。 モデルのパラメーターがランダムに初期化されるため、出力画像は数字「7」にさえ近くありません:

トレーニング中、ジェネレーターは、ディスクリミネーターをだますために、元の分布(数字の「7」を表す)にますます近い画像を生成することを学習します。 したがって、ある時点で、数字「7」により類似した画像が出力されます。

結局、ジェネレーターの出力の画像分布と元の分布は非常に近く、数字「7」を描いた合成画像が生成されます。

4. アプリケーション

それでは、GANの最も有用なアプリケーションのいくつかについて話しましょう。

4.1. データ拡張

提供されるデータが限られている場合は、GANを使用してデータ拡張用の合成サンプルを生成できます。

4.2. 画像の修復

画像を再構築して、不要なオブジェクトを削除したり、古い画像の損傷した部分を復元したりする場合が多くあります。 GANは、モデルがロープを取り外したのように、このタスクで優れた結果を達成しました。

4.3. 超解像

この用語は、低解像度の画像から高解像度の画像を生成する手順を指します。 これは、セキュリティの多くのアプリケーションで非常に便利なタスクです。

4.4. 画像から画像への翻訳

ここでは、入力画像を出力画像に変換します。これは、コンピュータグラフィックスと画像処理で一般的なタスクです。 CycleGAN のように、この問題に対処する多くのGANアーキテクチャがあります。

これらのモデルのいくつかのアプリケーションについて説明しました。 GANは多くのタスクを改善できますが、その適用性はまだ十分に検討されていません。 毎年、GANが有用であることが証明できる領域がますます増えています。

5. 課題

GANはすでに多くの分野で成功していますが、教師なし学習のためにGANをトレーニングする際に直面しなければならない課題はまだたくさんあります。

5.1. 非収束

先に述べたように、GANのトレーニングは通常の最適化問題ではなく、ミニマックスゲームです。 したがって、平衡点を学習する必要があるため、ジェネレータとディスクリミネータの両方の目的を最適化する点への収束を達成することは困難です。 理論的には、更新がで行われた場合、同時SGDが収束することがわかっています。 関数空間 。 ニューラルネットワークを使用する場合、この仮説は適用されず、収束は理論的に保証されません。 また、多くの場合、ジェネレータが有用な場所に到達せずにディスクリミネータの進行を元に戻したり、その逆の場合を観察します。

5.2. 評価

すべての学習タスクの重要な側面の1つは、評価です。 ジェネレーターが生成する合成サンプルを検査することにより、GANを非常に簡単に定性的に評価できます。 ただし、モデルを確実に評価するには、定量的な指標が必要です。 不運にも、 生成モデルを定量的に評価する方法は明確ではありません。 時々、良い可能性を得るモデルは非現実的なサンプルを生成し、現実的なサンプルを生成する他のモデルは低い可能性を示します。

5.3. ディスクリート出力

GANをトレーニングするには、ジェネレータのアーキテクチャを区別できる必要があります。 ただし、ジェネレーターに離散データを生成させたい場合、それぞれの関数は微分可能ではありません。この制限に対する多くの提案された解決策がありますが、最適な普遍的な解決策はありません。 この問題に対処することで、NLPなどのドメインにGANを使用できるようになります。

5.4. コードの使用

ジェネレータは、入力としてランダムなベクトルを受け取り、サンプルを生成します。 したがって、ベクトルはサンプルの特徴表現と見なすことができ、他のさまざまなタスクで使用できます。 しかし、高次元の空間から低次元の空間に移動したいので、与えられたサンプルを取得することは非常に困難です。

6. 結論

このチュートリアルでは、GANについて紹介しました。 最初に、提案された分類法を提示する生成モデルの一般的な分野について話しました。 次に、GANの基本的なアーキテクチャとトレーニング手順について説明しました。 最後に、GANのアプリケーションと課題について簡単に説明しました。