GANとは?敵対的生成ネットワークの仕組みと応用事例

「偽札職人と警察官のいたちごっこ」——GANはこの競争の仕組みでリアルな画像を生み出します。生成AIブームの原点となった技術の仕組みと、現在の位置づけを解説します。

GANとは?敵対的生成ネットワークの仕組みと応用事例

AI初心者

AIを知りたい

AIが画像を「生成」できるようになったきっかけの一つが「GAN」だと聞いたのですが、どんな技術ですか?

AIエンジニア

AIエンジニア

GAN(Generative Adversarial Network)は2つのニューラルネットワークを競わせて学習させる画期的な手法です。2014年にIan Goodfellowが提案しました。「敵対的」という名前の通り、生成するネットワークと見破るネットワークが互いに切磋琢磨することで、本物そっくりのデータを生成できるようになります。

AI初心者

AIを知りたい

2つのネットワークが競うというのはどういうことですか?

AIエンジニア

AIエンジニア

Generator(生成器)はノイズから偽のデータを生成し、Discriminator(識別器)はそのデータが本物か偽物かを判定します。Generatorは「Discriminatorを騙せるような精巧な偽物」を作ろうとし、Discriminatorは「見破る精度」を上げようとします。このいたちごっこで両方が進化します。

GAN(敵対的生成ネットワーク)とは、Generator(生成器)とDiscriminator(識別器)の2つのネットワークを敵対的に学習させることで、本物のようなデータを生成する深層学習モデルです。

2014年にIan Goodfellowによって提案され、「機械学習の過去10年で最も面白いアイデア」とYann LeCunに評されました。画像生成、スタイル変換、超解像など幅広い応用があります。

GANの学習プロセス

AI初心者

AIを知りたい

具体的にどうやって学習が進むのですか?

AIエンジニア

AIエンジニア

学習は交互に行います。まずDiscriminatorを学習:本物データに「本物」、生成データに「偽物」というラベルで識別精度を上げます。次にGeneratorを学習:Discriminatorを騙せるようなデータを生成するよう更新します。この2ステップを何万回も繰り返します。

AI初心者

AIを知りたい

うまく学習するのは難しそうですね。

AIエンジニア

AIエンジニア

はい、GANの学習は非常に不安定なことで有名です。主な問題はモード崩壊(同じような画像ばかり生成する)と学習の不均衡(片方が強くなりすぎる)です。これらを解決するために様々な改良版GANが提案されてきました。

代表的なGANの種類

AI初心者

AIを知りたい

GANにはどんな種類がありますか?

AIエンジニア

AIエンジニア

たくさんの変種があります。DCGANは畳み込みを使った安定した画像生成。Pix2Pixは画像から画像への変換(例:白黒→カラー)。CycleGANはペアデータなしでスタイル変換(馬→シマウマ等)。StyleGANは超高品質な顔画像生成で話題になりました。

AI初心者

AIを知りたい

StyleGANの生成した顔画像って本物と見分けがつかないんですか?

AIエンジニア

AIエンジニア

はい、人間では見分けがほぼ不可能なレベルです。NVIDIAが開発したStyleGAN2/3は1024×1024の高解像度の顔画像を生成でき、thispersondoesnotexist.comというサイトで有名になりました。一方でディープフェイク問題としても注目され、悪用防止が重要な課題です。

GAN変種 年 特徴 用途
DCGAN 2015 畳み込みベース 安定した画像生成
Pix2Pix 2016 条件付き画像変換 白黒→カラー等
CycleGAN 2017 ペアデータ不要 スタイル変換
StyleGAN 2018 スタイル制御 高品質顔生成
BigGAN 2018 大規模学習 多様な画像生成

GANと拡散モデルの関係

AI初心者

AIを知りたい

最近は拡散モデル(Diffusion Model)の方が主流だと聞いたのですが。

AIエンジニア

AIエンジニア

確かに画像生成の主流は拡散モデルに移りつつあります。Stable DiffusionやDALL-E 3は拡散モデルベースです。拡散モデルはGANより学習が安定し、多様性も高い画像を生成できます。ただしGANは生成速度が速いという利点があり、リアルタイム処理には依然として有利です。

AI初心者

AIを知りたい

GANを学ぶ意味はまだありますか?

AIエンジニア

AIエンジニア

はい。GANは生成モデルの基礎概念を理解する上で非常に重要です。Discriminatorによるフィードバック学習のアイデアは、RLHFなど強化学習を使ったAIの品質向上にも通じています。また超解像やスタイル変換など特定分野ではGANが今でも最適解の場合があります。

まとめ

GANはGeneratorとDiscriminatorの敵対的学習による画期的な生成モデルです。画像生成、スタイル変換、超解像など幅広い応用があり、StyleGANでは人間と見分けがつかないレベルの画像生成を実現しました。現在は拡散モデルが台頭していますが、GANの考え方は生成AI全般を理解する上での基礎知識として重要です。

関連記事

KerasでGANの基本構造を実装してみよう

ランダムなノイズから画像を生成するGenerator(生成器)と、本物か偽物かを見分けるDiscriminator(識別器)を組み合わせたGANの最小構成です。

import numpy as np
from tensorflow.keras import layers, models, optimizers

LATENT_DIM = 100   # ノイズの次元数
IMG_SHAPE = (28, 28, 1)

# --- 生成器:ノイズ → 画像 ---
def build_generator():
    model = models.Sequential([
        layers.Dense(256, input_dim=LATENT_DIM),
        layers.LeakyReLU(0.2),
        layers.BatchNormalization(),
        layers.Dense(512),
        layers.LeakyReLU(0.2),
        layers.BatchNormalization(),
        layers.Dense(np.prod(IMG_SHAPE), activation="tanh"),
        layers.Reshape(IMG_SHAPE),
    ])
    return model

# --- 識別器:画像 → 本物/偽物 ---
def build_discriminator():
    model = models.Sequential([
        layers.Flatten(input_shape=IMG_SHAPE),
        layers.Dense(512),
        layers.LeakyReLU(0.2),
        layers.Dense(256),
        layers.LeakyReLU(0.2),
        layers.Dense(1, activation="sigmoid"),
    ])
    model.compile(loss="binary_crossentropy",
                  optimizer=optimizers.Adam(0.0002, 0.5),
                  metrics=["accuracy"])
    return model

# --- GAN全体の組み立て ---
discriminator = build_discriminator()
generator = build_generator()

# GAN学習時は識別器の重みを固定
discriminator.trainable = False
gan_input = layers.Input(shape=(LATENT_DIM,))
fake_img = generator(gan_input)
validity = discriminator(fake_img)
gan = models.Model(gan_input, validity)
gan.compile(loss="binary_crossentropy",
            optimizer=optimizers.Adam(0.0002, 0.5))

print("Generator output shape:", generator.output_shape)
print("Discriminator output shape:", discriminator.output_shape)
# Generator output shape: (None, 28, 28, 1)
# Discriminator output shape: (None, 1)

GANの学習は「生成器が識別器を騙そうとし、識別器が見破ろうとする」という敵対的なゲームです。両者のバランスが崩れるとモード崩壊(同じ画像ばかり生成)が起きるため、LeakyReLUやBatchNormalizationなどの安定化テクニックが重要になります。