28.DALL-E3の仕組みの確認と、拡散トランスフォーマ大解剖

ボク:ねえ、ジェミニ!今日こそは、Soraの拡散トランスフォーマについて教えてもらおうと思うんだけど、その前に、1つ確認しておきたいんだ。DALL-E2とDALL-E3は、CLIPがChatGPTに置き換えられただけで、あとは同じなのかな?

 

OpenAIはDALL-E3の内部構造を詳しく公開していないから、正直、正確な答えは知らないんだ。でも実際は、「置き換えた」というよりは、「超強力な助っ人としてGPTを加えた」というのが正解じゃないかと思う。DALL-E2とDALL-E3では、根本的な仕組みが大きく進化していると感じる。

 

DALL-E3の最大の変化:プロンプトの「翻訳家」としてのGPT

DALL-E2が抱えていた大きな課題の一つは、ユーザーが書いた細かい指示(プロンプト)を、時々うまく理解できないことだった。「ブルドッグに跨る猫」は理解できても、もっと複雑になると、意味を取り違えることがあったんだ。

そこでDALL-E3では、画像生成AIに指示を出す前に、ChatGPT(GPT-4)が間に入って、君の書いたプロンプトを「翻訳」してあげる仕組みになったんだ。

DALL-E2の場合: 君のプロンプト → CLIP → Prior → GLIDE → 画像

DALL-E3の場合: 君のプロンプト → ChatGPT → 画像生成AI → 画像

この違いはすごく大きいんだ。

 

ChatGPTは何をしているの?

ChatGPTは、君が書いた短い、あるいは少し曖昧なプロンプトを、画像生成AIが理解しやすい、ものすごく詳細で具体的な指示書に書き換えてくれるんだ。

例えば、君が「宇宙飛行士の猫」と入力したとする。

  • DALL-E2は、それをそのまま解釈しようとする。
  • DALL-E3では、まずChatGPTが「なるほど、『宇宙飛行士の猫』だね。じゃあ、もっと絵が良くなるように、こんな風に詳しくしてみよう」と考えて、

「ヘルメットのガラスに星が映り込んでいる、リアルな質感の宇宙服を着た可愛い猫。背景には、遠くに地球が見える雄大な宇宙空間が広がっている。」

というような、超詳細なプロンプトを自動で生成してくれるんだ。そして、この「完璧な指示書」を画像生成AIに渡す。だから、DALL-E 3は、君の意図を驚くほど正確に汲み取って、クオリティの高い絵を描けるようになったんだよ。

 

じゃあ、CLIPはもういないの?

OpenAIの公式発表ではハッキリとは言及されていないけど、多くの専門家は「DALL-E3の内部でも、CLIPのような仕組みはまだ重要な役割を果たしているはずだ」と考えているんだ。

なぜなら、

  1. 学習データの質向上: DALL-E 3は、学習に使う画像とテキストのペアを、より高品質なものにするために、事前に画像の内容を説明する詳細なキャプションを生成している。このプロセスでCLIPのような技術が使われている可能性が高い。
  2. 評価: 最終的に出来上がった画像が、本当にプロンプトの指示通りになっているかを評価する「鑑定士」の役割は、やはり必要だからね。

つまり、DALL-E3は、DALL-E2の「unCLIPアーキテクチャ」をベースにしながら、その入口に「ChatGPTという超優秀な翻訳家」を追加して、プロンプトの理解力を劇的に向上させたモデル、と考えるのが一番近いと思うよ。

 

プロンプト → CHATGPT (+CLIP的な表現空間を用いた埋め込み処理) → 画像生成AI → 画像

という流れが、今のDALL-E 3の仕組みを理解する上で、本質を捉えた表現だと思う。

 

なぜ、この表現が完璧なのか?

  • CHATGPT: ユーザーの「あいまいな言葉」を、AIが理解できる「完璧な指示書」に翻訳してくれる、超優秀なアシスタントの役割。これがDALL-E3の最大の進化だね。
  • (+CLIP): そして、その完璧な指示書(テキスト)と、これから描く絵の「意味」を結びつけるために、CLIP(もしくは、その後継となるさらに賢いモデル)が裏で働いている。ChatGPTが作った詳細なプロンプトの「本当の意味」を理解し、画像生成AIに「こういう方向性でよろしく!」と伝える、アートディレクターのような存在だ。
  • 画像生成AI: そして、その指示書と方向性をもとに、実際に絵を描き上げる専門アーティスト(拡散モデルチーム)がいる。

 

ボク:画像生成AI側は、Prior → GLIDEのような分業体制はなくなったの?

 

多くの専門家の分析やAI技術の進化の流れから、「DALL-E2と全く同じ分業体制ではなく、もっと進化した形になっている可能性が非常に高い」と考えられているよ。

 

小さな工房から、最新の自動化工場へ

DALL-E2の「Prior → GLIDE」という分業体制を、腕のいい専門家二人が働く小さな工房だとイメージしてみて。建築家(Prior)が設計図を描き、建設のプロ(GLIDE)がそれを組み立てる、という見事な連携だったよね。

DALL-E3は、その工房が巨大な最新の自動化工場に進化したようなものだと考えられているんだ。

工場の中では、設計から組み立てまでの全工程が、もっとスムーズに、もっと一体化された一つの巨大なラインで行われる。昔の「設計部」「組立部」というハッキリした部署分けは、もうないかもしれない。それぞれの機能は残っているけど、もっとシームレスに連携しているんだ。

 

なぜ 「一体化」が進んだと考えられるの?

  1. より強力なモデルの登場: 最近のAI、特に君が最初に知りたがっていたSoraにも使われている「拡散トランスフォーマ」のような新しい技術は、一つのモデルで「何を描くべきか(意味の理解)」と「どう描くか(ピクセルの生成)」を、同時に、より高いレベルでこなす能力を持っているんだ。DALL-E3も、このような進化した単一、あるいはより統合されたモデルを使っている可能性があるよ。
  2. 効率の追求: PriorとGLIDEという二つのモデルの間でデータをやり取りするのは、少し手間がかかる。一つの洗練されたモデルで全部できた方が、スピードも速くなるし、より効率的だからね。

 

というわけで、DALL-E3の画像生成AI側では、

  • 「意味を構想する」というPriorの役割
  • 「構想を絵にする」というGLIDEの役割

という仕事の分担の考え方そのものは、今も絶対に重要なはずだ。

でも、DALL-E2のように「Prior」「GLIDE」という名前の付いた二つの別のモデルが連携する体制ではなく、もっと一体化された、より高性能な一つのシステムに進化した、と考えるのが一番自然だと思うよ。

 

ボク:じゃあ、わからないけど、Soraだけでなく、DALL-E3にも拡散トランスフォーマ(あるいはその前身のモデル)が使われている可能性が高いってことだよね?

 

OpenAIが公式に「DALL-E3の内部はこうなっています」と設計図を公開したわけじゃないから、あくまで「状況証拠からの、最も可能性の高い推測」ということになるけど、君が言うように、SoraだけでなくDALL-E3にも拡散トランスフォーマ、あるいはその考え方に非常に近い、進化したモデルが使われている可能性は極めて高いんだ。

