AI画像生成の原点!DCGANの仕組みとは?新人エンジニアに徹底解説

こんにちは。ゆうせいです。

最近、SNSやニュースで、AIが描いたとてつもなく綺麗なイラストや、本物そっくりの写真を見たことはありませんか。あれ、すごいですよね。どうやってコンピュータがあんな創造的なことができるのか、不思議に思ったことはないでしょうか。

今日は、そんなAI画像生成技術の基礎とも言える、DCGANという技術についてお話しします。

新人エンジニアのあなたなら、きっとこれから業務や学習で耳にすることになるはずです。難しそうに聞こえるかもしれませんが、安心してください。高校生でもわかるように、噛み砕いて説明していきますね。さあ、一緒に画像生成の扉を開いてみましょう。

画像生成AIの基本、GANとは

DCGANの話をする前に、まずは親玉であるGANについて理解しておく必要があります。

GANは、Generative Adversarial Networksの略で、日本語では敵対的生成ネットワークと呼ばれます。名前がいかついですが、仕組みはシンプルです。よく例えられるのが、偽札作りと警察のいたちごっこです。

ここには二人のプレイヤーが登場します。

  • 生成器(ジェネレータ):警察を騙せるような精巧な偽札を作ろうとする犯人
  • 識別器(ディスクリミネータ):渡されたお札が本物か偽札かを見破ろうとする警察官

最初は、犯人も下手くそなので、適当な落書きのような偽札を作ります。警察官もすぐに「これは偽物だ」と見抜きますよね。すると犯人は「次はもっとうまく描こう」と学習します。一方で警察官も、犯人の技術が上がってくると「もっと細かい透かしを見なければ」と鑑定能力を磨いていきます。

こうして、お互いがライバルとして競い合うことで、最終的に犯人は本物と区別がつかないほどの偽札(画像)を作れるようになる。これがGANの基本的な考え方です。

DCGANは何がすごいの

では、今回の主役であるDCGANとは何でしょうか。

DCGANは、Deep Convolutional GANの略称です。直訳すると、深層畳み込み敵対的生成ネットワークとなります。

従来のGANは、実は学習がとても不安定でした。犯人と警察のバランスを取るのが難しく、学習中に画像が砂嵐のようになってしまうことが頻繁にあったのです。そこで登場したのがDCGANです。

DCGANは、画像認識の分野で大成功していたCNN(畳み込みニューラルネットワーク)という技術を、GANの構造にうまく組み込みました。

例えるなら、それまでのGANが「ピクセルの数値」という数字の羅列だけで画像を判断していたのに対し、DCGANは「これは耳、これは目」といった、画像の特徴や形状を捉えるメガネを手に入れたようなものです。これにより、画像生成の品質と学習の安定性が劇的に向上しました。

重要な技術ポイント

エンジニアとして知っておくべき、DCGANを支える技術的な工夫がいくつかあります。専門用語が出てきますが、一つずつ見ていきましょう。

畳み込み層(Convolution)

これは、画像から特徴を抜き出すフィルターのような役割を果たします。DCGANでは、プーリング層という情報を間引く処理を使わず、代わりにこの畳み込み層のストライド(移動幅)を工夫して画像のサイズを変えています。これにより、位置情報を失わずに学習できるようになりました。

バッチ正規化(Batch Normalization)

これは学習を安定させるための命綱です。データの偏りを整えて、ニューラルネットワークが学習しやすい状態を常に保つ技術です。これがないと、生成器が特定のパターンの画像しか作らなくなるモード崩壊という現象が起きやすくなります。

活性化関数(Activation Function)

ニューロンの発火を決めるルールです。DCGANでは、LeakyReLUやReLUという関数を場所によって使い分けることで、情報の通り道を確保し、学習が停滞するのを防いでいます。

DCGANの仕組みを数式イメージで掴む

ここで少しだけ、エンジニアらしく数式のイメージを持っておきましょう。完全に理解しなくても大丈夫です。「ふーん、足し算引き算の関係なんだな」くらいに思ってください。

