深層学習

自己回帰生成

同時分布を条件付き確率の積に分解し、直前までに得た要素を条件として次の1要素を生成する枠組みです。

  • A|中核
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

自己回帰生成は、系列全体を一度に出すのではなく、それまでに生成した要素を条件にして、次の要素を1つずつ予測する枠組みです。ポイントは特定のネットワーク構造ではなく、同時分布を条件付き確率の積として表す定式化にあります。

ここでいう「要素」は、文章なら単語やトークン、画像なら順序付けた画素のように、系列を構成する単位です。生成のたびに新しい要素を履歴へ追加し、その履歴を次の予測へ渡します。したがって、自己回帰という名前は、出力の一部が次の入力へ戻る関係を指しており、文章生成だけに固有の呼び名ではありません。何を一要素とみなすかと、どの順序で並べるかを先に決めることが、確率分解を適用する前提になります。

この枠組みでは、系列の途中までが与えられたときの次要素の分布を繰り返し求めます。各ステップの予測は単独で完結するのではなく、直前までの選択を条件として受け取ります。そのため、早い段階でどの要素を選んだかが後の分布に影響し、生成された系列全体の形にも反映されます。

長い文章を一気に書かず、次の1語を決めて末尾に足す編集作業です。次の判断に出力が戻る点が自己回帰です。

なぜ必要か

系列の順序を決め、系列全体の確率を1ステップ予測へ分解します。積で同時分布を評価します。

この分解が必要なのは、系列全体の組合せを直接扱うと、要素数が増えるほど候補の空間が急激に大きくなるからです。各位置で「ここまでの履歴が与えられたとき、次に何が起こるか」を予測する形にすれば、モデルは一つの次要素の分布を学習すればよくなります。しかも、各因子を掛け合わせれば系列全体に対する確率へ戻せるため、局所的な予測と系列全体の尤度を同じ定式化で結び付けられます。

逆にこの枠組みを使わず、要素ごとの確率を履歴なしで掛けるだけでは、語順や画素間の依存関係を表せません。文章なら前の単語によって自然な次の単語が変わり、画像なら周囲の画素によって次の画素の分布が変わります。自己回帰の条件付けは、この「前に得た情報が次の予測を変える」関係を確率モデルの中に残す役割を持ちます。

この見方をすると、自己回帰生成が解決している不便は、単に長い出力を分割することではないと分かります。分割した各予測が同じ履歴を共有し、前の選択を後の予測へ反映できることが本質です。履歴を無視した予測なら各要素を個別に出せても、全体として一貫した系列の確率を構成できません。自己回帰は、局所的な次要素予測を、順序を持つ系列全体のモデルへ接続します。

したがって、自己回帰かどうかを判定するときは、出力が一度に見えるかではなく、ある要素の予測にどの要素を条件として使うかを確認します。モデルの内部に再帰的な状態があるか、特定のネットワーク名が付いているかは定義の中心ではありません。過去を条件に次の要素を決め、その因子を系列全体の確率へ組み立てるなら、自己回帰の枠組みとして読めます。

単語列に限らず、画像でも画素を順序付ければ使えます。PixelRNN は画素を空間方向に順次予測し、画素値の離散確率と画像内の依存関係をモデル化する例です。

分解は評価を小さな条件付き確率へ変えますが、生成の順序依存までは消しません。学習と推論の並列性は分けて考えます。

仕組み

系列を x1,x2,…,xTx_1, x_2, \ldots, x_T、系列全体を x\mathbf{x}、モデルのパラメータを θ\theta とします。連鎖律により、同時確率は次のように分解できます。

pθ(x)=pθ(x1,x2,…,xT)=∏t=1Tpθ(xt∣x1,…,xt−1)p_\theta(\mathbf{x}) = p_\theta(x_1, x_2, \ldots, x_T) = \prod_{t=1}^{T} p_\theta(x_t \mid x_1, \ldots, x_{t-1})

TT は要素数、xtx_t は時刻 tt の要素、pθp_\theta はパラメータ θ\theta で定まる確率です。各因子は過去を条件にした次要素の分布です。生成時は pθ(x1)p_\theta(x_1) から x1x_1 を決め、それを条件に x2x_2 を決めます。最大確率を選ぶかサンプルするかはデコードの選択です。

学習時の対数尤度は積を和に変えると扱いやすくなります。

log⁡pθ(x)=∑t=1Tlog⁡pθ(xt∣x<t),x<t=(x1,…,xt−1)\log p_\theta(\mathbf{x}) = \sum_{t=1}^{T} \log p_\theta(x_t \mid x_{<t}), \qquad x_{<t}=(x_1,\ldots,x_{t-1})

x<tx_{<t} は時刻 tt より前の正解要素の列です。学習では正解を条件にできますが、生成時はモデル自身の出力を次の入力に戻します。この差が露出バイアスで、1箇所の誤りが後続の条件を変えます。