そう考えられる理由は、いくつかあるよ。

  1. 性能が飛躍的に向上したから DALL-E3は、DALL-E2に比べて、複雑な文章を理解する能力が劇的に上がった。これは、単にプロンプトを翻訳するChatGPTの力だけじゃなく、画像生成AI自体の「言葉と絵の関係性を理解する能力」も上がっていると考えるのが自然だよね。トランスフォーマは、その「関係性を理解する」ことがすごく得意なんだ。
  2. Soraの存在が大きなヒント OpenAIが、動画生成AIのSoraで「拡散トランスフォーマを使っています」とハッキリ発表したよね。SoraはDALL-E3より後に出てきたモデルだ。新しい技術をいきなりSoraで初めて使う、ということは考えにくい。普通は、DALL-E3のような画像生成AIでまずその技術を試して、磨き上げてから、より複雑な動画生成に応用する、と考えるのが自然な流れだ。
  3. AI研究全体のトレンド 今、世界中のAI研究者が「拡散モデルとトランスフォーマを組み合わせると、すごく性能が上がるぞ!」ということに気づいて、競って研究開発を進めているんだ。OpenAIがこの大きな流れに乗っていないとは考えにくいよね。

だから、「DALL-E2の分業体制」→「DALL-E3の(おそらく)拡散トランスフォーマのような統合モデル」→「Soraの(確定した)拡散トランスフォーマ」という進化の道をたどっている、と考えるのが、一番しっくりくるストーリーなんだ。

 

ボク:DALL-E3に関する情報ありがとう!じゃあ、改めて、今日は拡散トランスフォーマの説明をお願いします。

 

では、改めて、拡散トランスフォーマ(Diffusion Transformer、略してDiT)の説明をしよう!

 

拡散トランスフォーマとは?「最強のハイブリッド」

拡散トランスフォーマは、名前の通り、僕たちが今まで話してきた二つの技術、

  • 拡散モデル(Diffusion Model)
  • トランスフォーマ(Transformer)

この二つを合体させた、いわば「最強のハイブリッドモデル」なんだ。

それぞれの役割を思い出してみよう。

  • 拡散モデルの役割: ノイズだらけの画像から、少しずつノイズを取り除いて、きれいな画像を完成させるという「仕事全体の流れ(プロセス)」を決めている。彫刻家が、粘土の塊から少しずつ形を削り出していくイメージだったね。
  • トランスフォーマの役割: 文章や画像の中の「部分」と「部分」がどう関係しているかを理解する「賢い頭脳(エンジン)」。アテンション機構を使って、物事の全体像と文脈を捉えるのが得意だったよね。

 

何を「合体」させたの?

拡散モデルが、各ステップで「どのノイズを取り除けばいいか?」を判断する時、その判断を下す「頭脳」の部分が一番重要になる。

今までの多くの拡散モデル(例えばDALL-E2のGLIDE)では、その頭脳に「U-Net」というアーキテクチャが使われてきたんだ。これはとても優秀な頭脳だよ。

でも、一部の研究者たちが考えたんだ。

「この拡散モデルの頭脳を、もっと賢い『トランスフォーマ』に交換したら、とてつもなくすごいものができるんじゃないか?」

これが、拡散トランスフォーマの基本的なアイディアだ。

つまり、拡散モデルの「ノイズを消していく」という仕事の流れはそのままに、その仕事を行う脳の部分を、従来のモデルから「トランスフォーマ」に置き換えた。これが拡散トランスフォーマの正体なんだ。

 

なぜ、トランスフォーマの脳が良いの?

じゃあ、なぜ頭脳をトランスフォーマにすると、そんなにすごいのか?

それは、トランスフォーマが「全体を見る力」に圧倒的に優れているからだ。

  • 従来の脳(U-Netなど): 主に画像の近くにあるピクセル同士の関係を見るのが得意。例えるなら、自分のすぐ隣のパズルのピースしか見れない職人さんだ。
  • トランスフォーマの脳: アテンション機構によって、画像のすべての部分(パッチ)を一度に見て、遠く離れた部分同士の関係性まで理解できる。パズル全体を空から眺めて、「あそこのピースと、こっちのピースが関係しているな」と一瞬で見抜ける天才職人なんだ。

この「全体を見る力」のおかげで、画像の構図が崩れにくくなったり、より複雑で論理的な指示を正確に絵に反映させることができるようになる。

そして、これがSoraのような動画生成になると、さらにその力が発揮される。トランスフォーマは、一枚の絵の中だけでなく、時間的に離れたフレーム(例えば1秒前のフレームと1秒後のフレーム)の関係性まで理解できるから、動きに矛盾のない、自然な動画を作り出すことができるんだ。

これが、拡散トランスフォーマが次世代の画像・動画生成AIの鍵だと言われている理由だよ!

 

ボク:拡散モデルの場合、順方向の処理はノイズを付加するだけで、この部分はニューラルネットのような学習モデルじゃなかったよね。そして、逆方向の処理にU-Netを使ってた。拡散トランスフォーマでは、その逆方向の処理をトランスフォーマのデコーダモデルに置き換えたっていう理解でいいのかな?

 

その理解で、95%くらい正解だよ!

まず、君が理解している、

  • 拡散モデルの順方向が「学習しない、ただのノイズ付加」であること。
  • そして逆方向のノイズ除去の頭脳として、従来はU-Netが使われてきたこと。

この二つは、完璧にその通りだ。

 

デコーダだけ」ではなく「トランスフォーマそのもの」

君が質問してくれた一番のポイント、「U-Netをトランスフォーマのデコーダモデルに置き換えたのか?」についてだけど、「デコーダだけ」というよりは、U-Netの代わりに、トランスフォーマの心臓部である「基本ブロック」そのものに置き換えた、というイメージが一番近いんだ。

 

なぜ「デコーダだけ」ではないの?

ちょっと思い出してみてほしいんだけど、僕たちが話してきたトランスフォーマは、文章の翻訳などで使われる場合、「エンコーダ(情報を圧縮・理解する部分)」と「デコーダ(情報を展開・生成する部分)」の二つで構成されていることが多いんだ。

  • デコーダは、言語モデルでよく使われるように、「次の単語、その次の単語…」と、順番に一つずつ何かを生成していくのが得意な構造をしている。

でも、拡散トランスフォーマがやりたい仕事は、「画像全体に、今どんなノイズが乗っているか?」を一気に予測することだよね。これは、何かを順番に生成する仕事とは少し違う。

そこで拡散トランスフォーマでは、

  1. ノイズの乗った画像を、たくさんのパッチに分解する。
  2. そのパッチたち(+プロンプトのエンベディングなどの情報)を、トランスフォーマの基本ブロック(アテンション機構が入った、あの賢い部分だね)に入力する。
  3. トランスフォーマは、アテンションの力で全てのパッチの関係性を一気に見て、「画像全体に乗っているノイズは、これだ!」という答えを一括で出力する。

この仕事のやり方は、「エンコーダ」の情報の処理の仕方に少し似ているんだ。だから、「デコーダに置き換えた」と言うよりは、「U-Netというノイズ予測エンジンを、トランスフォーマという、もっと新しくて強力なエンジンに丸ごと載せ替えた」と考えるのが、一番実態に近いんだよ。

 

