この動画は、従来のChatGPTのような自己回帰型言語モデルに対して、Googleが開発した新しい拡散言語モデルの革新性と優位性を数学的観点から詳細に解説したものである。拡散モデルは複数の単語を同時生成し、既生成テキストの改良が可能で、より高速で一貫性のある出力を実現する。マスキングプロセスによるノイズ追加と除去の仕組み、ベイズ則を用いた確率的アプローチ、訓練と生成の具体的手順まで、数学的基礎から実装まで包括的に説明している。

自己回帰型言語モデルから拡散言語モデルへ
もしChatGPTに質問をすると、次のトークンを生成するために前のすべてのトークン(ここでは単語として簡略化します)を苦労して使用し、これを何度も繰り返します。これは自己回帰型言語モデルまたはLLMと呼ばれています。
Googleの新しい言語モデルの反応を見てみましょう。ハイライトルールを表示してください。この新しいLLMは一度に多くの単語を生成するだけでなく、前後の単語の両方を使用して既に生成したものを改良することもできます。
自己回帰型言語モデルと比較した、この驚くべき速度と改良能力によって、新しいプレイヤーが登場したことを理解していただけるでしょう。それが拡散言語モデルです。
この動画では、最も一般的で最も効果的なタイプの拡散言語モデルがどのように機能するかについて説明します。数学の基礎に落とし込むと、非常にシンプルで洗練されています。事前知識を前提とせずに、すべてを数学的に導出していきます。その後、もう少し詳しく説明し、最後に拡散言語モデルが将来どうなるかと、Googleの新しい拡散言語モデルがどのように機能するかの予測をご紹介します。
拡散言語モデルに少しでも興味があるなら、この動画はゲームに参加するための素晴らしいビデオです。
自己回帰と拡散の比較
まず、自己回帰が実際に何を意味するかを振り返り、拡散がどのように機能するかと比較してみましょう。ChatGPTで見られるように、自己回帰型LLMは過去の単語を使用して単一の単語を予測します。単語が生成されると、それは石に刻まれたように固定されます。
一方、拡散はノイズを予測するプロセスです。例えば、この画像を見てください。拡散モデルを訓練するために、ランダムノイズを追加します。これは時間に依存し、我々の場合、時間が1に近いほど、より多くのノイズがあります。そして、追加したノイズを予測するようにモデルを訓練します。
このモデルができたら、画像の予測ノイズを出力させ、そのノイズを差し引くだけです。最も重要な部分は、ノイズを完全に除去する必要がなく、単に軽減するだけで良いことです。そのため、満足のいく結果が得られるまで何度でも繰り返すことができます。
自己回帰モデルと比較すると、これによりよりグローバルな一貫性、より高速な生成、より良い改良が可能になります。LLMにおいて、この拡散プロセスは思考とさえ見なすことができます。
マスキングによる言語への拡散の適用
しかし、一つ問題があります。単語にどうやってノイズを追加するのでしょうか?画像の場合、ピクセル値にガウシアンノイズを追加するだけで済みますが、単語は連続的ではありません。辞書にある単語でなければなりません。
そこで賢い人々が発見したのは、言語は社会的構造物であり、スラッシュマスクとして知られる別の単語を追加するだけでよいということです。単語にノイズを追加することは、その単語をマスク単語に変えることです。
今のところ、これをマスキングと呼びます。新しい単語として、マスキングのための文法ルールを設定する必要があります。テキストにマスク単語がない場合、時間t=0にあると言い、マスク単語のみの場合、時間t=1にあると言います。
時間t=0からt=1に行くことは、ノイジングまたはマスキングプロセスとして知られています。単語がマスクされた場合、マスキングプロセスの後でアンマスクすることはできません。
アンマスキングプロセスは、ある時間tからt=0に行くことで、t=0ではもうマスク単語がありません。アンマスキングプロセスでは、単語がアンマスクされた場合、再びマスクすることはできません。ただし、この動画の最後で、訓練済みモデルに変更を加えることなく、生成時のみでこれが可能であることを見ていきます。
数学的定式化
これらのルールが整ったところで、この動画の次の部分では、この文法に従う拡散モデルを定義するだけでなく、単語をアンマスクするためにそれを訓練する方法を導出するために数学を使用します。
まず、いくつかの表記から始めましょう。最も重要なのはこのPです。これは何かが起こる確率を意味します。例えば、コインを投げて表が出る確率は50%です。
P内に縦線を追加することもできます。これは「与えられた」を意味します。例えば、コインの両面が表または裏である場合のコインを投げて表が出る確率があり、それはゼロに等しくなります。
時間tでのテキスト内の単語を説明するために、このテキスト内のl番目の単語をx_t^lで表します。例えば、時間t=0で発生する文「その船は赤い」では、x_0^2は「船」に等しくなります。
テキスト全体を説明するために、x_t^{1:L}を使用します。ここでLはテキストの長さです。この1:Lは我々の文脈では1からLまでの両方を含むことを意味し、このテキスト内のすべての単語を説明します。
この動画の残りの部分で使用する任意の単語については、便宜上lを省略してx_tとします。
フォワードマスキングプロセス
この確率Pを使用して、フォワードマスキングプロセスを説明しましょう。このフォワードマスキングプロセスは、X_0(我々の目標単語)からマスク単語への変換を説明します。
目標単語が与えられた場合の時間tでの単語の確率を知りたいと思います。テキスト内の任意の単語について、このマスキングプロセスはすべての単語で独立して行われるためです。
文法ルールを考えると、x_tはx_0(初期単語)またはm(マスク単語の略)のみが可能であることがわかります。
時間tでの単語が目標単語に等しい確率をa(t)で定義し、目標単語が与えられた場合の時間tでの単語がマスクである確率を1-a(t)で定義できます。
時間t=0では、すべての単語がアンマスクされ、x_0でなければならないことを覚えておいてください。これは、時間t=0でa(t)は1でなければならないことを意味します。x_tがx_0と等しい確率が100%だからです。
時間t=1では、x_tがx_0と等しい確率は0でなければなりません。時間t=1ではすべての単語がマスクでなければならないからです。これは、時間t=1でx_tがmである確率が100%であることを意味します。
a(t)を定義する非常にシンプルな方法は1-tです。ご覧のとおり、これはすべてのルールに従います。tが0の場合、a(t)は1であり、tが1の場合、a(t)は0です。
拡散は離散ステップで機能するのではないかと疑問に思うかもしれません。これは、連続的なtをステップで書く必要があることを意味し、i/Tと書くことができます。ここで大文字のTは総ステップ数であり、これをTに設定できます。つまり、離散ステップがあります。
アンマスキングプロセス
要約すると、ノイジングまたはマスキングプロセスは、時間tでの単語が初期単語である確率として書くことができ、これは1-i/大文字Tに簡略化され、ある時間でのマスクである確率は1-a(t)に簡略化され、これはi/大文字Tです。
各時間ステップで、単語がx_0(初期単語)のままか、マスクに変わるかを選択できます。
より数学的な用語では、これをx_tはa(t)×x_0(初期単語)+(1-a(t))×mからサンプリングされると書くことができます。これは、これら2つの確率が与えられた場合に、離散的な単語x_0またはmを選択することを意味します。
アンマスキングに移りましょう。確率の代わりにpを使用する代わりに、読みやすさのためにアンマスキングプロセスにはqを使用します。pが見えた場合はマスキングプロセスでの確率を意味し、qが見えた場合はアンマスキングプロセスで作業していることを意味しますが、両方とも確率を意味します。
アンマスキングプロセスでは、目標はx_t(時間tでの単語)からx_0(目標単語)を取得することです。これはq(x_0|x_t)、つまり時間tでの単語が与えられた場合の初期単語の確率として書くことができます。
しかし、これを見つけるのは非常に困難で、おそらく不可能です。文字通り一歩ずつ進む必要があり、そのために前の時間ステップを見つける必要があります。
sを前の時間ステップとし、これは(i-1)/大文字Tに等しく、これは時間ステップtより1少ないことがわかります。時間ステップtは i/大文字Tに等しいです。このsはtと同じ性質を持ち、そのためa(s)=1-sであり、x_0が与えられた場合のx_s=x_0の確率はa(s)である等々です。
ベイズの定理の適用
この追加は実際には思っているより役立ちます。時間0からtまでのマスキングプロセスの確率を書く別の方法は、a(t)/a(s)×a(s)として見ることができます。a(s)が前の時間ステップに到達する確率であることを思い出してください。
そうすると、a(t)/a(s)(これをa(t|s)に簡略化します)は、すでにa(s)に到達している場合のx_t=x_sである確率でなければなりません。前の時間ステップでそうでなかった場合の時間tでの単語がマスクである確率は1-a(t|s)です。
この単純な追加により、前の時間ステップへの真のアンマスキングプロセス、つまり時間tでの単語と初期単語が与えられた場合の時間sでの単語の確率を見つける情報があります。これは真のアンマスキングプロセスであるため、x_0が既知であると仮定します。しかし、実際には、我々のAIモデルは初期単語を近似しようとします。
ベイズの定理を使用する必要があります。Cが与えられた場合のAとBが起こる確率は、BとCが与えられた場合のAが起こる確率×Cが与えられた場合のBが起こる確率として書くことができることを思い出してください。もちろん、これは両側でCが与えられた場合にAとBが見つかるため真実ですが、右側は少し異なる方法で書いているだけです。しかし、これらは両方とも等価です。
BではなくAで同じことができるので、Cが与えられた場合のAとBの確率は、AとCが与えられた場合のBの確率×Cが与えられた場合のAの確率にも等しく、これらすべてを互いに等しく設定すると、BとCが与えられた場合のAの確率を書き直すことができ、ブーム!我々は3つの変数に対するベイズの定理を証明しました。
AをsでのOUR単語、Bをtでの単語、Cを初期単語x_0に置き換えましょう。我々の問題は、ベイズの定理から3つの独立した問題に変わります。
真のアンマスキング分布の導出
アンマスキングプロセスはマスク単語でのみ機能することを思い出してください。つまり、時間ステップtはマスクと等しくなければならず、前の時間ステップsには2つの選択肢があります。マスクであるか、初期単語x_0である可能性があります。
x_sがx_0である場合から始めましょう。x_s=x_0、x_t=m、x_0が既知の場合の確率を見つけたいと思います。この一見複雑な確率を、これまでに見たことのある3つの独立した確率に簡略化できます。
x_s=x_0からx_t=マスクへの前進プロセスは1-a(t|s)であり、x_0が与えられた場合のx_s=x_0の確率はa(s)であり、下部のx_0が与えられた場合のx_t=mの確率は1-a(t)です。我々はこれらすべてを以前に見ており、ベイズの定理を使用してこの確率を美しく簡略化しました。
a(t|s)はa(t)/a(s)であることを思い出してくださいので、それを行った後、(a(s)-a(t))/(1-a(t))を得ます。
次の時間ステップx_tがマスクで、目標単語がわかっている場合のx_s=mの確率についても同じことをしましょう。これをベイズの定理に当てはめ、前の時間ステップがマスクである場合のx_tの確率が1であることがわかります。マスキングプロセス中、マスクした単語は石に刻まれたように固定されるからです。
x_0が与えられた場合のx_sがマスクである確率は1-a(s)であり、最後に下部では、初期単語が与えられた場合のa(t)がマスクである確率は1-a(t)と以前と同じです。
要約すると、現在の時間ステップがマスクである場合の前の時間ステップがマスクである確率は(1-a(s))/(1-a(t))であり、前の時間ステップが目標単語x_0になる確率は(a(s)-a(t))/(1-a(t))です。
現在の時間ステップが目標単語の場合、x_sは全く変化しないため、x_sがx_0である確率は100%です。
しかし、x_0がわからないため、我々のモデルはx_0を知らずにこの真のアンマスキング分布を近似しようとします。我々のモデルが予測するこの分布は、Q_θ(x_s|x_t)として説明できます。ここでθは我々のモデル内のパラメータです。
我々の分布はx_0をx_θに置き換えることを除いて全く同じです。これは全テキストシーケンスと与えられた時間を入力とする我々のAIモデルです。実際のx_0がわからないため、単語をx_tにアンマスクした場合、それをx_tのままにしておきます。
損失関数の導出
我々には2つのモデルがあります。Q(真のアンマスキングプロセス)とQ_θ(モデルの予測アンマスキングプロセス)です。これらのパラメータがこの真のアンマスキングプロセスを近似するようにするにはどうすればよいでしょうか?
損失関数、つまり訓練中にモデルが最小化しようとするものが必要です。これを行う一つの方法は、各分布を驚きの観点から考えることです。
例えば、お父さんが牛乳を持って帰ってきたら、あなたはおそらく非常に驚くでしょう。なぜなら、彼が帰ってこないと予想しているからです。起こる可能性が非常に低いことが起こると、おそらく驚くでしょうし、起こると予想することが起こっても驚かないでしょう。
数学的にこれをどのように定義するでしょうか?分布Qの驚きをQの負の対数として定義できます。小さな数を負の対数に代入すると大きな数、つまり大きな驚きが得られ、100%起こる可能性があることを意味する1を代入するとゼロの驚きが得られることがわかります。
分布QとQ_θの差を最小化するために、すべての入力と出力空間にわたって驚きを差し引き、それぞれが起こる確率を掛けることができます。起こることの確率はQです。これは真のアンマスキングプロセスだからです。Qを掛ける理由は、より頻繁に起こることを損失でより重く重み付けしたいからです。
これは二重否定が肯定になり、これら2つを切り替えるため、少し簡略化できます。AのlogからBのlogを引いたものがA/Bのlogと等しいことを思い出してください。そうするとさらに簡略化され、最小化したいこの式になります。この式はKLダイバージェンスとして知られており、2つの分布間の差です。
我々の方程式をKLダイバージェンスに代入しましょう。文法ルールから、アンマスキングプロセス中は常にx_t=mであると仮定し、そこからx_s(前の時間ステップ)が終わる方法は2つあります。x_0またはマスク単語である可能性があります。
この合計は、x_s=x_0またはx_s=m(x_t=mが与えられた場合)の2つの別々の合計に簡略化されます。これらすべての確率をqとして知っています。これらは我々が説明したアンマスキングプロセスで見つけることができるからです。
それらを代入した後、これらすべてを得ます。同じに見えますが、このQ_θ(x_s=x_0|現在の時間ステップがマスク)は少し異なります。真のアンマスキングプロセスと同じ確率を取りますが、我々のモデルが真の目標単語x_0を予測する確率を掛けます。
これは我々のモデルの予測×x_0として見ることができます。ここでx_0は、我々の目標単語x_0を予測するモデルの確率を抽出するワンホットベクトルです。
左側では(a(s)-a(t))/(1-a(t))が消え、右側では(1-a(s))/(1-a(t))が消えて、ログ内に1が残り、1のlogは0であるため、右側は完全に消えます。1/何かのlogは、そのもののマイナスlogと等しいという少しの簡略化の後、この式になります。
連続時間への拡張
しかし、この損失は現在単一の単語に対してのみです。我々が望むのは、すべての時間ステップとテキスト内のすべての単語にわたる損失です。これは、すべての時間ステップとすべての単語にわたって合計することによって数学で書くことができます。
x_θとグラウンドトゥルースx_0のLは、我々が単一の単語で作業していないことを意味し、シーケンス内の各単語に対して、ユニークなx_θと対応するグラウンドトゥルース単語があります。
実際には、我々のモデルLは、任意の単語が選択される確率に対応する出力を行います。次に行うことは非常にクールです。最初は明らかではないかもしれません。
大文字Tで乗算および除算しましょう。これは損失で何も変更しませんが、損失がすべての時間ステップを加算し、総時間ステップ数で除算することに変わることがわかります。これは平均または平均を取るのと同じです。
したがって、単一の時間ステップを取って、それが平均に十分近いことを期待するという少し胡散臭いことができます。それだけでなく、時間ステップ数を無限大にして、離散時間ステップだけでなく、任意の連続時間tで損失が機能することを期待します。
クールな部分が来ました。a(t)の導関数は、時間の変化に対するa(t)の変化として見ることができます。しかし、我々は前の時間ステップのa(t)、つまりa(s)を知っているため、これは(a(t)-a(s))/(t-s)として見ることができます。tとsは1時間ステップ離れているからです。
tとsが実際に何であるかを代入し、時間ステップ数Tを再び無限大にしましょう。いくつかの簡略化の後、無限大に向かう大文字T×大文字T×(a(s)-a(t))の極限を得ます。これはa(t)の導関数と等しいことを思い出してください。
ちょっと待ってください、これは損失で以前に持っていたのと全く同じです!そのため、これらすべてをa(t)の導関数で置き換えることができ、任意のtに対する連続損失を得ます。
これは任意のa(t)で機能しますが、a(t)=1-tの単純なケースを代入しましょう。これにより、最小化したい損失関数の非常にシンプルな式が得られます。
モデルの訓練と生成
この動画の残りでは、最初にこのモデルの訓練方法を要約し、次に生成にこのモデルを使用する方法を要約します。その後、アンマスキングプロセスで単語をアンマスクした場合、それが石に刻まれたように固定されないようにする方法、つまりモデルが自分自身を修正できるようにする方法について詳しく説明します。最後に、これをすべてGoogleの拡散モデルに戻し、それがどのように機能するかを示します。
モデルQ_θの訓練手順から始めましょう:
まず、データセットからグラウンドトゥルーステキストx_0^{1:L}を取得する必要があります。次に、0から1の間のランダムな時間tを選択します。次に、この分布からサンプリングしてテキストx_t^{1:L}を生成します。
言い換えれば、単語が時間tで初期単語のままである確率がa(t)であり、マスクに切り替わる確率が1-a(t)であり、テキスト内のすべての単語に対してこれを行います。我々の例では、a(t)は1-tです。
モデルのテキスト内すべての単語に対する予測を取得し、それを以前に導出した損失に代入します。その後、PyTorch、TensorFlow、JAXなどのライブラリを使用して、この損失をモデルを通して逆伝播し、損失を減らす方向に重みを更新できます。
生成にモデルを実際に使用する手順:
まず、与えられた長さに対してすべてmとしてx_1^{1:L}を生成します。言い換えれば、すべてマスクのテキストを生成します。
総時間ステップ数を大文字Tとして定義し、時間をi/大文字T、前の時間ステップsを(i-1)/大文字Tとします。
前の時間ステップx_sを生成します。これは少し複雑に見えますが、実際には確率(a(s)-a(t))/(1-a(t))でモデルの予測確率を使用し、確率(1-a(s))/(1-a(t))で単語がマスクのままであることを選択することとして見ることができます。
モデルの予測確率を選択した場合、モデルは語彙内のすべての単語に対する確率を予測することを覚えておいてください。そのため、モデルの確率に基づいてこれらの語彙単語の1つを選択し、そのマスクがその単語に変わります。テキスト内のすべての単語に対してこれを行います。
a(t)は1-a(t)、a(s)は1-a(s)であることを思い出してください。iをi-1と等しくします。つまり、時間ステップを減らし、現在の時間ステップテキストを前の時間ステップテキストに設定します。ステップ3に戻り、時間が0になるまでこのプロセスを繰り返します。「グラウンドトゥルース」テキストx_0^{1:L}を返します。
再マスキング機能の追加
生成プロセス中に、すでに訓練した同じモデルを使用して、すでにマスクした単語を再マスクできるようにしましょう。真のアンマスキングプロセスがどのようなものかを思い出してください。現在の単語がグラウンドトゥルース単語の場合、前の時間ステップはグラウンドトゥルース単語のままなので、再マスクされるオプションはありません。
追加の選択肢を加えましょう。x_tが目標単語の場合、マスクになる可能性があり、この確率をσ(t)として定義します。そのため、目標単語のままである確率は1-σ(t)です。
σ(t)を定義する方法は多くありますが、これについてより多くの情報が必要な場合は、この論文を読んでください。σ(t)を定義した後、現在の時間セットがマスクでマスクのままである確率と、現在の時間セットがマスクで目標単語に変わる確率がわからなくなります。
しかし、これを理解するためのきちんとしたトリックができます。本当に欲しいのは、x_t=mで目標単語x_0が与えられた場合のq(x_s|x_t)です。これが存在できることがわかっているとしましょう。
aをx_sがx_0になる確率、bを前の時間ステップがマスクになる確率としましょう。少し直感的でないことをしますが、x_0が与えられた場合のx_sの確率は、x_sがx_0のままの場合はa(s)に等しく、x_sがマスク単語になる場合は1-a(s)に等しいことがわかります。
しかし、この確率x_0が与えられた場合のx_sは、x_0からx_tに行き、それからx_sに戻る確率として書くこともできます。これは、x_sがx_0のままである確率は、x_tがx_0のままである確率×この確率を掛けた場合の前のステップでx_sもx_0のままである確率+x_tがマスクになる確率×この前の時間ステップでx_tがマスクからx_0に変わる確率として書くこともできることを意味します。
1-a(s)またはx_sがマスクになる確率についても同じことができます。知っていることをすべて代入しましょう。x_0が与えられた場合のa(t)=a(s)の確率はa(t)であり、x_t=x_0が与えられた場合の前の時間ステップx_s=x_0の確率は1-σ(t)であり、x_0が与えられた場合のx_t=mの確率は1-a(t)ですが、x_t=マスクが与えられた場合のx_s=x_0の確率はaです。
aについて解けば、x_t=マスクで、x_0がわかっている場合のq(x_s=x_0)の確率を得ることができます。次のものについても同じことができ、bがこれと等しいことがわかります。
再マスキングの確率を持つ真のアンマスキングプロセスがわかったので、この予測アンマスキングプロセスをモデルで置き換えれば完璧です。
一様状態拡散モデル
非常に最近の興味深い研究では、これらの便利なマスク単語を使用していません。代わりに、すべての単語の一様分布に遷移します。言い換えれば、彼らは前進または「マスキング」プロセスを、波状のt(a(t))の確率で目標単語のままであり、1-波状のt(a(t))の確率で語彙全体からランダムな単語になることとして定義します。
そのため、2つのカテゴリ(目標単語とマスク単語)から選択する代わりに、Kカテゴリから選択します。ここでKは語彙内の可能な単語の総数です。Tが1の場合、すべての可能な単語にわたって一様分布を得ます。
この波状のTは拡散変換演算子と呼ばれ、この一様状態拡散プロセスを連続ガウシアン拡散と等価にするために使用されます。これは、ガウシアン拡散の背後にある確立された理論をこれらの一様状態言語モデルに適用できることを意味します。
この逆プロセスまたは「アンマスキング」プロセスを見つけるために、mを1/kで置き換えることを除いて、我々が行ったのと同じことを行います。損失関数についても同じです。これは少し数学的に集約的になりますが、より詳しく知りたい場合は、論文「拡散双対性」を見ることができます。
これらの一様状態拡散モデルには、生成と訓練で間違いを修正できるという重要な特性があります。また、この一様状態拡散モデルがガウシアン拡散と等価であることは、品質をほとんど損なうことなく、生成中の時間ステップ数を100倍削減できることを意味します。
これは、この一様状態言語モデルからのサンプル生成です。個人的に、マスク単語を使用することで訓練と生成プロセス中の複雑さが削減されると信じていますが、拡散LLMはまだ初期段階にあり、これらの将来のモデルはマスク単語から離れていくでしょう。
将来の展望
これらの拡散LLMは自己回帰LLMを完全に置き換えることはありませんが、コーディング、メール作成などの既存の作品を修正することが理想的なタスクでは、これらの拡散LLMが大きなプレイヤーになるでしょう。
Googleの拡散モデルに戻ると、マスク単語がないようで、間違いを更新できるため、この一様状態言語モデルに似たものを使用していると仮定できます。
この動画を終える前に、この動画を作成するのに大きなインスピレーションを与えてくれたSAM SAに特別な感謝を述べたいと思います。また、この動画をご覧いただいた皆様にも感謝し、さようならです。


コメント