人工知能と親しくなるブログ

人工知能に関するトピックを取り上げるブログです

誰でもわかるStable Diffusion モデルから概念を消す(ESD、LECO)

最近、Stable Diffusionのモデルから特定の概念だけを消す、という面白いテクニックが提唱されたので見てみましょう。

オリジナルはこの論文のようです。論文の中で、このテクニックのことをErased Stable Diffusion(略してESD)と呼んでいます。

まずはESDが何なのかを見てみます。そして、ESDをLoRAによって実装したLECOという追加モデルについても軽く触れます。

 

なお、この記事を読む前に、「CFGスケール」の解説記事をお読みいただくことを強くお勧めします。CFGスケールについて理解しておくと、この記事もかなり分かりやすくなると思います。

hoshikat.hatenablog.com

 

 

Stable Diffusionが絵を描くしくみ

まず、Stable Diffusionのしくみについておさらいします。

Stable Diffusionは「しくみ」であって、これ自体が膨大な絵の知識を持っているわけではありません。OSの乗っていないパソコンのようなもので、「脳みそ」がないと何もできません。

その「脳みそ」はStable Diffusionでは俗に「モデル」と呼ばれます。モデルを読み込んで初めてStable Diffusionで絵を描けるようになります。

モデルを読み込んで、こちらから何も指示せずに絵を描かせてみると、何かを描いてくれるかもしれませんが、きっと意味の分からない絵になると思います。これを「無題の絵」と呼ぶことにします。

無題の絵

無題の絵では何の役にも立たないので、こんどは「cat」と指示して絵を描かせます。するとネコの絵が描かれるはずです。これを「お題の絵」と呼ぶことにします。「ネコ」という「お題」を出されたので、Stable Diffusionはネコの絵を描いたのです。

 

さて、Stable Diffusionで「絵を描く」とは、

 ⇒ 

砂嵐のようなカオスな絵を、人間が「美しい」と思う絵に変えていく作業です。
ちょっとずつ、それぞれのピクセルを変化させて、絵を完成させていくのです。

 

ここで仮に、この世の画像がすべて「2ピクセル」でできているとします。下の図の黒い2ピクセルを砂嵐の絵、右の灰色の2ピクセルをネコの絵だと思ってください。

左が砂嵐の絵、右がネコの絵、ということにしてください

Stable Diffusionで「絵を描く」ときは、まず適当に「砂嵐」(左の2ピクセル)を用意します。ちょっとずつピクセルの色を変えていき、最終的にゴールの絵に近づけます。それはあたかも地図上をちょっとずつ進んでいくようなものです。

地図上を進むような感じ

「ネコの絵」の方向に進んでいくには、ナビゲーションが必要です。このナビゲーションこそユーザーが指定する「お題」、つまり「プロンプト」です。Stable Diffusionのモデルは「ネコ」がどの方向にあるのかだいたい知っているので、「あっちに行けばいいんだな」という感じでネコの絵の方向に近づいていきます。
ナビゲーションがないとどうなるでしょう?Stable Diffusionはとりあえずどこかの方向に進みたがります。しかし、そちらの行き先は「無題の絵」で、ほしい絵とは似ても似つかない絵なので、そっちには絶対に行かないようにしなければなりません。この「無題の絵から遠ざかりつつ、目標の絵にうまく導く」手法を「Classifier Free Guidance」(略してCFG)といいます。

CFGに関しては過去の記事を見ていただくとして、ここで重要なのは「お題が与えられたせいで無題のときと違う方向に向かった」という点です。つまり、「無題」と「お題」の差が現れます。これは重要なので覚えておいてください。

「お題」の方向と「無題」の方向が違う

さて、ここまでが前提知識です。

いよいよ「概念消し」であるESDについて見ていきましょう。

 

ESDとは

日本語にすると「消去されたStable Diffusion」です。何というか、あいまいな名前ですすが、その手法を提案した論文に以下のような図があります。

ESDを説明した図、難しい…

この図の右側にある2つの(砂嵐みたいな)絵は、上で説明した「無題の絵」と「お題の絵」の2つを表しています*1。そして、真ん中の数式で「無題とお題の差」を計算しています。

左の黄緑色のモジュールが、ESDで新たに追加される部分です。これは何をしているかというと、「無題とお題の差を打ち消すような何か」を吐き出しています。

 

「無題とお題の差」を打ち消すと、どうなるでしょう?

「お題」が「無題」と変わらなくなってしまいます。すると、「お題の絵」の方向に進まず、「無題の絵」のほうに進んでしまうのです。そうすると、最終的には「無題の絵」のほうに近寄っていきます。つまり、「お題」というナビゲーションを完全無視する、ということになります。

これは「『お題』を忘れ去ってしまう」ということに他なりません。

お題へのナビゲーションを打ち消す負の力
それがESD

LECOは概念を消し去るLoRA

要するにESDは「特定のお題(トークン)が画像を作ろうとする力」を打ち消しているだけで、考えてみれば単純な事なのですが、実現するためにはその打ち消す力をモデルに追加してやらなければいけません。

オリジナルモデルにその力を組み込むこともできますが、そうするとその組み込んだ後のモデルを丸々配布しないといけなくなります。モデルは小さくても2ギガバイト以上あるので、配布は大変です。

そこで、概念を打ち消す力を持つ小さなニューラルネットを別に作って、それを配布する手法が提案されました。それが「LECO」です。

上で紹介した論文の図の黄緑色のモジュールにあたります。

LECOについては以下のサイトで詳しく説明されているのでご覧ください。

zenn.dev

 

小さなニューラルネットを追加する手法は「LoRA」と同じです(今回の記事ではUNet内のどの部分に適応されているか、などの説明は省略します)。

通常のLoRAは新たな概念を追加するために使われますが、LECOはその逆で、負の概念(打ち消す力)を追加するために使われます。

 

まとめ

今回はモデルから概念を消すESDとLECOを軽く解説しました。

Stable Diffusionは概念を追加して新たな絵を描かせることができますが、ESDによって「特定の概念を描かせない」という応用例も登場しました。

単純なようでいてなかなか思いつかない手法ですが、こういうたくさんの応用例が出てくるとAIお絵描きの幅もどんどん広がっていくのでしょうね。

*1:正確に言うと「「無題の絵」と「お題の絵」に乗っているであろうノイズ」です。