階層マージ

Last-modified: 2024-12-02 (月) 19:46:11

階層マージについて

階層マージって何なのさ?

  • Stable diffusionで使われるモデルはU-Netと呼ばれるIN12層・中間層1層・OUT12層の合計25階層で構成されている。(SD1.5とSDXLは層の階数が違う事に注意)
  • さらに、Base Alphaを加えた計26層が階層マージの対象となる。
  • 階層マージはこの階層ひとつひとつをどれくらいの割合で混ぜ合わせるか個別に設定して行うマージである。
BASEINMIDOUT
BASEIN00IN01IN02IN03IN04IN05IN06IN07IN08IN09IN10IN11MIDOUT00OUT01OUT02OUT03OUT04OUT05OUT06OUT07OUT08OUT09OUT10OUT11

前提条件は?

階層マージ機能はStable Diffusion web UIにデフォルトではビルトインされていない。
対応するExtensionsの導入が必要。

階層マージ機能を持つExtensions

  • その他

でも深い沼なんでしょ?

U-Net25階層+Base Alphaの合計26もの設定項目がある上に、全ての層が出力される絵にお互いに影響しあっているためどこか一つを変えると絵全体が変化してしまう。
しかもどの層が絵のどんな要素に影響を持つのかが必ずしも明確でないため、望んだ結果を得るにはかなり途轍もない試行錯誤を要求される。
設定項目がBase1個しかない通常マージの時点ですでに沼なのに、設定項目26個の階層マージは実際深い。
俺たちは雰囲気でマージをやっている。

だから浅いとこで遊ぼうね

階層マージを導入したものの26個のスライダーを前に途方にくれているとしあきたちよ。
そんなとしあきのために「既定値(preset)」と呼ばれるマージの設定が用意されているのでこの範囲で階層マージを試してみるのだ。

既定値の紹介と、その利用方法

従来のマージ(参考)

実例としてBrainDanceとQteamixQをお借りした。
階層マージの紹介に移る前に、この2つのモデルを通常のマージで50:50で混ぜるとこうなる。
NORMALmerge.jpg
主線をほとんど取らずソフトな塗りのBrainDnace(左端)と、ぶっとい主線にアニメ塗りに何も言わなくてもchibiにするQteamixQ(右端)。
真ん中がマージしたモデルで、主線の太さや背景の精緻さあたりにお互いの中間の性質を取っている様子がうかがえる。

GRAD_V

U-Netの浅層から深層に向かってグラデーション状に置き換えていく既定値。
「model Aの構図を(ある程度)維持したまま塗りだけmodel Bを移植する」ことができるため、この階層マージの有用性は極めて高い。
GRADVmerge.jpg
左から2番目はBrainDanceをmodel Aに、QteamixQをmodel Bに設定したもの。左から3番目はAとBを入れ替えたものになる。
model Aの服やポーズがだいたい維持された状態で、塗りだけmodel Bに置き換わっている。
全ての層がお互いに影響しあう関係でGRAD_Vだけで完全に元の特徴を維持できるわけではないが、完璧を求めだすとそこから先は深い沼だぞ!

FLAT

全ての層を同じ割合で混ぜる既定値。
これだけだと通常マージと同じなのだがBase Alphaの値をいじれるのが通常マージと異なる。
FLATmerge.jpg
左から2番目がFLATで50%ずつU-Net全ての層を混ぜるが、Base Alphaだけは完全にBrainDanceのままにしたものである。
通常マージするとBase AlphaとU-Netの相性が悪くなり、望まない欠点が出る場合がある。
この画像では左から3番目が通常マージしたものなのだが、瞳の書き込み具合が劣化して目線がどこを向いているか分からない等の欠点が出ている。
階層マージでBrainDanceのBase Alphaを維持してやった結果、瞳の書き込みや背景の精緻さがかなりキープされるといった改善が見られた。
FLATは、通常マージしたがどうもmodel Aにもmodel Bにも存在しない破綻が目立つというときに試してみるべき既定値である。

