GANの簡単な紹介

数学とコードの説明付き

GAN(Generative Adversarial Networks)は、ニューラルネットワークがデータを生成できるようにする一種のニューラルネットワークアーキテクチャです。過去数年で、彼らはディープラーニングで最もホットなサブフィールドの1つになり、数字のあいまいな画像の生成から顔の写実的な画像に移行しました。

前:あいまいな数字、後:写実的な顔

GANのバリエーションは、シマウマの画像を馬に、または馬から馬に変換するなど、非常識なことをしています。

GANが魅力的であることがわかりました。GANをよりよく理解するために、この記事を書いて、その背後にある数学とコードを説明する過程で、自分でGANをよりよく理解できると思いました。

GANリソース用に作成したgithubリポジトリへのリンクは次のとおりです。

では、GANはどのように機能しますか?

GANは、2つのニューラルネットワークを相互に対応させることにより、データセットの確率分布を学習します。

以下は、確率分布と、それらに精通していない人のためのその他の概念を説明する素晴らしい記事です。

1つのモデルであるジェネレーターは、絵画の偽造者に似ています。データセットに非常によく似た画像を作成しようとします。もう1つのモデルである差別者は警察のように振る舞い、生成された画像が偽物かどうかを検出しようとします。

基本的に何が起こるかというと、偽造者は偽物を作るのが上手くなり、警察は偽物を見つけるのが上手くなります。事実上、これらの2つのモデルは、何度も繰り返した後、ジェネレーターが実際のデータセットと見分けがつかないイメージを作成するまで、お互いに打ち負かそうとし続けます。

生成的敵対ネットワークのトレーニングには、2つの目的が含まれます。

  1. 弁別器は、トレーニング例とジェネレーターによって生成された画像の両方に正しいラベルを割り当てる確率を最大化します。つまり、警官は偽物と実際の絵を区別するのが上手になります。
  2. ジェネレータは、識別器が生成するものが偽物であると予測できる確率を最小化します。つまり、ジェネレーターは偽物を作成するのに優れています

これら2つのアイデアをプログラムにエンコードしてみましょう。

このチュートリアルでは、このコードに従います

データ

GANには使用するデータセットが必要なので、このチュートリアルでは、機械学習の古典的なハローワールドである手書き数字のデータセットであるMNISTを使用します。

ジェネレーターは、画像を生成するためにランダムな入力ベクトルも必要とします。このために、numpyを使用します

GAN関数

GANはミニマックスゲームをプレイし、ネットワーク全体が関数V(D、G)を最適化しようとします。これは、GANの動作を定義する方程式です。

今、その背後にある数学に精通していない人にとっては、恐ろしいように見えますが、それが表すアイデアはシンプルでありながら強力です。これは、上記で定義した2つの目的の数学的表現にすぎません。

ジェネレーターはG(z)で定義され、入力したノイズzを画像などのデータに変換します。

弁別器はD(x)によって定義され、入力xが実際のデータセットから来たかどうかの確率を出力します。

差別者は警察のように振る舞います

識別器によるデータセットの予測は可能な限り1に近く、ジェネレーターの予測は可能な限り0に近くする必要があります。これを達成するために、目的関数でD(x)と1-D(z)の対数尤度を使用します。

ログは、不正な値に近づくほどペナルティーが大きくなることを確認するだけです。

これが何をするのかわからない場合のログ損失の説明は次のとおりです。

ジェネレーターのコーディング

ジェネレーターは、ランダムな入力ベクトルを取得し、784次元のベクトルを出力する単なるバニラニューラルネットワークモデルです。

弁別器のコーディング

弁別器は、以前のネットワークの出力である784次元ベクトルを取得し、トレーニングデータセットから取得した0〜1の確率を出力する別のニューラルネットワークです。

GANにコンパイルする

ここで、両方のモデルを1つの敵対的ネットワークにコンパイルし、入力を100次元ベクトルとして設定し、出力を弁別器の出力として設定します。

GANのトレーニング

  1. まず、データをロードし、データをいくつかのバッチに分割してモデルにフィードします
  2. ここで、上記で定義した方法に基づいてGANネットワークを初期化します。
  3. これは、指定されたエポック数で実行されるトレーニングループです。
  4. ランダムノイズを生成し、データセットから画像を取り出します
  5. ジェネレータを使用していくつかの画像を生成し、いくつかの偽の画像といくつかの実際の画像を持つベクトルXを作成します
  6. Xに対応する「正解」を持つベクトルYを作成します。偽の画像には0のラベルが付けられ、実画像には0.9のラベルが付けられます。 GANトレーニングの改善に役立つため、1ではなく0.9とラベル付けされています。これは、片側ラベルスムージングと呼ばれる方法です。
  7. 識別器と生成器の間でトレーニングを交互に行う必要があるため、ここで識別器を更新します
  8. 最後に、弁別器を更新します。

最初のGAN

上記のコードを実行すると、最初から数字を生成する最初のGANが効果的に作成されました!

トレーニングしたGANから生成された画像!

願わくは、この記事がGenerative Adversarial Networksの紹介と作成方法を提供したことを願っています。近い将来、機械学習についてさらに詳しく書いていきますので、最新情報をお届けします!

読んでくれてありがとう、

サルバスフ

チャットしたいです? TwitterとLinkedinで私を見つけてください

ここに私が書いた他の投稿があります