Up 通説「Self-Attention で応答生成」の没論理 作成: 2023-06-09
更新: 2025-06-09


    ChatGPT の最もわからないところは,Self-Attention で応答生成を説明するくだりである。
    そして,わたしにとってこれは現在,どうしてもわからないところである。


    通説は,「Self-Attention で応答生成」をとう説くか?
    「Self-Attention で応答生成」を ChatGPT に質問すると,つぎのような応答になる:
     表現その1
     「 ChatGPT の応答生成は「自己回帰的(auto-regressive)」です。
    つまり、
      「1トークンずつ生成 → 末尾に追加 → 再度推論」
    というループです。」

     表現その2
     「 Self-Attention は、生成中も「入力+出力履歴の全体」に作用し続けます。
    つまり、最初の質問や文脈が、後の応答全体に対してずっと参照されます。」

     表現その3
     「 ChatGPT の内部では、Self-Attention は「質問 → 応答」という文脈遷移をすでに学習している。
    応答生成は、Self-Attention による「動的意味再構成」と、「事前学習された対話パターン」が合成された結果。」

     表現その4
     「 ChatGPT における Self-Attention は、たしかにアルゴリズム(Q・K・V・softmax)は Transformer のものと「形式的には同一」です。
    しかしその「意味機能」は、文脈処理・対話生成・応答予測という目的のもとに、構造的に変質しています。」


    しかし,この説明ではわからない。
    この説明では,つぎの内容が不明である::
     A.「1トークンずつ生成・末尾に追加」
     B.「動的意味再構成」「事前学習された対話パターン」が合成」
      「形式的には同じ・意味機能は構造的に変質」

    不明は,1つずつ明らかにするのみ。
    論点の拡散が,この場合最も警戒せねばならないことだからである。
    そこで,先ず A から。


    通説は,ChatGPT の Self-Attention は,Transform の Self-Attention と同じであると説く。
    そこで,「末尾に追加するトークンの生成」の中身を考える。

    Transform の Self-Attention は,トークンベクトルの順序列
       t = ( t_1, t_2, ‥‥ , t_n )
       t_i = (t_i1, t_i2, ‥‥, t_iD ), i = 1, ‥‥, n
    に作用する。

    ここでわたしは,「Self-Attention の出力」で,早くもに躓く。
    「Self-Attention の出力」が具体的に何を指すのかを,まだ押さえていないのである。
    いまは,これは「後ではっきりさせること」と留保して,
       「Z か O なんだろう」
    で収めて,論を進める。


    Transforemer は,中間出力ないし最終出力として, t と同じ長さ──即ち長さn──の D次元ベクトル列を生成する。
    中間出力であれ最終出力であれ,Transformer において t に対し生成されるのは,長さnのD次元ベクトル列である。

    ここが,要点になる。
    なぜなら,「1トークンずつ生成・末尾に追加」の1トークンはどこ?という話になるからである。

    t に対する出力を
      t = ( t_1, t_2, ‥‥ , t_n ) → t' = ( t'_1, t'_2, ‥‥ , t'_n )
    としよう。
    この場合, 「1トークンずつ生成・末尾に追加」はどう解釈するのが自然だろうか?
      ( t_1, t_2, ‥‥ , t_n ) → ( t_1, t_2, ‥‥ , t_n, t'_n )
    だろうか?

    わたしは,ここで完全にストップである。
    推理不能になる。
    通説の答えを待ち,どんな答えをするかを見て,それから考え始めるしかない。


    しかしそれでも,ここは,<1つはっきりさせておくべきこと>を述べるところである。
    それは,つぎのことである:
     先行するトークン列に1つのトークンをつなげるとき,それは,
      <先行するトークン列に確率統計的につながることになるトークン>
     をつなげているのではない。
     そのトークンは,
       <これから現れる文の中のトークン>
     として,先行するトークン列につなげるのである。 
     <次のトークン>は,過去から来るのではない。
     少し先の未来から来るのである。

    ChatGPT は,箇条書きや表を多用する。
    箇条を示すために,箇条の頭にドットや順番の数字をつける。
    表にするために,枠組をつくる。
    この表現は,「箇条書きにする」「表にする」という計画から来るのである。
    「先行する語彙列を見てつぎにつなぐ語彙を確率統計的に決める」では,ChatGPT の構成的な応答テクストは,絶対にできない。


    通説の「1トークンずつ生成・末尾に追加」は,末尾につけるトークンが先行するトークン列から導かれるうように読めてしまう。
    したがって,通説はつぎのどちらかということになる:
     ・間違っている
     ・言葉足らず (肝心なことを抜かしている)



      「末尾につなぐトークン」をさがすことになる図   
     ・その1    X^(1) = ( x_ij^(1) ) = X(S)    Z^(1) = ( z_ij^(1) ) = Z      x_i^(ℓ)       │       │Self-Attention(全語と相互作用)       ↓      z_i^(ℓ)(文脈情報を含んだ中間出力)       │       │Residue (残差接続)       ↓   x_i^(ℓ) + z_i^(ℓ)       │       │LayerNorm (正規化)       ↓      z'_i^(ℓ)       │       │FeedForward Network(各語ごとに)       ↓      y_i^(ℓ)       │       │Residue       ↓   z'_i^(ℓ) + y_i^(ℓ)       │       │LayerNorm       ↓      y'_i^(ℓ) = x_i^(ℓ+1)      ・その2   X(S) = X^(1) → X^(2) → ‥‥ → X^(LEN(S)) → O