見出し画像

無から絵を生み出す、敵対的生成ネットワーク(GAN)のおはなし

 こんにちは、こんばんはteftefです。今回も Midjourney や Stable Diffusion に使われる AI についてのお話です。どちらかというと mimic に使われていることのほうが多いかな…。mimic というアプリはとても不思議ですよね、自分が描いた絵を 16 枚入力するとその雰囲気や感覚を学習してあたかも本人が描いた絵をどんどん生成してくれる。まるで魔法のようなアプリです。今回はその mimic やお絵描きAI に使われている『敵対的生成ネットワーク』(GAN) について初学者向けに分かりやすく簡単に説明してみたいと思います。私もまだつい最近まで初学者であり、説明が間違っていたり勘違いがある可能性が0ではないということをご了承ください。ぜひコメントなどをいただけたら幸いです。
それでは行きます。

まずは簡単に

GAN の概要

GAN は簡単に言うと無から精製することを得意とする AI です。例えば実際に存在しない人の画像を生成するStyle_GAN、紅葉を緑葉にしたり、オレンジを林檎、馬をシマウマ、(それぞれ逆も可能)を可能にしたCycle_GANなどの派生形もあります。

Style_GANで生成された実在しない人物の顔画像
https://arxiv.org/pdf/1812.04948.pdf  から借用
Cycle_GANで馬をシマウマに変換してみた

GANって何ができるの?

 学会や発表の場でよく言われる言葉があります。
  「じゃあ、それって何に役に立つの?」
はい、来ました、このちくちく言葉(笑)。これ言われるとドキっとするんですよ… 答え方を間違えると割とよくない顔をされたりもします…
 主が思うに GAN はただ画像を生成できる、シマウマを馬にできることがゴールではありません。例えば医療の現場では脳の MRI 画像を使って統合失調やアルツハイマーを診断する AI が作られています。眼球の MRI は緑内障診断とかに使われていますね。こういう AI を訓練するときに画像が足りないのです。(そもそも病気でない方は高い金を払って MRI は撮りに行かないので。)こうしたときに GAN で実際には存在しないが高精度な画像を生成して、データを補填することができます。
 他にもお絵描き AI のような娯楽にも使われたりします。これはNVIDIA CanvasというNVIDIAが出しているアプリですが、左の部分はお絵描き経験の無い主が書きました。それをうまく右のように"ほぼリアルタイムで"出力できています。これらは一例ですが、考え方によってはもっと賢く応用される可能性を秘めていると思います。

Nvidia Canvas

少し難しい学術的な話

GAN の中身をのぞいてみたい

 GAN は2014 年に画像生成アルゴリズムとして誕生しました。意外と最近ですね。この技術はとても受けが良かったらしく、この発表を機に数多くの GAN に関する論文が発表されています。ちなみに今では画像生成以外でも音声、自然言語でも使われるように派生しています。
 ではなぜ受けが良かったのか、そのアイデアを見てみましょう。GAN の構造を見てみます。

GANのモデル
猫の画像は友人から借用

 簡単に説明します。例えば、今、猫の画像を生成したいとします。まず入力としてノイズ Z生成器(Generator)に入れます。するといい感じの(最初は意味の分からない画像が出てくるが、学習するうちに猫っぽいものが出てくる)画像が出てきます。それを識別器(Discriminator)を使って本物の画像と比較します。生成器はなるべく本物に近いような画像が出てくるように訓練し、識別器は入力された2つの画像を正しく真偽を判断できるように訓練します。要は鼬ごっこなんですね。生成器はパチモン絵師で、識別器は鑑定人でありお互いが競い合って自らの技術を伸ばしていくような感じです。

損失関数

 さてそれでは少し数学的な話になります。機械学習では損失関数と呼ばれる指標があります。簡単に言うと『飴と鞭の関数』です。間違ったほうに学習が進むと損失関数の値は大きくなり(鞭を与える)、臨んだ方向に学習が進むと損失関数の値が小さくなります(飴を与える)。このようにしてなるべく損失関数を小さくする(飴)ように訓練します。今回の GAN にも損失関数が使われていて、このようにあらわされています。本当は GAN の種類によってかなり違うのですが今回は一番シンプルな例を用いました。

GANの損失関数

 詳しく式を見ていきます。その前に log という関数(今回の底は e )を思い出してください。入力値が正で 0 に近いほど値が小さく出力されます

log関数

生成器の損失関数

 まず1つ目は生成器の損失関数です。ちなみに識別器 G は 0~1 の値を出力し、本物と判定すると1に近い値が出力され、偽物と判定すると 0 に近い値が出てきます。損失関数はなるべく小さいほうがいいということを忘れないでください。(もう一度図を載せます)

生成器の損失関数

 この式を言葉で説明すると
「生成器が出力した画像を識別器に見せた時に、本物と判断(1を出力)してほしい」
 この式をなるべく小さくするためには log の中身は 0 に近づけたい、そのため log の中身に 1- がついています。E_z はすべての画像に対して判定を行ったときの平均と思っていただければ大丈夫です。

生成器の損失関数

続いて第 2 式です。これも第1式と似ていますが説明していきます。

識別器の

 式を言葉で説明します。
「本物の画像を識別器に入れると本物と判断(1を出力)され、偽物の画像G(z)を識別器に入れると偽物と判断(0を出力)してほしい」
ということになります。
 あれ?なるべく値を小さくしたいなら逆じゃないか?と思いますが、よく考えると、それぞれの項を最小資することが目的ではなく式全体を最小にしたいため、この式を0に近づけるためにはこの形が最も理想的なのです。

目的関数

 これら2つを合わせてこのようにすることでGAN全体の学習目標となります。

目的関数

 識別器 D はうまく正誤を見分けられるように学習し、生成器 G は識別器をだますような画像を作れるように学習させます。
 あとはこの通りにコードをかいて実装するだけ!!(めちゃくちゃムズイ)

最後に

というわけで、GANの概要を長々と書いてきました。高校生2年生ほどの知識があればわかるように書きました。途中で結構すっ飛ばしたこともありますが、まずはGANが謡的に何をやっているのかの概要をつかむことが大切だと思うので、流れを見てきたという感じです。

次回予告と宣伝

 今回はここまでです。次回は今回紹介したGANの中でもStyle_GANに焦点を当ててみたいと思います。最後まで読んでいただきありがとうございました。最後に少し宣伝です。主のteftefが運営を行っているdiscordサーバーを載せます。このサーバーではMidjourneyやStble Diffusionのプロンプトを共有したり、研究したりしています。ぜひ参加してお絵描きAIを探ってみてはいかがでしょう。(teftef)

この記事が気に入ったらサポートをしてみませんか?