はじめに
はじめまして。竜太(仮名)です。テクニカルアーティストしてます。最近はAIによるアセット生成にも興味持ってます。
本記事では、 DeepL翻訳の検証がてらStyleGAN2の理解を深めるため「StyleGAN v2: notes on training and latent space exploration」を冬休みに読んでみました。とても勉強になる記事です。最近は新たな手法StyleGAN2-ADAも出てはいますがよければご覧ください。誤訳のご指摘あるいは詳しい方からのフィードバックお待ちしております。
動機(Motivation)
What: このエントリでは、複数の StyleGAN モデルをトレーニングし、学習された潜在空間を探索している間に収集したメモや考え、実験結果を紹介します。
Why: これは、同じような興味や意図を持っている他の人たちのために、洞察力を提供したり、議論の出発点にしたりすることを目的とした、明らかなものから "聖なるもの "まで、アイデアや考察を集めたものです。そのため、何か興味のあることがあるかどうかを確認するために、目を通すことができます。また、私はここでカニンガムの法則を大いに活用しています。
Who: 多くの考慮事項が StyleGAN v1 と v2 の両方に適用されますが、明示的に指定されていない限り、生成された結果はすべて v2 モデルからのものです。
コード リソースの観点から見た場合
- StyleGAN v1 および [v2 の公式リポジトリ](https://github.com/NVlabs/stylegan2)
- v1用エンコーダ(+方向学習)と[v2用エンコーダ](https://github.com/rolux/stylegan2encoder)
ここにあるすべてのコンテンツは、私のカスタマイズしたJupyterノートブックを介して、そのレポの上に生成されています。コードや実験、貴重な提案を熱心に共有してくれた人たちにも言及しておきます。 Gwern (TWDNE), pbaylies, gpt2ent, xsteenbrugge, Veqtor, Norod78, roadrunner01。
トレーニング
データセット
カスタムデータセットの場合、すべてのエントリが同じ正方形の形と色空間であることを確認して、画像のセットを事前に作成しておく必要があります。そして、ここで説明したように tf-records を生成することができます。何度も指摘されているように、このモデルは非常にデータを大量に消費します。必要なデータセットのサイズは画像の内容によって大きく異なりますが、一般的には4~5桁、例えば**ミラーリングで約50000、ミラーリングなしでは2倍(約100000)**を目指してください。これはゼロからの学習にも当てはまりますが、微調整(Fine-Tuning)の場合は非常に小さなデータセットで多くの実験が行われており、興味深い結果が得られています。私は主に2つの「ファッション」データセットを使って実験を行いました。
- ドレス(〜30kのパックショット画像)
- 履物(~140kのパックショット画像)
図:フットウェアとドレスのデータセットからのReal画像サンプル
しかし、手動で作成された芸術的なデータセット(~1k枚ずつ)での実験も紹介します。
図:Real画像サンプル(Frank Franzetta, Egon Schiele, Alphonse Mucha)
ファッションデータセットの方が,芸術的なデータセットに比べて(位置や背景などの)内容の一貫性が高いことに注目してほしい.このように、データセットのサイズに関係なく、前者の方がより高い生成精度を達成できることが期待できます。
ドレス画像は、水平ミラーリングのためのドレスの意味不変性を学習して、無料でトレーニングセットを2倍にすることができるので、ミラーオーグメントを有効にすべきケースです。
履物の画像は、データセット内のすべての画像が整列しているため、ミラーリングを無効にすべきです。
サイズについては、まず結果を検証するために512を選択しました。これまでの他のネットワークでの実験から、この解像度はパターンや素材の質感、ボタンやジッパーのような小さなディテールを捉えるのに適していると考えています。また、将来的には256での反復を計画しており、学習された表現の質を検証し、学習レジーム(Regime)との比較を行います。適切なハードウェアリソースを持っていて、より小さな解像度でデータセットを検証しているのであれば、1024のフル解像度(またはそれ以上)に移行することをお勧めします。
Train(訓練)
モデルをスクラッチから訓練することもできますし、以前に訓練した結果をピギーバックして、学習した表現を新しいデータセットに合わせて微調整することもできます。スクラッチからのトレーニングは、以下のように実行するだけで簡単です。
python run_training.py -num-gpus=2 -data-dir=<your_data_dir> -config=config-f -dataset=<your_dataset_name> -mirror-augment=True -result-dir=your_results_dir
すでにミラーオーグメントの話をしましたが、GPUの数は単純にあなたのセットアップに依存します。
図:ドレスデータセットの複数のトレーニングのためのfid50k曲線の比較
Configurationsはモデルのアーキテクチャやプロパティを制御するために使用します。config-a (オリジナルのSyleGAN v1)から始まり、config-e (v2用に完全にアップデートされたセットアップ)、さらにconfig-f (config-eのより大きなネットワークバージョンで、論文で使用されているデフォルトのもの)まで、コンポーネントの追加や変更 (重み復調、遅延正則化、パス長正則化)を段階的に行っていきます。 私は512サイズのデータセットにはconfig-eを選択しました。config-fで追加された複雑さは、学習中にネットワークがより高い解像度に暗黙のうちに焦点を当てていることに気づいたときに、情報のボトルネックに気付いたことが動機でした。
微調整(Fine-Tuning) は時間を節約するために使われ、前のモデルで既に学習された構造に依存し、その構造を新しいターゲットのデータセットに適応させようとします。また、元のデータセットとは全く関係のない画像を使って微調整(Fine-Tuning)を行っている人を見たことがありますが、これは目的によります。微調整(Fine-Tuning)を行うと、訓練の質に関するフィードバックが視覚的に早く得られるので、複数回の反復や実験を行うのが容易になり、モデルの動作やハイパーパラメータについて最初に詳しく知るのに最適な方法となります。
既存のネットワークを微調整(Fine-Tuning)するには、再起動するスナップショットを指定する必要があります。v2では、run_training.pyで以下のように追加し、適応させています。
train.resume_pkl = "your_network_snapshot.pkl" # Network pickle to resume training from, None = train from scratch.
train.resume_kimg = 0.0 # Assumed training progress at the beginning. Affects reporting and training schedule.
train.resume_time = 0.0 # Assumed wallclock time at the beginning. Affects reporting.
これは学習スケジュール(例えば学習率の減衰)を制御するために使用されるので、スナップショットに合わせてresume_kimgを指定することが重要であることに注意してください。
進捗の監視
図:StyleGAN v1(左)とv2(右)のトレーニング進捗比較
トレーニング中に私が注目している主なメトリックは Frechet Inception Distance (FID) で、デフォルトでは50kの画像に対して50回のTraining Ticksごとに計算されます。他のメトリックは、レポのREADMEに記載されているように呼び出すことができます。Tensorflowのログはターゲット先のディレクトリに生成され、tensorboardを実行することでアクセスできることに注意してください。
tensorboard --logdir
FIDの他に、ここではスコア/フェイク(score/fake)とスコア/リアル(score/real)を見ることができます。ラベルは最初は誤解を招くかもしれませんが、これらは損失値ではなく、判別器の純粋な予測出力であることをもう一度指摘しておきましょう。
私はこのようなグラフから何らかの指針を得ようとしていますが、ネットワークがどのように動いているかについての正確な洞察を引き出すのは難しいことがよくあります。理想的には、識別器(discriminator)が偽物と本物を区別できず、無作為に推測しているだけなので、ゼロになる傾向があることが望ましいです。損失の選択に基づいて、他の二次的なメトリクスも存在します。例えば、デフォルトでは、識別器はロジスティック損失をR1正則化して使用し、勾配のペナルティのプロットを提供します。
私のデータセットでは、FIDは個人の知覚した画質にうまくマッピングされていましたが、この指標はインセプションv3モデルから抽出された特徴間のサマリー統計の比較に基づいて計算されているため、他のタイプのデータセット、特に指標の値がゼロになる傾向があるデータセットでは、あまり参考にならないかもしれません。
それでも、短い訓練期間での視覚的な比較は避けることをお勧めします。
私たちの主観的な近似的判断は、見ている特定の例によって、あるいはノイズの寄与だけでも偏っていることが多く、偽のサンプルでは目に見える変化がないにもかかわらず、ネットワークが改善されている可能性があるからです。
図:フットウェアデータセットのための画像を10kimg程度で生成しました
一方、目視検査では、次のMuchaデータセットのために生成された偽のサンプルで示されているように、モード崩壊(mode collapse) のような問題を簡単に見つけることができます。
図:Muchaデータセットの部分的なモード崩壊(mode collapse)の例
これは部分的なモード崩壊の例で、生成器(generator)が数個の例を生成するために縮小され、多様性の点で負けてしまいます。これの顕著な原因は、データセットのサイズが小さいことに加えて、共通の重複エントリがあったことかもしれません。
代わりに、特に訓練曲線との関係で、Franzetta artの次のサンプルを参照してください。いくつかの項目はモード崩壊の印象を与えるかもしれませんが、それよりも、その特定の例のための訓練データセットの重複が多すぎることが原因である可能性が高いです。
図:最後のステップで生成された偽画像のサンプルを用いたFranzetettaデータのFID50k曲線
調整(Tweaking)とハイパーパラメータのチューニング
まともなデータセットであれば、一般的にはパレート分布に沿った良いトレーニング曲線が得られるはずです。公式のREADMEでは、さまざまな設定のためのトレーニング時間が指定されていますが、言われているように、トレーニングの最初の部分でほとんどの改善が得られます; トリッキーで面倒なのは、より細かい品質の詳細に到達しようとすることです。
プラトーは一般的な状況で、モデルがほとんど、または全く改善されないことを意味します。もう一つの可能性がありますが、あまり一般的ではありませんが、発散または爆発は、最初のステップの改善の後にモデルが劣化し始め、純粋なノイズの結果へと指数関数的に退化していくような状況です。
このような状況で取るべき行動は、(前の微調整(Fine-Tuning)のセクションで説明したように)以前のチェックポイントから再訓練し、認識された問題に応じてハイパーパラメータを合理的に微調整することです。よく言われているように、これはそれ自体が芸術であり、直感、経験、運に強く基づいています。
目標やモデルの状態などに応じて、多くの可能性があります。
-
データセット:いつものように、データセットのサイズやノイズの点で明らかな欠陥がある場合は、モデルのチューニングに時間を浪費するリスクを冒すのではなく、それらを修正するための努力をしてください。
-
学習率 (lr):ここでは、より安定した (しかし遅い) トレーニングの進行を可能にするために lr を下げることができます。また、2つのコンポーネント間のアーキテクチャに存在するかもしれないアンバランスに基づいて、ディスクリミネータとジェネレータのlrを個別に微調整することもできます。この点に関して、Shawn Presser氏はTwitterで、v2には実際にバグがあることを指摘しています。G/D lr のバランスを実験する前に、必ずこの部分にパッチを当ててください。 私は笑いのためにlrを増加させようとしましたが、それはいつも迅速で突然の発散で終わってしまいました。
-
バッチサイズ:バッチサイズを大きくすることで、より安定したトレーニングやローカルミニマムからの突破口を提供することもできます。これは、より多くの予測値を使って勾配を計算すればするほど、重みの更新やトレーニングの方向性がより正確になるという考えに基づいています。私がより大きなミニバッチで実行した複数の実験では、FID50kで良いポイントパーセンテージの増加を余儀なくされましたが、すぐに不安定になり、爆発的に増加したものもあります。また、あなたのセットアップのためのメモリの制約に注意してください、v2はより高価であり、1024解像度でのトレーニングは、少なくとも16GBのメモリを持つGPUを必要とします。
StyleGAN には、バッチサイズのパラメータとして_ minibatch_size_base_ と minibatch_gpu_base という 2 つの異なるパラメータがあることを指摘しておきましょう。前者は実際に使用する最大のミニバッチサイズであり、後者は単一の GPU で一度に処理されるサイズです。これは、ベースとなるミニバッチサイズに達するまで勾配が蓄積されるため、セットアップのGPU数に応じて2つのパラメータを調整する必要があることを意味します。
図:トレーニング曲線:同じデータセットで異なるハイパーパラメータをテストした場合
これらの側面については、再びGwern StyleGAN v1の記事をお勧めしたいと思います。なぜならその記事は非常に深い詳細と参照を提供しているからです。GAN-トレーニングをさらに探求したい場合には、さらに3つの優れた論文があります。
- tabilizing Generative Adversarial Network Training: A Survey (2019)
- Which Training Methods for GANs do actually Converge? (2018)
- Improved Techniques for Training GANs (2016)
以前のチェックポイント(同じ設定)からトレーニングを再開した後のロススコアの変化の原因は何なのかなど、未だに謎に包まれている行動があります。
潜在空間探索
マニホールド(多岐にわたる)散策
上記は、私のドレスと靴のモデルのための潜在空間探索のいくつかの例です。このアイデアは、N個のサンプルベクトル(ガウス分布から描画された)を生成し、任意の遷移関数を使ってそれらの間を順次遷移させることです。私の場合、この関数は固定フレーム数で行われる線形補間です(モーフィングに相当します)。
初期の潜在ベクトル z に依存していることに注意してください。これは、StyleGAN マッピングネットワークを使用して、最初に潜在ベクトル w を生成し、次に w を使用して新しいイメージを合成していることを意味します。このため、切り捨てのトリックに頼ることができ、潜在空間の表現が不十分な部分を切り捨てることができます。生成された中間ベクトルwがどれだけ平均に近づかなければならないかを指定します(マッピングネットワークへのランダムな入力に基づいて計算されます)。ψ (psi)値は平均からのwの偏差をスケーリングし、品質と多様性のトレードオフのために微調整することができます。ψ=1は切り捨てなし(元のw)と同等ですが、0に近づく値は平均に近づき、品質は向上しますが、バラエティの面では減少します。
図:動作中の切り捨てトリック、ここでは-0.5(左上)から1.5(右下)まで直線的に間隔を置いています
実画像をエンコードする
私たちはしばしば、ターゲットモデルに関して実際の画像のコード/潜在ベクトル/埋め込みを得ることができるようにしたいと考えています。
一般的に、これには2つの方法があります。
- ネットワークのエンコーダコンポーネントに画像を渡す
- 潜在空間を最適化する(勾配降下法を使用して)
前者は高速な解決策を提供しますが、学習データセットの外で一般化することに問題があり、我々にとっては残念ながら、Vanilla StyleGAN では箱から出てきません。このアーキテクチャは単に明示的なエンコーディング関数を学習していません。
そこで、知覚的損失を利用した潜在空間最適化の選択肢が残されています。参照画像と生成画像の高レベルの特徴(例えば、VGGのような事前に学習されたモデルから)を抽出し、それらの間の距離を計算し、潜在表現(ターゲットコード)に基づいて最適化します。このターゲットコードの初期化は、効率性と有効性のために非常に重要です。
最も簡単な方法は単純なランダム初期化ですが、画像から潜在表現への明示的な符号化関数を学習するなど、これを改善するために多くのことができます。アイデアは、N個の例のセットをランダムに生成し、結果の画像とそれを生成したコードの両方を格納することです。そして、このデータをもとにモデル(ResNet など)を学習し、実際の StyleGAN エンコーディング処理の前に潜在層を初期化するために使用します。初期化の改善については、こちらの詳細な議論を参照してください。
Encoder for v1 と Encoder for v2 は、この操作のためのコードとステップバイステップガイドを提供しています。また、以下の 2 つの論文もお勧めします。Image2StyleGAN と Image2StyleGAN++ です。初期化オプションや潜在空間の品質についての考察、モーフィングやスタイルミキシングなどの画像編集操作の分析など、Stylegan のための画像エンコーディングの良い概要を提供しています。
w(1) と w(N)
StyleGANは、マッピングネットワーク(8つの完全に接続されたレイヤー)を使用して、入力ノイズ(z)を中間の潜在ベクトル(w)に変換します。両方ともサイズは 512 ですが、中間ベクトルは各スタイル レイヤーごとに複製されます。1024サイズの画像で訓練されたネットワークでは、この中間ベクトルは(512, 18)の形をしており、512サイズでは(512, 16)になります。
符号化処理は一般的にこの中間ベクトル上で行われ、そのため、_w(1)_に最適化するか、_w(N)_全体に最適化するかを決めることができます(512層のうち1層だけを意味し、各スタイル層に必要に応じてタイル化されます)。公式のプロジェクターでは前者を使用していましたが、適応版では視覚的な忠実さのために、すべてのwエントリを個別に最適化することに頼っていることが多いようです。このトピックについては、このTwitterスレッドも参照してください。
図:Nvidia FFHQモデルを使用したw(N)とw(1)への投影の比較
FFHQモデルのドレス画像を投影した次の例のように、モデル学習分布の適切でない参照画像を投影した場合には、さらに顕著でゴリゴリしたもの(Goliardic)になります。
一般的には、高解像度の場合、プロジェクターは参照画像の細かいディテールにマッチしないように見えますが、これはこのスレッドで実証されているように、知覚の損失のために256x256の解像度を使用した結果である可能性が高いです。
方向性を学ぶ
StyleGANは、潜在空間離散化の改良により、データセットの単一の属性を(他の属性に影響を与えずに)直交的に探索することを可能にしました。
識別モデルは、対象となる属性(例えば、男性/女性、笑顔/非笑顔、猫/犬)を分けるために境界線を学習しますが、私たちがここで興味を持っているのは、境界線に垂直に移動しながら境界線を横断することです。例えば、悲しい顔から始めた場合、同じ顔の笑顔バージョンにゆっくりと、しかし着実に移動することができます。
これはすでに新しい方向性を学習する方法のヒントを提供しているはずです。最初にモデルから複数のサンプル(画像+潜在空間情報)を収集し、目標とする属性(例えば、微笑むか笑まないか)について画像を手動で分類し、適切なクラス表現のバランスを保証しようとします。次に、潜在的なラベルと手動ラベルに基づいて、分類または回帰するモデルを訓練します。この時点で、これらの支援モデルの学習関数を遷移方向として使用することができます。
ロバート・ルクセンブルクは、FFHQの公式モデルの学習方向を共有しました。
StyleGAN2 Distillation for Feed-forward Image Manipulationは、StyleGANを介して生成された不対のデータセット(unpaired dataset)上で学習された"student"画像対画像ネットワークを介した方向操作を探求した最近の論文である。この論文では、符号化性能のボトルネックを克服し、実世界の画像に効率的に適用できる変換関数を学習することを目的としています。
図:論文 "StyleGAN2 Distillation for Feed-forward Image Manipulation "からの例
結論
私の実験の多くは、当初、StyleGANモデルによって学習された潜在空間(表現学習)がどれだけ優れているか、また、得られた埋め込みが下流のタスク(例えば、線形モデルによる画像分類)でどれだけの性能を発揮できるかを評価することに動機づけられていました。一方では、自己回帰モデルやフローベースモデルのような他の生成モデルのタイプもカバーしようとしながら、この種の評価に取り組んでいきたいと考えています。
また、純粋な画像合成能力や、効果的な意味混合や編集の可能性を追求するために、このようなモデルを追求することにも興味があります。自動化された線画のカラー化、ペイントのアニメーション化、フレーム補間などは、すでにいくつかの素晴らしいフリーのツールがありますが、特により意味的な観点から、補助的なドローイングのためにできることはもっとたくさんあります。また、一般化機能、推論時間の短縮、トレーニングの最適化、伝達学習など、実用的な改善の余地もたくさんあります。
将来的には、純粋な2次元キャンバスを超えて、3次元グラフィックスの領域ですでに達成されている驚くべきことをもっと学びたいと思っています。微分可能なレンダリングは私の心を吹き飛ばし、ループを閉じるために、連続的な3D形状生成のために再びGANに戻ってきました。
おわりに
(冒頭でも述べましたが)StyleGAN2は2019年末に出た手法で既にStyleGAN2-ADAという新たな手法も出てきています。今後もGANアルゴリズムは進化していくと思いますがデータセットは使いまわしができますし、本記事で訳した内容が参考になれば幸いです。個人的にはStyleGAN2Encoder等のGANエンコードの精度向上にとても興味あります。なぜならこの精度が上がれば様々な分野で応用が可能になると思うからです。エンコードの精度向上に関して詳しい方いらっしゃいましたら是非フィードバックを宜しくお願いいたします。
また、DeepL翻訳はGoogle翻訳よりも「読みやすい訳」をしてくれる印象です。もちろん完ぺきではなく修飾節を思いっきり無視して短縮化されていることもあったり二重翻訳したりもありますが、技術論文のベースを訳してくれる分には十分なクオリティです。これからも活用していければと思います。