AI絵画のすすめ 

(アウトプットのために,ブログ?を人生で一回は書いてみたいなと思っていたところ,SFC Advent Calendarというのがちょうどあったので,書いてみます.)

 

普段,僕はスマートシティと機会学習(特に画像処理)を絡めた研究をしています.そこの背景から話していると長くなるので,そこは飛ばしますが,今日はそれ関係のことを話します.

 

つい先日,AIが書いた絵が4900万円で売れた!みたいな記事があったの覚えていますか?

www.afpbb.com

どうやって絵が描かれるのか(生成されるのか),なんとなく仕組みはわかるけどちゃんと論文読んで実装して,なんかの拍子にその絵が評価されて1億円とかゲットできないかなと思ったので,今日はそれをちょこっと読んで,CANのアイデアを紹介します.

割と多くの人が興味を示してくれるんじゃないかと願っています.

論文のタイトルは,CAN: Creative Adversarial Networks Generating “Art” by Learning About Styles and Deviating from Style Normsです.

(リンク: https://arxiv.org/pdf/1706.07068.pdf

これはInternational Conference on Computational Creativity (ICCC)の2017に採択されている論文です.

この論文はタイトルの通り,Generate Creative Art する手法を提案している論文です.(上の記事が,この手法で描かれた絵かどうかは知りません.)

 

まず結果,どんな感じの絵が生成されるのか.

 

f:id:tanimutomo:20181217232439p:plain

CANで生成された画像(論文内のFigure)

 

Artのセンスはないので,この絵がすごいのかどうかはまったくわかりませんが,素人目には”っぽく”見えます.

 

では,どうやって生成しているのか?

説明度の抽象度(適当さになってしまった)を元に,3つの段階の説明を用意しました.

 

間違いを一切恐れない,超大雑把な説明から始めます.

超大雑把な説明

まずは,前提として,下に書いてある種類の絵画を使用してモデル(AI的なやつ)の学習を行います.

f:id:tanimutomo:20181217233703p:plain

そして,今回のモデルには2人の登場人物がいます.一人目は絵画を生成する(描く)画家AI.もう一人は,本物絵画と生成された絵画をみて,どっちが本物っぽいかを判断する評論家AIです.(下はイメージ図)

 

f:id:tanimutomo:20181218220652p:plain


学習の手続きは簡単です.以下のことを繰り返します.

  1. 画家AIが絵を書く
  2. 評論家AIは,画家AIが書いた絵と本物の絵画をみて,それぞれが本物かどうかを判断する
  3. 評論家AIの判断結果が,正しかったか間違っていたかが,評論家AIと画家AIに告げられる
  4. 3で言われた結果から,評論家AIはちゃんと判断できるよう学習し,画家AIは評論家AIを騙す(つまり自分のを本物と間違えてくれる)ように学習する

当然ながら,最初の方の画家は,本物っぽい絵なんて描けるわけがありません.そのため,画家AIは適当な絵を書くことから始めます.一方の評論家AIも元から見分ける能力はないので,最初は適当に判断します.

しかし,ある程度上記の手続きを繰り返すと,評論家AIは違いがわかってきます(絵をみて判別するよりも絵を描く方が大変なので,評論家AIが先に成長する).一方の画家AIも評論家AIを騙せるようになるまで一生懸命学習します.

そしてある程度学習が進むと,画家AIはその評論家AIを騙せるくらい本物っぽい絵が描けるようになります.

これが超絶大雑把なAIによる絵画生成の説明です.

(面倒な説明を何もかも省いた結果,結局GANの説明を画家AIと評論家AIというよくわからないもので例えた説明で終わってしましました...)

 

これだと,著者に怒られるのでちゃんとCAN(今回の論文)のContributionを含めて私がわかる限度の厳密さで説明します.(もしも,上の説明だけで満足した場合は,これ以下は蟲師して大丈夫です)

 ここからは論文で出てくる単語に準拠した説明を行います.

 

大雑把な説明

ご存知の方が多いと思いますが,一般に先ほど説明した学習の手続きはGAN(Generative Adversarial Nets, 敵対的生成ネットワーク)と呼ばれます.

また画家AIはGenerator,評論家AIはDiscriminatorと呼ばれます.(CANでも同様の表記)下は論文に記載されているCANを表した図になります.

f:id:tanimutomo:20181218221007p:plain

CANは基本的にGANに加えて,データセットにある絵画とは異なるCreativityやOriginalityを生むためのLossを追加したもので,CAN全体の目的関数は以下のようになります.

f:id:tanimutomo:20181218211507p:plain

CANの目的関数

 

ということで,以下のような順序で解説をしていきます

  • Adversarial Loss (GANのLoss) の説明(青のライン部)
  • CreativityのためのLossの説明(赤と緑のライン部)
Adversarial Loss

ここはCANのContributionではないので,さっと説明します.

GANの目的関数は以下のような式で表されます.

f:id:tanimutomo:20181218153952p:plain

ここで,GはGenerator,DはDiscriminator,xはデータ(本物の絵画)で,zはGeneratorへの入力でノイズと呼ばれます.(ノイズに関しては,今は深く考えないでください)

順を追って直感的な解説をしていきます.

まず左辺だけ見ると,

f:id:tanimutomo:20181218155135p:plain

ここでは,Generatorを最小化して,Discriminaorを最大化しようとしている,ということがわかると思います.

次に,右辺を見ると,

f:id:tanimutomo:20181218155517p:plain

ここで,直感的な理解のみをするために,logとか,Eみたいなやつとか,[ ]こういうカッコとかは,一旦無視しましょう.

すると以下のようになります.

f:id:tanimutomo:20181218160313p:plain

上の式において,D(x)はDiscriminatorが本物の絵画をみた時に,「これは本物である」と言う確率を示しています.ということは,(1 - D(G(z)) ) はDiscriminatorがGeneratorによって生成された画像を「これは本物でない」と言う確率を表しています.(確率は0から1に収まるので,1 - (事象Aが起こる確率) は事象Aが起こらない確率となります)

つまり,上の式を最大化すると,Discriminatorは本物の絵画をみた場合,高確率で本物と認識し,生成された絵画をみた場合,高確率で本物でないと認識します.

だからDiscriminatorは最大化をすると,右辺に書いてあったわけです.

一方,GeneratorはD(G(z))を最大化することで,Discriminatorに自分が作った作品を本物と言わせることができます.

上の式をなんとなく理解することは難しくないと思います.直感的な理解には優しい数式です.

 

CreativityのためのLoss

下の目的関数の赤と緑部分

f:id:tanimutomo:20181218211507p:plain

CANの目的関数

ということで次に,CANのContributionである部分のCreativityについて説明していきます.Creativityという表現はわかりやすくするために使っているだけなので,ここでちゃんとしたこのLossの役割を説明します.

CANの仕掛けをざっくりと説明すると,GANのDiscriminatorに入力された絵画のスタイルを出力する機構を設け,本物が入力された時には正しいスタイルを出力するように,Generatorによって生成された絵画が入力されたときは違ったスタイルを出力するようにするというものです.

これによって,Generatorは本物の絵画から学びを得つつも,それとは違ったスタイルの絵をかけるようになります.

では,それをどうやってやっているのかを,残りの目的関数の項を使って説明していきます.

まず,緑部分に関して説明をします.

f:id:tanimutomo:20181218211133p:plain

これはDiscriminatorにx(本物の絵画)を入力した時の,出力スタイルの確率です.これを高めることで,正しく絵画のスタイルを識別できるようにします.

次に,赤部分について説明をします.

f:id:tanimutomo:20181218212324p:plain

(ここでKはスタイルの総数です)

ちょっと長いですが,分解してみていきましょう.

まず,Dc(ck | G(z)) はGeneratorによって生成された絵画の各クラスの所属確率を示しています.

ここで,先ほどのGANのLossを思い出してみると,上の項は所属確率を示しているが,下の項は所属しない確率を示していることがわかります.

そして,それらには1/Kと(1 - 1/K)といった係数がかかっています.これはたとえばそうスタイル数が10だとすると,1/10と9/10になります.

ということは,ここまでをまとめると,上の項は(所属確率) x 1/10,下の項は (所属しない確率) x 9/10となります.

そして,最初に (-) がついているので,これを小さくしようとするわけです.ということは,できる限り所属しない確率をできるだけ高くしたほうがいいということになります.

これをすべてのスタイルに関して行うので,最終的には全てのスタイルにできる限り所属しないように学習されます.

するとどこのスタイルへの所属確率も等しくなり,Generatorはいろんなスタイルの絵画をかけるようになるというわけです.

 

私の理解が曖昧で変なことを言っている可能性があるのと,誰でもわかるように専門用語や厳密な定義をすべて避けて説明をしているため,わかっている方からすると,「??」となる点が多いかもしれませんが,ちょっと目をつぶっていただけると助かります.

長くなりすぎてしまったので,近日中に別記事で,論文に完全に準拠した説明を書こうと思います.また,SFC Advent Calendarのおかげで,初めてブログ書いたのですが,ちょっと楽しくなったので,練習てみようと思います.