人工知能は拡散言語モデルの夢を見るか?

2025年11月25日

こんにちは、PredNextの徳永です。本当は週1くらいで更新するつもりにしていたのですが、ずいぶんと更新が滞ってしまいました。この忙しさで品質にこだわり始めると年に1〜2本しか記事を書けなくなってしまうので、次からは細かいところには目をつむって素早く更新することを心がけます。

閑話休題、2025年、拡散言語モデルであるMercury CoderGemini DiffusionDream 7B などが少し話題になりました。まだ実用的に使われている事例が出てきているとは言いづらい状況ですが、注目が集まっているとは言えるでしょう。

現状のLLMのモデルアーキテクチャであるTransformer(より正確には、自己回帰モデル型のTransformer)は、実行効率の面で根本的な問題を抱えています。特に、一つのプロンプトだけに対して応答を生成する場合、実効効率がどうしても低くなりがちです。この問題を解決する手段として、拡散言語モデルに注目が集まっています。

拡散言語モデルについては、最近、質問をいただくことが増えてきました。ただ、ハードウェアにあまり詳しくない方にそのメリットを説明しようとすると、意外なくらい説明が大変です。そこで本記事では、あまり計算機のハードウェアに詳しくない方に向けて、なぜ拡散言語モデルが注目を浴びているのかを、B/Fというキーワードを交えながら説明します。LLMの推論を考える上で計算機の利用効率は避けて通れない論点です。「ハードウェアはあまり詳しくない」という方にこそ読んでいただきたい内容になっています。ハードウェアチョットワカルという方には少し簡単かもしれませんが、復習だと思って読んでいただけると幸いです。

Transformerの推論が遅いのはなぜか

2025年現在、実用的なLLMはほぼすべて、Transformerと呼ばれるアーキテクチャに基づいています。現在のTransformerにおける推論方式は、 自己回帰モデル(Auto Regressive Model) と呼ばれる方式です。自己回帰モデルでは、文章を生成する際に次のトークン(=単語や記号など)を予測し、その予測結果を次の入力に使って、また次のトークンを予測する…というプロセスを繰り返します。ある時刻 tt のトークンを生成するためには、その一つ前の時刻 t1t-1 の出力トークンが必要になります。当たり前といえば当たり前の制約ですが、「 t1t-1 の計算が終わらないと tt の計算に進めない」ため、計算を並列化しづらいという厄介な問題を抱えています。

そのような問題がある一方で、自己回帰モデルには、出力品質が高いという圧倒的な利点があります。これは本当に大きな利点で、いくら強調してもしすぎることはないくらいです。

さて、問題の話に戻ると、自己回帰モデルでは、一つのトークンを生成するたびに大きなモデルデータをメモリ(DRAM)からプロセッサ(=GPUとかTPUとか)に読み込む必要があります。モデルサイズがどんどんと大きくなる昨今、これは大きな欠点です。例えば、Llama 3.3 70Bモデルを使って1トークンを生成するためには、8bit量子化したとしても、毎回70GBのデータを読み込む必要があります。10トークン生成しようとするとその10倍、700GBもデータを読まないといけません。信じられないかもしれませんが、何度も何度も同じデータをメモリからプロセッサへと読み込んではちょっと計算に使ってすぐに捨ててしまう(捨てる=次の計算に必要なデータで上書きしてしまう)ので、こんなことになるのです。参考として、NVIDIA H100のメモリバンド幅が3.35〜3.9TB/sですから、モデル読み込みがボトルネックになってしまうことは容易に想像できるでしょう。

専門用語で表現すると、自己回帰モデル型Transformerは推論時のB/F(Bytes per FLOP)値が高く、プロセッサとメモリが分離されている現代のコンピュータでは効率よく実行できません。さて、唐突にB/Fという専門用語が出てきてしまいました。早速ですが、B/Fについて次節で説明しましょう。

B/Fが高い計算はつらい

