見出し画像

階層マージのやり方ととーふ流のモデル階層マージを徹底解説(階層マージ基礎編)

はじめに

今回は、

  • 単純マージ、階層マージとは何か

  • 筆者が実際にやっている階層マージの方法

の2本立てです。

前半部分は単純マージと階層マージの説明になります。
後半部分は階層マージの基本的な操作方法と、とーふ流モデル階層マージについてご紹介したいと思います。

階層マージって何?難しくない?という方、ちょっと待ってください!
一見難しそうですが、実際は全体を見ると単純です。
是非、階層マージにチャレンジしてみてください。

マージについて

マージとは、とても簡単に説明すると、複数の学習モデルに対して、係数(重み付け)を掛けて、モデルを混合(マージ)させることを指します。

画像生成AIにおける学習モデルのマージには、大きく2つに分かれており、単純マージと階層マージがあります。

単純マージとは

単純マージは、重み付き平均法を用いた加重補間、差分補間(Model BとModel Cの差分をModel Aへ補間される)があります。

これはいずれも、モデルの全体構造から補間するもので、レイヤ毎に加重補間、差分補間することはできません。

この機能は、AUTOMATIC1111版WebUIにBuild-Inされており、マージを初めてする方の取っ掛かりには最適です。

AUTOMATIC1111 WebUI - Checkpoint Merge

U-Netの構造

階層マージを説明する前に、まずU-Netの構造を知る必要があります。

出典元:U-Net: Convolutional Networks for Biomedical Image Segmentation - Fig.1
https://arxiv.org/pdf/1505.04597.pdf

Fig. 1. U-net architecture (example for 32x32 pixels in the lowest resolution). Each blue
box corresponds to a multi-channel feature map. The number of channels is denoted
on top of the box. The x-y-size is provided at the lower left edge of the box. White
boxes represent copied feature maps. The arrows denote the different operations.

as input. First, this network can localize. Secondly, the training data in terms
of patches is much larger than the number of training images. The resulting
network won the EM segmentation challenge at ISBI 2012 by a large margin.

Obviously, the strategy in Ciresan et al. [1] has two drawbacks. First, it
is quite slow because the network must be run separately for each patch, and
there is a lot of redundancy due to overlapping patches. Secondly, there is a
trade-off between localization accuracy and the use of context. Larger patches
require more max-pooling layers that reduce the localization accuracy, while
small patches allow the network to see only little context. More recent approaches
[11,4] proposed a classifier output that takes into account the features from
multiple layers. Good localization and the use of context are possible at the
same time.

In this paper, we build upon a more elegant architecture, the so-called “fully
convolutional network” [9]. We modify and extend this architecture such that it
works with very few training images and yields more precise segmentations; see
Figure 1. The main idea in [9] is to supplement a usual contracting network by
successive layers, where pooling operators are replaced by upsampling operators.
Hence, these layers increase the resolution of the output. In order to localize, high
resolution features from the contracting path are combined with the upsampled

出典元:U-Net: Convolutional Networks for Biomedical Image Segmentation
https://arxiv.org/pdf/1505.04597.pdf

英語ばっかりで意味が分からない!と思いますので、すごく簡単に要約します。

U-Netとは、ずばり、「画像内の物体の境界線(セグメンテーション)を推定する為のネットワーク」です。
もっと例を挙げると、明暗や線などの複数の情報を視認できるように、それらを推定する為の専門家(各レイヤ)が居て、それを受け渡していくネットワークのことですね。

そのネットワークがUの字(上図参照)に見えることから、U-Netと呼ばれています。

階層マージとは

階層マージとは、このU-Netの構造・仕組みを取り入れ、各層に係数(重み付け)を与えて、加重マージや差分マージなどを行うことを指します。

WebUI 拡張機能 - Merge Block Weighted スライダー部

ここまで聞いて、察しが良い方は気が付くかもしれません。
上の図に一杯レイヤのスライダーがあるけど、それぞれに影響する部位が存在する?」と。
答えとしてはYESです。
但し、これは学習手法の違いなどにより、モデル毎に影響するレイヤが違う可能性が大きいです。
これは、モデル学習する際のプロンプトの重みや、Tensor偏差に違いがあるためです。
つまり、〇〇の層は〇〇に影響ある!と明言することができません。