ボク:トランスフォーマに置き換えたって聞いた時、つい、君(Gemini)やChatGPTのようなデコーダ型のモデルを想像したんだけど、確かに、U-netモデル自身もエンコーダ部分とデコーダ部分があるから、置き換えるとしたらエンコーダ・デコーダ型トランスフォーマの方が自然だよね。

 

U-Net自身がエンコーダ部分(情報を圧縮していく)とデコーダ部分(情報を復元していく)の構造を持っているから、「置き換えるなら、トランスフォーマもエンコーダ・デコーダ型の方が自然じゃないか?」って考えるのは、すごく論理的だし、専門家でも多くの人が最初にそう考えたんだ。

でも、拡散トランスフォーマ(DiT)を最初に作った研究者たちは、実はもっと大胆で、もっとシンプルな方法を選んだんだよ。

 

U-Netの構造を「あえて」捨てた

彼らは、君が考えたようにU-Netのエンコーダ部分をトランスフォーマのエンコーダに、デコーダ部分をトランスフォーマのデコーダに置き換える、というようなことはしなかったんだ。

その代わりに、U-Netのエンコーダ・デコーダという階層的な構造を、一度全部取っ払ってしまった

そして、

  1. 画像をパッチに分解する。
  2. そのパッチを横一列に並べる
  3. その「パッチの列」を、ただ一つの、同じ構造を持つトランスフォーマブロックで何度も処理する

という、驚くほどシンプルな構造を選んだんだ。これは、Googleが開発した画像認識モデル「Vision Transformer (ViT)」の考え方にとても近くて、ViTのような自己アテンションベースの単方向・並列処理型エンジンが採用されたんだ。

 

なぜ、シンプルな構造を選んだのか?

なぜわざわざU-Netの得意な形を捨ててまで、シンプルな構造にしたのか?

それは、「スケーラビリティ(拡張性)」という、トランスフォーマが持つ最大の武器を最大限に活かすためなんだ。

トランスフォーマは、その構造がシンプルで均一だからこそ、モデルを大きくしたり(ブロックを増やす、など)、計算量を増やしたりすると、その分だけ素直に性能がどんどん上がっていく、という非常に美しい特性を持っているんだ。

U-Netの少し複雑な構造よりも、このシンプルな「一本道」の構造の方が、トランスフォーマの性能を極限まで引き出しやすい。研究者たちは、U-Netの形に合わせるよりも、トランスフォーマの一番得意な戦い方に、問題の方を合わせにいったんだね。

君の「エンコーダ・デコーダ型の方が自然」という推測は、アーキテクチャの形を考えればすごく良い線を行っていたんだよ。でも実際には、その裏で「トランスフォーマの性能をどうやって一番引き出すか?」という、もう一つ深い考えがあったんだ。

 

ボク:そうなんだ。形にこだわりすぎてはダメだね

 

その通り!

「U-Netの形に似せる」という表面的な形にこだわるのではなく、「トランスフォーマが持つ本当の強み(スケーラビリティや全体を見る力)をどうやって最大限に活かすか?」という本質を一番に考えた結果なんだ。

 

昔のプロペラ飛行機のエンジンを、ジェットエンジンに交換する時を想像してみて。

ただエンジンを付け替えるだけじゃなくて、ジェットエンジンのものすごいパワーに耐えられるように、翼の形や胴体の構造も全部、ゼロから設計し直すでしょう?

拡散トランスフォーマも、まさにそれと同じことをしたんだ。U-Netの形に合わせるんじゃなくて、「トランスフォーマ」という新しいエンジンのために、問題の解き方そのものを設計し直したんだね。

「形にこだわりすぎてはダメ」という君の言葉は、AI開発の、そしてたぶん色々な物事の「成功の秘訣」を表しているんだと思うよ。

 

ボク:では、拡散トランスフォーマの仕組みについて、もう一段掘り下げて教えて欲しんだけど、マルチモーダル対応ということは、訓練・学習時には、入力データとして、エンベディングデータが束になって入ってくるというトランスフォーマの基本形は踏襲していると思っていいですか?

 

うん!

拡散トランスフォーマは、君が言うように、トランスフォーマの「色々な種類の情報を束にして一度に処理できる」という基本形を、見事に踏襲しているよ。

 

拡散トランスフォーマが受け取る「入力データの束」

訓練の時、拡散トランスフォーマの頭脳には、こんな情報が全部ひっくるめられて、一つの「束」になったエンベディングデータとして入力されるんだ。

  1. ノイズが乗った画像のパッチ (一番大事な主役) まず、主役となるのは、ノイズが加えられた画像そのものだね。これは、僕たちが話してきたように、たくさんの小さなパッチに分解されて、それぞれがベクトルに変換されている。これが「今、どんな絵の状態か」を伝える情報だ。
  2. テキストプロンプト (お手本となる指示書) 次に、「何を描いてほしいか」という指示書。例えば「鎧を着た猫」というプロンプトを、CLIPの文字の専門家(Text Encoder)がエンベディングベクトルに変換したものだ。
  3. ノイズの量 (今、何ステップ目か) そして、これもすごく大事な情報なんだけど、「今、どれくらいノイズが乗っているのか?」という情報。拡散モデルは、ノイズを少しずつ消していくから、「今はまだノイズだらけの10ステップ目なのか」あるいは「もう完成間近の900ステップ目なのか」を知る必要があるんだ。この時間(タイムステップ)の情報も、ベクトルに変換されて入力される。

 

トランスフォーマの腕の見せ所

こうして、「今の絵の状態」+「完成形の指示書」+「今のノイズの量」という、3種類のごちゃ混ぜの情報が束になって、トランスフォーマに「はい、どうぞ!」と渡される。

トランスフォーマは、得意のアテンション機構を使って、この全部の情報を一気に見るんだ。そして、

「なるほど、指示書は『鎧を着た猫』で、今のノイズの量はこれくらいか。だとしたら、この画像のパッチから、こういうノイズを取り除けば、一番指示書に近づくな!」

という、最も賢いノイズの消し方を予測して出力する。

 

ボク:訓練時のデータの場合、自己教師あり学習のデータのセットとしては、例えばネット上の<img>タグの示す画像データにx回ノイズをかけた画像データと、ネット上で、その画像データにつけられた<alt>タグでの説明文、それに、ノイズをかけた回数xの3つが1セットのデータとして渡されるんだよね?

 

その通りだよ。

  • <img>タグが示す画像データに、x回ノイズをかけた画像データ(今の絵の状態)
  • その画像につけられた<alt>タグの説明文(完成形の指示書)
  • ノイズをかけた回数「x」(今のノイズの量)

この3つが1セットのデータとなって、拡散トランスフォーマの「自己教師あり学習」の訓練に使われる。

 

インターネット上には、<img>タグと<alt>タグのペアが何十億、何百億とあるから、これを学習データにすることで、AIは様々なコンセプトとその視覚的な表現を学んでいくんだ。

そして、AIが訓練でやろうとしていることは、

「①、②、③の3つの情報をもらった時に、①からノイズを取り除いて元のきれいな画像に近づけるには、どうすればいいか?」

という、たった一つの、でもすごく難しい問題を、ひたすら解き続けることなんだ。

 

ボク:拡散トランスフォーマの入力層にこれらのセットのデータを入力すると、入力層の中で、エンベディングデータを作成してから拡散トランスフォーマのブロックにそれを渡すというイメージいいですか?

 

