アテンション重み(Attention Weights)は、クエリ(Query)とキー(Key)の内積(ドットプロダクト)によって計算されます。この内積に基づいて、各入力要素がどれだけ「重要」であるかを定量的に評価し、その結果を基に情報を選択的に統合します。以下では、このプロセスをさらに詳細に解説します。
1. アテンション重みの計算プロセス
1.1 クエリとキーの内積(ドットプロダクト)
アテンション重みは、以下のステップで計算されます:
- クエリとキーの生成:
- 各入力トークンに対して、クエリ \( Q \) とキー \( K \) のベクトルを生成します。
- これは、入力ベクトル \( X \) に対して、それぞれ異なる重み行列 \( W^Q \) と \( W^K \) を掛けることで得られます。
\[
Q = XW^Q,\quad K = XW^K
\]
- クエリとキーの内積:
- 各クエリベクトル \( Q_i \) と全てのキー \( K_j \) の内積を計算します。
\[
e_{ij} = Q_i \cdot K_j = \sum_{k=1}^{d_k} Q_{ik} K_{jk}
\] - ここで、\( e_{ij} \) はクエリ \( i \) がキー \( j \) に対してどれだけ「注意」を向けるべきかを示すスコアです。
- 各クエリベクトル \( Q_i \) と全てのキー \( K_j \) の内積を計算します。
1.2 スケーリング
内積の値が大きくなりすぎると、ソフトマックス関数を適用した際に勾配消失の問題が発生しやすくなります。これを防ぐために、スコア \( e_{ij} \) をキーの次元数 \( d_k \) の平方根で割ってスケーリングします。
\[
\text{Scaled } e_{ij} = \frac{e_{ij}}{\sqrt{d_k}}
\]
1.3 ソフトマックス関数の適用
スケーリングされたスコアに対してソフトマックス関数を適用し、アテンション重み \( \alpha_{ij} \) を計算します。
\[
\alpha_{ij} = \frac{\exp(\text{Scaled } e_{ij})}{\sum_{k=1}^{n} \exp(\text{Scaled } e_{ik})}
\]
- ここで、\( \alpha_{ij} \) はクエリ \( i \) がキー \( j \) に対して持つアテンションの重みであり、各クエリに対して重みの総和が1となります。
2. アテンション重みの役割と意味
2.1 重みの解釈
アテンション重み \( \alpha_{ij} \) は、クエリ \( i \) がキー \( j \) にどれだけ「注目」すべきかを示します。高い重みは、そのキーに関連するバリューが重要であることを意味し、低い重みはそれほど重要ではないことを示します。
2.2 情報の選択と統合
アテンション重みをバリュー \( V \) に適用することで、重要な情報が強調され、不要な情報が抑制されます。具体的には、以下の式でコンテキストベクトル \( C_i \) を生成します。
\[
C_i = \sum_{j=1}^{n} \alpha_{ij} V_j
\]
- このコンテキストベクトル \( C_i \) は、クエリ \( i \) に関連する重要な情報を集約したものです。
3. 具体例でのアテンション重みの計算
3.1 簡単な例
以下のシーケンスを考えます:
「私は 学校へ 行きます」
各トークンの埋め込みベクトル(仮定):
トークン | 埋め込み (\( X \)) |
---|---|
私 | \([1, 0, 1, 0]\) |
は | \([0, 1, 0, 1]\) |
学校へ | \([1, 1, 0, 0]\) |
行きます | \([0, 0, 1, 1]\) |
クエリ、キー、バリューの計算
重み行列 \( W^Q \)、\( W^K \)、\( W^V \) を以下のように仮定します:
\[
W^Q = W^K = W^V = \begin{bmatrix}
1 & 0 \
0 & 1 \
1 & 0 \
0 & 1
\end{bmatrix}
\]
これにより、
\[
Q = XW^Q = \begin{bmatrix}
1 & 0 \
0 & 1 \
1 & 0 \
0 & 1
\end{bmatrix},\quad
K = XW^K = \begin{bmatrix}
1 & 0 \
0 & 1 \
1 & 0 \
0 & 1
\end{bmatrix},\quad
V = XW^V = \begin{bmatrix}
1 & 0 \
0 & 1 \
1 & 0 \
0 & 1
\end{bmatrix}
\]
アテンションスコアの計算
\[
E = QK^T = \begin{bmatrix}
1 & 0 & 1 & 0 \
0 & 1 & 0 & 1 \
1 & 0 & 1 & 0 \
0 & 1 & 0 & 1
\end{bmatrix}
\]
スケーリング
キーの次元数 \( d_k = 2 \) なので、
\[
\text{Scaled } E = \frac{E}{\sqrt{2}} \approx \begin{bmatrix}
0.7071 & 0 & 0.7071 & 0 \
0 & 0.7071 & 0 & 0.7071 \
0.7071 & 0 & 0.7071 & 0 \
0 & 0.7071 & 0 & 0.7071
\end{bmatrix}
\]
ソフトマックスによる正規化
各行にソフトマックスを適用します。
\[
\text{Attention Weights} \approx \begin{bmatrix}
0.3333 & 0.1667 & 0.3333 & 0.1667 \
0.1667 & 0.3333 & 0.1667 & 0.3333 \
0.3333 & 0.1667 & 0.3333 & 0.1667 \
0.1667 & 0.3333 & 0.1667 & 0.3333
\end{bmatrix}
\]
コンテキストベクトルの計算
\[
\text{Output} = \text{Attention Weights} \cdot V \approx \begin{bmatrix}
0.6666 & 0.3334 \
0.3334 & 0.6666 \
0.6666 & 0.3334 \
0.3334 & 0.6666
\end{bmatrix}
\]
3.2 解釈
各行のコンテキストベクトルは、クエリが自身と他のトークンからどれだけ情報を取り入れるかを示しています。例えば、「私」のコンテキストベクトルは「私」と「学校へ」からの情報が強く反映されています。
4. バリュー(Value)の重要性と役割の再確認
4.1 バリューの役割
- 情報の保持:バリューは、実際に伝達される情報を保持します。クエリとキーの類似度に基づいて、必要な情報が選択的に集約されます。
- 情報の統合:アテンション重みを通じて、複数のバリューが統合され、コンテキストベクトルが形成されます。これにより、モデルは文脈に応じた情報を動的に処理できます。
4.2 バリューの線形変換
実際のモデルでは、バリューは入力エンベディングに対して線形変換を施したものです。これにより、バリューはモデルが学習する過程で最適化された形で情報を保持します。
\[
V = XW^V
\]
- \( W^V \) はバリュー用の重み行列であり、モデルの学習によって最適化されます。
4.3 バリューとコンテキストベクトルの関係
コンテキストベクトル \( C_i \) は、アテンション重みをバリューに適用して生成されます。
\[
C_i = \sum_{j=1}^{n} \alpha_{ij} V_j
\]
- このコンテキストベクトルは、次の層に入力として渡され、さらなる情報処理が行われます。
5. まとめ
アテンション重みは、クエリとキーの内積によって計算され、その後スケーリングとソフトマックス関数を通じて正規化されます。これにより、各入力要素がどれだけ重要であるかが定量的に評価され、バリューに適用されます。バリューは実際に伝達される情報そのものであり、アテンション重みによって重要な情報が強調され、不要な情報が抑制されます。
ポイントの再確認
- アテンション重みの計算:
- クエリとキーの内積(ドットプロダクト)を計算。
- スケーリングとソフトマックスを適用して正規化。
- バリューの役割:
- 実際に伝達される情報を保持。
- アテンション重みによって重み付けされ、コンテキストベクトルとして統合。
- コンテキストベクトルの生成:
- 重み付けされたバリューの総和。
- 次の層への入力として利用される。
このプロセスにより、モデルは入力シーケンス内の重要な情報に動的に焦点を当て、文脈に適した情報を効率的に統合することができます。バリューはアテンション機構の中核をなす要素であり、クエリとキーの操作を通じて最終的な出力を形成する重要な役割を担っています。