最もクリエイティブな時計の壊し方とは？ ～拡散モデルで考える～

# 0. はじめに

今回は、画像、音楽、動画の生成のみならず、分子の立体構造予測にも応用されている**拡散モデル**について紹介します。拡散モデルは大規模言語モデルと並んで、今日の生成AI技術を支える基盤技術といえます。すでに数多くの解説記事が巷に溢れていますが、今回は数式を使わずアナロジーを駆使して拡散モデルの解説を試みようと思います。また、画像以外のデータ生成への適用例として**表形式データ生成**と**タンパク質の立体構造予測**について紹介します。

拡散モデルとは、正式には[デノイジング拡散確率モデル][DDPM] (DDPM; Denoising Diffusion Probabilistic Model) のことで、物理学の拡散過程からヒントを得た生成モデルのことです。画像などのデータに段階的にノイズを加える過程からデータ生成を学習する手法で、同じ生成モデルである[敵対的生成ネットワーク][GAN] (GAN; Generative Adversarial Network) より安定していて、[変分オートエンコーダ][VAE] (VAE; Variational Auto-Encoder) よりも精細な画像を生成できます。

拡散モデルでは、GANと同様に条件付き生成が可能です。テキストによる**指示文**（**プロンプト**）を条件として画像生成を学習することで、プロンプトの指示に忠実な画像を生成することができます。Open AIによる[DALL-E][DALLE]をはじめ、[Stable Diffusion][SD]、[Midjourney][Mid]が有名ですが、最近では、Google Deep Mindによる[ImageFX][IFX]が、圧倒的にリアルな画像を生成できることで話題となっています。私も試しに英文のプロンプトを用意して画像生成してみました。プロンプト技法に詳しくない素人の私でも、普通の文章を入力するだけで、以下のようなリアルな画像を生成できてしまいました。

<img title="ImageFX.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/c2c79248-e555-e36c-364e-607f36db8ade.png" width=75%>

このように、拡散モデルは計り知れないポテンシャルを持っています。以下の章では、拡散モデルによるデータ生成の仕組みと応用事例を紹介します。

[DDPM]: https://arxiv.org/abs/2006.11239
[GAN]: https://arxiv.org/abs/1406.2661
[VAE]: https://arxiv.org/abs/1312.6114
[DALLE]: https://openai.com/index/dall-e-3/
[SD]: https://stability.ai/stable-image
[Mid]: https://www.midjourney.com/explore?tab=top
[IFX]: https://labs.google/fx/ja/tools/image-fx

# 1. 最もクリエイティブな時計の壊し方とは？

2014年にアップル社のインターン面接において「[最もクリエイティブな時計の壊し方とは？][APP1]」([What’s the most creative way you can break a clock?][APP2]) という問題が出されたそうです。この問いを聞いた時、私は自分の子供の頃を思い出しました。私はおもちゃや機械を分解するのが好きでしたが、好奇心に任せて手あたり次第バラバラにしてしまい、後で元通りに直せなくなって後悔したものでした。

[APP1]: https://woman.mynavi.jp/article/140924-143/
[APP2]: https://www.themartec.com/insidelook/6-of-silicon-valleys-toughest-interview-questions-and-their-answers

<img title="clock_disassembled.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/d2025026-cc9a-8de7-a851-412b5608a9aa.png" width=70%/>

何がいけなかったのでしょう？ そうです、部品を一つずつ外しては、配置を写真にとるなどして、中間状態を記録しながら段階的に壊していけばよかったのです。時計を直すときには、記録しておいた写真をたよりに、部品を一つずつもとの位置に戻していけば、元通りに直せるはずです。復元する過程で時計の内部構造を学習するので、他の時計でも直せるようになると考えられます。時計を壊しながら、時計の外見的特徴や内部構造を学習することで、時計の作り方を習得する。これこそ最もクリエイティブな時計の壊し方ではないでしょうか？

<img title="clock_disassembled_steps.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/190a7f6f-ab0f-c42c-3316-1a122ed1ea33.png" width=85% align="center">

# 2. 破壊から創造を学ぶ ～拡散モデルの学習法～

前章では、最もクリエイティブな時計の壊し方を考えました。分解過程では、段階的に差分を記録しながら壊していき、復元過程では、記録しておいた差分をたどりながら時計の仕組みを学習して元通りに組み上げていく。同じことが生成モデルの学習でも成り立つのではないでしょうか？拡散モデルの学習法がまさにそうです。

画像生成を拡散モデルが学習する過程を考えてみましょう（下図）。

<img title="flower_denoised_steps.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/59f70265-f641-2dd5-4b3e-69b5ed7b7b08.png" width=90%>