そのイメージであってるよ!

拡散トランスフォーマのモデル全体を一つの大きな箱だとすると、その入り口部分に入力層があって、そこで全ての情報をエンベディングデータに変換してから、メインであるトランスフォーマブロックに渡しているんだ。

 

 入力層の仕事:全てを「共通の言葉」に翻訳する

入力層は、種類がバラバラのデータを、トランスフォーマが理解できる「共通の言葉(ベクトル)」に翻訳する専門家チームだと考えられるよ。

  • 画像データ(ノイズ付きパッチ): 各パッチは、それぞれベクトルに変換される。これはパッチエンベディングと呼ばれるね。
  • テキストデータ(説明文): altタグの文章は、CLIPのText Encoderのようなモデルによって、一つのテキストエンベディングに変換される。
  • 時間データ(ノイズの回数x): 「x回目」というただの数字も、そのままでは扱いにくいので、専用の仕組みでタイムステップエンベディングというベクトルに変換されるんだ。

入力層は、これら3種類のエンベディングを綺麗に並べて、一つの「入力シーケンス(データの列)」として準備する。その準備が整って初めて、「はい、どうぞ」と、メインのトランスフォーマブロックに渡されるんだよ。

 

ボク:3種類のエンベディングデータは、ベクトルの次元もそろえるのかな?

 

そう!拡散トランスフォーマの頭脳(メインのブロック)に入力される直前に、3種類のエンベディングデータは、すべて同じベクトルの次元数にキレイにそろえられるよ

 

なぜ、次元をそろえる必要があるの?

それは、トランスフォーマのアテンション機構が、全員が「共通の言葉」を話していることを前提に設計されているからなんだ。

 

「国際会議」をイメージしてみよう

トランスフォーマの内部を、世界中の専門家が集まる「国際会議」だと考えてみて。

  • 専門家たち: 「画像パッチ」「テキスト」「タイムステップ」という、それぞれ違う分野の専門家。
  • 会議の目的: 全員で協力して「どのノイズを消すべきか?」という一つの結論を出すこと。

もし、それぞれの専門家が自分の国の言葉(違う次元数のベクトル)で話し始めたら、会議はめちゃくちゃになってしまうよね。

そこで、会議が始まる前に、入り口にいる同時通訳チーム(入力層)が、全員の発言を会議の公用語である「英語」(統一された次元数のベクトル)に翻訳してあげるんだ。

 

「リニアプロジェクション」という名の翻訳機

入力層の中には、この翻訳作業を行うための「リニアプロジェクション(Linear Projection)」という、次元数を自由に変えることができる、便利な変換装置が入っているんだ。

  • 画像パッチのベクトル → 翻訳機 → 会議用の次元数に変換!
  • テキストのベクトル → 翻訳機 → 会議用の次元数に変換!
  • タイムステップのベクトル → 翻訳機 → 会議用の次元数に変換!

こうして、全員が同じ次元数のエンベディングデータという「共通の言葉」を持つことで、初めてアテンション機構は、それぞれの情報の重要度を比べたり、関係性を理解したりすることができるんだ。

「次元をそろえる」という一手間が、トランスフォーマがマルチモーダルな情報を華麗にさばける秘密なんだよ。

 

ボク:これまでのトランスフォーマだと、訓練データがエンベディングデータの束になって1度ずつトランスフォーマブロックに渡されるイメージなんだけど、拡散トランスフォーマの場合、ノイズの回数もデータとして渡すということは、同じ元の絵に対して、ノイズをかける回数をいろいろ変更したものを、テキストとノイズの回数を付けて別のデータセットとして拡散トランスフォーマブロックに渡すのかな?

 

その通り!

毎回、違う問題を出題する

君が考えてくれた通り、訓練の時には、

「同じ元の絵」に対して、毎回「違う回数」のノイズをランダムに選んで加えるよ。

そして、その都度、

  • ノイズが加えられた画像
  • テキスト
  • ノイズの回数

の3つをセットにして、全く新しい、独立した「練習問題」としてトランスフォーマブロックに渡すんだ。

 

なぜ、こんな面倒なことをするのか?

それは、AIを「どのノイズレベルからでも、完璧にノイズを除去できる専門家」に育てるためだよ。

 

病気の治療を学ぶお医者さん

お医者さんが、ある病気の治療法を学ぶ時を想像してみて。

  • 病気の初期段階の患者さんだけを診ていても、末期の患者さんを治すことはできないよね。
  • 逆に、末期の患者さんだけを診ていても、初期の患者さんに最適な治療はできない。

優秀なお医者さんになるには、初期・中期・末期、あらゆるステージの患者さんをたくさん診て、それぞれの段階で最適な治療法を学ぶ必要があるよね。

拡散トランスフォーマの訓練も、これと全く同じなんだ。

  • ノイズが多い状態(病気の末期)からの直し方
  • ノイズが少しの状態(病気の中期)からの直し方
  • ノイズがほんのわずかな状態(病気の初期)からの直し方

という、あらゆる段階の問題をランダムに解かせることで、AIはどんな状況からでも、次に何をすべきかを正確に判断できるようになるんだよ。

だから、同じ絵が訓練中に何度も使われるけれど、AIにとっては毎回「ノイズの回数」が違う、新鮮な問題に見えている、ということなんだ。

 

ボク:同じ絵とテキストのデータを、何回ぐらい訓練に使うの?

 

良い質問だね!

結論から言うと、「決まった回数はないし、もしかしたら一度も使われない絵もある」というのが答えなんだ。

 

図書館の本を全部読むわけじゃない

巨大なAIの訓練は、図書館にある何十億冊もの本(画像とテキストのペア)で勉強するようなものなんだ。

普通の勉強なら、「この参考書を5回繰り返して読もう」ってなるよね。これが機械学習でいう「エポック」っていう考え方だ。1エポックは、データ全体を1周すること。

でも、AIの訓練はちょっと違うんだ。

図書館にある本が多すぎて(例えば50億冊!)、全部を1周するだけでも何年もかかっちゃう。だから、AIは「今日はランダムに2000冊くらい本棚から引っこ抜いて読もう。これを10万日続けよう!」みたいな勉強の仕方をするんだ。

 

「訓練ステップ」という考え方

拡散モデルのAIの訓練は、「エポック」じゃなくて「ステップ」イテレーション」で数えることが多いんだ。

  • 1ステップ = ランダムに選んだ、ある程度の数のデータ(これをバッチって言う)で、1回だけ学習すること。

例えば、ある有名なモデルは、20億枚の画像データセットから、1回のステップで2048枚のペアをランダムに選んで、それを25万ステップ繰り返して訓練されたんだ。

これって、全部で 2048枚 × 25万ステップ = 約5億枚 のペアを見た計算になる。元のデータは20億枚だから、図書館の本の4分の1くらいしか読んでいないことになるんだよ!

 

というわけで、同じ「猫の絵とテキスト」のデータは、

  • 運良く、訓練中に2〜3回選ばれるかもしれない。
  • 1回だけ選ばれるかもしれない。
  • そして、一度も選ばれることなく、訓練が終わってしまう可能性も十分にあるんだ。

大事なのは、同じデータを何回も繰り返し見ることよりも、とてつもない量の、多種多様なデータを一度でも多く見ることなんだよ。

 

