#contents

*U-Netとは何か。 [#i7be97ea]
U-Net「拡散モデル」は、SD1.5やSDXLで使われていた画像生成モデルです。
-SD3、FLUX.1やQwen-Imageでは[[DiT]]およびFlow Matchingモデルが採用されており、U-Netは使われていません。
--しかし、歴史的経緯でComfyUIなどではDiTモデルに関しても「unet_...」といった変数名などが使われていることがあります。
--画像生成以外の分野では[[CNN]]の代わりにTransformerを採用したU-Netもありますが、DiTとは全然別のものです。

※
U-Net拡散モデルとして実用レベルで普及したオープンなものがStable Diffusion(バージョン3.0より前)しかない為、
事実上 U-Net拡散モデル≒LDM(潜在拡散モデル)=SDと考えて差し支えない。
SDより前の拡散モデルではプロンプトを受け取る機能がない(当然テキストエンコーダともつながっていない)など、SDのU-Netとは大幅に構造が異なる。

**簡単に言うと? [#j7c44d48]
-U-Netは、画像を入力として画像を返すアーキテクチャです。
-オリジナルのU-Netは、画像内の物体やパターンの特徴を自動的に識別し、それらの特徴の境界(物体と背景などさまざま)を詳細に抽出し特徴マップとして返すものです。
-Stable Diffusionでは、画像から特徴量を抽出、それに加えてエンコードされたプロンプトを入力とし、画像から除去すべきノイズを返す装置としてU-Net拡散モデルを使っています。
--ノイズは生成処理の実行時に「Denoising strength」に応じた量(txt2imgなら100%)付加されます。

つまりSDでは、

板の木目を見て「人の顔みたいに見えるなあ」とか、部屋の真ん中に落ちているティッシュを見て「ゴミ箱に捨てたほうがいいなあ」とか、そんな感じの推論を行っています。

***なぜ、U-Netと呼ばれるの? [#q6a0da01]
-U字構造になっているネットワークだからです。

***なんでノイズを予測させるの? [#q20c334f]
ノイズを予想させたほうが誤差が蓄積しにくいからです。
-拡散モデルで使うノイズは「数学的に都合がいい」ガウシアンノイズです。ピンクノイズのような自然なノイズではありません。
-通常の画像では、低周波数帯(ライティングなどの大域的構造)~中周波数帯(顔や腕など、中間的な大きさの構造)が支配的です。くっきりとした線といった高周波帯はあまりありません。
-これに対し、ガウシアンノイズは全周波数帯フラットなため、比較すると画像よりチリチリとした高周波数帯の成分が多く含まれています。
-ノイズはランダムに撒かれるため、微細な構造である高周波数帯が真っ先に破壊されます。
-大域構造はその大きさから、かなりの量のノイズが撒かれても痕跡を拾いやすいです。
-このため、AIにノイズ除去タスクを学ばせると%%%低周波数帯から高周波数帯に向かって復元される傾向があります%%%。
-ノイズεを予測させた場合、モデルは学習時と同じだけのノイズが含まれているという前提で(実際には滑らかだったとしても)高周波ノイズを削りに行きます。
--ε予測では、予測ミスでボコボコに穴を開けたとしても後のステップの予測で誤差が修正されやすいです。
-しかし教師画像x0を予測させた場合は、ノイズの中から低周波帯の大域的構造の痕跡を探すようになります。
--x0予測では、早期に生じた低周波数帯の予測ミスはそのまま固定化されてしまい、誤差が増幅されやすくなります。
--また高周波成分は近接領域との差異が激しいため誤って線のないところに線を引こうとしたりすると減点が大きく、結果としてx0予測モデルにはディテールを甘くするバイアスがかかります。
(ε予測の場合は高周波ノイズを当てられないと点数が上がらないので、x0予測よりはディテールを復元しやすくなります)


**情報元 [#h80ceff9]
原文に近い情報はこれ。
-https://huggingface.co/papers/1505.04597
--http://lmb.informatik.uni-freiburg.de/people/ronneber/u-net
--https://arxiv.org/abs/1505.04597

*diffusers [#rb486291]
-当機能はdiffusersに実装されている。
よって、詳細なレイヤー名を知りたいときは、diffusersを検索することになる?

https://huggingface.co/docs/diffusers/index
https://github.com/huggingface/diffusers

*U-Netの構造 [#je775747]
U-Netの構造は複雑であり、1枚の絵だけでは可視化しきれない。
当wikiに関係する、いろいろな視点で集めてみる。

**生成行程でU-Netが使われている場所 [#b9ea431c]
下図の「拡散モデル」の部分で使われています。

#ref(./260620_01_モデルの役割_2.png,80%)
CENTER:i2iのイメージ図。としあき自作

**arXiv出典より [#ze61566a]
虫の目と鳥の目を段階的に使い分けるアルゴリズムです。
たとえばゴスロリであれば虫の目では「フリルやリボンでひらひらしている」、鳥の目では「全体的に黒っぽい」というイメージで、木も森も見て特徴を認識します((これに対し、例えばアップスケーラーのESRGANは虫の目に特化していて画風を崩さずに拡大するのは得意だが全体のバランスを見てディティールを描き足すのはそこまで得意ではない。))。

※以下はオリジナルの(画損「生成」ではなく、画像「解析」モデルとしての)U-Netの構造です。Stable Diffusionで画像生成に使っているU-Net拡散モデルとは異なる点もあります。
[[階層マージ]]のページも併せて読むと理解が進む、かもしれない。

&attachref(./U-Net構造 struc_from_arXiv1505.04597.png);
引用:https://arxiv.org/abs/1505.04597

#br
-図左上から中央下にかけての部分は基本的な[[CNN]]。
572✕572pxの画像を、最小解像度32✕32pxまでダウンサンプリング。
結果として、ノイズだらけのぼやけた画像になる。
この左側の役割を担うのがEncoder(エンコーダ)((U-Net内のエンコーダ/デコーダはあくまでU-Net内部のものであり、[[VAE]]とは異なる。))

-図中央下から右にかけて、
32✕32pxの画像を、388✕388pxまでアップサンプリング。
この結果が出力したい画像になる。
この右側の役割を担うのがDecoder(デコーダ)

-Encoderの過程では、
--特徴量を抽出する(フィルタリング)。
--サイズダウンして、計算コストを削減する

-ただしそのままだとボケるので、Encoderの各段階の特徴マップを対応するDecoderの対応段階へ結合する「スキップ接続」があるのが従来の[[CNN]]との違い

**LyCORISより [#x965ff61]
&attachref(LyCORIS/221555165-7b0a1b96-0cc4-4ec4-bdd7-559a43002c65.png);
引用:https://github.com/KohakuBlueleaf/LyCORIS/tree/locon-archive#difference-from-training-lora-on-stable-diffusion

図は、LyCORISで学習できる単位の一例。

*U-Net拡散モデルの長所 [#sf4b0fc7]
-各層の役割が分かりやすいので[[階層マージ]]みたいな調整ができる。
-(発表当時としては)プロンプト忠実性が高い。
--生成ステップ数がかさむのでステップ毎にプロンプトを介入させられるという、怪我の功名的な部分もある。
--プロンプトによる条件付けはオリジナルのU-Netには(どころか初期の拡散モデルにも)ない。[[Transformer>transformers]]をGPTに応用して成果を出しつつあったOpenAIが、DALL·E 2開発の際にTransformerアーキテクチャから借用したCross-Attention機構を後付けでU-Netに追加し、プロンプトによる条件付けを実用化した。SDのテキストエンコーダとして使われている[[CLIP]]もOpenAIの製品である。DALL·E 2はクローズドソースなので詳細は不明だが、Stable Diffusionはそれらの先行例を後追いしたもの。
-多様な画像を生成できる。初期拡散モデルの研究では当時の画像生成AIの主流だった[[GAN]]の「生成結果が偏りやすい」という弱点が強く意識されていた。
-(発表当時としては)画質が良い。
-塗りや質感、テクスチャといった細部の表現がリアル。
-オブジェクトの位置変更に比較的強い。
--[[CNN]]の特徴。エンコーダ部の各層における各マスに当たる部分は、元の画像からそのマスの担当範囲の情報が切り取られており、その単位で画像を認識している。オブジェクトの位置が変わっても別のマスが元のマスと同じように認識する。
-段階的にノイズ除去を行うため、処理中に誤差が出ても比較的蓄積しにくい。
-学習が安定しやすい。教師画像の多様性をフルに活かせる。

*U-Net拡散モデルの短所 [#q4ee0e9c]
-生成初期の高ノイズ域にモデルが予測に使える情報がほとんどなく、新世代のFlow Matchingモデルよりプロンプトが効きづらい
--初期拡散モデルの段階ではノイズ予測について「画像処理」というより「統計処理」ととらえる研究が多く、プロンプトも実用化されていなかったため疑問を持たれなかった。
---統計学では説明変数を見ても目的変数がどうなるか直感的に分からないことは普通にある。
--条件付けのための技術が未発達だったためガチャに頼るしかない部分が多く、制御不能感というよりも多様性として肯定的に捉えられていた。
--この問題は複雑な描画指示が可能なStable Diffusionが幅広く普及したことで顕在化した。
-キャンバスサイズの変更に弱い。Flow Matchingモデルのような柔軟なタイムシフトができない
--一般に高解像度の画像ほど相対的に細かい描き込み(高周波成分)が多くなり、ノイズとの区別が難しくなる。
このため、理想的にはモデルの期待する周波数特性に合わせ、モデルに渡す時間を表すパラメータσを調節したほうがよい。
しかし拡散モデルが返すのはe-predにしろv-predにしろ時間依存の予測値なので、FMモデルのような柔軟な調整はできない。
-モデル設計に職人技が必要とされる。解像度依存が強く、また後付けのプロンプト条件付け(Cross-Attention機構)をどこにどんな重みで挿すかの調整が困難。
--このため、商用製品では先行例があるもののクローズドソースに留まり、Stable Diffusion以外に実用レベルで普及しているオープンな実装が存在しない。
-細部の線や模様が削られやすい
--グラデーションのような滑らかな表現はうまいが、はっきりとした細部の表現は苦手。
このような高周波成分はAIにとってノイズと見分けがつかない為、描画過程をノイズ除去タスクとして訓練されている拡散モデルは特に復元する動機が弱い。
-オブジェクトの拡大縮小や回転に弱い
--[[CNN]]の弱点。SDXL以降はキャンバスサイズや縦横比の異なる画像をまとめて学習させることで、ある程度多様な解像度に対応している(([[SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis:https://arxiv.org/abs/2307.01952]]))。
-やや近視眼的で画面全体の整合性が取れていないときがある。顔が増えたり、[[DiT]]等の新世代のAIモデルより複数キャラの描き分けが下手だったりする。
--CNNの弱点。畳み込み演算は離れたマスの情報を参照しないため。U-Net拡散モデルは長距離依存関係に強いTransformerのSelf-Attentionを借用しているがそれでも近視眼的。
--VAEもCNNの近視眼的な面の緩和に貢献している。VAEによる潜在空間への変換がない場合、U-Net拡散モデルは「主線は画面の途中で切れないことが多い」といった意味的な特徴を学習しにくくなり、高周波成分に引っ張られて「隣と色が全然違うマスはノイズ」等と判断しやすくなる((Robin Rombach他「[[High-Resolution Image Synthesis with Latent Diffusion Models:https://arxiv.org/abs/2112.10752]]」arXiv))。
-近視眼的だが形状に関する観察力は弱い。指が減ったり増えたりする。
--人間は細部を見るときもそこが全体のどこかを意識しながら見るが、CNNの浅層は本当に狭い範囲だけしか参照しない為。盲人象を評す。
-生成速度が遅い。特にε予測だと低ステップ化に限界がある。
-学習コストも高い。

*関連ページ [#gd77a12e]
-[[LyCORIS]]
-[[LoRA/学習用パラメータ解説>学習にまつわる各パラメータ]]
-[[階層マージ]]