RING

U-Net深層の一部だけをmoel Bに置き換える既定値。
「model Aの構図や塗りを(ある程度)維持したままmodel Bの顔だけ移植する」ときに用いる。
BrainDanceとQteamixQではあまりに画風が違いすぎてRINGの解説に適さなかったので、ここではhimawari mixをお借りした。
RINGmerge.jpg
ちょっと変化の幅が大きいのだが、ツインテールではなくお下げ・巨乳・セーターの質感・細い主線・精緻な背景などBrainDanceの特徴を残しつつ、顔はタレ目になり口の形もhimawari mixに近づいたのがおわかりいただけるだろうか。
モデルの塗りも構図も気に入ってるけど鼻の穴まで描くような写実的な顔だけが気に入らないというようなときに試す既定値である。
既定値ポン混ぜだと混ざりすぎたり混ざらなさすぎたりするので、RINGを試すときはBase Alphaの値をいろいろいじってみてほしい。

WRAP

U-Netの浅層を完全にmodel Bに置き換えてしまう既定値。
使い方はGRAD_Vと似ているが、GRAD_Vより過激な変化が起きる。
WRAPmerge.jpg
GRAD_Vでは移植具合が中途半端というときに使う既定値だが、これもRING同様Base Alphaの値をいろいろいじって試行錯誤してほしい。

もう少し深みへ行きますか?

  • 既定値(preset)でもモデルに変化が加わって楽しかったでしょ?
    ある程度満足行く結果が得られたらそれで十分です。
  • でもマージしたモデルのここがもうちょっとこう...そんな色々欲が出てくるもんです。
    じゃあもうちょっとマージ沼の深みへ足を踏み入れてみましょう。

Baseについて

いわゆるText Encoderと呼ばれる部分がこのBaseです。

例としてモデルAにlametta_v1745、BにRabbit_v6を設定します。

  • 以下の画像は、Baseを0~1まで0.1づつ変化させた推移です。

    tmp00twkjll.jpg

    ←lametta_v1745寄り
    Rabbit_v6寄り→
  • 翻訳の変化を見るため、残りのU-Net25階層はすべて0することで、lametta側へ振り切って固定します。
  • つまり、Base:0はlametta_v1745そのもの、Base:1はlametta_v1745のU-NetにRabbit_v6のText Encoderを乗せたものということになります。

雰囲気だけ見てください。
どちらもコンピューターへ向かう女の子の絵として成立していますが、

  • 右と左で女の子の向きが変わっています。
  • 頭身も違うようです。
  • Base:0.5~0.7は腕が増えています。
  • 下半身の様子もなんだか奇妙に見えます。

このようにBase部分の変化だけでも絵の雰囲気は変わります。

ならばそのBaseとやらも調整すれば良いんでしょ?

確かにそうですが、Baseをマージするということはそれぞれのモデルのプロンプトの反応具合が混ざります。
どう混ざるか次第では特定のプロンプトの反応がものすごく悪くなる可能性がありますし、その逆にいまいち反応が悪かったモデルが改善するということも起こり得ます。

  • 多分マージモデルで元のモデルで使えていたプロンプトが効かなくなったりするのはこれが原因。

マージ素材となっている2つのモデルはもともとBaseとU-Netがある程度完成された(=BaseとU-Netがマッチングされた)状態で存在していたわけですが、U-NET部分のマージでBaseとの兼ね合いはある程度の破綻が起きているはずです。
例えるなら英語の通訳がいる職場で意思疎通が出来ていたところに別の言語の方が入ってきたら、言葉がいまいち通じなくて困っちゃう・・・そんな感じです。
通訳に別の言語も覚えてもらう=Base部分のマッチングを取ることでU-NET部分でのマージ比率に自由度が得られて調整が容易になると感じます。
筆者の個人的な感覚ではBaseはチョイ足し位の範囲(~0.3とか?)で調整することが多いです*1