しかし、ある程度、このレイヤはここに影響するのではないか?など、国内・海外のフォーラム(5chやReddit、4chan)等で検証・推察は進んでいます。
かなり概略になってしまいますが、次項で各レイヤの影響部位についてご紹介しましょう。

各レイヤの影響

前項の内容を把握した上で、各レイヤの影響部位をご紹介します。
色々なWikiや、フォーラムを確認して得た情報から、私の方でマトリクスを纏めてみました。

U-Net各レイヤ影響 概略

何度も言うのですが、上図はあくまでも目安にしかなりません。
但し、上図を参考に、マージの配合を変えて微調整しましょう。


階層マージ方法

次は、ようやく階層マージの方法について説明します。

使用する拡張機能

筆者はいつもマージをする際、「Super Merger」を利用しています。

Super Merger外観

Super Mergerの機能で一番凄いところは、モデルマージをせず(実際は内部処理でマージしてる)、マージ後の生成イラストを出力(X/Y Plotも可)してくれるところです。

従来のマージ機能は、一度モデルをマージした後に、モデルを変更して、生成の変化を確認する必要がありましたが、Super Mergerはその悩みを解消してくれます。

これがないと、マージ沼からは絶対に這い上がってくることはできません。
これから階層マージする方は、迷わずにこれを是非インストールしてください。

WebUIへの拡張機能インストール方法については、いつも通りなので割愛させて頂きます。

使用モデル

今回、使用するモデルは変化が判別しやすいように、イラスト系モデルとリアル系モデルで行います。

[ 使用モデル ]
イラスト系モデル:SukiyakiMix v1.0(Vすき焼き様)

リアル系モデル:Chilled-Remix v1(鎖城郎郭様)

どちらも、CreativeML-OpenRAIL-Mライセンスのモデルなので、使用させて頂きました。

Super Mergerの使用方法

Super Mergerは標準のt2i機能を使い、マージ後のイメージ出力を行います。
なので、まずは構図を固定するために、t2iを回しましょう。
マージ後のイメージ出力は、現在設定のVAEに影響される為、VAEもこのタイミングで変更する場合は変更しておきましょう。
今回は、以下のプロンプトと設定値にします。

Prompt

best quality,masterpiece,illustration,beautiful detailed glow,textile shading,absurdres,highres,dynamic lighting,intricate detailed,beautiful eyes,
BREAK,
(pov:1.3),
BREAK,
(1 girl, solo:1.5),
(smile),
(jeans pants and frill shirts)

Negative Prompt

EasyNegative,
ng_deepnegative_v1_75t,
bad_prompt_version2

Sampler:DPM++ 2M Karras
Step:30
Hires.fix:Checked
Upscaler:None
Hires Step:30
Denosing Strength:0.5
Upscale:2
Size:512px × 768px
CFG Scale:11
Clip Skip:2
Seed:1959198349

次に、Super MergerにてModel AとModel Bを選択します。
今回は、イラスト系マージモデルを作成することにします。
ベースモデルがModel A、コンセプトモデル(要素を取り入れたいモデル)がModel B(またはModel C)となります。
これはどのマージ機能でも同様なので、覚えておきましょう。
生成イラストは基本的に、ベースモデル(Model A)の画風に寄ります。

Model A:SukiyakiMix v1.0
Model B:Chilled-Remix v1
と選択します。

Merge Modeは「Weight sum(加重マージ)」で行います。

モデル選択

続いて、「Calcutation Mode(算出モード)」ですが、今回は「通常」で行います。
use MBW」へチェックを入れることで、階層マージができるようになります。
alpha」と「beta」がありますが、今回は使用しない為、デフォルト値で行います。
これは、Merge Modeにおいての係数です。加重マージでは算出式上、「beta」は使用されません。

加重マージの算出式 A*(1-alpha)+B*alpha

各種主設定#1

続いて、「save setting」と「名前」と「merge from ID」ですが、一旦飛ばします。
名前は、マージモデルのファイル名になります。
既に決まっている場合でも、この時点で入力せず、マージ実行時に入力しましょう。
理由としては、マージ作業最終段階で、「Set from ID」ボタンをクリックするのですが、設定値が全て変わってしまうので、最後に設定を行います。
write merged model ID to」のみ設定しましょう。

  • write merged model ID to:image

