😎

初心者にも分かるAttentionと翻訳

に公開

はじめに

自然言語処理で大きな役割を果たすのが Attention です。
とくに翻訳タスク(日本語 → 英語)では、Attention によって「どの入力をどれくらい参照するか」を学習できるため、語順や助詞の違いを越えて正しい対応づけができます。
ここでは初心者がつまずきやすい点を丁寧にフォローしつつ、翻訳タスクにおける Attention の仕組みを説明します。


1. 単語はどう扱われるのか?

入力文(例:「私はニンニクが好きです」)は次の流れでモデルに入ります。

  1. トークン化
    文を単語やサブワードに分割する(例:[私, は, ニンニク, が, 好き, です]

  2. 埋め込み(Embedding)
    各トークンを数百次元のベクトルに変換する

    x_i \in \mathbb{R}^{d_{\text{model}}}
  3. 位置エンコーディング
    単語の並び順を示す情報を加える


2. Q, K, V とは?

各埋め込みベクトル x_i から、学習された重み行列を使って Q, K, V を作ります。

q_i = x_i W_Q, \quad k_i = x_i W_K, \quad v_i = x_i W_V
  • Query (Q) = いま欲しい情報
  • Key (K) = 自分はどういう特徴を持っているか
  • Value (V) = 実際の情報の中身

3. Attention の計算式

Attention の基本式は次のとおりです。

\mathrm{Attention}(Q,K,V) = \mathrm{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right) V

やっていることを分解すると:

  1. 関連度スコアを計算

    s_i = q \cdot k_i

    → Query と Key の内積をとり、似ているほど大きな値になる

  2. softmax で確率に変換

    \alpha_i = \frac{\exp(s_i)}{\sum_j \exp(s_j)}

    → すべての入力に対する注目度を確率化する

  3. 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 を作成
  • エンコーダ出力 H から K, V を作成し Cross-Attention を計算
c = \mathrm{softmax}\!\left(\frac{qK^\top}{\sqrt{d_k}}\right) V
  • 文脈ベクトル cz と組み合わせ、次に出力する単語を予測する

5. 出力単語の決定

  1. 文脈ベクトルと状態を結合

    h = [z; c]
  2. 線形変換で語彙ごとのスコアに変換

    o = W_o h + b

    o の次元は語彙サイズ(数万〜数十万)

  3. softmax で確率化

    p(\text{単語}) = \mathrm{softmax}(o)
  4. 確率が最大の単語を次に出力


6. 具体例:「私はニンニクが好きです」→ "I like garlic."

  • "I" → 「私」に強く注目
  • "like" → 「好き」に強く注目
  • "garlic" → 「ニンニク」に強く注目

👉 Attention のおかげで、語順や助詞が異なっても正しい対応づけが可能になります。


7. まとめ

  • Attention は「どこを見るべきか」を学習する仕組み
  • Q, K, V は「問い合わせ・特徴・中身」の役割を分担
  • 翻訳タスクでは Cross-Attention が重要
  • 出力は文脈ベクトル c と状態 z を組み合わせて softmax で決まる

参考

Discussion