🤖

LLM解説シリーズ:Transformerの基本構造をAttention論文から読む

に公開

はじめに

この記事は、以下の論文を読んだ技術メモです。

  • 論文タイトル: Attention Is All You Need
  • 論文リンク: https://arxiv.org/abs/1706.03762
  • 著者: Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin
  • 初版公開日: 2017年6月12日

詳細な背景説明、図解、Self-AttentionやMulti-Head Attentionの補足は個人ブログ側にまとめています。

👉 完全版はこちら:Transformerとは?Attention Is All You Need論文からLLMの基本構造をやさしく解説

3行まとめ

TransformerのEncoderとDecoderがMulti-Head AttentionとFeed Forwardを積み重ねる構造

  • Transformerは、RNN(再帰的に系列を処理するニューラルネットワーク)やCNN(畳み込みで局所パターンを見るニューラルネットワーク)を使わず、Attentionを中心に系列変換を行うモデルです。
  • 論文では、Multi-Head Attention、Position-wise Feed-Forward Networks、Positional Encodingを組み合わせ、機械翻訳で高い性能と学習効率を示しました。
  • GPT系LLMは元論文そのものではありませんが、tokenをベクトル化し、位置情報を加え、Attention層で文脈表現を作るという基本発想はここから理解しやすいです。

何の論文か

Attention Is All You Needは、Transformerを提案した論文です。

元論文のTransformerは、機械翻訳向けのEncoder-Decoder構造です。

入力文をEncoderが読み、Decoderが翻訳文を1 tokenずつ生成します。

部品 役割
Input Embedding token IDをベクトルへ変換する
Positional Encoding tokenの順序情報を加える
Encoder Self-Attention 入力文中のtoken同士の関係を見る
Decoder Masked Self-Attention 未来tokenを見ないように出力側を処理する
Encoder-Decoder Attention DecoderがEncoder出力を参照する
Feed Forward Network 各位置の表現を非線形変換する

LLMシリーズの流れで見ると、前回のBahdanau Attentionは「Decoderが入力のどこを見るか」という発想を扱う回でした。

今回のTransformerでは、そのAttentionを補助部品ではなく、系列処理の中心に置いています。

何が新しいのか

大きなポイントは、系列処理から再帰と畳み込みを外し、Attention中心の構造にしたことです。

RNNはtokenを順番に処理するため、長い系列では計算の並列化が難しくなります。

CNNは比較的並列化しやすい一方、遠い位置の関係を見るには層を重ねる必要があります。

TransformerのSelf-Attention(同じ系列内のtoken同士が互いを参照する仕組み)では、1層の中で離れたtoken同士を直接結びやすくなります。

観点 RNN CNN Transformer Self-Attention
並列化 時間方向に弱い 比較的しやすい かなりしやすい
長距離依存 遠いほど情報経路が長い 層数に依存 1層で直接参照できる
位置情報 順序処理に含まれる 畳み込み位置に含まれる Positional Encodingで明示的に加える

Self-Attentionの見方

Self-Attentionが文中のtoken同士の関係を重みとして計算する流れ

Transformer論文で使われる基本形は、Scaled Dot-Product Attentionです。

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

Query、Key、Valueは、入力tokenのベクトル表現から別々の重み行列で作られます。

たとえば「私は機械学習が大好きです。」という文で、大好き の表現を更新したいとします。

このとき、大好き から作るQueryは「何を参照したいか」を表します。

一方で、機械学習大好き など各tokenから作るKeyは「照合される手がかり」です。

QueryとKeyの相性が高いtokenほど、大きなattention weightを持ちます。

最後に、その重みに応じて各tokenのValueを足し合わせます。

Valueは「各tokenのベクトル表現をValue用の重み行列で変換したもの」と見ると分かりやすいです。

役割 大好き を更新する例
Query 大好き から作る。何を参照したいか
Key 各tokenから作る。Queryと照合される手がかり
Value 各tokenの表現から作る。重みに応じて混ぜる中身

Multi-Head Attentionの見方

Multi-Head Attentionが複数のheadで異なる関係を並列に見る流れ

Multi-Head Attentionは、複数のAttention headを並列に走らせる仕組みです。

headは、Q/K/Vを作るための別々の投影セットと、それを使ったAttention計算の1単位です。

Convolutionでいうフィルタの種類に少し似ていて、同じ入力を複数の見方で処理します。

ただし、畳み込みのフィルタが近くの要素を局所的に見るのに対して、Attention headは離れたtokenも直接参照できます。

論文のbaseモデルでは、d_\mathrm{model}=512、head数は8です。