各種主設定#2

次に、「Hires.fix , Batch size」設定です。
ここは普段、皆様がお使いになってる設定でOKです。
今回は、私が普段使っている以下設定にします。

  • バッチサイズ:1

  • hiresfix:Check

  • Upscaler:None

  • 高解像度ステップ数:30

  • ノイズ除去強度:0.5

  • 倍率:2

Hires.Fix Batch size設定

Elemental Mergeとは、その名の通り、「要素マージ」と呼ばれます。
階層マージをさらに細分化して、各レイヤの複数の要素ごとにマージを行える機能です。
さらに、自分好みにアレンジすることもできますが、マージ上級者向けの機能です。
今回は、基本的な使用方法の説明のため、Elemental Mergeは使用しませんが、
使用方法の一例のみ記載しておきます。

Elemental Merge

OUT00 OUT01:attn2 attn1.to_out:0.3

Elemental Merge使用例

「OUT00 OUT01:attn2 attn1.to_out:0.3」はOUT00、OUT01レイヤにおいて、「attn2」と「attn1.to_out」に含まれる要素の比率を「0.3」にし、マージされます。
Elemental Mergeは、私も利用することがありますが、基本は利用していません。
要素が多すぎて、比率を変えても微細な部分の変化にしかならない為です。
あくまで、最終的な微調整で使用する機能と思っても大丈夫です。(私は微調整で使用してます)
ちなみに、要素部分(attn2などの記載部分)を空欄にすると、指定レイヤの階層マージと同等の機能として働きます。

話が逸れましたが、次に行きます。
次は、X/Yのシーケンシャルパラメータです。
今回は通常算出なので、X軸は「seed」、Y軸は「mbw.alpha」のみの指定にします。

Model Aの生成イラストを確認したいので、設定値は以下で設定します。
seedは冒頭で固定した値にします。
mbw.alphaは「ALL_A」を利用してみましょう。

  • seed:1959198349

  • mbw.alpha:ALL_A

X/Y Sequential Merge Parameters

入力が終わりましたら、「Sequential XY Merge and Generation」をクリックしましょう。
生成したイラストがこちらになります。

ALL_A指定時

これが比較のベースとなります。
では、ここから本格的な比率配分を行います。

Seed値は固定なので、Y軸のmbw.alphaのパラメータを変更していきましょう。
今回はひとまず、マージプリセットを使用して行います。
Y gridの項目を、以下のように設定してみましょう。

GRAD_V
GRAD_A
FLAT_25
FLAT_75
R_SMOOTHSTEP*4
R_SMOOTHSTEP/4

マージプリセットは、画面下部にあります。

マージプリセット
Y grid Parameters変更

入力が終わりましたら、「Sequential XY Merge and Generation」をクリックしましょう。
生成したイラストがこちらになります。

今回は、イラスト系マージモデルを作りたいので、ぱっと見た感じ「FLAT_25」が良さそうですね。
では、FLAT_25で生成された際の「merge ID」を確認しましょう。
merge IDの表示は、イラスト左上部に黒文字で書かれています。merge IDは「123」ですね。

次に、再度画面上部に戻って、マージ出力の設定します。
画面上部に戻ったら、merge from IDに「123」と入力し「Set from ID」をクリックしましょう。

merge ID設定

上図のように、merge from ID以外は空欄になりましたので、次に進みましょう。

次に、save settingとマージモデル名を付けます。
今回のマージモデル名は「tofupiecesMix」としました。

  • save model:Checked

  • safetensors:Checked

  • fp16:Checked

  • 名前:tofupiecesMix

マージ出力設定

ここまで来たら、マージ作業最終段階です。
Merge!」をクリックしましょう。

マージが実行されると、バッチ画面には各種マージ設定が表示され、マージ処理が行われています。

マージ処理画面

マージ完了したら、早速出力をしてみましょう!
プロンプトと設定値は冒頭のものと同じものを使い実行してみます。

Prompt

best quality,masterpiece,illustration,beautiful detailed glow,textile shading,absurdres,highres,dynamic lighting,intricate detailed,beautiful eyes,
BREAK,
(pov:1.3),
BREAK,
(1 girl, solo:1.5),
(smile),
(jeans pants and frill shirts)

Negative Prompt

