😎
初心者にも分かるAttentionと翻訳
はじめに
自然言語処理で大きな役割を果たすのが Attention です。
とくに翻訳タスク(日本語 → 英語)では、Attention によって「どの入力をどれくらい参照するか」を学習できるため、語順や助詞の違いを越えて正しい対応づけができます。
ここでは初心者がつまずきやすい点を丁寧にフォローしつつ、翻訳タスクにおける Attention の仕組みを説明します。
1. 単語はどう扱われるのか?
入力文(例:「私はニンニクが好きです」)は次の流れでモデルに入ります。
-
トークン化
文を単語やサブワードに分割する(例:[私, は, ニンニク, が, 好き, です]
) -
埋め込み(Embedding)
各トークンを数百次元のベクトルに変換するx_i \in \mathbb{R}^{d_{\text{model}}} -
位置エンコーディング
単語の並び順を示す情報を加える
2. Q, K, V とは?
各埋め込みベクトル
- Query (Q) = いま欲しい情報
- Key (K) = 自分はどういう特徴を持っているか
- Value (V) = 実際の情報の中身
3. Attention の計算式
Attention の基本式は次のとおりです。
やっていることを分解すると:
-
関連度スコアを計算
s_i = q \cdot k_i → Query と Key の内積をとり、似ているほど大きな値になる
-
softmax で確率に変換
\alpha_i = \frac{\exp(s_i)}{\sum_j \exp(s_j)} → すべての入力に対する注目度を確率化する
-
Value の重み付き和をとる
c = \sum_i \alpha_i v_i → 得られる
が 文脈ベクトルc
4. 翻訳タスクでの使われ方
翻訳モデルは Encoder–Decoder 構造をもち、それぞれで Attention が動きます。
エンコーダ
- 入力文を Self-Attention で処理
- 各単語ベクトルが文脈を含んだ表現に変換される
- 出力
を生成H = [h_1, h_2, \dots, h_T]
デコーダ
- これまでに生成した単語列から状態ベクトル
を作るz -
からクエリz を作成q - エンコーダ出力
から K, V を作成し Cross-Attention を計算H
- 文脈ベクトル
をc と組み合わせ、次に出力する単語を予測するz
5. 出力単語の決定
-
文脈ベクトルと状態を結合
h = [z; c] -
線形変換で語彙ごとのスコアに変換
o = W_o h + b →
の次元は語彙サイズ(数万〜数十万)o -
softmax で確率化
p(\text{単語}) = \mathrm{softmax}(o) -
確率が最大の単語を次に出力
6. 具体例:「私はニンニクが好きです」→ "I like garlic."
- "I" → 「私」に強く注目
- "like" → 「好き」に強く注目
- "garlic" → 「ニンニク」に強く注目
👉 Attention のおかげで、語順や助詞が異なっても正しい対応づけが可能になります。
7. まとめ
- Attention は「どこを見るべきか」を学習する仕組み
- Q, K, V は「問い合わせ・特徴・中身」の役割を分担
- 翻訳タスクでは Cross-Attention が重要
- 出力は文脈ベクトル
と状態c を組み合わせて softmax で決まるz
参考
- Vaswani et al. (2017), Attention is All You Need
- Jay Alammar, The Illustrated Transformer
Discussion