B/Fとは、Bytes per FLOP の略で、1回の演算をするために何バイトのデータを読み書きする必要があるかを表す値です。ここでのFLOP(FLoating point OPeration)は、浮動小数点数の加算や乗算といった演算1回ぶんを指します。式で表すと、B/F = 転送バイト数 / FLOP です。例えば、B/Fが1なら、1回の計算(例えば加算)をするために読み書きするデータは1バイトです。ちなみに、B/Fでカウントされるデータは、プロセッサとメモリの間を流れるデータ量です。つまり、プロセッサがキャッシュを持ち、データを再利用する場合、再利用したデータの分はB/Fとしてカウントされません。

プロセッサとメモリ(いわゆるDRAM)は、製造工程が違うので、どうしても別々のチップとして作る必要があります。 絶対に同じチップに作り込むことが不可能というわけではありませんが(Compute In Memoryという分野が存在するくらいには、同じチップ上にプロセッサとメモリを同居させるのはメジャーな研究分野です)、計算能力がかなり落ちてしまうというデメリットがあります。私が知る限りでは、プロセッサの性能を下げずにプロセッサとメモリを同居させることは2025年現在、不可能です。

ここからが問題の本質ですが、別々のチップの間でデータをやり取りするのは非常に大変です。同じチップ上であれば、データを移動させるための配線を高密度で並べることができますが、チップ間配線を行う場合、チップ内と同じ密度で配線することができず、どうしても線の数が大幅に少なくなります。そのため、コンピュータは昔から、B/Fが高い計算は基本的に苦手です。

ここからは少し歴史寄りの余談ですが、どれくらい昔からDRAMが使われているのかというと、DRAMが考案されたのが1966年、インテルがDRAMの製造をはじめたのが1970年ということですから、1970年代なかばにはDRAMが普及していたようです。そして、DRAMが普及する前には磁気コアメモリが使われていたそうですから、50年以上も前から、コンピューターはB/Fが高い計算は苦手だったはずです。そういうわけで、B/Fは昔からソフトウェアの実行効率にとって極めて重要な指標なのです。

ここまで説明して、やっと前節の続きの話ができます。自己回帰モデル型Transformerの推論計算は1トークンを生成するために毎回モデルを読み込む都合上、B/F値がとても高く、ボトルネックはメモリ帯域になります。そのため、メモリ帯域を広げれば広げた分だけプロセッサの利用効率が向上しますが、メモリ帯域を広げるのは多大なコストがかかります。NVIDIAのデータセンター向けGPUはHBM(High Bandwidth Memory)という特殊なDRAMを使うことで広帯域を実現していますが、このHBMのチップは普通のDRAMよりかなり高価です。HBMを用いる場合、プロセッサとメモリを物理的に非常に近い位置に並べて、普通なら考えられないくらいの高密度でチップ間の配線を行います。そのためには、シリコン貫通ビアという技術とシリコンインターポーザーという部品が必要になります。HBM自体の値段が高いのに、接続するための部品もまた高価なのです。しかも、そのHBMを使っている現状でも、B/Fが高すぎてメモリ帯域がボトルネックになっているわけです。最近、SK Hynixやマイクロンの株価がうなぎのぼりなのは、このHBMを製造しているからです。

拡散モデルの仕組み

話を拡散言語モデルに戻しましょう。拡散言語モデルが嬉しいのは、B/Fが自己回帰モデルよりも圧倒的に低い点です。

いきなり拡散言語モデルの詳細を説明するのは難しいので、まず拡散言語モデルの元となる拡散モデルから説明しましょう。 拡散モデルは、以下の2つの過程で構成されます。

  1. 拡散過程(ノイズを加える): 元のデータ(画像など)に少しずつノイズを加えていき、最終的に完全なノイズにする。
  2. 逆過程(ノイズを除去する): ノイズ混じりのデータから、(ニューラルネットワークを使って)ノイズを少し取り除く。

逆過程をよく学習させた画像生成拡散モデルにノイズを入れると、素敵な画像を取り出すことができます。ノイズに対応する画像が生成される、というのが初見では信じがたいところではありますが、実際、Stable Diffusionなどの画像生成モデルを使うと、写真と見まごうような画像が生成できてしまいます。

拡散モデルのLLMへの応用

このノイズを除去するという考え方をLLMに応用したのが拡散言語モデルです。入出力が離散値になるため、離散拡散言語モデルとも呼ばれます。(連続拡散言語モデルという概念も存在しますが、本記事では触れません。)

