Dance with Agents

画像生成AIが「どこに何があるか」を保てるのは、絵を縦横のマス目のまま数字にしているから

言葉は、数字を決まった個数だけ並べた組にすれば扱えます。「猫」という語を数百個の数字の組で表す、というやり方です(『言葉が数字になるまで』)。

絵では、それだけでは足りません。 左上に空、右下に犬が写っている写真を考えます。この2つを入れ替えたら、別の絵になります。 ところが数字を一列に並べただけの組には、どの数字が左上でどれが右下かという情報がありません。

絵を数字にするときは、どの数字が絵のどこなのかが分かる形にしておく必要があります。 そこがこの記事の話です。


絵は、マス目ごとの色の数字として持つ

いちばん素朴なやり方は、方眼紙のように区切って、マス目ごとに色を数字で書くことです。

512×512の画像なら、マス目は26万個あまり。1マスにつき、赤・緑・青の3つの数字を持ちます。全部で78万個ほどの数字です。この数字は、縦横に並んだまま扱われます。5行3列目の数字は、5行3列目の色である——という対応が、そのまま位置の情報になっています。

一列に並べ替えてしまうと、この対応が消えます。 だから絵は、縦横に並んだマス目の形のまま計算されます。

見比べるための数字と、描くための数字は別もの

ここで混ざりやすいところがあります。「絵を数百個の数字の組にする」という話も、たしかにあります。

CLIP(クリップ)という仕組みは、言葉用と画像用の2つの変換器を持っていて、どちらも同じ個数の数字の組を返します。だから「猫」という語と猫の写真を、同じ物差しの上で近い・遠いと言えるわけです(『画像生成AIは、絵の描き方を習っていない』)。

ただし、この数字の組から絵は戻せません。 これは絵の要約であって、絵そのものではないからです。位置の情報は、要約の時点で捨てられています。

形 使いみち
見比べるための数字 数百個の数字の組が1つ 言葉と絵の距離を測る
描くための数字 縦横に並んだマス目 ノイズを引いて絵を作る

拡散モデルがノイズを引いているのは、下の段のほうです。上の段の要約からは、何も描けません。

描くときのマス目は、小さく畳んである

とはいえ、78万個の数字を何十回も計算し直すのは重すぎます。

そこで2021年のLatent Diffusionという方法が登場します。画像をそのままの大きさで扱わず、いったん粗いマス目に畳んでから、その上でノイズの足し引きをするやり方です。512×512の画像なら、64×64くらいのマス目まで畳みます。扱う数字はおよそ48分の1になりますが、縦横に並んでいるという性質は保たれたままです。

手元のパソコンで画像生成が動くようになったのは、この畳み込みのおかげです。そして畳んでもなお格子のままなので、位置は失われません。

一列に並べるときは、位置の目印を貼ってから並べる

いまの画像生成や動画生成では、Transformer(トランスフォーマー)という仕組みがよく使われます。もともと文章のために作られたもので、一列に並んだものしか受け取れません。

そこで登場したのが、2020年のViT(Vision Transformer、ビジョン・トランスフォーマー)です。論文の題は「An Image is Worth 16x16 Words(1枚の絵は16×16の言葉に値する)」。やり方は名前のとおりで、画像を16×16画素の小さな正方形に切り分け、その1枚1枚を「語」のように扱って一列に並べます。 この小さな正方形をパッチ(patch、継ぎ当ての布)と呼びます。

ここで位置が消えます。 一列に並べた時点で、どのパッチが左上だったかは分からなくなる。

対策は単純です。パッチごとに「これは何行目の何列目だった」という目印の数字を足してから並べます。 これを位置埋め込み(position embedding)と呼びます。目印そのものも、訓練の中で決まっていきます。

つまり「絵を一列に並べる」ことは可能です。ただし、並べる前に位置を書き込んでおく必要があります。

動画では、時間の向きにも同じことをする

OpenAIがSoraについて公開した技術報告によれば、Soraは動画を圧縮したうえで、時空パッチ(spacetime patch)——縦横だけでなく時間の向きにも切り分けた小さなかたまり——に分解します。

縦・横に「何コマ目か」が加わっただけで、考え方は同じです。位置の目印が3方向ぶんになります。人物が横を向いても服の柄が保たれるのは、時間の向きも最初から位置として扱われているからです。

まとめ

  • 言葉は一列でよいが、絵は縦横の対応を保つ必要がある。 左上と右下を入れ替えたら別の絵になる
  • 描くための数字は、縦横に並んだマス目。 拡散モデルがノイズを引いているのはこちら
  • 見比べるための数字(CLIPの数字の組)は要約。 そこから絵は戻せない
  • 一列に並べるなら、先に位置の目印を貼る(ViTのパッチと位置埋め込み)
  • 動画は、時間の向きにも同じことをする(Soraの時空パッチ)

画像・動画生成の記事

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