この式で pθ(xt∣x<t)p_\theta(x_t \mid x_{<t}) は、履歴 x<tx_{<t} が固定されたときに候補となる次要素へ割り当てる確率分布です。xtx_t はその分布から実際に選ばれる一つの要素であり、モデルが各候補の確率を出力してから、最大確率を採るかサンプリングします。したがって、確率の積を最大化する学習は、各時刻の正解要素に高い確率を割り当てることを、系列全体について同時に要求していると読めます。

積のままでは系列が長いと小さな確率を何度も掛けることになるため、対数を取って和に変えます。対数は積の大小関係を保つので、対数尤度を最大化することと尤度を最大化することは同じ向きの目的になります。実装では時刻ごとの対数確率を足し合わせればよく、系列間で損失を比較するときも、長さで割るかどうかを別途決めれば、どの長さの系列を評価しているかを明確にできます。

学習時に正解の履歴を使えるのは、各時刻の条件を正しく保ったまま損失を計算できるからです。一方、推論では正解の履歴は与えられないので、直前に選んだモデル出力を条件にするしかありません。従って、学習中に正しい履歴で得た分布が良くても、推論中に一度ずれた履歴に対して適切な分布を返せるとは限りません。露出バイアスは、単に「学習と生成で入力が違う」という用語暗記ではなく、この条件分布のずれが後続の予測へ連鎖する現象です。

同時分布を分解しても依存関係は消えません。xtx_t の前に xt−1x_{t-1} が必要なので、生成は t=1t=1 から TT まで逐次的です。推論時の出力確定はこの順序に拘束されます。

ここで「確率を積に分けたこと」と「計算を並列にできること」を混同しないでください。学習では正解系列の全履歴が既知なので、各時刻の条件付き確率をまとめて計算できる実装があります。しかし生成では、xtx_t の入力に含める xt−1x_{t-1} が直前の計算結果です。まだ確定していない要素を先に条件へ入れられないため、少なくとも出力を確定する依存鎖は残ります。分解は確率の評価を整理しますが、推論時の因果的な順序を取り除く操作ではありません。

画像へ適用する場合も、まず画素をどの順序で並べるかを決め、その順序で過去に置かれた画素を条件にします。PixelRNN のように二つの空間方向に沿って画素を順次予測すれば、画素値の離散確率と画像内の依存関係を同じ積の形で表せます。重要なのは「画像だから自己回帰でない」ということではなく、画像の要素にも一貫した順序と過去・未来の境界を定義している点です。

式の添字は、条件に含めてよい情報の境界を表します。tt の因子に xtx_t 自身やそれより後の要素を入れてしまうと、予測したい値を入力へ漏らすことになります。x<tx_{<t} と書くことで、時刻 tt より前だけを条件とする因果的な制約が明示されます。系列の並べ方を変えれば、同じデータでも「過去」と「次」の意味が変わるため、画像では画素の走査順もモデルの定義の一部になります。

最初の因子だけは履歴が空なので pθ(x1)p_\theta(x_1) になります。ここから一つ選んだ後は、その値を履歴として次の因子 pθ(x2∣x1)p_\theta(x_2\mid x_1) に渡します。この初期条件から始めて、各ステップで一つの要素を確定し、履歴を一つずつ伸ばしていくのが生成手順です。式の t=1t=1 から TT という範囲は、この開始点と終了点をまとめて表しています。

試験でどう問われるか

問われ方正解に寄る条件引っかけ
同時分布の分解式p(x1,…,xT)=∏tp(xt∣x<t)p(x_1,\ldots,x_T)=\prod_t p(x_t\mid x_{<t}) と、過去を条件にする形各要素の周辺確率を掛けるだけで依存を表せるとする
学習と生成の入力学習は正解の過去、生成はモデル自身の過去の出力学習時も常に自分の予測だけを入力するとする
逐次生成の性質次の要素が前の出力に依存するため、推論を全時刻で完全並列化できない積に分解したので生成も一括で終わるとする
適用対象単語列だけでなく、画素列にも同じ確率分解を適用できる自己回帰をテキスト専用の機構と限定する

引っかけは、数式の見た目だけを追うと選びやすい形になっています。周辺確率の積は各要素を独立とみなす形なので、過去を条件にした因子が消えています。また、学習時に正解の履歴を使えることから、生成時にも正解が使えると思い込むと露出バイアスの説明と逆になります。試験では「どの確率を掛けるか」「その条件はいつ得られるか」「選択規則は定義に含まれるか」を分けて判断すると、表の選択肢を切り分けられます。

