見出し画像

CLIP Text Deprojectorを使って画像生成してみる ~モデルをさらに改良~

前回の記事から少し時間が空きました。前回は、新しいモデルアーキテクチャを用いてアンサンブルモデルを作りましたが、今回は、単体モデルのアーキテクチャをさらに改良しました。

前回の記事

他のStable Diffusionの関連記事

Layered Diffusion Pipelineを使うためのリンク集


前回モデルの問題点

前回モデルの最終版実装では、Vicinityネットワークに活性化関数の適用が不足していました。(下図)

活性化関数の不足

この場合、Vicinityネットワーク内の線形変換は数学的に不要な変換となっていて、取り除いてもモデルの最終的な性能に影響を与えないと考えられます。

そこで、今回の記事では、Vicinityネットワークに活性化関数を適用する方法について検討していきます。

線形変換を削除

まず、現時点で数学的に不要な変換と考えられるVicinityネットワーク内の線形変換を削除して、生成画像の質に変化がないことを確認します。

使用するプロンプトはこれまでと同じものです。

単一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 (少年 少女 教室)

生成画像は上段から、

  1. Deprojectorを使用しない(参照用)

  2. Vicinityネットワーク内に線形変換がある

  3. Vicinityネットワーク内に線形変換がない

となっています。

単一embedding
複数embeddingの合成

以上の結果から、線形変換のありなしで生成画像の品質に特別な変化がないことが確認されました。

活性化関数を追加

次に、シンプルに活性化関数をVicinityネットワークに足してみます。また、それに加えて、やや強引な形になりますが、活性化関数適用後に残差接続を繋げるパターンも試してみます。

生成画像は上段から、

  1. Deprojectorを使用しない(参照用)

  2. Vicinityネットワーク内に線形変換なし

  3. Vicinityネットワーク内で、線形変換後に活性化関数を適用

  4. Vicinityネットワーク内で、線形変換後に活性化関数と残差接続を適用

となっています。

単一embedding
複数embeddingの合成

以上の結果から、活性化関数の適用が生成画像の品質の向上につながっていないと結論付けられました。

残差接続の適用方法の問題点

上の実験で使用した残差接続は、最初に述べたようにやや強引な形で実装されています。

通常の残差接続と今回の違い

通常は、上にあるように、活性化関数を適用した後にさらに線形変換を適用して値域を負数に拡大し、次元を入力と一致させてから、残差入力に加算します。

しかし、今回は活性化関数を適用した直後に残差入力に加算しているため、値域が非負でかつ次元が一致していません。

これを解決するには、モデルアーキテクチャに大きな変更を加える必要が生まれます。

新しいVicinityネットワーク

上記の問題を解決するため、個別適用版のVicinityネットワークの内部で適用している変換を、線形変換からMLPへと変更します。これを、新たにMLP版Vicinityネットワークと呼ぶこととします。

MLP版VTアーキテクチャ

上図が新しいモデルアーキテクチャの模式図です。ただし、残差接続などの詳細は省略しています。Vicinityネットワーク内のMLPは省略可能です。省略された場合は、残差接続だけが残るため入力がそのまま出力に直結されます。

個別適用版のVicinityモデルと同様、入力embedsに適用されるMLPと隠れ状態に適用されるMLPは別のネットワークとなり、それぞれに別の次元を設定できます。

MLPの有効性

まず確認する点は、新たに導入したMLPに効果があるかどうかです。そこで、入力embedsと隠れ状態それぞれのMLPの有効無効を切り替えて、生成画像の結果を比較します。

今回の生成画像は上段から、

  1. Deprojectorを使用しない(参照用)

  2. 入力embedsと隠れ状態のどちらのMLPも無効に

  3. 入力embedsのMLPのみを有効に

  4. 隠れ状態のMLPのみを有効に

  5. 入力embedsと隠れ状態のどちらのMLPも有効に

となっています。有効にしたMLPの中間層の次元は、入力次元の2倍とします。

単一embedding
複数embeddingの合成

詳細に確認すると、入力embedsに対するMLPは明確な改善傾向は見られませんが、隠れ状態に対するMLPは生成画像に改善傾向が認められます。

隠れ状態のMLPの中間層の次元

次に、隠れ状態のMLPの中間層の次元を変化させてみます。生成画像は上段から、

  1. Deprojectorを使用しない(参照用)

  2. MLPなし

  3. MLPの中間層の次元を入力次元の2倍に

  4. MLPの中間層の次元を入力次元の4倍に

となっています。

単一embedding
複数embeddingの合成

以上の生成画像から、中間層の次元を2倍から4倍に増やすことのメリットは特にないのではないかと思われます。

新モデルアーキテクチャ最終版

以上の知見を元にして、MLP版アーキテクチャの模式図を下に掲載します。

MLP版VTモデル(最終版)

まとめ

前回のVTモデルでは、Vicinityネットワークの活性化関数が不足していたため、線形変換が不要であることが確認できました。

Vicinityネットワーク内で活性化関数を適用するため、MLP版アーキテクチャを考案しました。さらに、MLPは入力embedsには適用せず、隠れ状態にのみ適用するのがベストであると確認しました。

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