stable diffusion が1枚の画像を生成する裏では、途中経過の画像が12枚生成され、捨てられています。
初期状態では途中経過を見ることは出来ませんが、画面からの簡単な設定により、途中経過の画像を取り出すことが可能です。
そして何より、この途中経過の画像の中には、掘り出し物の画像が潜んでいることが多々あります。
今回は、この掘り出し物の画像を抜き出すための設定である、clip skip について詳しく紹介したいと思います。
「clip skip とは何?」と思われている方、CFGとの違いについて今一つ分からない方、LoRAの結果が今一つという方も、この記事は必見です。
是非 clip skip を使いこなして、stable diffusion ライフを楽しんで下さい。
clip skip とは
clip とは、ChatGPTで有名になったOpenAI社が開発した「テキストと画像の関連性を学習する」モデルです。stable diffution では、clip を使って、プロンプトから生成させたい画像が何かを解釈しています。
stable diffusion は、この clip を12個(12層)連ねて、最終的な画像生成を行っているのですが、各層は与えらえたプロンプトに対して、それぞれ異なった解釈をします。
具体的には、最初の層(1層目)ではプロンプトをより抽象的に解釈し、層が進むにつれてより具体的な解釈に落とし込んで画像を生成します。
実際の処理は極めて複雑なのですが、思い切り簡略化して説明すると、「1Gril」と記載されていたプロンプトに対して、第一層目では「人間」という大きな概念で捉え、それに基づき画像生成します。第2層目では、もう少し具体的な「女性」という概念で捉え、第3層目では「若い女性」、第4層目では「都会にいる若い女性」、第5層目では「都会にいる若い女性で、20代前半」、・・・という様なイメージです。
clip を skip することの意味
「Clipをスキップする」という事は、「プロンプトの具体化を途中で止める」ことです。これは「曖昧さを残した状態で画像生成を打ち切る」という意味にもなります。
プロンプトの指示に従わせたいにもかかわらず、その指示を途中で放棄させることに矛盾があるかもしれません。しかし、自分が指示したプロンプトの意図を、stable diffusionが100%解釈することは無く、間違った解釈をされたり、場合によっては気を利かせすぎて不要なものを描画することが多々あります。
このような場合、clip skip を適切に設定することにより、途中生成した画像の中から、自分が意図した画像=完成度の高い画像を取り出せるかもしれません。
特に LoRA を使っていて利きが悪いと感じる場合は、clip skip を調整することで良い結果が得られる確率が高くなります。
一般的にはLoRAを使う場合、clip skip=2が推奨されているようですが、私の経験上4や6でうまく効くこともあるので、この辺は実験することが大切です。
clip skip と CFG の違い
stable diffusion には CFG(Classifier Free Guidance)というものがあります。clip skip と CFG は、どちらもプロンプトに作用するものなので混同されがちですが、根本的な違いがあります。
clip skip は「プロンプトをどこまで具体的に解釈させるか」であり、画像生成の層(ニューラルネット)を強制的に切断してしまうのに対し、CFGは「プロンプトにどれだけ忠実に従わせるか」を単に指示するものだからです。
少々難しくなりましたが、両方ともプロンプトに対して効果が発揮されるため、プロンプトの利きが悪い場合、どちらか又は両方調整するという考え方でも良いかと思います。
clip skip | CFG | |
---|---|---|
使用される場所 | CLIPモデル内のレイヤー | テキストプロンプト内の倍率 |
影響 | 最終的なテキスト埋め込みの計算に影響 | プロンプトの特定度に影響 |
値の範囲 | 0, 1, 2などの整数値 | 任意の連続値 |
機能 | 特定のレイヤーをスキップして埋め込みを計算 | テキストプロンプトの特定度の調整 |
モデルへの適用 | CLIPモデルやCLIPベースのモデルに適用 | モデルの構造に関係なく適用できる |
目的 | テキスト埋め込みの計算精度の調整 | テキストプロンプトの具体性の調整 |
影響の範囲 | レイヤーごとにスキップの可否が設定される | プロンプト全体に対して倍率が適用される |
clip skip の表示方法
clip skip の表示方法は 「Setting」タブを選択し、次に「Usert Interface」を選択します。
そして画面をスクロールすると、[info] Quicksettings list (setting entries that appear ~)と記載されている欄があるので、ここに clと入力します。
ドロップダウンリストが表示されるので、CLIP_stop_at_last_layer を選択して下さい。
最後に、少し上にスクロールし、「Apply setting」をクリックし、続けて「Reload UI」をクリックすれば作業は完了です。
txt2img タブを選択すると、上部に「clip skip」が表示されているはずです。
clip skip の使い方
clip skip の使い方は簡単で、スキップ数を指定して、Generateボタンをクリックするだけです。同じ画像に対して、clip skip の違いを確認したい場合、Seed の値を固定しておきましょう。
下記はClip skip 1~12 に変えた場合の結果です。丸や四角で囲った部分に着目して下さい。微妙に描写が異なることがお分かりいただけるかと思います。
よく見ると、服のシワや影、柱の模様なんかも微妙に違っています。
私の個人的な感覚ですが、LoRAの場合は clip skip の差がもっと出やすい気がします。たとえば、複数のLoRA(LoRA-aとLoRA-b)を適用した場合、LoRA-bに引きずられてLoRA-aがうまく反映されない場合があっても、clip skip を変えることで期待通りの結果が得られる事もありました。
まとめ
今回は clip skip について、clip skip の表示方法と使い方、CFGとの違いについて説明しました。
stable diffusion には、プロンプトから画像を生成するための12個の層(ニューラルネット層)が用意されており、層を重ねるごとに抽象的な解釈から具体的な解釈へ落とし込みながら画像生成を行っています。
clip skip は、最後から数えて何番目の層で処理を打ち切るかを指定するもので、skip の数が多いほどプロンプトの影響を受けなくなります。
stable diffusion は、こちらが意図した通りにプロンプトを解釈しないことも多く、また創造的に細部を作り上げたり、指示しないものを描画したりするため、途中で打ち切る(スキップする)ことで、良い結果が得られる場合があります。
通常は1又は2に設定しておき、良い結果が得られない場合、3以上に上げて試してみると良いでしょう。
是非一度、チャレンジしてみてください。
コメント