Upgrade to Pro — share decks privately, control downloads, hide ads and more …

大規模言語モデルを支える頭脳:Transformerを30分でつかむ

Avatar for r-hagihara-max r-hagihara-max
August 02, 2025
49

 大規模言語モデルを支える頭脳:Transformerを30分でつかむ

このスライドでは、ChatGPTなどの大規模言語モデルの中核技術である「Transformer」について、初心者にもわかりやすく30分で理解できるように解説しています。
RNNやCNNとの違いから、Self-Attention・Multi-Head Attention・Encoder/Decoder構造・Positional Encodingなどの要素を図解と具体例で丁寧に紹介。

文脈をどう捉え、翻訳や生成をどのように行っているのかが視覚的に学べる内容です。
AIや自然言語処理に興味がある方、これからTransformerを学びたい方におすすめです。

Avatar for r-hagihara-max

r-hagihara-max

August 02, 2025
Tweet

Transcript

  1. Transformer とは Get Started Transformer は、2017 年にGoogle の研究者たちに「Attention Is All

    You Need 」という論文で発表された、ニューラルネットワーク(人間 の脳の仕組みを模倣した機械学習モデル)の一種です。 最初は機械翻訳や文章の要約などの、 ある系列データを別の系列データに変換するタスク(系列変換タスク) を想定して開発されましたが、その後、ChatGPT の基盤となる技術と して大変注目を集めることになりました。 Transformer は、この系列変換タスクにおいて非常に高い性能を発揮 することが知られています。
  2. 「彼は昨日、東京で寿司を食べた。 」 RNN はこの文を以下のように1 語ずつ処理します: 「彼は」→ 「昨日」→ 「東京で」→ 「寿司を」→ 「食べた」

    つまり、 「食べた」という動詞が出てきたときに、主語の「彼」や目的語の「寿司」が何だったかを覚えておく 必要があります。 長い文だと、 「彼」が主語だったことや「寿司」が目的語だったことを忘れてしまうことがあります。 Example RNN (再起型ニューラルネットワーク)
  3. Encoder Encoder Self-Attention FFNN Position-wise Feed-Forward Networks エンコーダは、Self-Attention 層と Position-wise

    Feed-Forward Networks (FFNN )という二つのサブ レイヤーから構成されています。 Self-Attention 層は、文中の各単語が他の単語とどの 程度関係が強いかを教えてくれます。 FFNN はSelf-Attention 層から得られた各単語の関係性 をもとにして、各単語の意味をどう解釈するか、とい う深い理解の変換をしてくれます。
  4. Decoder Decoder Self-Attention FFNN Position-wise Feed-Forward Networks デコーダの構成はSelf-Attention 層とFFNN の間に、

    Encoder-Decoder Attention 層が存在します。 Self-Attention 層は、デコーダの現在までの各単語が 他の単語とどのように関連しているかを理解します。 Encoder-Decoder Attention 層はエンコーダからの入 力とデコーダの現在の状態との関連性を評価します。 FFNN は、Self-Attention 層およびEncoder-Decoder Attention 層から得られた情報をもとにして、各単語が 文全体の中でどのような意味を持つのかを解釈し、よ り深い意味理解へと変換してくれる役割を担っていま す。 Encoder-Decoder Attention
  5. Transformer 全体アーキテクチャの流れ Encoder Self-Attention FFNN Decoder FFNNs Encoder-Decoder Attention INPUT

    Input Embeddings Positional Encoding Tokenization LayerNorm LayerNorm +Residual +Residual LayerNorm +Residual LayerNorm +Residual LayerNorm +Residual Linear OUTPUT Self-Attention
  6. Input Embeddings (入力埋め込み) モデルは(語彙数 × 埋め込み次元数)の埋め込み行列を持っており、 各単語に割り当てられた「トークンID 」を使って、そこから対応するベクトルを取り出します。 このベクトルは、その単語がもつ意味を数値で表現したもので、 通常はBERT

    で768 次元などの高次元ですが、今回は理解しやすくするため3 次元ベクトルで解 説しています。 [ 0.21, -0.45, 0.33 ], [-0.18, 0.12, 0.04 ], [ 0.66, -0.05, -0.11 ], [ 0.03, 0.19, 0.07 ], [ 0.45, 0.22, -0.09 ] ,[-0.09, -0.14, 0.06 ], [ 0.30, -0.33, 0.48 ], [ 0.11, 0.44, 0.02 ], [-0.03, 0.06, 0.01 ], [ 0.59, -0.28, -0.17 ] ,[-0.09, -0.14, 0.06 ], 彼女 / は/ 駅/ で/ 猫 / を/ 見かけて/ 写真/ を/ 撮った/ 。 2154/17/3232/21/4610/18/ 3972/5577/18/6741/8
  7. Positional Encoding (位置エンコーディング) 単語 単語の意味ベクトル 位置の情報ベクトル 足し合わせた最終ベクトル 「私」 [0.1, 0.3,

    -0.2] [0.0, 0.0, 0.1] [0.1, 0.3, -0.1] 「は」 [0.2, 0.1, -0.4] [0.1, 0.0, 0.05] [0.3, 0.1, -0.35] 「猫」 [0.5, -0.2, 0.3] [0.2, 0.0, 0.0] [0.7, -0.2, 0.3] Transformer にはRNN のような順序情報がないため、単語の位置情報を埋め込みベクトルに追加する必要 があります。各単語に「あなたは文の中で〇番目だよ」という 位置のラベルを、埋め込みベクトルに足 し合わせる仕組みです。
  8. Layer Normalization (レイヤー正規化) LayerNorm は、Transformer のような深層学習モデルで、各トークンのベクトルの「スケール(値の大 きさのばらつき) 」を整えるための処理です。 具体的には、1 つのトークンが持つベクトル(たとえば

    [0.1, 0.3, -0.1] のような)について、 ベクトル全体の平均を引いて ばらつき(分散)で割る ことで、平均が 0 、分散が 1 に近い値に変換します。 1. 学習を安定させるため ベクトルのスケールが大きすぎたり偏っていたりすると、次の層に渡るときに「一部の値だけ強調されす ぎる」ことが起こります。LayerNorm によってスケールを整えることで、勾配の暴走や消失を防ぎ、学 習が安定・高速になります。 2. どのトークンにも平等な処理をするため Transformer は一度に全トークンを並列処理しますが、それぞれのベクトルのスケールがバラバラだと、 Attention の計算結果に偏りが出ます。 LayerNorm によって、全てのトークンが「同じ基準」で扱われるようになります。 なぜ必要なのか
  9. Encoder でのSelf-Attention Self-Attention 層は、文中の各単語が他の単語とどの程度関連しているかを評価します。 文中の各単語が、他のどの単語に注目すべきかを計算し、文全体の意味構造をつかみます。 「撮った」→ 「写真を」 「猫を」 「見かけて」 「何を撮ったのか?」

    「それを撮る前に何があったか?」を理解する 「見かけて」→ 「猫を」 「駅で」 「誰が・どこで・何を」見かけたのかを把握しようとしている 「彼女は」→ 「見かけて」 「撮った」 主語は行動を表す動詞と強く結びつく
  10. どのように各トークンに文脈の意味を反映させるか Transformer では、各入力ベクトルを次の3 種類に線形変換する必要があります: Query ベクトル(Q ) : 「今、何が欲しいか?」という問い合わせ Key

    ベクトル(K ) : 「私はどんな特徴を持っているか?」という自己紹介 Value ベクトル(V ) :実際に渡す情報の中身 これらは以下の式で求められます: Q = X × W^Q K = X × W^K V = X × W^V X は埋め込みベクトル(入力) Wq, Wk, Wv は、モデルが学習によって獲得したパラメータ行列
  11. よって各単語はそれぞれ3 種類のベクトルを持つことになります。 下記はそのイメージです。 トークン 埋め込みベクトル xᵢ Qᵢ (Query ) Kᵢ

    (Key ) Vᵢ (Value ) 彼女 [ 0.21, -0.45, 0.33 ] [ 0.12, -0.08, 0.33 ] [ 0.10, -0.02, 0.29 ] [ 0.15, 0.01, 0.40 ] は [-0.18, 0.12, 0.04 ] [-0.05, 0.11, 0.02 ] [-0.04, 0.13, -0.01 ] [ 0.01, 0.02, 0.03 ] 写真 [ 0.59, -0.28, -0.17 ] [ 0.59, -0.28, -0.17 ] [ 0.60, -0.29, -0.16 ] [ 0.58, -0.27, -0.18 ] 撮った [ 0.03, 0.19, 0.07 ] [ 0.02, 0.14, 0.04 ] [ 0.03, 0.15, 0.01 ] [ 0.05, 0.12, 0.03 ] どのように各トークンに文脈の意味を反映させるか
  12. 今回は「撮った」というトークンのコンテキストベクトル(文脈を反映させたベクトル)の計 算を例にして説明します。 どのように各トークンに文脈の意味を反映させるか トークン 埋め込みベクトル xᵢ Qᵢ (Query ) Kᵢ

    (Key ) Vᵢ (Value ) 彼女 [ 0.21, -0.45, 0.33 ] [ 0.12, -0.08, 0.33 ] [ 0.10, -0.02, 0.29 ] [ 0.15, 0.01, 0.40 ] は [-0.18, 0.12, 0.04 ] [-0.05, 0.11, 0.02 ] [-0.04, 0.13, -0.01 ] [ 0.01, 0.02, 0.03 ] 写真 [ 0.59, -0.28, -0.17 ] [ 0.59, -0.28, -0.17 ] [ 0.60, -0.29, -0.16 ] [ 0.58, -0.27, -0.18 ] 撮った [ 0.03, 0.19, 0.07 ] [ 0.02, 0.14, 0.04 ] [ 0.03, 0.15, 0.01 ] [ 0.05, 0.12, 0.03 ]
  13. 「撮った」のQuery ベクトルと各トークンのKey ベクトルの内積を求めます。 トークン 埋め込みベクトル xᵢ Qᵢ (Query ) Kᵢ

    (Key ) Vᵢ (Value ) 彼女 [ 0.21, -0.45, 0.33 ] [ 0.12, -0.08, 0.33 ] [ 0.10, -0.02, 0.29 ] [ 0.15, 0.01, 0.40 ] は [-0.18, 0.12, 0.04 ] [-0.05, 0.11, 0.02 ] [-0.04, 0.13, -0.01 ] [ 0.01, 0.02, 0.03 ] 写真 [ 0.59, -0.28, -0.17 ] [ 0.59, -0.28, -0.17 ] [ 0.60, -0.29, -0.16 ] [ 0.58, -0.27, -0.18 ] 撮った [ 0.03, 0.19, 0.07 ] [ 0.02, 0.14, 0.04 ] [ 0.03, 0.15, 0.01 ] [ 0.05, 0.12, 0.03 ] どのように各トークンに文脈の意味を反映させるか
  14. 「撮った」のQuery ベクトル:[0.02, 0.14, 0.04] 「彼女」の Key ベクトル:[0.10, -0.02, 0.29] =

    0.02 * 0.10 + 0.14 * (-0.02) + 0.04 * 0.29 = 0.002 - 0.0028 + 0.0116 = 0.0108 「は」の Key ベクトル:[-0.04, 0.13, -0.01] = 0.02 * (-0.04) + 0.14 * 0.13 + 0.04 * (-0.01) = -0.0008 + 0.0182 - 0.0004 = 0.0170 「写真」の Key ベクトル:[0.25, 0.15, 0.32] = 0.02 × 0.25 + 0.14 × 0.15 + 0.04 × 0.32 = 0.005 + 0.021 + 0.0128 = 0.0388 「撮った」 (自分自身) の Key ベクトル: [0.03, 0.15, 0.01] = 0.02 × 0.03 + 0.14 × 0.15 + 0.04 × 0.01 = 0.0006 + 0.021 + 0.0004 = 0.0220 どのように各トークンに文脈の意味を反映させるか
  15. softmax 関数で確率分布を求めます。これがAttention スコアです。 実際のAttention では、スコアをSoftmax に入れる前にスケーリング(例:√dₖ で割る)を行い ます。これによりSoftmax の勾配が極端になりすぎず、安定した学習が可能になります。 トークン

    生スコア(内積) Softmax 後のAttention スコア 彼女 0.0108 0.2472 (24.7% ) は 0.0170 0.2488 (24.9% ) 写真 0.0388 0.2543 (25.4% ) ← 一番高い 撮った 0.0220 0.2497 (25.0% ) どのように各トークンに文脈の意味を反映させるか
  16. それぞれの Value ベクトルに Softmax 後の Attention スコアを掛けて足し合わせた結果、すな わち「撮った」のSelf-Attention 層から出ていく出力ベクトルです。 トークン

    Attention スコア Vᵢ (Value ベクトル) Attention × Vᵢ (要素ごと の積) 彼女 0.2472 [0.15, 0.01, 0.40] [0.0371, 0.0025, 0.0989] は 0.2488 [0.01, 0.02, 0.03] [0.0025, 0.0050, 0.0075] 写真 0.2543 [0.58, -0.27, -0.18] [0.1475, -0.0687, -0.0458] 撮った 0.2497 [0.05, 0.12, 0.03] [0.0125, 0.0300, 0.0075] 合計 [0.1996, -0.0312, 0.0681] どのように各トークンに文脈の意味を反映させるか
  17. 1 つのSelf-Attention だけだと、 「どの単語に注目するか」の観点が1 種類だけになります。 例えば、 「動詞と主語の関係」は捉えられても、 「副詞との修飾関係」は取りこぼす可能性がある。 そこで、複数の異なる視点でSelf-Attention を並列に行うのがMulti-Head

    Attention です。 Step 1: Q/K/V を複数のヘッドごとに分けて計算 各Head の Wq,Wk,Wv は異なる学習パラメータ 各ベクトルの次元は 次元数/ ヘッダ数に分割される Step 2: 各ヘッドでSelf-Attention を独立に計算 Step 3: ヘッドの出力を結合 Step 4: 最後に線形変換して統合出力へ MultiHead(Q, K, V) = Concat(head₁, ..., head_h) × Wᵒ Wo は、モデルが学習によって得るパラメータで、複数の視点(ヘッド)から得られた意味ベクトルをひとつ に統合する役割を担います。 Multi-Head Attention とは
  18. Encoder でのFFNN Transformer では、Self-Attention のあとにFFNN が必ずセットで入るようになっています。 それぞれの単語はSelf-Attention で得た情報をもとに、より深く、抽象的な意味表現に変換されます。 「撮った」 「誰が撮ったのか(彼女)

    」 「何を(写真) 」 「そのきっかけ(猫を見かけた) 」 という文脈を背景に、 「完了した行動」として表現が練られる 「猫を」 「駅で」 「見かけた対象」として整理される
  19. Decorder でのSelf-Attention 出力文を1 単語ずつ生成していきます。 すでに生成した単語たちの中で、どれと関係があるかを見て、次に出す単語の文脈を整えます。 つまり、デコーダーは「これまでに何を言ったか?」をふまえて、 「今、何を言うべきか?」を判断する ために自分の出力履歴を振り返ります。 “She saw

    a cat at the station and took a photo.” この文を生成していくとき、Decoder のSelf-Attention は以下のように進みます 1 単語目: 「She 」 最初の単語なので、他に見る単語がない「自分自身(‘She’ ) 」だけを見る 2 単語目: 「saw 」 「She 」 「saw 」の2 つを見る、 「saw 」は「誰が見たか(She ) 」に注目 → 「She 」が主語であることを踏まえ、 「saw 」を自然に出せる 3 単語目: 「a 」 「She 」 「saw 」 「a 」を見る、 「a 」は名詞の前に来るべきなので、 「saw 」の後である文法の流れを意識
  20. Decorder でのEncoder-Decoder Attention (クロスアテンション) エンコーダからの入力とデコーダの現在の状態との関連性を評価します。 デコーダは適切な出力を生成するために、どの入力情報に焦点を当てるべきかを判断します。 「入力文のどの単語が一番関係しているのか?」を判断します。 “cat” を出すときは「猫を」に注目 “station”

    を出すときは「駅で」に注目 “she” を出すときは「彼女は」に注目 “took” を出すときは「撮った」や「写真を」に注目 こうして、Decoder は「自分が出すべき単語の根拠を、入力文の中から見つける」ことができるんです。
  21. Decorder でのEncoder-Decoder Attention (クロスアテンション) どこに注意を向けるかを計算する方法はエンコーダセクションのSelf-Attention と、基本的には同じ計算 構造です。ただし、使われる Q, K, V

    の出どころが違うのがポイントです。 Self-Attention (Decoder 内) Encoder-Decoder Attention (Decoder 内) Query (Q) Decoder 内の入力から作られる Decoder 内の入力から作られる Key (K) 同じ Decoder 内の入力から作られる Encoder の出力 から作られる Value (V) 同じ Decoder 内の入力から作られる Encoder の出力 から作られる Self-Attention vs Encoder-Decoder Attention
  22. Decorder でのFFNN Decoder におけるFFNN (Feed-Forward Neural Network )は、基本的にはEncoder のFFNN と同じ構造

    を持っています。 ただし、入力として処理する内容に違いがあります。 Decoder では、FFNN に入る前にまず** 自己注意(Self-Attention )を行い、続いてクロスアテンション (Encoder-Decoder Attention )** を通じてEncoder からの情報を取り込みます。 この2 つの処理を通過した後の出力は、1 つのトークンごとに統合されたベクトル表現となり、それが FFNN に渡されます。 つまり、Decoder のFFNN は「Decoder 自身の過去の出力文脈」と「入力文から得た情報」の両方を含 んだ表現を扱っており、 その後の出力に向けて、より適切なトークン表現へと変換を行います