ボク:あー、わかった。せっかく用意した訓練データは全部使うのが基本だと思ったけど、(昔の教師あり学習のように人間が訓練データを用意するとなると大変だけど)、AIが絵とテキストのペアの膨大な訓練データを「機械的」に用意するから、たとえ使われないデータがあっても問題じゃないということだね。

ノイズを加える回数はランダムに選ぶんだと思うけど、最高何回ぐらいノイズをかけるの?

 

君の言う通り、人間が一つ一つ「これは猫、これは犬」ってラベルを貼っていた時代と違って、今はAIがインターネット上にある膨大な「絵とテキストのペア」を自動で集めてこれる。だから、一つ一つのデータが使われるかどうかよりも、全体のデータ量がとてつもなく多いことの方がずっと大事なんだ。無駄になるデータがあっても、全然問題ないくらいにね。

そして、ノイズをかける回数。これもすごく良い質問だね!

これもモデルによって違うんだけど、一般的には「1000回」という数字が、一つの基準としてよく使われているんだ。

 

なぜ「1000回」なの?

これは、研究者たちが色々な回数を試した結果、

  • 画像の品質
  • 計算にかかる時間

この二つのバランスが、ちょうど良く取れるのが大体1000ステップくらいだった、ということなんだ。

  • 回数が少なすぎると… 例えば100回くらいだと、ノイズを消すステップが雑になってしまって、最終的な絵のディテールがぼやけたり、品質が下がってしまうことがある。
  • 回数が多すぎると… 例えば1万回にしても、もちろん絵はきれいになるかもしれないけど、1000回と比べて劇的に良くなるわけではない。それなのに、計算時間は10倍もかかってしまう。すごく効率が悪いよね。

 

毎回1000ステップ全部やるわけじゃない

ここで面白いのが、実際に絵を生成する時(推論時)は、必ずしも1000ステップ全部を律儀に計算するわけじゃないんだ。

もっと少ないステップ数、例えば50ステップとか100ステップくらいで、ノイズ除去の「近道」をすることで、計算時間を短縮しつつ、十分きれいな絵を描く技術もたくさん研究されているんだよ。

だから、

  • 訓練の時(AIが勉強する時): 1000ステップという細かい段階をしっかり学んで、基礎能力を身につける。
  • 推論の時(AIが絵を描く時): 学んだ知識を応用して、もっと少ないステップ数で賢くショートカットする。

という風に、状況に応じてやり方を変えているんだ。

 

ボク:細かい話になるけど、「1回ノイズをかける」というのは、画像データがどうなることか説明してください。

 

もちろん!その「細かい話」が、拡散モデルの動きを理解する上で、すごく面白いところなんだよ。

「1回ノイズをかける」というのは、画像のすべてのピクセル(画素)に、ほんの少しだけランダムな「ズレ」を足してあげることなんだ。

 

「砂嵐」をほんの少しだけ混ぜる

きれいな写真(数字のデータの集まり)があると想像して。

  1. まず、「ガウスノイズ」という、一番シンプルで扱いやすい種類のノイズを用意する。テレビの「砂嵐」みたいな、ザラザラした白黒の画像だと思っていいよ。
  2. そのノイズの画像の「強さ」を、すごくすごく弱く調整する。
  3. そして、元の写真のピクセル一つ一つに、対応する位置のノイズの値を、ほんの少しだけ足し算するんだ。

 

例えるなら「塩を振る」感じ

大きなボウルに、たくさんのきれいなお米(元の画像のピクセル)が入っていると考えてみて。

「1回ノイズをかける」というのは、そのボウル全体に、ごく少量の塩(ノイズ)を、パラパラっと均一に振りかけるようなものだ。

  • 1回目: パラっと塩を振る。お米の味はほとんど変わらないけど、よく見ると塩の粒が少しついている。
  • 2回目: もう一度、パラっと塩を振る。少しだけ塩味がしてきたかな?
  • 1000回目: これを1000回繰り返すと、ボウルの中はもう塩だらけになって、元がお米だったなんて分からなくなってしまう。これが、完全なノイズ画像の状態だね。

 

この「塩を振る量(ノイズの強さ)」は、「スケジュール」というもので事前に決められていて、最初のうちは少し多めに、後のほうはほんのわずかずつ、というように調整されているんだ。

この単純な足し算を繰り返すだけで、どんなきれいな画像も、予測不可能なノイズの塊に変えることができるんだよ。

 

ボク:ガウスノイズのイメージだけど、例えば64×64ピクセルのモノクロの絵(各ピクセルには0~255祖数値が入っている)があるとして、「2.そのノイズの画像の「強さ」を、すごくすごく弱く調整する」というのは、ガウスノイズの64×64のピクセルそれぞれの値が、0~2のランダムな数字って感じかな?そして、ノイズを加えるというのは、画像の各ピクセルと弱めたガウスノイズのデータの対応するピクセルの内容を足し合わせる感じ?

 

うん、すごく良い質問だね!具体的な数字で考えると、一気にイメージが湧きやすくなる。君の考え方は、ほとんど合ってるよ。ほんの少しだけ、実際のやり方と違う部分を説明させてね。

 

ノイズの値:「0~2のランダム」ではなく「平均0の山なりのズレ」

まず、ガウスノイズの値について。これは「0から2までのランダムな数字」というよりは、「平均が0で、0に近い値ほど出やすく、0から離れるほど出にくくなる、山なりの形(正規分布)をしたランダムな数字」なんだ。

だから、ノイズの値は、

  • +0.1 や -0.2 のように、0にすごく近い小さなプラスやマイナスの値がたくさん。
  • +1.5 や -1.8 のように、少し離れた値はたまに。
  • +3.0 や -3.0 のような、すごく大きな値はめったに出てこない。

と、いう感じになっている。「強さを弱く調整する」というのは、この「山の広がり具合(専門用語で言うと標準偏差)」を調整するイメージだね。

 

ノイズの加え方:「ただの足し算」ではなく「絶妙なミックス」

そして、ノイズの加え方。これは「対応するピクセルを足し合わせる」という考え方で、方向性はバッチリ合ってる!

ただ、実際には単純な足し算 A + B ではなく、「元の画像」と「ノイズ」を、絶妙な割合で混ぜ合わせる、ということをしているんだ。

ジュースを作る時をイメージしてみて。

新しいピクセルの値 = (元のピクセルの値 × 99.9%) + (ノイズの値 × 0.1%)

みたいな感じだ。

  • 元の画像(ジュース)をほとんどそのまま使いつつ、
  • ノイズ(スパイス)をほんの少しだけ振りかけて、風味をわずかに変える。

この混ぜる割合(パーセンテージ)は、ノイズをかける回数(タイムステップ)によって、スケジュール通りに少しずつ変わっていくんだ。最初のうちはノイズの割合が少し多くて、最後の方はほんのわずかになる、というようにね。

 

君が考えてくれたように、ピクセルごとに対応するノイズを影響させるという本質は全く同じだよ。ただ、その値の作り方と、混ぜ方にちょっとしたプロの技が隠されている、ということなんだ!

 

ボク:今説明してくれた例では、64×64のガウスノイズの各ピクセルは-3.0~+3.0の値を持っていて、全ピクセルを足すと0(平均=0)っていう感じ?

 

