🔰 初心者
GNMTでAttention機構が出てきましたが、まだRNNを使っていましたよね。RNNなしでもいけるんですか?
🎓 上級者
2017年にGoogleが発表したTransformer は、まさに「Attention Is All You Need (注意機構だけで十分)」というタイトルの通り、RNNもCNNも使わずAttentionだけ で系列データを処理するモデルなんだ。現在のGPTやBERTの基盤になった革命的なアーキテクチャだよ。
RNNの限界とTransformerの登場
RNN/LSTMには大きな弱点があった:
① 逐次処理 — 単語を1つずつ順番に処理するため並列計算ができない (遅い)
② 長距離依存 — 文が長いと離れた単語の関係を捉えにくい(情報が薄まる)
TransformerはAttention機構だけ で全単語を同時に処理し、この2つの問題を一気に解決した。
RNN vs Transformer:処理の違い
RNN:逐次処理(遅い)
単語1
→
単語2
→
単語3
→
単語4
1つずつ順番に処理 → 前の計算が終わるまで待つ必要がある
Transformer:並列処理(速い)
単語1
単語2
単語3
単語4
全単語を同時に処理 → 全ペアの関係を一括で計算
Transformer = RNNを排除 → GPUで並列計算が可能 → 大規模学習に最適
これがGPT、BERTなど大規模言語モデル(LLM)の基盤になった
🎯 Attention(注意機構)
🔰 初心者
GNMTのところでAttentionが出ましたが、もう少し詳しく知りたいです。具体的にどう計算しているんですか?
🎓 上級者
Attentionの核心はQuery(質問)・Key(索引)・Value(値) の3つの概念だよ。辞書を引くイメージで考えるとわかりやすい。
Attentionの仕組み:Query・Key・Value
辞書を引くときに例えると:
Query(Q) =「調べたいこと」(検索ワード)
Key(K) =「各ページの見出し」(索引)
Value(V) =「各ページの内容」(本文)
① QueryとすべてのKeyの類似度(内積) を計算
② 類似度をソフトマックスで正規化 して「注目度(重み)」にする
③ 注目度でValueの加重平均 を取る → 出力
Scaled Dot-Product Attention の計算フロー
Query (Q)
Key (K)
Value (V)
QK^T の内積
(類似度を計算)
÷ √d_k
(スケーリング)
Softmax
(注目度に変換)
重み × V
(加重平均)
出力
Attention(Q, K, V) = softmax( QK^T / √d_k ) × V
√d_k によるスケーリングの理由
Queryの次元数 d_k が大きいと内積の値が大きくなりすぎて、Softmaxの出力が極端(ほぼ0か1)になってしまう。
√d_k で割ることで値を適度な範囲に保ち、勾配が消失しにくく なる。
このスケーリングが入っているため「Scaled Dot-Product Attention」と呼ぶ。
🔍 Self-Attention(自己注意)
🔰 初心者
GNMTのAttentionは入力文と出力文の間で注目していましたよね。Self-Attentionはどう違うんですか?
🎓 上級者
Self-Attention は同じ文の中で 各単語が他のすべての単語にどれだけ注目すべきかを計算するんだ。Q・K・Vがすべて同じ系列 から作られるのが特徴だよ。
Self-Attentionのイメージ:文の中で各単語が互いに注目
猫
が
魚
を
食べた
「食べた」が各単語に注目する度合い
0.35
猫
0.05
が
0.30
魚
0.05
を
0.25
食べた
「食べた」にとって重要な単語=「猫」(主語)と「魚」(目的語)に高い注目度
各単語がQ・K・Vすべてを同じ入力系列から生成 → 文の内部構造を自動で把握
Self-Attention = Q, K, V がすべて同じ系列から生成されるAttention
Self-Attention(自己注意機構)
同じ系列内の各要素が他のすべての要素との関連度を計算する仕組み
仕組み: 入力系列の各単語からQ(Query)・K(Key)・V(Value) の3つのベクトルを生成し、同じ文の中で各単語が他のどの単語に注目すべきかを計算する。
特徴:
文中のすべての単語ペアの関係を一度に計算 できる
離れた単語の関係も直接捉えられる(RNNのように情報が薄まらない)
GPUでの並列計算 に適している
RNNとの違い: RNNは隠れ状態を順番に伝搬するため長距離の依存関係が薄まるが、Self-Attentionは距離に関係なく直接的に関係を計算できる。
🔗 ソースターゲットアテンション(交差注意)
🔰 初心者
Self-Attentionは同じ文の中で注目しますよね。でも翻訳のときは「入力文(英語)」と「出力文(日本語)」の間で注目する必要がありますよね?
🎓 上級者
その通り!それがソースターゲットアテンション (Cross-Attention / 交差注意)だよ。GNMTのAttentionと同じ考え方で、Queryは出力側(デコーダー) から、Key・Valueは入力側(エンコーダー) から来るんだ。
Self-Attention
同じ系列の中で注目
Q, K, V がすべて同じ系列 から生成
エンコーダー内・デコーダー内で使用
「文の中の単語同士の関係」を捉える
ソースターゲットアテンション
異なる系列の間で注目
Q はデコーダー から、K・V はエンコーダー から
デコーダー内で使用
「出力のこの単語は、入力のどの単語に対応するか」を捉える
ソースターゲットアテンション:翻訳時のイメージ
エンコーダーの出力(入力文:英語)→ K, V を提供
I
love
cats
very
much
デコーダー(出力文:日本語)→ Q を提供
私は
猫が
大好き
です
love: 0.50
very: 0.25
much: 0.20
「大好き」を生成する際、入力の「love」「very」「much」に高い注目度で参照
🎭 Masked Self-Attention
🔰 初心者
デコーダーで文を生成するときも、Self-Attentionをそのまま使えるんですか?
🎓 上級者
そのままでは使えないんだ。デコーダーは単語を左から右に1つずつ生成 するので、まだ生成していない未来の単語を見てはいけない 。そこでMasked Self-Attention を使って、未来の位置をマスク(隠す)するんだ。
Masked Self-Attention:未来の単語を見ないようにマスク
通常のSelf-Attention行列
私は
猫が
好き
です
私は
猫が
好き
です
→
Masked Self-Attention行列
私は
猫が
好き
です
私は
×
×
×
猫が
×
×
好き
×
です
参照可能(過去+自分)
× マスク(未来)
未来の位置を -∞ にして Softmax 後に0にする → 未来の情報が漏れない
デコーダーのSelf-Attentionで使用。学習時に並列計算しつつ因果関係を維持
Masked Self-Attention
デコーダーで使用される、未来の位置をマスクしたSelf-Attention
なぜ必要か: デコーダーは左から右に1単語ずつ生成するため、まだ生成していない未来の単語を参照してはいけない (カンニング防止)。
実装方法: Self-Attentionの注意行列で、未来の位置(右上三角)を-∞(マイナス無限大) にする。Softmax後に0になるため、未来の情報が漏れない。
利点: マスクを使うことで、学習時には全位置を並列に 計算しつつ、各位置が過去の情報のみを参照する因果関係を維持できる。
👁️ マルチヘッドアテンション
🔰 初心者
Self-Attentionを1回やれば十分じゃないんですか?なぜ「マルチヘッド」なんですか?
🎓 上級者
1つのAttentionヘッドでは1種類の関係 しか捉えられない。でも言語には「主語-述語の関係」「修飾-被修飾の関係」「代名詞の照応」など複数の関係 が同時に存在する。そこで複数のヘッドを並列に走らせて、異なる観点から注目 するんだ。
マルチヘッドアテンション:複数の観点で同時に注目
入力
(Q, K, V)
ヘッド1: 主語-述語
「猫が…食べた」に注目
ヘッド2: 修飾関係
「大きな…魚」に注目
ヘッド3: 近傍関係
隣り合う単語に注目
(元論文では8ヘッド)
Concat
(結合)
線形変換
(W^O)
出力
各ヘッドが異なる関係パターンを学習 → 結合して豊かな表現を獲得
マルチヘッドアテンション(Multi-Head Attention)
複数のAttentionヘッドを並列に実行し、異なる観点の注目パターンを統合する仕組み
仕組み:
入力のQ・K・Vをそれぞれh個のヘッド に分割(元論文では h=8)
各ヘッドで独立にScaled Dot-Product Attentionを計算
全ヘッドの出力を結合(Concat) して線形変換 で元の次元に戻す
メリット: 1つのヘッドでは1種類の関係しか学べないが、複数ヘッドで主語-述語、修飾、照応 など多様な関係パターンを同時に学習できる。
計算量: 各ヘッドの次元を小さくする(d_model / h)ため、ヘッド数を増やしても計算量はほぼ変わらない。
📍 位置エンコーディング
🔰 初心者
RNNは順番に処理するから語順がわかりますよね。Transformerは全部同時に処理するなら、語順の情報はどうなるんですか?
🎓 上級者
とても大事なポイントだね!TransformerのSelf-Attentionは集合のように全ペアを計算するだけなので、そのままでは語順の情報がない 。そこで位置エンコーディング(Positional Encoding) を使って、各単語に「何番目にあるか」の情報を明示的に足すんだ。
位置エンコーディング:単語の位置情報を加算
単語の埋め込みベクトル
猫 [0.3,…]
が [0.1,…]
魚 [0.5,…]
+
位置エンコーディング
位置0
位置1
位置2
=
Transformerへの入力
猫(位置0)
意味+位置の情報
が(位置1)
意味+位置の情報
魚(位置2)
意味+位置の情報
元論文ではsin/cosの周期関数を使用
PE(pos, 2i) = sin(pos / 10000^(2i/d))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d))
位置エンコーディング(Positional Encoding)
Transformerに語順の情報を与えるために、各位置に固有のベクトルを加算する仕組み
なぜ必要か: Self-Attentionは全ペアの関係を計算するが、入力の順番を区別しない (集合として扱う)。「猫が魚を食べた」と「魚が猫を食べた」の区別がつかない。
仕組み: 各位置に固有のベクトルを生成し、単語の埋め込みベクトルに加算 する。元論文ではsin/cosの周期関数 を使用。
sin/cosを使う理由:
学習なしで任意の長さの位置をエンコードできる
相対的な位置関係を内積で表現できる
学習で位置ベクトルを獲得する方法(学習型)もある(BERTなど)
🏗️ Transformerの全体構造
🔰 初心者
Attentionの種類はわかりました。これらが全体でどう組み合わさっているんですか?
🎓 上級者
Transformerはエンコーダー とデコーダー の2つのブロックからなるんだ。各ブロックの中で、今まで説明したAttentionの種類が使い分けられているよ。
Transformerの全体構造(Encoder-Decoder)
エンコーダー(×N層)
入力埋め込み+位置エンコーディング
Self-Attention
+ Add & Norm(残差接続+層正規化)
Feed Forward Network
+ Add & Norm(残差接続+層正規化)
↑ この2層を N回繰り返し(元論文: N=6)
出力 → K, V
デコーダー(×N層)
出力埋め込み+位置エンコーディング
Masked Self-Attention
+ Add & Norm
ソースターゲットアテンション
Q=デコーダー、K・V=エンコーダー + Add & Norm
K, V を提供
Feed Forward Network
+ Add & Norm
↑ この3層を N回繰り返し(元論文: N=6)
→ Linear → Softmax → 出力単語
各サブ層に残差接続(ResNetと同じ)+層正規化(Layer Normalization)を適用
Transformerの3種類のAttentionまとめ
① Self-Attention (エンコーダー内)
→ 入力文の各単語が他のすべての入力単語との関係を計算
② Masked Self-Attention (デコーダー内)
→ 出力文の各単語が、自分より前の出力単語のみ参照(未来を隠す)
③ ソースターゲットアテンション (デコーダー内)
→ 出力の各単語が、入力文のどの単語に対応するかを計算(Q=デコーダー、K/V=エンコーダー)
Transformer(Vaswani et al., 2017年)
RNN/CNNを排除し、Attention機構のみで構築された画期的なEncoder-Decoderモデル
構成(元論文):
エンコーダー :Self-Attention → FFN の2層 × 6回繰り返し
デコーダー :Masked Self-Attention → ソースターゲットAttention → FFN の3層 × 6回繰り返し
各サブ層に残差接続 +層正規化(Layer Norm)
マルチヘッドアテンション:8ヘッド 、モデル次元 d_model=512
意義:
RNNの逐次処理を排除 → 並列計算が可能 → 学習が大幅に高速化
長距離の依存関係を直接的に捉えられる
BERT(エンコーダーのみ)、GPT(デコーダーのみ)など大規模言語モデルの基盤に
📊 Attentionの種類の比較
種類 Q の出処 K・V の出処 使用場所 特徴
Self-Attention 同じ系列 同じ系列 エンコーダー 文内の単語間の関係を把握
Masked Self-Attention 同じ系列 同じ系列(過去のみ) デコーダー 未来を見ないよう右上三角をマスク
ソースターゲット Attention デコーダー エンコーダー デコーダー 入力のどの部分に注目するか
マルチヘッド Attention 上記いずれかを複数ヘッドで実行 全箇所 多様な関係パターンを同時に学習
📝 まとめ
G検定で押さえるべきポイント
Transformer (2017年)はRNN/CNNを使わずAttentionだけ で構築されたEncoder-Decoderモデル
「Attention Is All You Need 」という論文で発表(Vaswani et al.)
Attention はQuery(質問)・Key(索引)・Value(値)の3つの概念で計算。内積→スケーリング→Softmax→加重平均
Self-Attention :同じ系列内で各単語が他のすべての単語との関係を計算(Q・K・Vが同じ系列)
ソースターゲットアテンション :Q=デコーダー、K・V=エンコーダーで、入出力の対応関係を学習
Masked Self-Attention :デコーダーで未来の単語を見ないようマスク(右上三角を-∞にする)
マルチヘッドアテンション :複数のヘッドで異なる関係パターンを同時に学習(元論文は8ヘッド)
位置エンコーディング :Attentionは語順を区別しないため、sin/cosの周期関数で位置情報を明示的に加算
RNNと違い並列計算が可能 → 大規模学習に適している → BERT・GPTの基盤