また先のlametta_v1745とRabbit_v6の実験のとおりBase部分の調整次第で体つきや顔の雰囲気、塗りの具合なども大きく変化します。
U-NETで調整することも可能な部分ですがBaseも含めて調整を行うことでより好みに近づけやすくなると思います。

先に述べた通り特定のプロンプトの反応がものすごく悪くなるパターンもあります。その場合は軸にしたい(=プロンプトの反応が自分好み)なモデルへ振り切るほうが悩まなくて良いでしょう。
U-NETのマージ比率調整を頑張ることでBaseのアンマッチもある程度乗り越えられます。

実際のワークフロー

Baseもなんだか大事そうなことがわかりました
これを踏まえてここではBaseを調整を含めてある程度破綻が起きにくい(かもしれない?)モデルマージワークフローの一例をお見せします。

この手法が果たして良いのか悪いのか… 単に筆者が良いと思いこんでいるだけかもしれません。エイヤで即階層調整をしたほうが近道の時もあります。こういうやり方もあるのねくらいで見ていただけたらと。

前提として

  • 「モデルをマージして別のモデルを作る」という前提で書かせていただきます。
    • 「あるモデルのどこそこの雰囲気だけがほしい」という期待とはちょっと違うかもしれませんが、それでもある程度の参考になる可能性はあります。
  • 使うツールは下記で話を進めます。
    • SuperMerger
    • Merge Modeは「Weight sum」
    • Calculation Modeは 「normal」
      ※もちろん他のモードも駆使しても問題ないですが、話を簡単にするためにです

モデルはそれぞれある程度使い込んでおきましょう

マージするモデルは、「それぞれ好みの呪文とかでどんな挙動をするのか」等、特性を把握しておいたほうが良いです。
実は「特定のプロンプトの反応がものすごく悪い子」かもしれませんので悪癖がないかざっくり見ておきます。
悪癖があってもマージ素材として使えますが、その悪癖を矯正しつつ好みのモデルに仕上げる場合はちょっと大変になるかもしれません。

アタリを取ります

マージ比率はどのくらいが良いか?
そのアタリを取るために、通常マージかプリセット階層マージで、複数回トライ&エラーをします。

  • ただしランダムはお勧めしない。ランダムで一発成功はまずあり得ない。数値もバラバラなのでアタリも取りにくい。

設定のコツ

  • プロンプトは自分の好きなやつで固定します。
    • 指定が多すぎると破綻しているのかそうでないのかがわからなくなるので、個人的にはあっさりめにしています。
  • ネガは特にあっさりめ、例えば(worst quality, low quality:1.4),とかだけ。
    • ネガで破綻を抑え込んだらモデルの弱点がわからなくなるので。TIも出来上がってから組み合わせてみるのがいいかも。
    • (調整に使ったTIを必ず唱える前提なら入れてもいいと思うよ)
  • seedは適度に変えます。(同じseedで変えずに徹底的にやるのもアリ)
    • seedによって「こんなのダメじゃん」ってのに当たる可能性もありますが、
      数回アタリを取るうちに実は結構良いかも?ってなるパターンもよくあります。
  • こだわるならプロンプトも変えて複数アタリを取ります、ただしプロンプトを変えた後の3出力はブレるので見ないで捨てるかな。
  • 通常マージならXYZ Plot機能を使ってアタリを取ると楽できます
    sqa.png
    • X type:alpha
    • Sequential Merge Parameters:1,0.95,0.9,0.85,0.8,0.75,0.7,0.65,0.6,0.55,0.5,0.45,0.4,0.35,0.3,0.25,0.2,0.15,0.1,0.05,0.0
      ※比率は1がモデルB側、0がA側です。
      例えば、0.3ならAが7割・Bが3割の比率ということになります。
      ※刻み間隔は個人の好みで、マシンパワー*2などと相談して好きな値に書き換えてください。

