Stable Diffusionの「階層マージ」とは?やり方や影響について詳しく解説

LoRA

皆さんは画像生成する時に好みのモデルを使いますよね。

モデルは画像とテキストを学習させたTRAINEDモデルと

モデル同士を掛け合わせたMERGEモデル

この2種類に分類されています。

今回はMERGEモデルの作り方と階層マージについて解説していきます。

スポンサーリンク

モデルをマージする方法

すごく単純にモデル同士を掛け合わせることで誰でもオリジナルのモデルを作成することができます。

Stable Diffusionにデフォルトで付いているCheckpoint Mergerの機能を使えば最も簡単にMERGEモデルが作成できます。

好きなモデルをセットしてMergeを押すだけです。

このCheckpoint Mergerは単純マージ専用です。階層マージはできません。

単純マージ!? 階層マージ!? 

大丈夫です。今から解説していきます。

Stable Diffusionの画像生成を最速で学びたいあなたへ!
  • Stable Diffusionの基礎を2時間でマスター!
  • 高スペックPCがない方向けに徹底解説。
  • ControlNetなど、必須級の拡張機能も網羅。
  • 今話題のSDXL、AI動画生成も。
  • 特典として、大人気「おすすめ拡張機能・モデル解説」「プロンプト大全」つき!
\このボタン限定!70%オフキャンペーン実施中!/
70%オフキャンペーン実施中!/

単純マージと階層マージ

これを理解するにはU-NETの構造をおさらいしなくてはなりません。

https://arxiv.org/pdf/1505.04597.pdf

左から入力された情報がたたみ込まれながら深い層まで行き、徐々に拡大されながら最終的に画像として出力しています。

入力から最深部手前までをINPUT層、最深部から出力部分までをOUTPUT層と呼び、INPUT、OUTPUT層がそれぞれ12層と最深部の25層で形成されています。

浅い層では特徴は曖昧で位置情報は正確、深い層では特徴が局所的で位置情報は曖昧になります。

単純マージとは

モデルAとモデルBを3:7で単純マージしたとします。すると以下のようになります。

全ての階層で3:7の割合でモデルがマージされています。

これがいわゆる単純マージです。

階層マージとは

それぞれの階層でブレンド具合を変えて配合するマージ手法を階層マージと言います。図にするとこのようなイメージです。

でもなんでこんなにややこしい事をするのか不思議ですよね。

自分の理想の画像に近づけるために、日夜研究に励んでいる男たちがいます。

そういった男たちの熱い情熱と少年のような探究心がそれを支えているに違いないと確信しています。

各階層の影響

各階層のブレンド具合を変えた際にどのような影響があるかは、ネット界隈では盛んに議論されているところです。

しかしどの層を変えると美少女が生まれるなどと確定的な事は何も言えません。

全てのモデルが同じ条件で作成されているわけでは無いですし、学習の中身も違います。

そしてそれらは全て数値に変換され、たたみ込まれた空間の中で処理されています。

故に人々は階層マージのことを『沼』と表現します。

あくまでもU-NETは浅い層では特徴は曖昧で位置情報は正確深い層では特徴が局所的で位置情報は曖昧になる事を覚えておきましょう。

romptn Q&Aで画像生成の悩みを解決しよう!
  • Stable Diffusionのエラーが解決しない
  • 画像生成がうまくできない
  • おすすめのモデルが知りたい
など、AIに関するお悩みがあれば投稿してみてください。
詳しい人が解決してくれるかもしれません。

階層マージのやり方

とりあえずやってみるのが早いですので、拡張機能のSuper Mergerを使います。

拡張機能とモデルを用意する

Super Mergerの導入と使い方は以下の記事を参考にしてください。

モデルはなんでもいいのですが、階層マージをわかりやすく説明するには実写系とイラスト系をマージするのがいいかと思い、実写系はbeautifulRealistic_v7、イラスト系はflat2DAnimerge_v30の2つをWeight sumのnormalでマージしていきます。

まずはSuper Mergerにモデルをセットし、1:1の単純マージで画像を生成したものがこちらです。

flat2DAnimergeのベタ塗り感は無くなりましたが、実写系の要素も完全にありません。

ここからもっと実写系に寄せていきます。

beautifulRealistic_v7の要素を限りなく濃くするためINPUTのalpha値を0、OUTPUTのalpha値を0.0001にしてみます。

ちなみにBaseの部分はテキストエンコーダーに関わる値で、「1」だとその部分はflat2DAnimergeの要素のみということになります。

できた画像はこのような感じです。

イラスト要素が薄すぎて普通に実写系です。

今の設定の最深層(M00)のalpha値を0.5にして作成した画像がこちら

なんとなく画質が良くなった気がします。

もっとイラスト系に寄せたいのですが、その前にもう一度U-NETの構造を確認しましょう。

よく見るとinput③、input⑥、input⑨から直接output③、output⑥、output⑨、へ情報が返されています。

これは深い所の処理で喪失した位置情報を補完する為なのですが、この部分にイラスト要素を足して画像を生成してみます。

その③、⑥、⑨のalpha値を0.5にしてみます。できた画像はこちら

明らかに純粋な実写系とはタッチが変わってきました。

次は考え方を変えて浅い層1、2、3の部分と深い層10、11、12を極端に寄せてみます。

まずは浅い層をイラスト系寄り(alpha値0.6)、そのほかは実写系にして画像を生成してみます。

次は深い層のみ(alpha値0.6)で生成します。

これが好きです(笑)

この設定をベースにもう少し2.5次元モデルっぽくなるようにイラストよりに調整してみます。

そしてできたものはこちら

実写系寄りですが、懐かしさを感じる質感になりました。

これぐらいで満足しておきましょう。

だって「沼」ですから・・・・

ちなみに最終的なalpha値は

こちらになりますので、ぜひ参考にしてください。

まとめ

いかがでしたでしょうか?

Stable Diffusionの「階層マージ」とは?やり方や影響について詳しく解説について解説してきました。

今回のポイントをまとめると、以下のようになります。

  • 階層マージはU-NETの階層ごとにブレンド具合を変えるマージ手法である。
  • 階層マージは「沼」である。

Stable DiffusionでオリジナルのMergeモデルを作るのは比較的簡単です。

ただそれを商用利用する可能性があるならば、注意が必要です。

マージ自体を拒絶しているモデルも存在しますので、事前にライセンスを確認してください。

romptn Q&Aで画像生成の悩みを解決しよう!
  • Stable Diffusionのエラーが解決しない
  • 画像生成がうまくできない
  • おすすめのモデルが知りたい
など、AIに関するお悩みがあれば投稿してみてください。
詳しい人が解決してくれるかもしれません。