EasyNegative,
ng_deepnegative_v1_75t,
bad_prompt_version2

Sampler:DPM++ 2M Karras
Step:30
Hires.fix:Checked
Upscaler:None
Hires Step:30
Denosing Strength:0.5
Upscale:2
Size:512px × 768px
CFG Scale:11
Clip Skip:2
Seed:1959198349

マージ前とマージモデルで生成したイラストと比較してみましょう。

程よく印象が変わりましたね!
少しだけ、リアル調になってます。

とーふ流 モデル階層マージ

ついに本題です。
皆様、本当にお疲れさまです。

階層マージの基礎知識を覚えたところで、ここからは、私がモデルの階層マージをする際に、どんな感じで作業しているのか、ご説明します。
今回は前章で使用したモデルを使用して、ご紹介します。
前章で階層マージの方法をご紹介しましたので、詳しい操作方法については省きます。

フロー概略

とーふ流階層マージ作業の大まかなフローは以下です。

  1. マージモデルの最終系をイメージする

  2. 全体的な構造の変更程度を検討する

  3. ベースイラストのSeed値を確定させる

  4. 全体構造に変化を加えてみる

  5. 全体構造を微調整する

  6. 部位構造を微調整する

  7. マージ実施

以上のステップを踏んで、私はマージ作業をしています。

マージモデルの最終系をイメージする

初めに、どのようなモデルにしたいか、頭の中でイメージしてプロットを考えます。
Hugging FaceやCivitaiなどのモデル配布サイトで、出力イメージを眺めながら、頭の中でイメージしたイラストタッチに合うモデルを選定します。
この時、ライセンスの問題もあるので、しっかりと使用するモデルも検討しましょう。
使用するベースモデルとコンセプトモデルが決まったら、私はプロット表と呼んでますが、プロット表に割り当てていきます。

プロット表は、Excelやスプレッドシートなどで表を作り、ベースモデルとコンセプトモデルをメモするものです。
これはしっかり残しておいたほうが、後々幸せになります。

プロット表

今回は、ベースモデルがSukiyakiMix v1.0で、コンセプトモデルがChilled-Remix v1です。
コンセプトモデルの全体の雰囲気と背景をマージしたいので、このようにプロットを作成します。

プロット表入力例

全体的な構造の変更程度を検討する

全体的な構造とは、私がそう呼んでいるだけなのですが、ざっくり言うと生成されるイラスト全体の雰囲気のことです。
前項で説明した脳内のイメージを、要点だけを文字として書き起こすイメージです。
マージ前のメモ書きみたいなものです。

これも、Excelやスプレッドシートなどを使って、表を作り書き出しています。

マージ前メモ書き

今回は、以下のようにしてみます。

やりたいことを明確にすることで、最終的な着地点を打ち出しておきます。
ぼんやりしたイメージだけだと、マージの沼から抜け出せなくなるためです。

ベースイラストのSeed値を確定させる

では、ベースイラスト(変化を比べるための比較用イラスト)のSeed値を確定させましょう。
今回は、階層マージ方法で説明したものを利用します。
実際はプロンプトと設定値を決め、お好みの構図が出るまで回します。

Prompt

best quality,masterpiece,illustration,beautiful detailed glow,textile shading,absurdres,highres,dynamic lighting,intricate detailed,beautiful eyes,
BREAK,
(pov:1.3),
BREAK,
(1 girl, solo:1.5),
(smile),
(jeans pants and frill shirts)

Negative Prompt

EasyNegative,
ng_deepnegative_v1_75t,
bad_prompt_version2

Sampler:DPM++ 2M Karras
Step:30
Hires.fix:Checked
Upscaler:None
Hires Step:30
Denosing Strength:0.5
Upscale:2
Size:512px × 768px
CFG Scale:11
Clip Skip:2
Seed:1959198349

全体構造に変化を加えてみる

では実際に、全体的な変化を加えてみましょう。
まずは、マージプリセットを使う方法で私は実施しています。
変化の強度がどの程度発生するのか、イメージを掴むためです。

実際にやってみましょう。
今回は、以下のプリセットを利用します。

GRAD_V
GRAD_A
SMOOTHSTEP*4
R_SMOOTHSTEP*4
R_SMOOTHSTEP/4
Y grid parameters