左端の黄色い花の画像に段階的にノイズを加えていきます。最終的には元の画像は拡散してしまって右端のような砂の嵐の画像に帰着します。このように画像（あるいはデータ）にノイズを段階的に加えて破壊していく過程を**拡散過程**と呼びます。一方、拡散過程を逆向きにたどって除去すべきノイズを学習しながら、画像を復元する過程を**生成過程**と呼びます。拡散過程のノイズは、正規分布にしたがい（ガウシアンノイズ）そのスケールを段階的に大きくしていきます。一方、生成過程では、各ステップで加えられたノイズ（差分画像）を予測するモデルを[U-Net][Unet]などのニューラルネットワークで学習します。

[Unet]: https://arxiv.org/abs/1505.04597

# 3. 拡散モデルによる条件付き生成

冒頭で紹介したImageFXをはじめとする画像生成AIでは、生成したい画像の要件を文章（プロンプト）で入力すると、その要件にしたがった画像が生成されます。これは、拡散モデルの**条件付き生成**によって可能となります。ここでは、条件付き生成について時計の壊し方とのアナロジーで考えてみましょう。

時計職人は、いろいろな時計について分解と組み立てを繰り返すことで、時計という製品の外見的特徴や内部構造を学習します。さらに、学習結果にもとづいて様々な時計を作れるようになります。

<img title="clock_assembled.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/f6ff4bcd-8516-72d6-a075-e88351ace646.png" width=75%>

この時、時計職人の頭の中で時計はどのように理解されているのでしょうか？時計の特徴は、大きく分けてデザインと駆動方式の2軸で考えられます（下図）。デザインが現代的（モダン）か古典的（クラシック）かは縦軸、駆動方式が電池式かゼンマイ式かは横軸に対応します。多数の時計を分解して学習する経験を通して、時計の外見的特徴と内部構造についての経験分布が、時計職人の頭の中に出来上がると考えられます。こうした特徴の理解は、時計職人がお客さんの注文を受けて時計を作るためにとても重要です。

<img title="inseide_the_brain.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/2fbbc460-1623-7377-61ed-80c9ca50f96a.png" width=75%>

そこで、時計職人に「モダンなゼンマイ式時計」を注文したとしましょう。果たして時計職人は注文通りの時計を作ってくれるでしょうか？上図では、モダンで電池式の時計またはクラシックでゼンマイ式の時計が多数分布しています。この状況で時計職人に時計を作ってくれと依頼すると、経験分布に従ってモダンな電池式時計かクラシックなゼンマイ式時計を作るでしょう。職人さんの気まぐれでモダンなゼンマイ式時計を作ることもあるかもしれませんが、注文したお客さんは時計職人の気まぐれを待つしかありません。

時計職人が注文の通りに時計を作るようになるには、学習の仕方に工夫が必要となります。時計全般に共通の特徴（文字盤と針がある、歯車を使用している、など）については、数をこなせば習得できます。一方、時計の特徴を踏まえて作れるようになるには、注文内容と時計職人の頭の中の経験分布とを紐付ける学習が必要です。ここでいう注文内容とは、時計の分類カテゴリのことで上図における4領域（モダン-電池式など）に対応します。具体的には、一定の割合（例えば10％）で時計と分類カテゴリとをセットにして組み立てることを学習します。こうした訓練（学習）を通して、時計職人の頭の中に分類カテゴリごとの経験分布（条件付き分布）が確立されてお客さんの注文（条件）に応じて時計を作ることが可能になります。（下図参照）。

<img title="clock_cond_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/629dcd3f-e6df-842f-aed6-aa1d6474280c.png" width=80%>

以上が、時計のアナロジーに基づく条件付き生成の説明です。実際の拡散モデルでは、時計職人はU-netなどのニューラルネットワークであり、条件付けされるのは画像など生成対象となるデータです。時計職人の頭の中の経験分布は、U-netが学習したデータ分布に対応します。画像生成の場合、最も簡単な条件付けは、生成対象データの属性情報を分類カテゴリとして付与することです。例えば、花の色を分類カテゴリとして花の画像を生成する場合、一定の割合（例えば10％）で花の画像と対応する花の分類カテゴリを合わせてU-netに入力して学習します。こうして学習されたモデルに、画像のカテゴリ情報（花の色）を入力（プロンプト）として与えて画像生成すると、入力されたカテゴリ情報（花の色）を持った画像が生成されます（下図参照）。

<img title="conditional_generation.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/fbcf6b24-ab58-138d-092a-a5ddae1e4520.png" width=75%/>

