見出し画像

[実験レポ] Model Block Merge で、 U-Net の各レイヤーの影響を調べる #1

はじめに

Model Block Merge は、従来とはまた違った良い結果を出し得るマージ手法として、一定の評価と期待を得ている。利用した成果も共有され始めており、美しい画像の数々は、日々日々、私の心を癒やし、ディスク領域を圧迫し続けている。(ありがたい事です。絵師様/術師様に感謝)

(※この手法は、kohya_ss 様が下記の記事にて提示されたものです。)

(※AUTOMATIC氏製 Web UI 用に、上記手法の Extension を作成させて頂きました。)

しかしながら、新しい手法であるために、望むような効果を出すための方法・勘所がはっきり分かっているとは言い難い。
一つには、パラメータが 25 個と多い事や、出力結果の評価方法・モデルの評価方法が確立していない事から検証が大変で、明確知にしにくいことがネックとなっている、と思う。
(※ここで「モデル」は checkpoint ファイルとほぼ同義で使用します)

やってみること

そこで、「検証方法を探すこと」「議論のネタになる程度の考察・憶測を提供すること」を目標に、実験を計画した。

具体的には、特定レイヤーでのマージ処理にて、そのレイヤーを透過するようにできないか(実験1)、もしくはその効果を増減できないか(実験2)、検討した。

※早く結果を見たい方は「実験2: 結果検討」へどうぞ。


実験1

実験検討1

モデルの対象層部を「何もしない」ようにできないか。

特定の層の効果を除外できれば、通常の出力結果と比較することで、影響を検討する事ができるはずである。

NN や U-Net の知識が不足しているので、仮説というか、ややあてずっぽうに予想した。
『仮にモデルの対象レイヤーのテンソルが、いわば、運動方程式 ma=F に対する慣性テンソル I のような動きをするならば(ここらへん曖昧。。)、透過的に振る舞うためには単位ベクトルのようなものであれば良いのではないか』(妄想)
調べたところ単位テンソル I や恒等写像といった話が出てくるが、、、よく考えるとこれだとデータが落ちてしまう。
torch を調べたところ、ずばりのものがあるじゃないか!

torch.ones_like
スカラー値 1 で満たされたテンソルを返します。

これなら、入力 * ones tensor = 出力 = 入力 にできるよね!
と思って試してみたが、上手く動かない。。。なぜ。。。


実験2

実験検討2

一旦諦めて、方針転換する。
既存モデルの特定層のみ、マージ比率を下げることで「その層の影響力が弱いモデル」を作成し、比較する事で影響を検討する。

現在の通常のマージの実装では、マージ比率 M (範囲:0~1)に対して、以下のような計算を行っている。

マージした結果のモデル = (1 - M) * model_A + M * model_B

この計算を以下のように変更することで、モデルAの比率 M_A、モデルBの比率 M_B を用いて、出力されるマージモデルにおけるモデルAとモデルBの比率の合計が 100% ではないようにする事ができるようにした。

マージした結果のモデル = M_A * model_A + M_B * model_B 
実験用魔改造済み Merge Block Weighted Extension の UI
IN_00 のモデルA成分を 0.75 にしている例

蛇足1

実は、AUTO1111 における "Add difference" でも同じように「合計して100%」を維持していない。使用されている式は O = A + M * (B-C) なので、出力されるモデル O は、「モデル A」に「モデルBとモデルCの差分の M %」を足したもの、となっており、モデル O は モデル A に比べて「大きくなっている」ようにも見える。

この Add Difference 処理については、「マージ時に『合計して 100%』にしなくてよいのか」、「モデルを壊しているだけではないか」、などの批判が一部である。

実験2 の設定

対象モデル:model A = Stable Diffusion v1.5 pruned、model B も同じ
マージ設定:IN_00~IN_11、M_00、OUT_00~OUT_11 まで、それぞれを 0.75 倍。対象の層のみ M_A=0.75, M_B=0。その他は M_A =1, M_B=0
準備したモデル:階層マージ済みモデル x25ケ、SD15 x1ケ
Seed: 1, 2, 3, 4
テストプロンプト:PNG Info 形式にて、下記の通り。