上記の設定でSequential XY Merge and Generationすると、通常マージの比率を1~0まで0.05刻みで変化させてどんな絵が出るか見ることが出来ます。

  • プリセット階層マージ...はごめんなさい実は使ったことが有りません、好みのプリセットで幾枚か出力して良さげなものを使ってください?
    • プリセットはほぼ使わないと思われる。階層設定の定番のようなものは全くないように思えるので…
  • 時に最初の一枚目は腕が増えたりしてうわーってなる数値も、幾枚か出してみると実はそうでもなくてたまたまだったってこともありますがら、最初から先入観は持たないほうが良いです。
    • AIでは指が腕が増えるぐらいは割と日常だったりする。マージをやる時はあまり気にしすぎない事も大事。
  • 何度か出力してこれだー!という雰囲気が良い比率を見つけたら、そのマージ比率をメモしておいてください。
    • 1.0~0.0の間で1点だけかもしれないし2つ,3つ良さそうな数値があるかも。その時は複数メモしておいてください。
    • ついでに破綻が少なめな比率であれば階層を調整する時に比較的楽もできると思います。

もし、この段階でもういいモデルが出来てしまったなら、沼卒業でいいと思いますよ。この先本当に大変ですし。

適宜、Adjust設定をする

アタリを取っているうちに色味などに不満があればAdjust settingsを調整します。
必須ではないため、読み飛ばしてもOKです。

 

個人的にはIN、OUT、OUT2、Contrastは使いこなせていません。
プラスに振ると書き込みが増えすぎて破綻しやすいモデルになる可能性が高いと感じます。あえてマイナス適用して描き込みがうるさいモデルを大人しくさせる方向で使うのはたまにやるかも。
書き込みを増やしたいなら完成してからflat LoRAとかでも解決するのでここでこだわりすぎないのが良いと思いました。
色味がおかしいモデル(青みが強いとか暖色に転ぶとか)はColor1~3で調整しておきます。
Adjustをいじった場合は色味だけでも細部が変化することが多いので再度アタリ取り直しが必要かも。といってもAdjustへよほど大きな値を適用していない限りは無視して良いかも

そこそこのアタリが取れたら

通常マージでアタリを取ったALPHAの値を、Merging Block Weightsの26全階層へ同じ値を代入します。
(つまり、通常マージと同じ状態になります)
プリセットならそのプリセットのまま。

baseをシーケンシャルで1.0~0.0まで流して様子を見る

上で述べていたbaseのマッチングをXYZ Plot機能で取ります、基本的な設定や手順はアタリを取ったときと同じです。

sqb_0.png

  • X type:pinpoint blocks(alpha or ...)
  • Sequential Merge Parameters:BASE(←必ず半角大文字で記入、block IDsのところからも代入可能)
  • Y type:alpha
  • Y grid (Disabled if blank):1,0.95,0.9,0.85,0.8,0.75,0.7,0.65,0.6,0.55,0.5,0.45,0.4,0.35,0.3,0.25,0.2,0.15,0.1,0.05,0.0
  • これでIN00~M00~OUT11までを固定しつつbaseを1~0まで0.05刻みで変化させてどのような出力になるかを確認できます
    いくつか良さげな数値のポイントが有ると思うので良さげな数値をメモしておきます。
    • 良さげな数値が見つからない、気に入らないのであればアタリ取りの時に控えた他の数値の比率を26層に代入し直して試してください。
      じっくり別seedで何枚もシーケンシャルして好みの数値を割り出してください。

もし、この段階でいいモデルが出来てしまったら、沼卒業でいいと思いますよ。
下手に階層をいじると崩れちゃうかもしれませんし。

ああほんと沼ですね?

おっしゃるとおりです。
でも満足行くモデルを突き詰めたい!という情熱があれば多分泳ぎきれます。疲れたらまた明日やってもいいと思います。一朝一夕でさくっととはいかないので根気勝負です。
ということで?アタリ取り~base調整までじっくりお楽しみください。途中気が変わってマージするモデルを変更するなども有りかもしれません。
この段階でどこまで突き詰めるかは人それぞれですが、少なくとも全体の雰囲気とプロンプトの応答性は確認しておいてください。
手足や胸や陰部などの細かい部分は階層調整で対応できます。