離散拡散言語モデルでは、拡散過程と逆過程は以下のようになります。

  • 拡散過程: 文章中の一部の単語を、特殊なトークン(以下では[MASK]トークンと表記します)にランダムに置き換える。
  • 逆過程: Transformerなどのモデルに[MASK]トークンが混ざった文を入力し、[MASK]の部分のトークンを予測させる。

拡散モデルで出てきた「ノイズを加える」「ノイズを取り除く」という過程が、「マスクする」「マスクを取り除く」に変わっただけです。

学習の際には、逆過程を成功させるように学習させます。学習を安定させるためには工夫が色々とありますが、基本はこれだけです。

逆過程において、複数の[MASK]トークンを入力できることが拡散言語モデルの特徴です。このため、一度に複数の[MASK]トークンを入力することで、複数のトークンを生成することができます。

上にふわっと書きましたが、学習させるネットワークのアーキテクチャはTransformerなどの既存のLLMです。拡散言語モデルという名前で呼ばれてはいますが、拡散言語モデルという新しいアーキテクチャが存在するわけではなく、学習と推論の部分に拡散モデル由来のアイデアが取り込まれているだけです。拡散言語モデルと対比される概念は自己回帰モデルであり、Transformer等のネットワークアーキテクチャではありません。

拡散言語モデルで推論するには

拡散言語モデルを使って文章を生成する際の流れは、おおまかに次のようになります。

  1. 生成したい長さの [MASK] トークン列を用意する。
  2. そのトークン列を Transformer 等の逆過程ネットワークに入力する。
  3. 出力列のうち、出力値の大きさがしきい値を超えた位置だけ、そのトークンを採用する。 (しきい値方式の他に、上位何件かを強制的に採用する、といった方法もあります。)
  4. 採用されなかった位置は再び [MASK] トークンに戻し、もう一度逆過程ネットワークに入力する。
  5. 1〜4 を繰り返し、[MASK] トークンがなくなるまで少しずつ確からしい単語に置き換えていく。

拡散言語モデルは一度の逆過程の適用で複数のトークンを生成できるため、モデルの読み込み回数を減らすことができます。つまり、B/F値を小さくできます。例えば、100回の繰り返しで文章が完成する場合、DRAMからのモデルの読み込み回数も100回で済みます。1000トークンの文章を生成する場合、自己回帰モデルが1000回モデル読み込みを必要とするのに比べ、大幅に効率的です。

また、副次的な効果として、一度に複数のトークンを並列で処理するため、計算が行列積中心となり、GPUのTensorCoreなどを効率的に活用できます。

拡散言語モデルの実用性

拡散言語モデルは現状、実用的なのでしょうか? 出力の品質と速度の2点について考えてみましょう。

品質については、最近、ある程度以上のモデルが学習され、しっかりとした評価が行われるようになってきました。Large Language Diffusion Models (LLaDA)では、8Bクラスの拡散言語モデルが、同等規模の自己回帰モデルと同程度の品質を達成することを、いくつかの下流タスクを用いた実験で明らかにしました。

速度については、拡散言語モデルのほうが常に自己回帰モデルよりも高速というわけではなく、繰り返し回数が増えると、拡散言語モデルのほうが遅くなってしまいます。どのあたりにしきい値があるのかはハードウェアの性能(演算性能とメモリ帯域)やモデルサイズによっても変化するので、ここでは、モデルサイズは70B、ハードウェアはNVIDIA H200を仮定することにしましょう。出力長は1024トークンとしておきます。

まずは自己回帰モデルの計算時間について考えてみましょう。Boost Llama 3.3 70B Inference Throughput 3x with NVIDIA TensorRT-LLM Speculative Decodingによると、H200におけるLlama 3.3 70Bの推論性能は約51 tokens/s(TPS)です。出力量が1024トークンと仮定すると、出力にかかるのは約20秒です。

モデルを1秒間に約51回読み込むわけですから、51 × 70 ≈ 3.6TB/sのデータ読込が必要になります。NVIDIA H200のメモリ帯域は4.8TB/sですから、メモリ帯域のかなりの部分がモデル読み込みに使われていることがわかります。KVキャッシュの読み書きにもメモリ帯域が必要であることを考えると、ボトルネックはメモリ帯域にあると考えてよいでしょう。

