【GAN入門】偽物を見抜く「AIの目」!DiscriminatorとGeneratorの実装を直感で理解しよう

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

新人エンジニアのみなさん、最近「GAN(敵対的生成ネットワーク)」という技術に触れる機会はありますか?

AIにイラストを描かせたり、実在しない人の写真を作ったりする技術として有名ですが、いざ自分でコードを書いてみようとすると、独特の概念が多くて戸惑ってしまいますよね。

特に初心者が最も混乱するのが、「どっちがどっちの損失(Loss)を計算しているのかわからなくなる」という問題です。

  • 「あれ? さっきは『偽物だから0』って言ってたのに、なんでこっちのコードでは『1』を入れてるの?」

こんなふうに、「0」と「1」の使い分けで迷子になってしまったことはありませんか?

実はこれ、GANの仕組みを「警察」と「偽札犯」の物語として理解すると、驚くほどスッキリ解決するんです。

今回は、GANを構成する2つの主役、「Discriminator(識別器)」と「Generator(生成器)」の実装の勘所について、数式をほとんど使わずに解説します。

これを読めば、複雑に見えるGANのソースコードが、実はシンプルな「知恵比べ」の記録であることがわかるようになりますよ!

1. そもそもGANとは?:終わらない「いたちごっこ」

まず、GANの基本構造をサクッと整理しましょう。

GANは、以下の2つのAIが戦うゲームのようなものです。

  • Discriminator(識別器)=「警察」
    • 役割:渡されたデータが「本物」か「偽物」かを見抜くこと。
    • 性格:とにかく厳格。少しでも怪しいと「偽物!」と判定したい。
  • Generator(生成器)=「偽札犯」
    • 役割:本物そっくりの偽データを作って、警察を騙すこと。
    • 性格:嘘つき。警察に「本物だ」と言わせたい。

この2人の目的は正反対です。だからこそ、コードを書くときも「今、どっちの視点に立っているか」で、使う数字(正解ラベル)が真逆になるのです。

では、順を追ってそれぞれの視点を見ていきましょう。

2. Discriminator(警察)の視点:真実を見抜くルール

まずは、警察であるDiscriminatorの学習からです。

彼の仕事は、事実をありのままに判定することです。

警察のスコアリングルール

警察は、以下の2つが正解できれば「優秀」と評価されます。

  1. 本物のデータを見たら、自信を持って「これは本物(1)です!」と答える。
  2. Generatorが作った偽データを見たら、迷わず「これは偽物(0)です!」と答える。

コードで見る「偽物判定」

では、「Generatorが作った偽画像を、Discriminatorに見せた時の学習」をコードでどう書くか考えてみましょう。

警察に対して、「偽物を見たら『本物』と言いなさい」と教えるのは間違いですよね? それでは警察としての機能が失われてしまいます。

正しくは、こう教えます。

「これは偽画像(Fake)だ。だから、君が出すべき正解ラベルは『0(False)』だ!」

これをTensorFlowなどのコードに落とし込むと、以下のようになります。

# 偽物(fake_data)に対する警察の予測結果
fake_pred = discriminator(fake_data)

# 警察への指導:
# 「君の予測(fake_pred)と、正解ラベル(全部0)を比較して、間違いの大きさを計算しなさい」
loss = binary_crossentropy(tf.zeros_like(fake_pred), fake_pred)

ここで重要なのは、tf.zeros_like(すべて0) を正解として渡している点です。

Discriminatorの学習において、偽物はあくまで「偽物(0)」として扱う。これが絶対のルールです。

3. Generator(偽札犯)の視点:ルールを逆手に取るトリック

さて、ここからがGANの面白いところであり、最大の混乱ポイントです。

ライバルであるGenerator(偽札犯)の視点に切り替えましょう。

偽札犯の野望

Generatorのゴールはたった一つ。「警察(Discriminator)を騙すこと」です。

Discriminatorは、渡された画像に対して点数をつけます。

  • 0点 :「これは偽物だ!」
  • 1点 :「これは本物だ!」

Generatorとしては、自分が作った自信作(本当は偽物)を警察に見せたとき、「おっ、これは本物(1点)だね!」と言わせたいわけです。

真実がどうであれ、Generatorにとっては「1(本物)」という判定をもぎ取ることこそが勝利なのです。

コードでの表現:あえて「嘘」を教える

では、この野望をコードに落とし込んでみましょう。

Generatorの学習における「正解ラベル」には何を設定すべきでしょうか?

先ほどDiscriminatorでは「偽物だから0」としました。しかし、Generatorでは逆のことをします。

「この画像は偽物だけど、目指すゴールは『本物(1)』と言われることだ!」

つまり、Generatorの損失関数を計算するときは、あえて正解ラベルを「1(すべて本物)」に設定するのです。

# 偽物(fake_data)に対する警察の予測結果
fake_pred = discriminator(fake_data)

# 偽札犯の野望:
# 「警察に『1』と言わせたら勝ち!」
loss = binary_crossentropy(tf.ones_like(fake_pred), fake_pred)

ここで tf.ones_like(すべて1) が登場しました!

これが、初心者が「えっ、偽物なのになんで1なの?」と混乱する原因です。

これは「画像が本物だから1」なのではありません。

「Discriminator(警察)のルールは『本物は1』だ。だから、僕(Generator)はその『1』判定を勝ち取りに行くんだ!」

という、攻略の意思を表しているのです。

4. まとめ:立場の違いを整理しよう

いかがでしたか?

コードの中で zeros_like(0)と ones_like(1)が入れ替わる理由は、それぞれの「勝利条件」が違うからだったんですね。

最後に、2つの視点を対比して整理しましょう。

立場キャラクター目的偽物データに対する正解ラベルコード上の表現
Discriminator警察真実(偽物は偽物)を見抜きたい0tf.zeros_like
Generator偽札犯嘘(偽物を本物)と信じ込ませたい1tf.ones_like

GANのソースコードを読むときは、「今、この行は誰を育てているのか?」を常に意識してみてください。

そうすれば、なぜそこで「0」が使われているのか、あるいは「1」が使われているのか、その意図が手に取るようにわかるはずです。

今後の学習指針

この「0と1の対立構造」が理解できたら、次は以下のステップに進んでみてください。

  1. DCGANの全体コードを読むGitHubなどで公開されている「DCGAN」のコードを見て、zeros_like と ones_like がどこで使い分けられているか探してみてください。「ここが警察のターン、ここが犯人のターンだな」と読めるようになっているはずです。
  2. Generator学習時の注意点を知るGeneratorを学習させるときは、Discriminatorの重みを固定(freeze)する必要があります。なぜなら、犯人が練習している間に警察までレベルアップしては困るからです。コード内の trainable = False という記述にも注目してみましょう。

「騙すAI」と「見抜くAI」。

この2人の終わらない知恵比べをプログラミングするのは、まるで映画監督になったような気分になれますよ。

ぜひ、実際にコードを動かして、その面白さを体感してみてください!

それでは、また次の記事でお会いしましょう。

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

投稿者プロフィール

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

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