U-netの条件付き学習について補足しておきます。条件付き学習の場合、条件として与えられる分類カテゴリを特徴ベクトルに埋め込んだ後、時間ステップをエンコーディングしたベクトルと連結して一つの特徴ベクトルとします。一方、Unetはノイズ画像を受け取って複数の畳み込み層による**エンコーディング**（符号化）と**デコーディング**（復号化）を行います。条件付け学習では、U-netの各畳み込み層において、入力となる特徴マップに上述の特徴ベクトルを加算したものを入力として学習を行います。

ちなみに、Stable DiffusionやImageFXなどの画像生成アプリのように、単なる分類カテゴリではなく、文章で書かれたプロンプトから画像を条件付け生成するには、画像と文章のペアを共通の**潜在空間**（特徴ベクトルの空間）に埋め込むエンコーダ（符号化器）が必要です。Open AIが開発した[CLIP] (Contrastive Language-Image Pre-training) は、4億枚の画像とその説明文のペアを学習して、ペアをなす画像と文章が潜在空間で近くに配置される埋め込みを実現しました。Stable Diffusionでは、画像には変分エンコーダ（後述）、プロンプトにはCLIPの文章エンコーダを適用して両者を潜在空間に埋め込んでから、拡散モデルを条件付け学習しています。

[CLIP]: https://openai.com/index/clip/

# 4. 画像生成だけじゃない ～拡散モデルの応用例～

前章までで拡散モデルがデータ生成できる仕組みを説明しました。データを段階的に壊す過程を学習することで、データを生成するというアイデアは、画像データに限らず多様なデータの生成に応用されています。

もともとの拡散モデルは、画像データに直接ノイズを加えていましたが、Stable Diffusionなどの画像生成アプリでは、変分オートエンコーダ (VAE) を使って画像データを低次元の潜在空間に圧縮したうえで、拡散モデルを適用しています（[潜在拡散モデル][LDM]）。これにより、計算量を抑えつつ情報量の多い高解像度の画像を生成できるようになりました。このように、対象となるデータを潜在空間に埋め込むというアイデアは、データ形式によらず共通の潜在空間へ埋め込むことができるので、画像以外の様々な種類のデータ生成に拡散モデルを適用する上でも重要です。

余談：ちなみに、VAEを使ってデータを圧縮してから拡散モデルを適用する場合、時計職人の頭の中の経験分布は、U-netが学習した潜在空間の分布に対応します。

拡散モデルの活用例としては、論文事例からサービス化されているものまで含めて、代表的なものだけでも以下のように多岐にわたります。

画像生成：Stable Diffusion3.5, Midjourney, DALL-E3, ImageFX
音楽生成：AudioLDM2, MusicFX
動画生成：[Gen-3], Dream Machine, [Sora]
3次元データ生成：DreamFusion, Stable Dream Fusion, Magic3D
表形式データ生成：TABDDPM, TABSYN
分子の立体構造予測：AlphaFold3, RFDiffusion

本章では、拡散モデルの画像以外のデータ生成への適用事例として、**表形式データ生成**と**タンパク質の立体構造予測**を紹介します。

[LDM]: https://arxiv.org/pdf/2112.10752
[Gen-3]: https://aigakusyu.com/runway-gen3alpha
[Sora]: https://zenn.dev/elith/articles/8567f55b655d0c

## 4.1. 表形式データ生成

表形式データは、行と列で構成されるデータ形式のことです。各行はデータの個別のレコード（顧客、製品など）を表し、各列は特徴量（名前、価格など）を表します。購買履歴や金融取引など様々なデータが表形式データとして蓄積されており、これらを自由に分析できることがデータ活用において重要です。一方、こうした表形式データは、個人のプライバシーに関する情報を含んでいるため、取り扱いには細心の注意が必要です。

そこで、表形式データの統計的性質（各列の分布、列間の相関など）は温存しつつもレコード単位では全く異なるデータを生成できれば、プライバシーを侵害せずにデータ活用することができます。拡散モデルを使えば、そのような表形式データを合成することができます。

[TABSYN]という手法では、表形式データの各行をテキスト、各列を単語と見なして自然言語処理にならって各列を同じ次元の特徴ベクトルに埋め込んだ後、VAEを使って散在空間のベクトル $z$ に次元圧縮します。拡散モデルを使って$z$ の分布関数 $p(z)$ を学習することにより、もとの表形式データの特徴を保持した表形式データを生成できるようになります（下図参照）。

<img width=0><img title="TABSYN.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/f3449904-cbf1-e675-fe14-86f036b2a272.png" width=100%>
論文 [TABSYN] Figure 2