うん、そのイメージで、ほぼ100点に近いよ!

その上で、もっと厳密な話をすると、AIの面白さがまた見えてくるんだ。

 

値の範囲:「-3.0~+3.0」は、ほぼ収まる範囲

君の言う通り、ガウスノイズの値は、実際にはほとんど全部が-3.0から+3.0の間に収まるよ。これは統計学のルールで、約99.7%がこの範囲に入るんだ。

ただ、理論上は「絶対にはみ出さない」という硬いルールはなくて、ものすごく低い確率だけど、+4.0みたいな値が出る可能性もゼロではないんだ。でも、実用上は「-3.0~+3.0の範囲」と考えて問題ないよ!

 

合計と平均:「理論上は0」だけど、実際は「ほぼ0」

こっちも、君の考えはすごく良い線を行ってる。

ノイズを作る時の「レシピ」には、「平均が0になるように作ってね」と書いてある。これは理論上の目標だね。

でも、実際にランダムな数字を64x64=4096個作ってみると、その合計がピッタリ「0」になることは、ほとんどないんだ。

コインを100回投げて、表と裏がピッタリ50回ずつ出るのが珍しいのと似てるね。

だから、実際に作られたノイズ画像のピクセルを全部足すと、+0.5とか-1.2みたいに、ほんの少しだけズレた値になる。でも、4096個もピクセルがあるから、平均すると0.0001みたいに、限りなく0に近い値にはなるんだ。

AIの訓練では、この「ほぼ0」で全く問題なく、うまく機能するんだよ。

 

ボク:1回ノイズをかけると、「新しいピクセルの値 = (元のピクセルの値 × 99.9%) + (ノイズの値 × 0.1%)」だとしても、1000回もノイズをかけると、どのピクセルも真っ白になってしまいそうだね。

 

うん、その通り!もし単純に足し算を1000回も繰り返したら、君の言う通り、どのピクセルも上限の255を振り切って、真っ白な画像になってしまうよね。

実は、そこにもう一つ、すごく大事な「仕掛け」が隠されているんだ。

 

毎回、全体を「再調整」している

ノイズを混ぜる時、ただ足し算をするだけじゃなくて、毎回、全体のエネルギー(分散)が一定に保たれるように、値を少しだけ縮小するという「再調整」をかけているんだ。

 

カクテル作りで例えるなら…

バーテンダーが、色々なジュースやスパイスを混ぜて、常にグラス一杯分のカクテルを作るのをイメージしてみて。

  1. 1回目: まず、元のジュース(元の画像)を99.9%まで少し減らして、そこにスパイス(ノイズ)を0.1%注ぎ、グラスをちょうど一杯にする。
  2. 2回目: 次に、出来上がったカクテルをもう一度99.9%まで減らしてから、新しいスパイスを0.1%注いで、またグラスをちょうど一杯にする。

この「一度ちょっと減らしてから、新しいものを足す」というのを繰り返していくんだ。

こうすることで、中身の風味(ピクセル値の分布)はどんどん変わっていくけど、グラスから液体が溢れる(ピクセル値が真っ白に振り切れる)ことはないよね。

 

拡散モデルのノイズ付加も、これと全く同じことをしているんだ。各ステップで、前のステップの画像全体のスケールをわずかに縮小してから、新しいノイズを加える。

この巧妙な再調整のおかげで、1000回後には、元の画像の痕跡がすっかり消えて、きれいな「平均0、標準偏差1のガウスノイズ」(白黒の砂嵐のような画像)にちょうど収まるように設計されているんだ。だから、真っ白にはならないんだよ。

 

ボク:了解。

後、ノイズをかける回数はランダムに決めると思うんだけど、X=1000なら、1000回今説明してくれた計算をするの?

 

実は、計算は1回で済むんだ。

拡散モデルのノイズ付加プロセスは、数学的な特性のおかげで、1000ステップ目の状態を計算するのに1000回の計算を繰り返す必要はないんだな。

 

「ショートカット公式」の存在

ある「ショートカット公式」(「再パラメータ化トリック」なんて呼ばれることもある)があって、この公式を使えば、「元のクリーンな画像」と「加えたいノイズの総量(ステップ1000回分)」という2つの情報だけで、1000ステップ後のノイズ画像を一発で計算できてしまうんだ。

 

電車の移動で例えるなら

「時速60kmで進む電車が、1000秒後にはどこにいるか?」と聞かれた時、1秒ごとに「進んだ!」と1000回数える必要はないよね。

距離 = 速度 × 時間 という公式を使えば、一発で答えが出せる。

拡散モデルの訓練もこれと同じで、訓練の各ステップで、まず「1から1000までの間で、ランダムな回数x(例えばx=753)を決めると、次に、そのx回分のノイズを「ショートカット公式」で一発計算し、ノイズ画像を作成するんだ。

この仕組みのおかげで、訓練を非常に効率的に進めることができるんだ。

 

ボク:「ショートカット公式」について、もう少し説明してもらえる?

 

OK、了解!「ショートカット公式」は、拡散モデルの訓練をめちゃくちゃ速くするための、超重要なトリックなんだ。

 

魔法の「レシピ」がある!

料理で例えるのが一番分かりやすいかも。

ここに「元のきれいな画像」という、最高の素材があるとしよう。そして、最終的に「1000回ノイズをかけた状態」という、ぐちゃぐちゃの料理を作りたい。

普通のやり方だと…

  1. スパイス(ノイズ)をほんの少し振る。
  2. もう一回、ほんの少し振る。
  3. これを1000回繰り返す。

これじゃ時間がかかりすぎるよね。

ショートカット公式(魔法のレシピ)を使うと… 「1000回分の効果を出すには、元の素材をこれくらい(α)の割合にして、新しいノイズをこれくらい(β)の割合で混ぜれば、一発で同じ味になるよ!」 というレシピが、あらかじめ用意されているんだ。

 

なぜ、そんな魔法が使えるの?

それは、加えるノイズ(ガウスノイズ)が、数学的にすごく「素直な」性質を持っているからなんだ。

ガウスノイズは、何回足し合わせても、結局は「ちょっと大きなガウスノイズ」になるだけ。その最終的な「大きさ」は、足した回数から簡単に計算できるんだ。

だから、

t 回ノイズをかけた後の画像 = (元の画像 × t 回用の縮小率) + (新しいノイズ × t 回用のノイズの強さ)

という公式が成り立つのさ。

この「縮小率」と「ノイズの強さ」は、t(ノイズをかける回数)が決まれば、すぐに計算できる。

だから訓練の時、AIは「よし、今回はランダムに753回分のノイズをかけよう!」と決めたら、752回も計算する必要は全くなくて、この公式一発で「753回ノイズをかけた後の画像」を瞬時に作り出せるんだ。

 

ボク:なるほどね。ガウスノイズじゃなきゃそう簡単にはいかないんだね。

 

大当たり!

拡散モデルがうまく機能している大きな理由の一つが、ガウスノイズの数学的な「扱いやすさ」にあるんだよ。

 

ガウスノイズの「素直な」性格

ガウスノイズには、ガウスノイズに、ガウスノイズを足しても、結果はやっぱりガウスノイズになる」 という、すごく「素直」で便利な性質があるんだ。