いよいよ階層の調整

前段まででどの階層を調整して仕上げようという方向性は決まっていると思います。指がもうちょっときれいにならないかとか、顔を好みに、塗りを...と
もちろんbaseは先程の調整済みの値に設定して適用しておいてください。

各層については私もよくわかりませんが、決め打ちで層の解説しているのは半分嘘で半分本当だと思います。
おおまかにいえば

  • IN層は入力された絵を階層を経るごとにサイズを縮小しつつ特徴の洗い出しをおこなう、数値が大きい層ほど畳まれた小さい絵の特徴をサーチするので細かい部分が変わる
  • OUT層はINで縮小された絵を階層を経るごとにサイズを拡大しつつまとめ上げるので、数値が大きい層ほど展開された大きな絵へ書き込むから全体の描画がなされる

これは私見ですが絵の画角に対してよくある構図の絵であれば、畳まれて(展開されて)行く最中に特徴のサーチを行ったり描画される箇所が特定の層でだいたいおなじに重なるからその層はこれこれだ!となるように感じます。
「好ましい絵のパターンはある程度は決まっている」という前提の中であれば、先人によって培われた調整・出力の経験則はそれなりの参考にはできるかなあ?といったところです。

例えば某U-NETの図解ではIN00層が指と名指しされていますが、実際にはIN00~05付近の調整でいずれも変化があり、さらにIN深層(IN09~11とか)や、OUT00、OUT11~7などの値の取り方でも変わってきます。
感覚として、絵の奥行きで指が前面にあるか中間付近か奥のほうかで対応する層が変わります。
手が近景だと指がキレイなのにちょっと遠景気味になるとすぐグズグズになる場合は、指が少し奥まった描写のプロンプトやSEEDの出力を持ってきて調整すると改善するかと思います。
(とはいえSD1.5だとその仕組み上細かい部分を詰めるのは大変ですし、そこに気を取られて数値を設定すると別の箇所が破綻したりするのですけどね)

ざっくり

  • IN層は入力された画像の特徴を洗い出ししつつプロンプトの反映を行う
    • IN00~04・05は全体のアタリっぽい層なのでどちらか好みのモデル方向へ振り切ってみるのも手、(04~)05は絵の主体(女の子とか)のアタリに相当しやすいような?
    • IN06は大きく変化することが少なめ
    • IN07,08は主体の細部(顔とか胸とか陰部とか)に変化があるがもちろん全体も変わる
    • IN09~11色々変わるどれがどれとは言えない領域、ここの調整を丁寧に行うと破綻が減るかもという印象
 
  • M00はINでまとめた特徴をOUTで出力する準備でもやってるんじゃないかな
    • MID層は性質的にはIN層OUT層に近い。しかしこの層がモデルに与える影響は大きい。
 
  • OUT層はIN側からスキップコネクションで情報をもらい逸脱を防ぎつつ出力を担当
    • OUT00~02
      IN09~11に対応した層
      ここはINでまとめた情報のうちまずは細部を決めているのかな?
    • OUT03~05
      IN06~8に対応しているので主体の細部に大きく関与する、顔とか陰部とかかな?
    • OUT06~08
      IN05~03に対応しているので絵の全体へ関わってくる、OUT07と08(その周辺の層も)案外指にも効いてくるよ
    • OUT09~11
      IN00~02に対応しているOUT11~10が色味ってのは多分そう、でも顔つきなども変わるのでこの付近の調整でぐぬぬってなるよね

※各層については別のとしあきがその印象を語ってくれることを期待しています!