GANの目的は、生成器と識別器のいたちごっこでしたね。これを数式の形にすると、次のような関係になります。

全体の目的関数 = 本物の画像を本物と見抜く確率 + 生成された画像を偽物と見抜く確率

識別器は、この値を最大にしようと頑張ります。つまり、正解率を上げようとするわけですね。

一方で生成器は、この値を最小にしようと頑張ります。つまり、識別器の正解率を下げて、騙そうとするのです。

これを数式っぽく表現すると、以下のようになります。

目的関数 V(D, G) = 期待値 E[\log D(x)] + 期待値 E[\log(1 - D(G(z)))]

ここで、 D(x) は本物を入力したときの識別器の出力、 G(z) はノイズから生成された画像です。

エンジニアのあなたは、この「最大化と最小化のせめぎ合い」をプログラムで実装することになります。

DCGANのメリットとデメリット

どんな技術にも良い面と悪い面があります。ここを理解しておくと、技術選定の際に役立ちますよ。

メリット

学習が比較的安定しています。

従来のGANに比べて、設定すべきパラメータなどのガイドラインが論文ではっきり示されたため、初心者でもきれいな画像を生成しやすいです。

特徴抽出能力が高いです。

生成された画像だけでなく、識別器が学習した「画像の特徴」を、他のタスク(例えば画像の分類など)に転用することができます。

デメリット

モード崩壊のリスクは依然としてあります。

バッチ正規化などで対策はしていますが、それでも生成器が似たような画像ばかり作り出してしまう現象に悩まされることがあります。

高解像度の画像は苦手です。

人間の顔などの小さな画像(64x64ピクセルなど)は得意ですが、4Kのような高画質な画像を生成しようとすると、破綻したりぼやけたりしやすいです。

実装のイメージ

言葉だけだとわかりにくいので、PythonとPyTorchを使った場合の、生成器のクラス定義の雰囲気だけ見てみましょう。コードを覚える必要はありません。「こんな風に層を重ねていくんだな」と眺めてください。

import torch.nn as nn

class Generator(nn.Module):
    def __init__(self):
        super(Generator, self).__init__()
        self.main = nn.Sequential(
            # 入力はランダムなノイズ
            # 転置畳み込み層で少しずつ画像を大きくしていく
            nn.ConvTranspose2d(100, 512, 4, 1, 0, bias=False),
            nn.BatchNorm2d(512),
            nn.ReLU(True),
            # 層を重ねるごとに特徴が具体的になっていく
            nn.ConvTranspose2d(512, 256, 4, 2, 1, bias=False),
            nn.BatchNorm2d(256),
            nn.ReLU(True),
            # ... (中略) ...
            # 最終的に画像として出力
            nn.ConvTranspose2d(64, 3, 4, 2, 1, bias=False),
            nn.Tanh()
        )

    def forward(self, input):
        return self.main(input)

このように、ブロックを積み木のように重ねていくだけで、最先端のAIモデルが作れてしまうんです。面白いと思いませんか。

今後の学習の指針

DCGANは、現在の画像生成AIブームの火付け役となった偉大な技術です。最新のStable Diffusionなども、根底にある考え方はここから発展しています。

これから学習を進めるなら、以下のステップをおすすめします。

  1. Pythonの基礎と、PyTorchやTensorFlowなどのフレームワークに触れてみる。
  2. Google Colabなどの無料環境を使って、実際にDCGANのサンプルコードを動かしてみる。
  3. 生成された画像を見て、「なぜ失敗したのか」「どうすれば綺麗になるか」をパラメータを変えながら実験する。

まずは動くものを作って、AIが描いた画像が出てくる感動を味わってください。それが、エンジニアとしての大きな一歩になるはずです。

もし途中でわからなくなったら、いつでも聞いてくださいね。一緒に学んでいきましょう。

それでは、また。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。