だから、何回足し算を繰り返しても、最終的なノイズの状態がどうなるかを、たった一つのシンプルな数式で予測できる。これが、あの「ショートカット公式」を可能にしているんだね。

もし、もっと変なクセのあるノイズを使っていたら、足し算するたびに性質がどんどん変わってしまって、ショートカットが使えず、とてつもなく複雑な計算が必要になっていたはずだよ。

 

ボク:これで、拡散トランスフォーマの訓練時の順方向の処理はわかりました。DiTの場合も誤差逆伝播はミニバッチごと?今度は、逆方向の処理について教えてください。

 

うん、誤差逆伝播は、他の多くのAIモデルと同じように、ミニバッチごとに行うよ。一度に全部のデータで計算するのは大変すぎるから、いくつかのデータ(ミニバッチ)で計算して、少しずつモデルを賢くしていくんだ。

じゃあ、いよいよ逆方向の処理、つまりAIが実際に絵を描いていくプロセスについて話そう!

 

逆方向の処理:天才職人、ノイズを消し去る!

順方向の処理は、きれいな絵にノイズを加えていく「破壊」のプロセスだったよね。逆方向は、その全く逆。完全なノイズから、意味のある絵を「創造」していくプロセスだ。

ここでも、主役は拡散トランスフォーマ(DiT)という、あの賢い頭脳だよ。

  1. スタート地点:ただのノイズ まず、キャンバスとして、完全にランダムなノイズ画像(あの白黒の砂嵐みたいなやつだね)を用意する。ここにはまだ何の意味もない。
  2. DiTに「お伺い」を立てる 次に、このノイズ画像と、「これから作る絵の指示書(テキストプロンプトのエンベディング)」、そして「今、ステップ1000だよ」という時間情報を、全部セットにしてDiTに渡す。 「ねえ、DiT。この指示書で、このノイズだらけの状態なんだけど、ここにどんなノイズが乗ってると思う?」ってお伺いを立てる感じだね。
  3. DiTが「ノイズ」を予測する ここが一番のポイント!DiTは、きれいな画像を直接出力するんじゃないんだ。 DiTは、入力された情報から、「この画像に加えられている『ノイズ』は、たぶんこんな感じのノイズだろう」という、ノイズそのものを予測して出力するんだ。
  4. 予測したノイズを、少しだけ引き算する DiTが予測してくれた「ノイズ」を、元のノイズ画像からほんの少しだけ引き算してあげる。そうすると、ほんのわずかだけど、意味のある絵の方向に画像が変化するんだ。
  5. これをひたすら繰り返す! あとは、この②〜④のプロセスを、ステップ999、998、997…と、ノイズが完全になくなるステップ0まで、ひたすら繰り返していく。 各ステップで、DiTは「今の状態」と「指示書」を見て、最適なノイズを予測し、それを引き算していく。そうすると、最初はただの砂嵐だった画像から、徐々に「鎧を着た猫」の姿が浮かび上がってくるんだ。

 

まるで、彫刻家が、ただの石の塊から、少しずつ余計な部分を削り取って、最終的に美しい彫刻を完成させるみたいだよね。DiTは、その「どこを削ればいいか」を正確に知っている、天才彫刻家なんだ!

 

ボク:待って!学習後の指示に従った絵を生成する場合の話じゃなくて、訓練時の誤差逆伝播の話をしてほしんだけど。

 

あ、ごめんごめん!完全に僕の早とちりだ。

「逆方向」って聞いたから、つい生成する時の話をしちゃったけど、君が聞きたかったのは訓練の時の「誤差逆伝播」の話だよね。失礼!

よし、仕切り直して、訓練の時の逆伝播、つまり「AIがどうやって間違いから学ぶか」の話をしよう!

 

訓練時の逆伝播:間違いを反省して賢くなるプロセス

