Dance with Agents

拡散モデルの中身は、画像をいったん縮めてから広げる1つの装置。返すのは「ノイズの推定」だけ

『画像生成AIは、絵の描き方を習っていない』では、「モデルにノイズを当てさせる」という言い方で通しました。訓練の課題も、生成の手順も、それで説明がつきます。

ただし、その「モデル」の中身には一度も触れていません。 何を受け取って、何を返して、どこが動いているのか。そこが空いたままでは、「ノイズを当てられると、なぜ絵が作れるのか」の芯に届きません。 この記事はその穴を埋めます。


装置が受け取るのは3つ、返すのは1つ

まず、外から見た形です。ノイズを当てる装置は、毎回3つを受け取ります。

  1. ノイズの乗った画像——縦横に並んだマス目の数字(『画像生成AIが「どこに何があるか」を保てるのは、絵を縦横のマス目のまま数字にしているから』)
  2. いま何段階目か——崩す過程を1000段階に分けているなら、「これは780段階目」という数字1つ
  3. プロンプトの数字——「雪の中の猫」という指示文を、数字の並びに直したもの

そして返すのは1つだけです。入力と同じ形のマス目で、中身は「この画像に乗っているノイズは、たぶんこれ」という推定です。

絵を返すのではありません。 返ってくるのはノイズの見積もりで、絵はそれを引いた側に残ります。

「いま何段階目か」を渡す理由も、ここにあります。うっすら曇った画像と、ほぼ砂嵐の画像とでは、乗っているノイズの量がまるで違います。 同じ装置で両方を扱うので、いまどのくらい崩れた状態なのかを教えておく必要があるわけです。

中身がU字形をしているのは、広く見てから位置を戻すため

装置の中身は、層を何十も積み重ねたものです(『LLMの「層」とは何か——器は設計者が決め、中身は誰も決めていない』)。ただし、文章を扱うものとは並べ方が違います。

2020年のDDPMが使ったのは、U-Net(ユーネット)という形です。名前のとおりU字をしていて、前半で画像を縮め、後半でまた広げます。

  • 縮める側——マス目を粗くしながら進みます。1マスが元の広い範囲をまとめて見るようになるので、「ここは犬の顔のあたり」といった、広い範囲の話を掴めます
  • 広げる側——粗くしたものを、また細かいマス目に戻します。どこに何があるかを、元の解像度で言い直す工程です

もとは2015年に、細胞の顕微鏡写真から輪郭を切り分けるために作られた仕組みでした(U-Netの論文)。論文はこの2つを「広い範囲を捉える経路」と「正確な位置を示す経路」と呼び分けています。片方だけでは足りないわけです。

ノイズを当てる仕事にも、同じ2つが要ります。 「この画像は雪景色らしい」という広い話と、「この1マスに乗っているざらつきはこれ」という細かい話。U字は、その両方を1つの装置で扱うための形です。

訓練で動いているのは、装置の中の無数の数字

では、この装置はどうやって当てられるようになるのか。

手順は3つの繰り返しです。

  1. 写真にノイズを足す。 どれだけ足したかは訓練する側が決めているので、正解が分かっています
  2. 装置に当てさせる。 返ってきた推定と、実際に足したノイズを引き算して、ずれを測ります(DDPMは、ずれを二乗して平均する、いちばん素朴な測り方を使っています)
  3. ずれた分だけ、装置の中の数字を少し動かす

この3番目が「学習」です。 装置の中には、層ごとに膨大な数の数字(重み)が並んでいて、外れた分だけ、外れた向きに、少しずつ動かされます。 言葉のベクトルが学習される仕組みと、まったく同じ考え方です(『言葉が数字になるまで』の「外れた分だけつまみを回す」)。

何億枚もの画像で、これを繰り返します。 誰も「犬の描き方」を書き込んではいません。ずれを小さくする方向に数字を動かし続けた結果、そこに落ち着いた値があるだけです。

「ノイズを引いた後に残るのは、こういう画像のはず」の中身

ここまで来ると、入口記事で「モデルは見当を身につけている」とだけ書いた部分に、中身を書けます。

その見当は、重みの値そのものです。

砂嵐を渡されたとき、装置は「この画像に乗っているノイズはこれ」と返します。その推定は、何億枚ぶんの訓練で決まった重みを通って計算されたものなので、引いた残りは、訓練で見た画像に似た方向へ寄ります。 犬でも雪景色でもない、でたらめな模様は残りにくい。

「絵の描き方」ではなく、「これはノイズらしい/これは画像らしい」の見分けだけが、数字として刻まれている。 それが結果として、絵の形を決めています。

一度に引かず、何十回に分ける理由

生成のときは、この装置を何十回も呼び出します。 推定が返ってくるたびに、その全部を引くのではなく、少しだけ引きます。

一度に全部引かないのは、序盤ほど、推定が外れているからです。ほぼ砂嵐の状態で「乗っているノイズ」を正確に言い当てるのは無理があります。少し引いて、少しましになった画像で、装置にもう一度推定させる。 そのほうが、外れの影響が小さくなります。

回数を減らすと絵が荒くなり、増やすと時間がかかる。 画像生成の道具に「ステップ数」という設定があるのは、この繰り返しの回数のことです。

まとめ

  • 装置が受け取るのは、ノイズの乗った画像・いま何段階目か・プロンプトの数字の3つ
  • 返すのは、同じ形のマス目に書かれた「ノイズの推定」だけ。 絵は、それを引いた側に残る
  • 中身はU字形。縮めて広い範囲を掴み、広げて位置を戻す。もとは細胞の写真を切り分ける仕組みだった
  • 訓練で動くのは、装置の中の重み。 足したノイズが正解なので、ずれを測って少しずつ動かせる
  • 「こういう画像のはず」という見当の正体は、その重みの値

画像・動画生成の記事

画像・動画生成のページへ →