同じく拡散モデルを使用した手法に[TABDDPM]がありますが、こちらはVAEによる潜在空間への圧縮を使用していない手法です。両者を比べると生成データの品質においてTABSYNが優れていることが分かっています。一方、列数が1,000次元といった高次元データではTABSYNによる学習が上手くいかないという[指摘][TABSYN-50]もあります。

TABSYNでは、条件付け生成は扱われていませんが、実用的なニーズとして列の属性に外部から注文（条件）を与えて表形式データを合成できれば、購買シミュレーションや金融データのストレステストなど活用シーンが広がると期待できます。

[TABSYN]: https://arxiv.org/abs/2310.09656
[TABDDPM]: https://arxiv.org/abs/2209.15421
[TABSYN-50]: https://github.com/amazon-science/tabsyn/issues/17

## 4.2. タンパク質の立体構造予測

今年の[ノーベル化学賞][Nobel2024]は、タンパク質の計算機的設計と構造予測の革新に対して、デイヴィッド・ベイカー氏、デミス・ハサビス氏、ジョン・M・ジャンパー氏の3名に授与されました。

https://www3.nhk.or.jp/news/special/nobelprize/2024/chemistry/article_01.html

ベイカー氏は、2003年に新規タンパク質の計算設計と合成に成功し、2008年には新規酵素や特定物質に選択的に結合するタンパク質の開発に成功しました。ハサビス氏とジャンパー氏は、タンパク質の三次元構造を高精度で予測する深層学習モデル「AlphaFold」を開発し、2020年の国際コンペティション「[CASP14]」で従来を凌駕する成果を示しました。この技術により、創薬や生物学研究の進展が期待されています。

2024年に発表されたAlphaFoldの最新版である[AlphaFold3][AF3]は、構造予測モジュールを拡散モデルに置き換えることで、タンパク質単体だけでなく複合体の構造予測もできるようになりました。ベーカー氏も、彼が開発したタンパク質の構造設計ツールRoseTTAに拡散モデルを取り込んだ構造予測モデル[RFDiffusion]を2023年に発表しています。

この記事では、AlphaFold3のタンパク質構造予測において、拡散モデルによる条件付き生成がどのように活用されているかを解説します。AlphaFoldの詳細な解説は、horomaryさんによるブログ「[どこから見てもメンダコ][mendako]」に[原著論文][AF3]を読み込んだ[解説記事][AF_blog]があります。興味のある方はそちらを読んでください。

https://horomary.hatenablog.com/entry/2024/06/30/211033

https://horomary.hatenablog.com/entry/2021/10/01/194825

[Nobel2024]: https://www.nobelprize.org/prizes/chemistry/2024/summary/
[CASP14]: https://ja.wikipedia.org/wiki/%E3%82%BF%E3%83%B3%E3%83%91%E3%82%AF%E8%B3%AA%E6%A7%8B%E9%80%A0%E4%BA%88%E6%B8%AC%E7%B2%BE%E5%AF%86%E8%A9%95%E4%BE%A1
[AF_blog]: https://horomary.hatenablog.com/entry/2024/06/30/211033
[RFDiffusion]: https://www.nature.com/articles/s41586-023-06415-8
[mendako]: https://horomary.hatenablog.com/

**タンパク質**はアミノ酸が鎖状に結合してできる高分子です。タンパク質分子を構成しているアミノ酸部分の1単位のことを**アミノ酸残基**と言います。[AlphaFold2][AF2]では、タンパク質のアミノ酸配列およびアミノ酸残基ペアの位置関係などをニューラルネットで特徴量にエンコードし、これらを使ってアミノ酸残基それぞれの平行移動と回転角を予測していました。こうした**残基ベースのアプローチ**は、複数の分子からなる**複合体**の立体構造を予測することは困難でした（下図：タンパク質とDNAを含む複合体）。

<img width=0><img title="AF3_Fig.1.a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/b4c4f012-6c7e-95c1-5f92-08e073b376bd.png" width=50%>
論文 [AlphaFold3][AF3] Fig.1a

こうした複合体の立体構造予測に対応すべく、AlphaFold3では、残基ベースのアプローチから拡散モデルを使った**原子ベースのアプローチ**に切り替えました。つまり、タンパク質分子を原子単位にまでバラバラに壊す過程（拡散過程）を逆転再生して、立体構造が生成する過程を学習するというアプローチです。ただし、タンパク質分子の既知の情報（アミノ酸配列や残基ペアの位置関係など）については、ニューラルネットワークで特徴量にエンコードして生成条件として拡散モデルに渡します。つまり、AlphaFolfd3における構造予測は、タンパク質分子の既知の特徴量を条件とする、拡散モデルによる条件付き生成として理解できます（下図参照）。