masterpiece, best quality, beautiful anime girl, school uniform, strong rim light, intense shadows, highly detailed, cinematic lighting, taken by Canon EOS 5D Simga Art Lens 50mm f1.8 ISO 100 Shutter Speed 1000
Negative prompt: lowres, bad anatomy, bad hands, error, missing fingers, cropped, worst quality, low quality, normal quality, jpeg artifacts, blurry
Steps: 40, Sampler: Euler a, CFG scale: 7, Seed: 1, Face restoration: CodeFormer, Size: 512x512, Model hash: a9263745, Model: sd-v1-5-pruned

実験2:結果と検討

出力結果を U 字型の配置に整理し、各部分の検討や相対的な比較を行った。
各層の出力画像は、Seed: 1~4 を横に並べたもの。

※実験で出力した画像と、下記の形状に表示する HTML のセットを添付しておきます。拡大して見たい場合などにどうぞ。

実験結果の全体観

検討方針と、リマインド(to me)

キャラクター顔(の詳細表現)全体構図背景、に着目して見ていく。
・重ねて注意点。実験2では、「その層へのモデルの能力を 0.75倍」しているので、仮説としては、画像を見て特徴を見て取れた場合『見て取れた特徴の逆の能力が失われたのでは』と解釈すべき、と考えている。
・「結果の読取り」「解釈・憶測 (あれば)」「まとめ」の構成で記載する。


検討1. IN_01~IN_11 にて、キャラクタ配置・構図はあまり変わらない

キャラクタの体の向きや、顔のリアルさ/アニメ寄りはまちまちに変化したが、大きな構図の変化は見られなかった。
また、キャラクタ・全体構図には大きな破綻の発生は見られなかった。

この事から、「全体構図は IN の上層で大まかには決定しており、それ以降は大きな変化は見られない」 と言えそう。
また、「全体の破綻や背景の破綻は、IN 側の影響ではない (つまり M~OUT 側が悪い)」可能性がある。(後述)

(やや極論の仮説)
Seed:2 や Seed:3 を縦に見ると、アニメ調・リアル調を行ったり来たりする様子が見られた。これは、モデルのその層が担当している絵柄(アニメ/リアル) の影響の可能性、と言えるかも。
この仮説が正しければ、「INの上層はリアル調、INの下層がアニメ調を担当している」と言えるのではないか。
(IN_07のseed:4、IN_08のseed:3 はかなりリアル寄りに見える)


検討2. M_00 で、表現が大きく変化した

M_00 では、直前の IN_11 や標準出力画像と比べて、キャラクタ・キャラクタ詳細・色味に影響が見られた。
全体の構図は大まかには変化していないが、体の向きや顔のサイズ・服装・背景などに変化が見られた。
通常の出力結果との大きな違いとして、Seed 4 の結果にて、ピンクのスカートを失っていた。

M_00 層は自身へのモデルの影響力を失うと、大きく出力に影響が出てしまうのではないか。(M_00 の結果ではピンクのスカートを失っているのに、前後の IN_11やOUT_00 ではピンクのスカートを維持できている)
一方で、OUT 上層の結果のように全体が破綻しないのは、M_00 以降の OUT ブロックでのアップサンプル処理+スキップコネクションで、どうにか辻褄を合わせているのではないか。(M_00 から OUT_00 へ行くと、IN_11 と同じ雰囲気まで回復している)

この事から 「M_00 は、全体の詳細に、大事な/回復不能な影響を与える」と言えるのではないか。


検討3. OUT_04 以降にて、全体が崩れている


OUT_04 から上層にて、全体構図、背景、絵全体に乱れが見られた。
成れ果てか。やはり上昇負荷には勝てないのか。。
OUT_06 ではキャラクターがかろうじて粘って出現していた。