※個人の感想注意
層に決められた役割とかは無い・・・と思う。
画像生成AIは画像全体をノイズから絵に変化させる、逆再生のような事をやっているので各層の影響は全体的であると思われる。
〇〇が変わった、というのは、今回変わったのがたまたまそこだった、というだけで、早い話がランダム。
強いて言えばどこかに画像全体の塗りや画風を動かしている層はあるかもしれない。

といった具合で数値をちょいちょい変えながらより良い出力を求めてみてください。0.01でも変えれば思わぬ変化を得ることもありますし、大きく数値を変えてもあまり変化しないこともありますね。
OUT層については先述のスキップコネクションでIN層から情報をお漏らしして貰っているので対応したIN層の数値次第でも変化の具合が変わります。

感覚的で難しいですが、いくつかの層にまたがって出力結果を左右しているという点は頭の片隅に留めておいてください。
特定の1層だけの変更でイメージ通りになればそれに越したことは有りませんが、上手くいかない時は(特にOUT層は)その前後付近やスキップコネクションで繋がっている層なども合わせて変更すると良いでしょう。

何ならU-Netが固まった時点でまたbaseを調整してみても面白いかもしれません。

階層マージのTips

  • 安定感あるモデルと言ってもあまりかっちりさせ過ぎない気持ちが大事です。
    10枚出力して2枚くらい変なのがあってもいいじゃないですか!くらいでやったほうが気楽にできます。10枚で2枚の数字は適当です自分で高すぎない程度の基準決めてね。
  • 上記で0.05づつシーケンシャルして良さげな値を探っていましたが、その良さげな数値付近を0.01刻みとかで更にシーケンシャルするとより突き詰めたものになります。大変ですけどね。
  • 各種調整時に胸元の主張を強くしておくと結果破綻が減る傾向を感じています。
    huge breasts,puffy nipples,とか唱えておくと着衣のおかしいところ(ブラ紐だけ描画されてカップがないとか)や脱がせた時にうずまき乳首になるなどわかりやすいと思います。
    胸が大きいと腕やその他の部位との兼ね合いに制限が生じるのでそこの捌きがうまくなるように感じるのですが気のせいかも?
  • シーケンシャルマージの活用
    上の方でシーケンシャルでbaseの良さげな値を探りましたが、階層にも使えるのでこいつで値を調整して行ってもいいと思います。
    IN00から順番にいい値を拾って行って代入して適用して次の層をシーケンシャルなんてやり方も面白いかもしれませんね。
  • ある層をいじって絵が変わった!でも別の層をいじると絵が戻った!?ということもあります。
    OUT7で指の具合が悪化したのをそのままにOUT8の数値次第で元に戻すなんて事もできたり出来なかったりします。ホント沼だね。

さらなる深淵へ

階層マージの沼はまだまだ深いのです...

その前に

とは言ったものの強敵を打ち倒すには相応の準備ってものが必要なのでちょっと知識編としてMerge ModeやCalculation Modeについて触れておきます。

Merge Mode

マージの比率を決める計算式ですね

  • Weight sum:A*(1-alpha)+B*alpha
    よくつかうやつです、2つのモデルをalphaの比率で加重平均を取ってまぜこぜします
  • Add difference:A+(B-C)*alpha
    3つのモデルを指定してAに対してBからCの引き算されたモデルにalphaを掛けたものを混ぜています
    よく見るとAに対してはalphaの倍率が掛からないのがこれの特徴です
  • Triple sum:A*(1-alpha-beta)+B*alpha+C*beta
    3つのモデルを加重平均するモードです。それぞれのモデルをalphaとbetaの比率で掛け算してから足しています
    3つをバランスよく配合する時に使えるモードです
  • Sum Twice:(A*(1-alpha)+B*alpha)*(1-beta)+C*beta
    2回Weight sumを行うモードです。AとBをalphaの比率でまぜこぜして一時モデルを作ります。この一時モデルとCでbetaの比率でまぜこぜするそういう処理です
    2回Weight sumを行う処理を一度に行えるのでやることが決まっているのであれば便利かもしれません

