CLIP Text Deprojectorを使って画像生成してみる ~訓練データの一部を無視~
前回は、それまでに作ったLSTMモデルのバリエーションの性能比較をしましたが、今回は、訓練データの与え方についての実験を行います。
前回の記事
他のStable Diffusionの関連記事
Layered Diffusion Pipelineを使うためのリンク集
ライブラリの入手先と使用法(英語) : Githubリポジトリ
日本語での使用方法の解説 : Noteの記事
動機
訓練データの与え方を変更するアイデアは、最近の一連の投稿で分析した、テキストエンコーダーの出力の長さに関する発見から思いつきました。
以上の記事からは、Text Encoderの出力の全てが画像生成に必要なわけではないことが示唆されていて、訓練データの一部のみを学習に使うことで、モデルの質を向上させることができる可能性があることが推察されます。
実験の設定
実験に使うモデルアーキテクチャは、前回の記事で選んだ「線形変換後に残差接続を繋げるモデル(内部次元1.5倍)」とします。また、最終正規化層のパラメータは固定して学習します。
現在、損失関数としては平均二乗誤差が使われていますが、損失の計算をする際にトークン位置ごとに重みづけをして計算しています。重みづけのルールは次の通りです。
SOSトークン : 0倍(使用しない)
単語トークン : 5倍
EOSトークン : 5倍
EOS以降の詰め物トークン : 1倍
設定1:単語とEOSのみ
最初の設定は、EOS以降の詰め物トークンを損失の計算から除外するものです。これによって、モデルはEOS以降のトークン位置の状態を学習しなくなり、あたかもその後も単語トークンが続くように状態を出力するモデルとなります。
この設定は、下に示すような重みづけの変更だけで実現できます。
SOSトークン : 0倍(使用しない)
単語トークン : 1倍
EOSトークン : 1倍
EOS以降の詰め物トークン : 0倍
設定2:単語とEOSのみ(逆順)
次の設定は、設定1と同様にEOS以降の詰め物トークンを除外し、かつ、状態をEOS位置から逆方向に生成します。この設定のメリットと想定される点は、生成される状態が入力embeddingに近い状態から遠い状態へと変化するように並ぶので、モデルが単純になるということです。
この設定を実現するには、重みづけに加えて状態の並べ替えを行う必要があります。並べ替えは下図のように行われます。
設定3:EOS以降のみ
最後の設定は、逆にEOSとそれ以降のトークン位置の状態のみを使用します。別の言い方をすると、単語トークン位置の状態を全て除外します。この設定のメリットは、設定2以上に状態の生成が単純化される点です。
この設定を実現する場合も、重みづけに加えて状態の並べ替えを行う必要があります。並べ替えは下図のように行われます。
生成画像
生成画像は上から次の順に並べられています。
Deprojectorなし
変更なし
単語とEOSのみ
単語とEOSのみ(逆順)
EOS以降のみ
使用したプロンプトはこれまでと同様、次の通りです。
単一embedding
cat maid (猫耳メイド)
1girl red hair blue eye black skirt(赤髪 青目 黒スカート)
1boy 1girl in class room(少年 少女 教室)
複数embeddingの合成
cat, maid (猫 メイド)
1girl, red hair, blue eye, black skirt (赤髪 青目 黒スカート)
1boy, 1girl, in class room (少年 少女 教室)
「単語とEOSのみ」(3段目)と「単語とEOSのみ(逆順)」(4段目)は、元のバージョンに対して画像の品質が大きく劣化しいます。
「EOS以降のみ」(5段目)は、画像のノイズは完全になくなりましたが、代わりにプロンプトの再現性に問題が起きるようになりました。
再帰的入力を用いた学習
「EOS以降のみ」のモデルを改善する方法として、以前試した「再帰的入力を用いた学習」を使用してみます。
生成画像は上から次の順に並べられています。
Deprojectorなし
変更なし
EOS以降のみ(一括入力)
EOS以降のみ(再帰的入力)
再帰的入力を用いることで、プロンプトの再現性に明らかな改善が生まれました。
まとめ
訓練データの一部だけを使用して学習する方法について実験考察を行いました。
EOSとそれ以降のみの位置の状態のみを学習データとして、再帰的入力を用いる方法で学習を行うと、効果的な学習が可能であることが分かりました。
この記事が気に入ったらサポートをしてみませんか?