つまり、各tokenを512次元の表現として扱い、それを8個のheadに分けて各64次元でAttentionを計算します。

最初の512次元ベクトルはInput Embeddingで作られ、Positional Encodingを足してTransformer層へ渡されます。

技術的に面白い点

Positional Encodingが必須になる

Self-Attentionは全tokenを集合のように見ます。

そのままだと語順を区別しにくいため、Transformerではsin/cosを使ったPositional Encoding(位置情報を表すベクトル)を入力埋め込みに加えます。

PE_{(pos, 2i)} = \sin\left(pos / 10000^{2i / d_\mathrm{model}}\right)
PE_{(pos, 2i+1)} = \cos\left(pos / 10000^{2i / d_\mathrm{model}}\right)

現代のLLMではRoPE(Rotary Position Embedding、相対位置を回転で表す位置埋め込み)など別方式も多いですが、「Attentionだけでは順序が入りにくい」という前提は重要です。

Feed Forwardはtokenごとに独立している

Feed Forward Networkが各token位置で同じ非線形変換を行う流れ

TransformerのFeed Forward Networkは、各token位置に同じ2層MLP(多層パーセプトロン)を適用します。

\mathrm{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2

上記式は畳み込みの式にも似ていますが、ここでの線形変換は畳み込みではありません。

Attentionがtoken間の情報を混ぜ、Feed Forwardが混ぜた後の各token表現を個別に加工する、という役割分担で見ると整理しやすいです。

残差接続とLayer Normalizationも重要

Transformerは「Attention Is All You Need」というタイトルで有名ですが、Attentionだけでできているわけではありません。

各サブ層の周りには残差接続(入力をサブ層出力へ足す経路)とLayer Normalization(特徴次元の値を正規化する処理)があります。

残差接続を広く普及させた代表的な元論文としては、ResNetの Deep Residual Learning for Image Recognition を参照するのが自然です。

実験結果をどう読むか

論文では、WMT 2014 English-GermanとEnglish-Frenchの翻訳タスクで評価しています。

モデル EN-DE BLEU EN-FR BLEU 特徴
ByteNet 23.75 - 畳み込み系の文変換モデル
Deep-Att + PosUnk - 39.2 当時の強い翻訳モデル
Transformer base 27.3 38.1 既存モデルより少ない学習コストで高性能
Transformer big 28.4 41.8 EN-DEで当時のstate-of-the-art相当

Transformer bigは、English-to-Germanで28.4 BLEU、English-to-Frenchで41.8 BLEUを報告しています。

ただし、これは当時の機械翻訳タスクでの結果です。

現代LLMの対話性能や推論能力をこのBLEU値だけで説明することはできません。

実装者視点で気になった点

maskはsoftmax前に入れる

Decoderの自己回帰生成では、未来tokenを見ないcausal maskが必要です。

実装では、softmax前のscoreにmaskを入れて、見てはいけない位置の確率がほぼ0になるようにします。

scores = query @ key.transpose(-2, -1)
scores = scores / (head_dim**0.5)
scores = scores.masked_fill(~attention_mask, torch.finfo(scores.dtype).min)
weights = torch.softmax(scores, dim=-1)

Attention weightを説明として過信しない

attention weightは、どのtokenを強く参照したかの傾向を見るには便利です。

一方で、それだけでモデル判断の因果的な説明が完全に分かるわけではありません。

可視化として使うときも、デバッグの手がかりとして読むのがよさそうです。

計算量はtoken数に対して重くなる

Self-Attentionは全tokenペアを比較するため、単純な実装ではtoken数 n に対して O(n^2) の計算・メモリが必要です。

この課題は、後のFlashAttention、Sparse Attention、KV Cache、GQAなどの研究につながっていきます。

個人的な所感

Transformer論文は、現代LLMそのものをすべて説明する論文ではありません。

GPT系ではDecoder-only構造が中心ですし、位置情報もRoPEなどへ発展しています。

それでも、LLMの中核にある「tokenをベクトル化し、位置を加え、Attentionで文脈を混ぜ、Feed Forwardで加工する」という流れを理解するには、今でもかなり良い入口です。

特に、Self-Attention、Multi-Head Attention、Positional Encoding、残差接続を同じ図の中で眺められる点が読みどころだと思います。

詳細版

より詳しい背景、図解、Q/K/Vの具体例、Transformerと現代LLMの違いは個人ブログにまとめています。

👉 完全版はこちら:Transformerとは?Attention Is All You Need論文からLLMの基本構造をやさしく解説

Discussion