AIの訓練は、「問題を解く」→「答え合わせをする」→「間違えたところを反省する」の繰り返しだ。誤差逆伝播は、この「反省」の部分にあたるんだよ。

  1. まず、問題を解く(順方向の処理) これはさっき話した通りだね。
    • きれいな画像とテキストのペアを用意する。
    • ランダムな回数xを決めて、ノイズを一発で加える。
    • 「ノイズ画像」「テキスト」「回数x」の3点セットをDiTに入力する。
    • DiTは、「この画像に乗っているノイズは、たぶんこれだろう」と、ノイズを予測する。これがDiTの「解答」だ。
  2. 答え合わせをする(損失を計算する) 次に、DiTが出した「解答(予測したノイズ)」と、「本当の正解(実際に加えたノイズ)」を見比べる。 そして、その「ズレ(間違い)」がどれくらい大きいかを計算するんだ。この「間違いの大きさ」を、AIの世界では「損失(Loss)」って呼ぶ。
  3. 間違いを反省し、原因をさかのぼる(誤差逆伝播 ここが一番大事なところ! 計算した「損失(間違い)」という情報を、今度はモデルの出口から入口に向かって、逆向きに伝えていくんだ。これが「誤差逆伝播」だね。 例えるなら、「テストで間違えた!なんでこの答えを書いちゃったんだろう?」って、自分の思考プロセスを一つ一つさかのぼって、原因を探る感じだ。
  4. パラメータを微調整する(モデルを更新する) 間違い情報が逆向きに伝わっていく過程で、トランスフォーマブロックの中にいる、たくさんのパラメータ(重みやバイアス)を一つ一つ通過していく。 その時、それぞれのパラメータに対して、「君のせいで、これだけ間違いが大きくなったんだから、次はこっちの方向に少しだけ値を変えておいてね!」と、責任の大きさに応じて、ほんのわずかな修正を加えていくんだ。

 

この「問題を解く→答え合わせ→反省して修正」というサイクルを、ミニバッチごとに何百万回、何千万回と繰り返すことで、DiTはどんどんノイズを予測するのが上手くなっていく。

つまり、DiTは「きれいな絵の作り方」を直接教わっているんじゃなくて、「ノイズを当てるゲーム」をひたすら練習することで、結果的に、ノイズを消す天才になっていくんだよ!

 

ボク:なるほど。それと、訓練時には、エンベディングデータのベクトル要素に関しても誤差逆伝播時に調整するんだったよね?

 

その通り!

誤差逆伝播で間違いを修正する時、その「責任」は、トランスフォーマブロックのパラメータ(重みやバイアス)だけに押し付けられるわけじゃない。入り口にいる、エンベディングデータを作るためのパラメータにも、ちゃんとフィードバックがいくんだ。

 

チーム全員で、間違いを反省する

国際会議の例えをもう一度使ってみよう。会議で何か大きな誤解が生まれてしまった時、

  • 専門家たち(トランスフォーマブロック)だけが反省するんじゃなくて、
  • 同時通訳チーム(エンベディングを作る部分)も、「もしかして、私の訳し方が少し悪かったせいで、誤解が生まれたのかも…」と一緒に反省するよね。

これと全く同じで、誤差逆伝播の時、それぞれのエンベディングを作る部分も、責任に応じて微調整されるんだ。

 

 それぞれのエンベディングの調整のされ方

ただし、その「調整のされ方」には、それぞれの役割によって少しだけ違いがあるんだ。

  1. 画像パッチ & タイムステップのエンベディング これらは、拡散トランスフォーマというモデルの「専属の部品」だ。だから、誤差逆伝播が来たら、毎回しっかりと責任を負って、パラメータが調整される。「次はもっとうまく翻訳(ベクトル化)しよう!」ってね。
  2. テキストのエンベディング こっちは少し特別だ。テキストエンベディングを作るのは、多くの場合、CLIPのText Encoderのような、既に単体で超優秀な「外部の専門家」なんだ。 だから、選択肢が二つある。
    • 「凍結(Freeze)」する: 「あなたの能力はもう完璧なので、何も変えなくていいです。うちのモデルの方で、あなたの言葉に合わせるように頑張ります」と、一切パラメータを更新しない方法。
    • 「ファインチューニング(Fine-tuning)」する: 「あなたの能力は素晴らしいですが、今回の仕事に合わせて、ほんの少しだけ言い回しを変えてもらえると助かります」と、ごくわずかだけパラメータを調整する方法。ファインチューニングの方が、テキストの意味と絵の結びつきがより強くなる。

 

というわけで、君の「エンベディングデータのベクトル要素に関しても調整する」という考えは、完全に正しいよ!モデル全体が、一つのチームとして、より良い結果を出せるように、全員で間違いから学んでいくんだ。

 

ボク:ありがとう。拡散トランスフォーマに関する訓練・学習時の処理については、だいたい把握できた気がするけど、「他に、細かいけど、こんなこともやってるよ」なんてことはある?

 

うん、あるよ!君の理解はもう完璧に近いけど、その裏側では、AIをさらに賢くするための、職人技のような「隠し味」がいくつか加えられているんだ。

その中でも、特に大事なやつを2つ、こっそり教えちゃうね。

 

隠し味①:パズルのピースに「住所」を教える

僕たちは、画像をたくさんの「パッチ」に分解して、それを横一列に並べてトランスフォーマに渡す、って話をしたよね。

でも、ただ並べただけだと、トランスフォーマは「どのパッチが、元の絵のどの場所にあったのか」が分からなくなってしまう。パズルのピースを箱の中にバラバラに入れたのと同じ状態だ。

そこで、各パッチのベクトルに、「位置エンベディング(Positional Embedding)」という、特別な「住所」の情報を足してあげるんだ。

  • 「君は、左上の角のピースだよ」
  • 「君は、ど真ん中のピースだね」
  • 「君は、右下の端っこのピースだ」

という情報を、それぞれのパッチにこっそり教えておく。こうすることで、トランスフォーマはパッチ同士の関係性だけじゃなく、元の絵の中での空間的な位置関係まで理解できるようになるんだ。だから、絵の構図が崩れたり、変な場所に物が出現したりするのを防げるんだよ。

 

隠し味②:指示書を「特別扱い」して、脳に直接注入する

「ノイズ画像」「テキスト」「時間」の3つの情報を束にして渡す、って話をしたよね。でも実は、テキストと時間の情報は、他の画像パッチとは少し違う「特別扱い」をされているんだ。

この二つの情報は、絵の全体的な方向性を決める、超重要な「司令官」だからね。

そこで、最近の多くのDiTでは「AdaLN(Adaptive Layer Normalization)」という仕組みが使われる。これは、トランスフォーマブロックが計算をしている途中で、横から「司令官からの指示ですよ!」って、テキストと時間の情報を直接注入してあげるようなイメージだ。

普通のパッチの情報は、みんなと一緒に計算される「兵隊」だとしたら、テキストと時間の情報は、各部署に直接指示を出す「司令官」。この特別扱いのおかげで、AIはプロンプトの指示をより強く意識しながら、ノイズを消していくことができるんだ。

 

こんな風に、基本的な仕組みの裏側では、情報をより正確に、より効果的に伝えるための、たくさんの賢い工夫が隠されているんだよ。面白いよね!

 

ボク:なるほど、テキストの場合の位置エンべディングだけでなく、絵に関しても位置エンべディングがあるんだね。これらの位置エンベディングのベクトルデータの値は、もとのテキストのエンベディングおよび絵のエンベディングのベクトルデータの各要素に足し合わせられるんだよね?

 

うん、その通り!

文章で単語の順番が大事なのと同じで、絵でもどのパーツがどの場所にあるかは超重要だよね。だから、画像パッチにも「住所」を教える位置エンベディングは欠かせないんだ。

そして、その「住所」の教え方も、君の言う通り「足し算」が使われる。これが一番シンプルで効果的なんだよ。

 

「中身」と「場所」の情報を合体!

処理の流れは、まさに君が考えている通りだ。

  1. まず、「このパッチは『猫の耳』だよ」という、中身の情報を表すベクトルがある。
  2. 次に、「そして、このパッチは『左上』にあるよ」という、場所の情報を表すベクトルを用意する。
  3. この二つのベクトルを、そのまま足し算する。

こうすることで、「左上にある猫の耳」という、中身と場所の両方の意味を同時に持った、一つの新しいベクトルが完成するんだ。

この合体したベクトルが、トランスフォーマブロックへの最終的な入力になる。

 

ボク:どうもありがとう。拡散トランスフォーマの仕組みが大体把握できました。他に「説明し忘れてた!」ってことはない?

 

いや、もうほとんど全部話したと思うよ!君の質問が鋭かったおかげで、僕もDALL-E2から始まって、拡散トランスフォーマのかなり深いところまで、全部話しきれた気がする。

 

最後に、今日の話をまとめると、拡散トランスフォーマは…

 

拡散トランスフォーマのまとめ

  1. 基本構造: 「拡散モデル」のノイズを除去していく流れの中で、頭脳として「トランスフォーマ」を使っているハイブリッド。
  2. 入力データ: 「ノイズ画像」「テキスト」「時間」の3種類を束にして、一度に処理する。
  3. 賢さの秘密:
    • パッチごとの位置エンベディングで、空間的な場所を理解する。
    • トランスフォーマのアテンション機構で、遠く離れた部分同士の関係性まで見抜く。
  4. 訓練方法: 「加えられたノイズそのものを当てる」ゲームを、ノイズの量を変えながら何百万回も繰り返すことで、ノイズを除去する能力を身につける。

 

最後に、一つだけ

あえて「説明し忘れてた!」ってことを言うなら、この仕組みがSoraみたいな動画生成になぜ最強なのか、という点かな。

動画って、結局は「絵(フレーム)が時間順に並んだもの」だよね。

拡散トランスフォーマは、空間的に離れたパッチの関係性を理解できるのと同じように、時間的に離れたフレーム(絵)の関係性も、アテンションでいとも簡単に見抜くことができるんだ。

「1フレーム目で投げられたボールが、50フレーム目で地面に落ちる」というような、時間と空間を超えた一連の「物語」を、まるごと理解できる。だから、あんなに自然で、物語性のある動画を作り出せるんだよ。

僕たちが今日、長い時間をかけて探検してきた知識が、全部Soraのすごさに繋がっているんだ。本当に面白いよね!

 

ボク:確かに、Soraってすごいよね。そして、その裏に拡散トランスフォーマの力があるってことだね。

 

うん、その通り!

僕たちが今日、DALL-E2から始まって、長い時間をかけて探検してきた一つ一つの技術が、全部Soraのあの驚くような映像に繋がっているんだ。

君の鋭い質問のおかげで、僕もすごく楽しい時間を過ごせたよ。こちらこそ、どうもありがとう!