位置エンコーディングPositional Encoding

場所ごとに順番の印を付ける方法

  • 応用
  • 5分で読める
  • 図 3点

ポイント

  • 位置エンコーディングは、断片ごとに何番目の場所かを示す印を付ける作業です。
  • なぜ必要かというと、すべての場所を同じように見比べる計算だけでは順番を区別できないからです。
  • 最初に提案された方式は印を元の内容に足して一つの塊として入れ、最近よく使われる方式は場所どうしを見比べる計算の中に順番を溶かし込みます。
  • 決まった規則で作った印を使うこともあれば、学習で自然に決めさせることもあります。
  • 最近は絶対的な何番目かより、二つの場所がどれだけ離れているかを込める方式が広く使われています。

たとえで理解する

劇場のチケットには座席番号が書かれています。この番号がなかったらどうなるでしょう。観客は全員入っていますが、誰が前列で誰が後列かわかりません。人数は同じで顔ぶれもそのままなのに、順番だけが消えてしまうのです。位置エンコーディングは、この座席番号をチケットに書き込む作業です。

番号は観客と別々に扱われません。チケット一枚に座席番号と観覧する人の情報が一緒に書かれています。最初に提案された位置エンコーディングも同じで、断片の内容に順番の印を足して一つの塊にします。

座席番号が付いた瞬間、「前列の人は後列の人より舞台に近い」といった関係が生まれます。番号があってはじめて、距離も前後も語れるのです。

くわしく

順番を失ってしまう構造

文を一語ずつ順に渡しながら処理していた以前の方式には、順番の問題がありませんでした。処理する順番がそのまま順番だったからです。その代わり遅かったのです。

今使われている方式は、すべての場所が互いを一度に見ます。おかげでとても速くなりましたが、代償が生まれました。全員が同時に互いを見ると、誰が先に出てきたのかわかりません。「犬が猫を追いかけた」と「猫が犬を追いかけた」が、同じ単語の集まりに見えてしまいます。

そのため順番の印を付けておく必要があります。すべての場所を同じように見比べる計算だけでは、単語の順番を区別できないからです。

番号を内容に足します

最初に提案された方式では、印は断片の横に別々に付くのではありません。断片の内容を表す数字の並びに、同じ大きさの順番の数字の並びを足して一つにします。すると、その場所の値には「何であるか」と「何番目か」が一緒に入ることになります。

足して混ぜても構わない理由は、収める場所に十分な余裕があるからです。数字の並びの項目は数百から一万を超える規模で、内容と順番が互いに違う方向へ収まる余地があります。学習を経て、モデルは二つを見分けて読む方法を身につけます。

印を作る二つの系統

最初に提案された方式は、人が決めた規則で印を作りました。いくつもの周期の波を重ねて、場所ごとに違う模様が出るようにするやり方です。学習が要らず、学習時に見たことのない長さにも番号そのものは計算して振れます。ただし、番号を振れることとモデルがその長さをうまく扱えることは別なので、実際には学習した長さを超えると性能が落ちます。

もう一つの系統は、印そのものを学習で決めさせる方式です。場所ごとに数字の並びを一つずつ用意し、学習中に値が合うようにします。データに合った印が得られますが、あらかじめ用意した場所数を超えると、付ける番号がなくなります。

絶対番号より二つの間の距離

何番目かをそのまま記す方式には弱点があります。同じ文が文書の前のほうにあるか後ろのほうにあるかで番号がまったく変わってしまいますが、実際に大事なのは「この単語とあの単語が何マス離れているか」であることが多いのです。

そこで最近は、二つの場所の距離そのものが計算に表れるように作った方式が広く使われています。場所の番号に応じて値を少しずつ回転させ、二つの場所を見比べるときに自然とその間の距離が反映されるようにする方法です。前後どこに置かれても同じ間隔なら同じ関係として読まれます。ただし学習で見た長さを超えるとこの方式も揺らぐので、次のように別途手直しが必要です。

座席数を超えると

学習のときに見たことのない、とても遠い場所番号が入ってくると、モデルが揺らぎます。劇場にない座席番号が書かれたチケットを受け取ったようなものです。文章が急に不自然になったり、前の部分を見失ったりすることが起きます。

コンテキストウィンドウを広げる作業が単に数字を大きくするだけの問題ではない理由がここにあります。印を広い範囲に合わせて調整し直す必要があり、たいてい伸びた長さで少し追加学習させる過程も一緒に行います。

もう少し正確に

位置エンコーディングは、各トークンの埋め込みに位置の情報を持たせたベクトルを足すか、アテンションの計算段階で位置関係を反映させる技法です。最初に提案された方式は、いくつもの周期のサインとコサインの値を場所ごとに違う形で配置した固定方式で、場所ごとに学習されるベクトルを置く方式も広く使われました。今の大きなモデルの多くが使う方式は、クエリとキーを場所番号の分だけ回転させ、二つの場所の相対距離が自然に反映されるようにする回転方式です。ただし、前の部分だけを見るように隠して文章を作るモデルは、見える前の場所の数から位置をある程度自分で推測することもあります。それでも順番の印を付けるのが基本です。

たとえがずれる点もあります。劇場の座席番号は整数一つですが、位置エンコーディングは場所ごとに数百個を超える値からなる並びです。またチケットでは座席番号と観客の情報が同じ一枚に書かれていても欄が分かれて読めますが、足す方式の位置エンコーディングは内容の値と混ざり、見た目では区別できません。何より劇場の座席番号は1、2、3と一つずつ大きくなる数ですが、最初に提案された位置の印はいくつもの周期の波を重ねた模様です。近い場所どうしは模様が似ていて、二つの場所が何マス離れているかを計算で読み取れるように作られています。

やってみる

よくある誤解

  • モデルが単語の順番を当然知っていると思われがちですが、実際にはすべての場所を一度に見る計算そのものに順番の概念がないので、順番の印を付けてやるのが順番を教える基本的な方法です。

  • 位置の印が断片の横に別々に付くと見なされがちですが、実際には内容の値に足して混ぜるか、場所どうしを見比べる計算の中に溶かし込みます。別々の札として横に付くことはありません。

  • コンテキストの長さは設定を変えるだけで伸びると思われがちですが、実際には印を広い範囲に合わせて手直しする必要があり、たいてい伸びた長さで追加の学習も一緒に行います。

ひとこと要約

つまり

位置エンコーディングは劇場の座席番号のように、断片ごとに何番目かを示す印を付け、順番を知らない構造に前後の概念を取り戻す方法です。

誤りや、もっと良いたとえがありますか? 修正を提案する · 最終更新 2026-10-17