GAN:生成器と識別器
ミニマックスゲーム理論、GAN学習の不安定性、モード崩壊、DCGANの実装について学習します。
「GAN:生成器と識別器」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
GANとは何か
敵対的生成ネットワークは、2つのネットワークを競わせます。生成器は偽データを作り、識別器は本物か偽物かを判定します。両者が競い合うことで、生成器は説得力のあるサンプルを生成できるようになります。
敵対的なゲーム
生成器を偽造者、識別器を探偵だと考えてみましょう。偽造者は探偵をだますために偽物を改善し、探偵は見分ける目を鍛えます。この競争によって両者が向上し、最終的には偽物が本物のように見えるようになります。
生成器
生成器はランダムなノイズベクトルを偽の画像に写像します。意味のないランダムな数値を、構造を持つ現実的に見えるデータへ変換することを学習します。
class Generator(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(100, 256), nn.ReLU(),
nn.Linear(256, 784), nn.Tanh()
)
def forward(self, z):
return self.net(z)ノイズベクトル
入力zは標準正規分布からサンプリングされます。異なるノイズベクトルからは異なる画像が生成されるため、ノイズは生成の「種」になります。その次元(ここでは100)が潜在サイズです。
z = torch.randn(batch_size, 100)
fake_images = generator(z)識別器
識別器は画像を受け取り、それが本物である可能性を表す単一の確率を出力します。Sigmoidによって値は[0,1]になり、1は本物、0は偽物を意味します。
class Discriminator(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(784, 256), nn.LeakyReLU(0.2),
nn.Linear(256, 1), nn.Sigmoid()
)識別器の学習
本物の画像に1、偽物の画像に0というラベルを付けたバッチでDを学習します。バイナリクロスエントロピーを使い、本物のスコアを上げ、偽物のスコアを下げることを学習します。
d_real = criterion(D(real), ones)
d_fake = criterion(D(fake.detach()), zeros)
d_loss = d_real + d_fake
d_loss.backward()偽物をdetach()する理由
Dの学習時にはfake.detach()を使い、勾配が生成器へ流れないようにします。このステップで更新するのは識別器だけであり、生成器は別のステップで学習します。
生成器の学習
ここではGを学習してDをだまします。偽物をDに通し、Dが本物(ラベル1)と出力したときに生成器が報われるようにします。生成器は、Dに自分の偽物を本物だと思わせることで改善します。
g_loss = criterion(D(fake), ones) # want D to say "real"
g_loss.backward()
g_optimizer.step()交互学習
各イテレーションでは、まずDを更新し、次にGを更新するという順番で交互に学習します。両者のバランスをおおむね保つことが重要です。Dが強すぎるとGは有用な勾配を受け取れず、弱すぎるとGに十分な課題がなくなります。
# per step
# 1) update Discriminator
# 2) update Generatorモード崩壊
典型的な失敗の1つがモード崩壊です。生成器がDをだませる1つまたは少数の出力を見つけ、それだけを生成してデータの多様性を無視します。症状として、生成されたサンプルがすべてほぼ同じ見た目になります。
学習の不安定性
GANは不安定なことでよく知られています。損失が振動し、一方のネットワークが他方を圧倒し、収束も不確かです。LeakyReLU、慎重な学習率の設定、ラベルスムージングなどの工夫が学習の安定化に役立ちます。
理解度チェック
GANについての理解度を確認しましょう。
まとめ:GAN
敵対的な構成について学びました。生成器はノイズベクトルを偽物に変換し、識別器は本物か偽物かの確率を出力します。両者はD、次にGという順番で交互に学習します。また、モード崩壊と、GANを学習しにくくする一般的な不安定性についても学びました。
よくある質問
「GAN:生成器と識別器」レッスンは無料ですか?
はい。「GAN:生成器と識別器」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「GAN:生成器と識別器」で何を学びますか?
ミニマックスゲーム理論、GAN学習の不安定性、モード崩壊、DCGANの実装について学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「GAN:生成器と識別器」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。