「完全並列化できない」という表現も、学習と推論のどちらを指すかで意味が変わります。正解系列を使う学習では時刻ごとの損失をまとめて評価できますが、モデル自身の出力を次の条件へ戻す生成では、各時刻の確定を待つ必要があります。したがって、積への分解だけを根拠に推論まで一括計算できるとする選択肢は、条件付き確率の評価とサンプリングの手順を混同しています。

また、最大確率を選ぶことと、系列全体の確率が最大になることは常に同じではありません。自己回帰の定義が決めるのは各時刻の条件付き分布であり、その分布からどう選ぶかはデコード側の判断です。試験で貪欲法やサンプリングの語が出ても、まず確率分解と選択規則を分離して読んでください。選択方法の話を、自己回帰であるかどうかの判定材料にしてしまうのが典型的な取り違えです。

実装で確かめる

条件付き確率の積が同時確率になることを確認します。cond[t] は位置 tt の条件付き確率です。

import numpy as np

cond = np.array([0.8, 0.5, 0.25])  # p(x1), p(x2|x1), p(x3|x1,x2)
joint = np.prod(cond)
log_joint = np.log(cond).sum()
print("joint:", joint)
print("exp(log_joint):", np.exp(log_joint))

実行結果は joint: 0.1 と exp(log_joint): 0.10000000000000002 です。

取り違えやすいもの

用語自己回帰生成との切り分け
同時分布系列全体の確率です。自己回帰はそれを条件付き確率の積として表現します
条件付き確率「過去が与えられた次の要素」の確率です。積の各因子にあたります
教師強制学習時に正解の過去要素を条件へ入れる運用です。生成時の自己出力との差が露出バイアスになります
デコード得られた次要素の分布から値を選ぶ方法です。貪欲法やサンプリングは生成の選択規則で、自己回帰の定義ではありません
PixelRNN画素を順次予測する自己回帰モデルの例です。画像でも要素の順序と条件付けを作れることを示します

同時分布は「モデルの出力方法」ではなく、系列全体にどれだけ確率を割り当てたかを表す対象です。条件付き確率はその対象を分解した一因子であり、自己回帰は過去を条件にする分解の枠組みです。この三つを同じ意味で扱うと、モデル・確率・生成手順の境界が崩れます。

教師強制も自己回帰そのものと同一ではありません。教師強制は学習時の入力を決める運用で、自己回帰は次の要素を過去の要素に条件付ける確率構造です。教師強制を使っていても、推論時にはモデル自身の出力を戻すため、学習と生成の差は残ります。

デコードは、次の要素の分布が得られた後に一つを選ぶ段階です。貪欲法ならその時点の最大確率を選び、サンプリングなら分布に従って選びますが、どちらを採っても「次の要素を過去に条件付ける」という自己回帰の定義自体は変わりません。選択規則の違いを、確率分解の違いと答えないことが境界になります。

PixelRNN は「画像を扱うニューラルネット」という名前だけで覚えると、自己回帰との関係を落としやすい例です。切り分けるべき点はネットワークの細かな構造ではなく、画素を順序付け、過去の画素から次の画素の離散分布を予測していることです。画像を対象にしていても、条件付き確率を順に積むという枠組みが保たれているため、自己回帰モデルの具体例に分類されます。

条件付き確率という用語だけでは自己回帰とは限りません。どの変数を条件にするかが重要で、過去以外を条件にしたり、系列全体の情報を一括して使ったりする場合は、このノートの逐次生成の定義とは別に判定します。自己回帰では、条件が生成の進行に合わせて更新されることまで含めて捉えます。

表の「同時分布」と「条件付き確率」の違いは、左辺の大きさでも確認できます。同時分布は TT 個すべてを含む一つの系列に確率を与えますが、条件付き確率は履歴を固定したうえで次の一要素を評価します。前者を後者の積へ分けることで、全体の確率を保ちながら、学習で扱う予測単位を一要素へそろえられます。ここを逆に読んで、各因子を別々の独立なモデルだと考えると、履歴を共有するという自己回帰の性質を失います。

想起チェック

自己回帰生成は同時分布をどのように扱うか

同時分布 pθ(x1,…,xT)p_\theta(x_1,\ldots,x_T) を、過去の要素を条件にした各因子 pθ(xt∣x<t)p_\theta(x_t\mid x_{<t}) の積へ分解します。

露出バイアスはどの入力の差から生じるか

学習時は正解の過去要素を使えますが、生成時はモデル自身の過去の出力を使います。この条件分布の差が露出バイアスです。

自己回帰生成を推論時に完全並列化できない理由は何か

時刻 tt の条件に、それ以前に生成した要素が含まれるためです。xtx_t を決める前に xt−1x_{t-1} までを確定する必要があります。

画像にも自己回帰の枠組みを適用できるか

できます。画素を順序付け、過去の画素を条件に次の画素を予測すればよく、PixelRNN がその具体例です。

出典