拡散言語モデルの方では、ボトルネックがプロセッサになります。70Bモデルで1トークンを出力するために必要な計算量は約140GFLOP(概算ですが、約2FLOP/パラメーターです)なので、1024トークン出力するための計算量は約140TFLOPです。これが逆過程を一回計算するための計算量で、NVIDIA H200のfp8密行列積の計算性能は約2000TFLOP/sですから、逆過程の計算は1秒間に約14回できるはずです。実際には、演算器をフル稼働させるのは様々な事情があって難しいので、7割くらいの性能になるとすると、1秒間に約10回程度の繰り返しが可能になると推定できます。自己回帰モデルは出力に20秒かかるのですから、両モデルで釣り合いが取れる繰り返し回数は約200回になります。

200回というとかなり余裕があるように見えますが、Boost Llama 3.3 70B Inference Throughput 3x with NVIDIA TensorRT-LLM Speculative Decodingによると、自己回帰モデルは投機的デコーディングを導入することで約3倍程度の高速化が可能です。さらにそこから3倍くらいは高速にならないと拡散言語モデルを採用するうまみがないと考えると、200/9 = 約22回程度が実際に許される繰り返し回数になるでしょう。そう考えると、拡散言語モデルが本当に速いのか、だんだんわからなくなってきます。

実際の拡散言語モデルの繰り返し回数はどれくらいでしょうか。Dream 7B: Diffusion Large Language Modelsでは、拡散言語モデルであるDream 7Bは、繰り返し回数を5〜20回に設定した場合に、Qwen 2.5 7Bを精度、速度ともに上回ったと報告しています。ただし、タスクはCountdown一種類だけでしか検証されていません。Diffusion LLMs Can Do Faster-Than-AR Inference via Discrete Diffusion Forcingでは、D2Fという提案手法を適用したDream 7Bは、GSM8k-4-shotとMBPP-3-shotの2種類のタスクで、LLaMA3-Instruct-8Bを速度、スコアともに上回ったと報告しています。ただし、Qwen2.5-Base-7Bにはスコアで大幅に負けてしまっています。

学習に使える計算機資源によってもスコアは大きく変わってきてしまうため、大規模実験に莫大な金額がかかる昨今、拡散言語モデルと自己回帰モデルの公平な比較は簡単ではありません。しかし、少なくとも現時点では、「出力品質と速度の両方で自己回帰モデルを大きく上回っている」とまでは言えない状況です。

まとめ

本記事のポイントを3つにまとめると、次のようになります。

  • 自己回帰モデルはB/Fが高く、現代のGPUではメモリ帯域がボトルネックになりやすい
  • 拡散言語モデルは一度の推論で複数トークンを生成できるため、モデル読み込み回数を減らし、B/Fを小さくできる余地がある
  • ただし、繰り返し回数が増えると結局計算にかかる時間が伸びてしまうので、投機的デコーディングなどで高速化された自己回帰モデルを常に上回るとは断言できない

上述の通り、自己回帰モデルと拡散言語モデル、どちらが優れているとは一概に結論付けられません。また、拡散言語モデルには、Mixture of Expertsを採用する場合にroutingをどうしたらいいか、など、自明ではない問題も残されています。様々な課題が残されている現状では、拡散言語モデルが次世代の主流になる推論方式になると断言はできませんが、自己回帰モデルによる推論は原理的に効率が悪いというのも変えがたい事実です。筆者としては、拡散言語モデルが来る方に賭けようと思ってこの記事を書きました。数年後に本記事を振り返ってみるのを楽しみにしています。

本記事は原理の説明だけで随分と長くなってしまったので、最近出てきた拡散言語モデル関連の面白い研究については次の記事で紹介しようと思います。次の記事はすぐに出せるようにがんばります。また近いうちにお目にかかりましょう。

お仕事募集中です

2025年11月現在、お仕事を若干ですがまだ募集しています。拡散言語モデルに限らず、難易度が高めの機械学習案件ならなんでもお待ちしております。ご興味のある方はお問い合わせフォームからご連絡ください。

参考文献

これから読むつもりの文献

シェアする: