Up 「教師あり」の意味 作成: 2025-06-13
更新: 2025-06-13


    質問テクストと応答テクストをそれぞれエンコーダとデコーダに入力し,それぞれトークンベクトルの列に表現する。
    そして,この2つのトークンベクトル列を突き合わせるアルゴリズムにかける。
    これが,「応答」の概念の注入になる。
    また,「応答」の概念が獲得されるにつれ,このプロセスは,応答パターンを覚えさせるものになる。

    で,質問と応答の2つのテクストを突ぎ合わせるアルゴリズムだが,これの概略を以下に示す。
    なお,このアルゴリズムが動くプロセスは,「デコーダ」の内容と位置づけられている。


    質問テクストは,エンコーダに入力されて,トークンベクトルの列
      X = ( x_1, x_2, ‥‥, x_m )
    に表現される。
    ここで,x_i は,質問テクストの i 番目のトークに対応するトークンベクトルに「i番目」の位置エンコーディングを加算したものである。

    X は,まだ Transformer のテクストではない。
    Transformer のテクストになるのは,Self-Attention の処理をくぐった後である。

    応答 (正答) テクストが,デコーダに入力されて,トークンベクトルの列
      Y = ( y_1, y_2, ‥‥, y_n )
    に表現される。

    X をデコーダに入力する。

    学習のアルゴリズムは,つぎのようになる:
     1゜( k = 0 )
      H^(0) = ( X, <BOS> )
      ここで "<BOS>" (Beginning Of Sentence)は 文頭記号。
     2゜( k → k+1 )
      Self-Attention:
       Q^(k) = H^(k) W_Q,
       K^(k) = H^(k) W_K,
       V^(k) = H^(k) W_V
      Z = softmax( Q K^T /√D ) V
      Feedforward + 残差接続 + LayerNorm :
      FFN( X ) = ReLU( X W1 + b1) W2 + b2
      これをレイヤーの数だけ繰り返す。
      最終出力を O とする。
      O に対し, 「教師あり」の処理をする:
       ・正解表と照合 → 誤差(得失)計算
       ・誤差逆伝播
      H^(k+1) = ( H^(k), y_(k+1) )
     3゜( k = n )
      H^(n) がつぎのようになる:
       H^(n) = ( H^(n-1k), y_n, <EOS>) 

    k = n が終わって,( X, Y ) の回の終了となる。
    新しい質問・応答テクストに替えて,入力から同じことを繰り返す。,


    なぜ,こんな面倒なアルゴリズムにしたのか:
     《 応答文の方は,1トークン/サブワードずつ加える 》

    では逆に,質問文と応答文を並べたテクストを1度に入力するやり方だと,「応答」の概念を獲得できるだろうか?
    応答文を生成できるよういなるだろうか?

    実際,人間でも,<見てわかる>と<書ける>は大違いである。
    TV が入力テクストを吸収することは,そのテクストを「先頭から末尾へ続く系列」として構造化することとは,違うのである。
    そこで,「応答文の方は,1トークン/サブワードずつ加える」は,テクストを「先頭から末尾へ続く系列」として教えていると解釈できる。

    ただし,このやり方でうまくいっていることは,このやり方が絶対だということではない。


    ちなみに,通説は《1トークン/サブワードずつ加える》を「連想ゲーム」だと説明する。
    k → k+1 だと,通説はつぎのように言う:
      「 "y_k" の次は,意味の確率分布により,"y_(k+1)" がくる」
    これは,「どうしてこんな間違ったことが言えるのか」の類の間違いであ。
    はじめから,y_1, ‥‥, y_n の順番で続けることになっているから,y_k のつぎは y_(k+1) なのである。
    学習アルゴリズムのどこにも「連想ゲーム」は存在していない。
    そして,意味の確率分布で "y_k" の次が "y_(k+1)" となるはずもない。