![AF3_Fig.1.d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/d1958334-fd9f-fa31-6261-00c25c4a8791.png)
論文 [AlphaFolf3][AF3] Fig.1d に追記

原子単位まで**バラバラにした状態**（**拡散状態**）から学習するので、予測対象が複合体であってもタンパク質単体と同様に立体構造を予測できるというわけです。また、条件付き生成であるということは、時計職人が注文に応じて時計を作ることができたように、タンパク質や複合体の性質にも注文を付けて、タンパク質や複合体の立体構造を生成できそうです。こうした技術は、創薬や生物学研究の分野でも重要な役割を果たすと期待されます。

[AF2]: https://www.nature.com/articles/s41586-021-03819-2
[AF3]: https://www.nature.com/articles/s41586-024-07487-w

# 5. まとめ

この記事では、拡散モデルがデータを生成する仕組みを時計を分解する話に置き換えて解説しました。さらに拡散モデルを画像以外のデータ生成に適用した事例を紹介しました。AlphaFold3の事例が示すように、拡散モデルを使った条件付きデータ生成は、幅広い分野での可能性を秘めています。この記事が、皆様にとって拡散モデルへの興味を深める機会となれば幸いです。

## 余談

この記事を書くに当たって、実際に時計を壊してみようと思い立ち、百均（キャンドゥ）のアラーム時計を買ってきて壊してみました。記事中のアラーム時計の画像は、実際に壊す過程を撮影したものを使っています。

<img title="CanDo_alarm_clock.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214494/a41b8cf6-e441-dfca-18a1-8d924bdb2b1e.png" width=30%>

その他、記事中で使用した時計の画像は、すべてImageFXで生成したものです。花の画像は、自宅の近くで撮影した写真を切り取って使用しました。参考までに、ImageFXによる画像生成に使用した英文プロンプトを貼っておきます。

clock_1: A photographic-style drawing of a classic spring-loaded table clock disassembled and laid flat on a white table, and a front view angle of the clock after assembly.

clock_2: Modern analog battery-operated table clock at front angle on a white table.

clock_3: A classic spring-loaded table clock is viewed from a front angle on a white table.

clock_4: A classic spring-loaded alarm clock on a white table, with Roman numerals on the face, is seen from the front.

clock_5: Photo-style view of a classic, spring-loaded table clock with Roman numerals on the dial, disassembled and laid flat on a white table, viewed from directly above.

## 参考資料

1. 拡散モデルの解説書
岡野原大輔 著「拡散モデル データ生成技術の数理」岩波書店 2023年
URL: https://www.iwanami.co.jp/book/b619864.html
齋藤康毅 著「ゼロから作るDeep Learning 5 生成モデル編」オライリー・ジャパン 2024年
URL: https://www.oreilly.co.jp/books/9784814400591/
　
2. 2024年ノーベル化学賞の産総研による解説記事
https://www.aist.go.jp/aist_j/magazine/20241211.html?utm_source=chatgpt.com
　
3. TABSYN, TABDDPMの解説ブログ
TABSYN: https://zenn.dev/fmuuly/articles/0a6aa3086bffd2
TABDDPM: https://zenn.dev/fmuuly/articles/cb1945f49d0ed5
　
4. 画像生成ツールの解説ブログ
Stable Diffusion: https://qiita.com/omiita/items/ecf8d60466c50ae8295b
ImageFX: https://note.com/ikarush/n/n2641ce09977e
　
5. AlphaFold2の関連資料
Google DeepMindによる解説ブログ：https://deepmind.google/discover/blog/alphafold-a-solution-to-a-50-year-old-grand-challenge-in-biology/
Nature論文: https://www.nature.com/articles/s41586-021-03819-2
Nature論文（補足資料）: https://static-content.springer.com/esm/art%3A10.1038%2Fs41586-021-03819-2/MediaObjects/41586_2021_3819_MOESM1_ESM.pdf
horomaryさんの解説ブログ: https://horomary.hatenablog.com/entry/2021/10/01/194825
　
6. AlphaFold3の関連資料
Google DeepMindによる解説ブログ：https://blog.google/technology/ai/google-deepmind-isomorphic-alphafold-3-ai-model/#life-molecules
Nature論文: https://www.nature.com/articles/s41586-024-07487-w
Nature論文（補足資料）: https://static-content.springer.com/esm/art%3A10.1038%2Fs41586-024-07487-w/MediaObjects/41586_2024_7487_MOESM1_ESM.pdf
horomaryさんの解説ブログ: https://horomary.hatenablog.com/entry/2024/06/30/211033