Calculation Mode

分かる範囲で書きますね

  • normal
    alphaやbetaの比率で加重平均を取るモードです、こいつにはいつもお世話になっています。
  • cosineA (cosineB)
    • 時間が掛かる&かなりCPU負荷がかかるので注意。CUDAを使えば高速化できるが結果が変わってしまう。
  • cosineAはモデルAをベースとしてモデルBとの共通点(cosineBはその逆です)をまず計算します。
    その上でモデルA・B共にもっている要素の共通点のA寄りにマージする、ざっくりそんなモードです。
    処理の途中で異常値の切り捨てなども行っているので、何らかの原因でモデル内部の数値が異常になったモデルを正常化することも期待できます。
  • smoothAdd(smoothAdd MT)
    Add differenceでしか使えないモードです。BとCの差分をAへスムーズにマージするとかなんとか。
    処理の途中でメディアンフィルターやガウスフィルターをかけてBとCの差からくるノイズを減らしてAへ適用するそんなやつです。
    MTはマルチスレッドの略のようで(8スレッド?)処理速度が改善されています。
  • tensor(tensor2)
    U-Netは25階層だと言ったがあれは嘘だ、各層は更に細かいブロックに分かれている...
    ということで768ブロック?768tensorでしたっけ?をalphaやbetaの比率でそっくり入れ替えるモードです
    tensor.jpg
    出典:https://github.com/hako-mikan/sd-webui-supermerger/blob/images/tensor.jpg
    alphaが入れ替える範囲、betaが入れ替え開始位置そんな感じです。
    要素をまるっと入れ替えるので時に面白い効果が得られますから深く考えずに試してみると良いでしょう。処理速度も早いです。
    tensor2はtensorとは別の次元を入れ替えるモードになるのでまた結果が変わります。
  • trainDifference
    • cosineより更に重い負荷がかかるので注意。
      smoothAddみたいにAdd difference専用モードです。
      名前の通りトレーニングした内容の差分をどうこうする時に有効らしいです。
  • self
    マージのようでマージじゃない特殊なモード。とりあえずこのモードではAとBには同じモデルを指定します。
    alphaを指定してマージするとあら不思議!モデルの各パラメータがalpha倍して出力されるそんなモードです(なんのこっちゃ)。
  • extract
    BとCの共通部分を計算するモード。
    おそらくtrainDifferenceの次に処理が重い。

Elementalマージ

Calculation Modeのtensorで述べたように階層はもっと細かい要素で構成されています。その細かい要素単位でマージを行うのがElementalマージです。
U-Netの学術的な仕組みとその要素構成についてざっくり理解した上で取り組む項目と思います。
また要素は膨大な数があるので特定の目的、例えばIN側Attentionをマージしてプロンプトへの反応を調整するとかそんな微調整を行うのが一般的かもしれません。

注意

Civitai等で公開されているモデルにはユーザーの利用法に制限がかかっている場合がある。
マージモデルの配布禁止や使用時にクレジット表記必須などの利用条件を確認してからマージしようね。
モデル作者さんへのリスペクトは忘れてはいけないのだ。

互換性について

基本的なことだがモデルに(SD1.5、SD2、XL等)世代毎の互換性はない。
また、優秀な次世代モデルが出ると古いモデルは全く使われなくなってしまう事も。
後で全部捨てる事になっても泣かない

LoRAについて

出来の良いモデル=LoRAとの適正が高いとは限らない。
マージで良いモデルが出来ても元となった古いモデルはLoRAのために置いておく。あるいはLoRAの方を作り直す。

最近の傾向

今流行りのIllustrious-XLの登場によってそれの派生モデルがかなり混沌としてきている。
また質の高いモデルが増えたため、適当にマージすると逆に劣化してしまいがち。
失敗してもそれが普通だと考えていい。


*1 U-Netをどんな比率で混ぜたかにもよりますが
*2 これやるとそこそこ時間がかかる
閉じる