OUT の上層は、U-Net の逆畳み込みにより全体がアップサンプルされている段階のはず。この時点でモデルの影響力を失ったため、正しくアップサンプルが出来ていないのではないか。
また、OUT_06 ではキャラクタがやや残った事から、モデルの影響を失ってもなおそれまでに強い特徴量を得ている部分(今回だとキャラクタ)は残るが、弱い部分(背景などのその他の部分) が失われるのではないか。
さらに、OUT_04 ~ OUT_05 あたりでキャラクタの顔が大きく崩れている事から、これらの層が顔の成立に大きな影響を与えているのではないか。

この事から、「OUT 上層は、出力される絵の全体の再現に影響している」 と言えそう。
また、「OUT上層は、主題以外の表現 (例えば背景)に影響を及ぼしている」のではないか。
さらに「OUT_04、OUT_05 が顔の決定に大きな影響を及ぼしている」のではないか。

残った課題・疑問点

以下の課題については、顕著な変化点・解釈を見つけられなかった

(疑問) 目のリアルさ、手のリアルさはどこらへんから来ている?
(疑問) 肌の質感、キャラクタのフォルムの立体感・質感はどこらへんから来ている?
(疑問) OUT_06 から OUT_07 に行くとキャラクタが復活しているが、なぜ?
(疑問) IN_00 のみがその他と大きく異なる結果になっているが、なぜ?

あとがき

今回は Stable Diffusion v1.5 モデルを使って、U-Net 各レイヤーに対するモデルの影響力を下げ(?)、結果の検証から「絵」に対する影響を検討する試みを行った。

各レイヤーの働きについて、いくつかの仮説・憶測を得られたのは成果であると思う。一方で、多数の疑問がまだまだ残されている。
まだまだ沼は深そうだ。オレもまだまだ掘り続けるッ

さらに検討を進めるなら、以下のような項目がありそう。

  • その他のモデル(単独)における、同様の検討

    • 他のモデルでも同様に検討・整理してみて、同じような傾向が見られるのかどうか(普遍的な U-Net の傾向なのか、モデルの傾向なのか)

  • 異なるモデル同士のマージにおいて、同様の効果・傾向が見られるか

感想

素人が七転八倒しているだけの記事ですが、ここまで読んでくださってありがとうございます。
個人的には、オープン性が保たれた時の技術の爆発力が大好きで、大いに期待しています。
プロンプトを魔術とは良く言ったものですが、中世に科学技術が "魔術" として研究された時のような「迫害から逃れるために秘匿」のような流れにはなって欲しくないな、とは思います。
今我々が行っているような検証・トライアルは、次世代の技術であっさり上書きされたりしますが、逆に言えば「後世から見ればあたりまえの事に、うんうん唸って頭を抱える」という楽しみ方は現世人だけ・今だけの醍醐味ですよね!

では、節度を守って、良い ジェネレーティブAI ライフを!

蛇足2

ちなみに、この「Model Block Merge」処理は色々な呼ばれ方をしている模様。
海外で見かけたのは、block merge, weight merge など。
日本だと、層マージ、層別マージ、階層マージ、ブロックマージ、など。

注意事項

本稿での実験はあまり深く考えて行っていないので、技術的・学術的に正しいかどうか等は考慮していません。(というか、できていません。自分の勉強が不足していて、根拠がない部分が多く。。)
記載においては、できるだけ「自分の憶測である」部分が分かるように注意しているので、読み物として楽しんでもらえれば助かります。
技術的な間違いの指摘は大歓迎です。(これ勉強しとけ!など)

謝辞・拙作宣伝URLリンク

kohya_ss 様 「Stable DiffusionのモデルをU-Netの深さに応じて比率を変えてマージする」

すべてこの記事から始まりました。良質な記事に感謝しています。

Multi Block Merge GUI

拙作。

Merge board

拙作。マージ機能を拡張します。
マージの組み合わせをテキストの「レシピ」として扱えるようにしますので、マージ実験する方にお勧めです。
※ AUTO1111 公式のリストにも乗りました。やったね!


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