今回のイメージ的には「SMOOTHSTEP*4」が近いです。
しかし、ちょっとリアルに寄りすぎてる気もします。

では、微調整を行っていきましょう。

全体構造と部位構造を微調整する

微調整でも、メモを取りやすいように自作の突貫で作った配合表を使っています。

配合表

横に長すぎるので、画像が小さくて申し訳ありません。

では、現時点での配合を埋めてみましょう。

配合表入力例

こんな感じになりました。
Excelで管理する理由としては、マージプリセットの値をコピーして、区切り位置(カンマ)でセル毎に分けられるので、管理がとても便利です。
ここから微調整していきます。

微調整時は、前章で説明した影響マトリクス図を見ながら行います。

影響マトリクス図

ひとまず、このようになりました。
変更箇所はセルを網掛けして、強調するようにしています。

配合表入力例

このままコピーだと、パラメータ入力の記載ルールでNGなので、タブをカンマに置き換えてください。
置き換える方法は、メモ帳で置き換えても良いですし、やりやすい方法で置き換えてください。
私は、エディタなどで一括置換で置き換えています。

入力するパラメータができたら、Y gridへ入力しましょう。

0,0,0.02025463,0.5,0.171875,0.15,0.15,0.625,0.822337963,0.962962963,0.734375,0.49537037,0.249421296,0,0.249421296,0.49537037,0.734375,0.962962963,0.822337963,0.625,0.44849537,0.296296296,0.171875,0.078703704,0.02025463,0
X/Y grid parameters

では、試しに生成してみましょう。

全体微調整例

まだ、リアル感が強いですね。
と、この作業を繰り返し行い、プロット表で纏めたイメージに近づけます。

で、最終的にできたのがこちら。

全体微調整例

今回は、同モデルで背景にも変化を加えたいので、背景に関する部分構造の微調整も行います。
全体構造と部分構造のコンセプトモデルが違う場合は、ここで一度マージしておきます。
今回は、同モデルで2つの要素に変化を加えたいので、このまま継続して行います。
やり方は、全体構造と同じです。
この作業を永延と繰り返します。

結果的に出来上がったのがこちら。

部分微調整例
配合表入力例

今回は、マージ手法の一例ですので、マージ回数は少ないですが、私の場合は5~8モデル程マージするので、もっと試行回数は多くなります。

モデルが完成したら、次はマージを実行しましょう。

マージ実行

マージ実行手順は階層マージの方法でも説明しましたので、大部分割愛させて頂きます。
今回はモデル名を「tofupiecesRMix」とします。

マージモデル完成

マージモデルが完成しました。
実際に試し打ちしてみましょう。

マージモデルでイラストを生成してみる

変わり映えしないのもあれなので、プロンプトを変更して試してみます。

Prompt

best quality,masterpiece,illustration,beautiful detailed glow,textile shading,absurdres,highres,dynamic lighting,intricate detailed,beautiful eyes,
BREAK,
[backlighting],face lighting,(pov:1.5),(face focus),
BREAK,
(1 girl, solo:1.5),black hair,(smile),blazer,
BREAK,
school route,summer,(blue sky),sunshine,windy

Negative Prompt

EasyNegative,
ng_deepnegative_v1_75t,
bad_prompt_version2

Sampler:DPM++ 2M Karras
Step:30
Hires.fix:Checked
Upscaler:None
Hires Step:30
Denosing Strength:0.5
Upscale:2
Size:512px × 768px
CFG Scale:11
Clip Skip:2
Seed:3877066738

マージモデル生成例

背景も人物もリアルチックっぽいイラストになっていますね!

おわりに

今回は、階層マージの方法と、とーふ流モデル階層マージ方法をお伝えしました!
かなりの大ボリュームになりましたね…ここまでで1.1万文字強です。
読破された方、本当にお疲れ様でした。

階層マージも慣れてくると、同じことの繰り返しになってくるので、思ったよりも難しくないのでは…?と思えてくるようになります。
ただ、そこに深みがあり、お気に入りのマージモデルが出来上がった時の達成感は格別です。

皆様も是非、この機会に階層マージチャレンジしてみてはいかがですか?

この記事が参加している募集

よろしければサポートお願いします!✨ 頂いたサポート費用は活動費(電気代や設備費用)に使わさせて頂きます!✨