見出し画像

いまさら勉強する人工知能

見出し画像の肖像画、実はぜんぶAIが作ったフェイク油絵なんです。

いまさらながら!! AIを!マシーンラーニングを始めるぞ!!!と勢いでゴールデンウィークを費やし4週間…ようやく成果がでてきたぞい。

秀作で作った、ルネッサンス肖像画ジェネレーター。こんな感じです。先行事例より高品質なものができたんじゃないかと。データセットと訓練の工夫大事。

すべて存在しない人のフェイク肖像画

とりあえず自力でデータセット作ったり、StyleGan2をカスタマイズしたり、潜在空間を制御したりできるようになりました。

以下、やったこととかの忘備録。


やったこと

ゴールデンウィーク初日から3週間ぐらいで、以下のような感じで勉強。

自分のバックグラウンドを踏まえ、エンジニアが苦手とする定量化しにくい画像生成系(GAN)に狙いをさだめて集中学習。

・まずAmazonでPythonと機械学習の本を5冊ほど購入。中身は読まず、目次だけ読んで基礎知識をゲット。雑に序文と目次を読んで、共通で言ってることをまとめる。

・ai.googleのチュートリアルMachine Leraning Crash Courseを一式やる。ここで基礎を勉強、わからないところを日本語の書籍で補正。Tensor Flowを一式覚える。

・Google ColabでPythonとColabの基本を覚える。

・その後、PyTorchの公式チュートリアルの日本語版をフルセットでやる。PyTorchのほうが設計的に好みだったので、PyTorchに引っ越す。


・ネットを巡回して、いろいろなハックしてる人のブログや論文を100個ぐらい読む。

・親切なPFNの人にお時間もらって、謎だった部分や、自分なりにたてた仮説のコンセプトをきいてもらう。

・Udemyがちょうどセールをしてたので、AI系のクラスを3万円分購入(総額20万円相当)。2倍速でざっくり見る。


…だいたいこんな感じの3週間。数学が難しすぎて、わからないこともいっぱい。ただ頭のなかでe4eエンコーダやpix2pix的に、概念モデルのエンコーダーを作れば、数式なしでもいける感はあった。

総論としてはAIは面白いですね、ロケットサイエンスと別の方向性で「言語化されてない職人芸のアート領域」があり、ここを抑えることができれば、最先端の発見や成果は色々とうまってそうという印象を受けました。

とりあえずStyleGan2で基礎勉強をしながら、BigGan、VQGanとProblematic Diffusion Modelの概要を覚えて、Open Clipとの合体に挑戦してみようと思います。Open Clip系のジェネレーションは、エンジニアリング知識と別に絵の知識をもってるほうが有利な気がするので。



以下、詳しい人にきいてみたい仮説

自力で最低限のことは覚えたのだけど、なんか色々と仮説がある。でも、今の自分の知識では、正しいかわからない…そういうことが多すぎて、AIのプロに聞いてみたいことメモ。


Discreminatorは複数を組み合わせるほうがよくないか?

GANのDiscreminator(判定器)は、全体感をベースに真贋判定を学習しているように見える。これが指先や毛先や襟元の精度がなかなか上がらない原因。なので、目をチェックするやつ、構図をチェックするやつ、口元をチェックするやつ… と粒度のことなる複数のDiscreminatorによって、アンサンブル判定をしたらば、GANの精度はもっとあがるのではないか?


同じデータセットで2段階学習をするのはアリではないか?

転移学習と同じロジックが、1データセットでもいけるのではないか? データセットを低解像度やアーギュメントしたものをベースに、高ラーニングレートで全体感を学習させ、その後に同じデータセットの高解像度版を低ラーニングレートで学習させたら、より精度があがらないかな?と思う。

なんかGAN系の教育は、小学生にむりやり微積分を教えてるような感じなので、足し算、掛け算、二次方程式…と段階で学習させていくほうがよい気がする。


同じデータセットでレイヤーブレンディングをするのは、過剰学習の対策として有効ではないだろうか?

モデルが過剰学習するタイミングはレイヤーによって違うのではないか? 浅いレイヤーが過剰学習してから、深いレイヤーがおっかけてくるみたいな?
なので、同じデータセットでエポック数が違うものを組み合わせて、浅いレイヤーがベストで深いレイヤーが未熟なモデルと、浅いレイヤーが過学習で深いレイヤーがベストチューンのモデルを組み合わせたら、もっとベストチューンなもの作れないのかな?


Discreminatorの評価関数に乱数をぶっ込んだら、過剰学習を抑制できないか?

Discreminatorの返す評価関数に、+-5%ぐらいの乱数をぶっ込んだら、学習速度が遅くなるかわりに過剰学習対策になるのではないか?モデルの各レイヤーのノードをブロックするのに近い感じになるんじゃないかな?


複数のGneratorを同じデータセットで同時にトレーニングして、レイヤーブレンディングをすると精度があがるのではないか?

複数のGneratorを同じデータセットでトレーニングして、それらをレイヤーブレンディングした場合、モデルのウェイトには平均回帰がおきるはず…なので、局所回やノイズが低減して、より高精度のモデルにならないだろうか? 100kimgまわすより、30kimg回したモデル3個を合成して平均するほうがよい…的な


データセットの要点を切り出して連結したら精度があがらないか?

データセットに食わせる画像を512x512の人物データだけじゃなく + OpenCVで目を切り抜いたもの、鼻を切り抜いたもの、口を切り抜いたもの…などを、配列として連結して一緒に食わせると、精度があがるのではないか? 


学習させるより複数回出力するほうがよくないか?

よほどリアルタイム性の高い分野でない限り、超学習させて精度をあげるよりも、3〜5画像を生成して一番精度の高いものを採用する方式の方が、品質が高くないだろうか?


総当たりのAugumentedと潜在空間の制御で精度があがらないか?

ADAするよりも、無制限のData Augumentationをぶん回して基礎学習させたあとに、正しい構図を導く潜在ベクトルWを抜き出して、構図をあとから限定するほうが学習的にラクなのではないだろうか?


少ないデータで過学習しないようにするには?

BigGanやStyleGan2に、30枚ほどの学習させたいデータをプロジェクションして潜在空間Wを得る。30枚の潜在空間Wをベクトルブレンドして、中間画像を2万枚ほど作り、その2万枚でファインチューンを行うことで、10枚程度の画像でも過学習なしにStyleGanをトレーニングできる…気がする。

などなど…もろもろを疑問に思う今日この頃、少しづつ検証してみたいと思います… が師匠が欲しい。



まぁ、なんでこんなことをやってるかというと、お仕事(noteじゃないやつ)で、AI関係にからみそうだったから。

お仕事のポリシーとして、あたらしい業界に絡むときは、できるだけそこの原住民になろうと心がけています。投資サービス作るときは口座を開き、漫画サービス作るときは電子書籍を大量に買い、ハンドメイドサービス作るときは工房に篭るスタイル。やはりAIも自分で実装できたり、コンセプト提案できないと、説得力なかろうと覚えてみた。

「CXOとは何なのか?」という哲学的な問いをかかえつつ、これからも頑張っていこうと思います。

いただいたサポートは、コロナでオフィスいけてないので、コロナあけにnoteチームにピザおごったり、サービス設計の参考書籍代にします。