ChatGPTの仕組みから学ぶG検定対策講座⑤

Attentionの後で何をしているのか?MLP・GELU・残差接続

こんにちは。ゆうせいです。

前回は、Self-Attentionによって文章中のトークン同士の関係を調べ、必要な情報を取り込む仕組みを説明しました。

Transformer Blockの処理は、Self-Attentionだけでは終わりません。

Self-Attentionの後には、MLP(Multi-Layer Perceptron)と呼ばれるニューラルネットワークがあります。

Self-Attentionがトークン同士の情報交換を担当するのに対し、MLPは各トークンが持つ情報を個別に加工します。

今回は、Transformer Explainerの「MLP」を操作しながら、次の内容を確認します。

  1. Self-AttentionとMLPの役割の違い
  2. 768次元を3072次元へ拡張する理由
  3. GELU活性化関数
  4. 3072次元を768次元へ戻す処理
  5. 残差接続
  6. Layer NormalizationとDropout

【G検定対策コラム①:多層パーセプトロン(MLP)と全結合層】

MLP(Multi-Layer Perceptron:多層パーセプトロン)は、複数の層を重ねたニューラルネットワークの基本形で、G検定の頻出用語です。各層は全結合層(Fully Connected Layer/Dense Layer/Affine層)とも呼ばれ、入力すべてに重みを掛けて足し合わせます。Transformer内のMLPは、各トークンを独立して処理する点が特徴で、Feed Forward Network(FFN)とも呼ばれます。単層のパーセプトロンでは線形分離できない問題(XOR問題が有名)を解けませんが、層を重ね非線形の活性化関数を挟むことで複雑な関係を学習できるようになった、という歴史的経緯も押さえておきましょう。

Transformer BlockのMLPを開く

Transformer Explainerを開き、「Transformer Block」の中にある「MLP」をクリックしてください。

GPT-2 smallのTransformer Blockは、主に次の二つの処理で構成されています。

  • Multi-Head Self-Attention
  • MLP

GPT-2 smallでは、このTransformer Blockが12個積み重ねられています。各Blockを通るたびに、トークンの数値表現が少しずつ更新されます。

Self-AttentionとMLPの役割は異なる

Self-AttentionとMLPは、どちらもトークンの数値表現を変換しますが、役割が異なります。

処理主な役割ほかのトークンとの情報交換
Self-Attention文章中の関連する情報を集める行う
MLP集めた情報を各トークンの内部で加工する行わない

Self-Attentionでは、あるトークンがほかのトークンを参照します。

例えば、次の文章を考えてみましょう。

この商品は性能が高い。

「高い」というトークンは、Self-Attentionによって「商品」や「性能」の情報を取り込みます。

その結果、「高い」が、山の高さではなく、性能の程度を表していると判断しやすくなります。

MLPは、Self-Attentionによって集めた情報を使い、それぞれのトークンの特徴をさらに加工します。

MLPは各トークンを個別に処理する

Self-Attentionでは、複数のトークンを同時に見て、それらの関係を計算しました。

一方、MLPは各トークンを一つずつ独立して処理します。

入力文が6個のトークンで構成されている場合、MLPには6個の768次元ベクトルが入力されます。

トークン1:768次元
トークン2:768次元
トークン3:768次元
トークン4:768次元
トークン5:768次元
トークン6:768次元

MLPは、それぞれのトークンに対して同じ変換を適用します。

トークン1:768 → 3072 → 768
トークン2:768 → 3072 → 768
トークン3:768 → 3072 → 768
トークン4:768 → 3072 → 768
トークン5:768 → 3072 → 768
トークン6:768 → 3072 → 768

MLPの中では、あるトークンが別のトークンを直接参照することはありません。

トークン同士の情報交換はSelf-Attentionで行い、MLPでは各トークンの情報を個別に加工するという分担になっています。

MLPは二つの線形変換で構成される

Transformer Explainerで使用されているGPT-2 smallのMLPには、二つの線形変換があります。

  1. 768次元から3072次元へ拡張する
  2. 3072次元から768次元へ戻す

二つの線形変換の間には、GELUという活性化関数が入ります。

768次元
   ↓
第1の線形変換
   ↓
3072次元
   ↓
GELU
   ↓
第2の線形変換
   ↓
768次元

Transformer Explainerでは、最初の線形変換で次元数を4倍に広げ、GELUを通した後、二つ目の線形変換で元の768次元へ戻す流れを確認できます。

線形変換とは何か

線形変換とは、入力された数値に重みを掛け、必要に応じてバイアスを加える処理です。

簡単な式で表すと、次のようになります。

出力 = 入力 × 重み + バイアス

ニューラルネットワークでは、重みとバイアスが学習によって調整されます。

例えば、3個の入力値から4個の出力値を作る場合、次のような変換が行われます。

[入力1, 入力2, 入力3]
          ↓
    重みを掛けて加算
          ↓
[出力1, 出力2, 出力3, 出力4]

GPT-2 smallのMLPでは、768個の入力値を使って、3072個の出力値を作ります。

【G検定対策コラム②:線形変換と非線形性・活性化関数の必要性】

本文の「二つの線形変換をそのまま連続させても、一つの線形変換にまとめられてしまう」という説明は、活性化関数がなぜ必要かを理解する核心です。線形変換(出力=入力×重み+バイアス)だけをいくら重ねても、表現できるのは直線的な関係にとどまります。そこで層の間に非線形の活性化関数を挟むことで、初めて複雑な(非線形な)パターンを学習できます。G検定では「なぜ活性化関数に非線形関数を使うのか」がよく問われます。「線形関数だけでは層を深くする意味がなくなるから」と理由まで言えるようにしておきましょう。

なぜ768次元を3072次元へ拡張するのか

768次元から3072次元へ広げると、モデルが情報を加工するための空間が大きくなります。

3072 = 768 × 4

元の768次元だけで処理するよりも、3072次元の広い空間へ一度展開したほうが、複雑な特徴の組み合わせを表現しやすくなります。

料理に例えると、狭いまな板よりも、広い調理台へ材料を広げたほうが、切る、混ぜる、分類するといった作業を行いやすくなります。

段階料理の例MLPの処理
入力材料を取り出す768次元のベクトル
拡張広い調理台へ材料を並べる3072次元へ変換
加工切る、混ぜる、選別するGELUによる非線形変換
出力料理としてまとめる768次元へ戻す

Transformer Explainerでは、この拡張によって、元の次元では捉えにくい複雑なパターンを表現しやすくなると説明されています。

次元を増やせば情報量も4倍になるのか

3072次元へ変換したからといって、元の情報量が単純に4倍になるわけではありません。

新しい事実や知識が外部から追加されるわけでもありません。

元の768個の数値を、学習済みの重みを使って、別の3072個の数値へ写し替えています。

重要なのは、同じ情報をより多くの観点から表現できるようになることです。

例えば、一つのトークンについて、次のような特徴の組み合わせを捉えやすくなります。

  • 名詞として使われているか
  • 肯定的な文脈か否定的な文脈か
  • 人物、場所、物のどれに関係するか
  • 文の主題にどの程度関係しているか
  • 次のトークン予測にどの特徴が役立つか

ただし、3072個の各要素に、人間が理解できる明確な意味が一つずつ割り当てられているわけではありません。

線形変換だけでは複雑な関係を学びにくい

MLPには二つの線形変換があります。

しかし、二つの線形変換をそのまま連続させても、全体としては一つの線形変換と同じ種類の処理になってしまいます。

例えば、次のような処理を考えます。

入力
 ↓
線形変換A
 ↓
線形変換B
 ↓
出力

この二つは、計算上、一つの大きな線形変換としてまとめることができます。

それでは、ニューラルネットワークを深くする利点が小さくなります。

そこで、二つの線形変換の間に、活性化関数を入れます。

入力
 ↓
線形変換
 ↓
活性化関数
 ↓
線形変換
 ↓
出力

活性化関数によって非線形性が加わり、単純な直線だけでは表現できない複雑な関係を学習できるようになります。

GELUとは何か

GPT-2のMLPでは、GELUという活性化関数が使われます。

GELUは、Gaussian Error Linear Unitの略です。

活性化関数は、入力された数値をそのまま通すのではなく、値に応じて出力を変化させます。

簡単にいえば、次の処理を担当します。

どの情報を強く残し、どの情報を弱めるかを調整する

GELUは、入力値を滑らかに変換する活性化関数です。

Transformer Explainerでは、二つの線形変換の間にGELUを配置し、MLPへ非線形な変換を加えています。

ReLUとGELUの違い

GELUを理解するために、代表的な活性化関数であるReLUと比べてみましょう。

ReLUは、入力が0以下の場合は0を出力し、0より大きい場合は入力値をそのまま出力します。

入力が0以下の場合:0

入力が0より大きい場合:入力値をそのまま出力
入力ReLUの出力
-30
-10
00
11
33

ReLUでは、負の値をすべて0にします。

そのため、0の位置でグラフが折れ曲がります。

一方のGELUは、0を境に機械的に切り捨てるのではなく、入力値に応じて滑らかに変化します。

ReLUGELU
負の値を原則として0にする負の値も一部残す
0の位置で折れ曲がる滑らかに変化する
単純で計算しやすい入力を段階的に調整する

GELUは情報を滑らかに選別する

GELUのイメージは、完全なオンとオフを切り替えるスイッチというよりも、音量を滑らかに調整するつまみに近いものです。

ReLUを単純化すると、次のような判断です。

正なら通す。負なら止める。

GELUは、次のような判断に近くなります。

重要そうなら大きく通し、重要性が低そうなら弱めて通す。

実際には、GELUが人間のように情報の重要性を理解しているわけではありません。

学習された数値と活性化関数の働きによって、結果的に必要な特徴を残し、不要な特徴を弱められるようになります。

【G検定対策コラム③:活性化関数(ReLU・GELU・その他)】

活性化関数はG検定の重要テーマです。ReLU(Rectified Linear Unit)は入力が0以下なら0、正ならそのまま出力する関数で、計算が単純かつ勾配消失を起こしにくいため広く使われます。GELU(Gaussian Error Linear Unit)はReLUを滑らかにしたような関数で、負の値も一部残しながら滑らかに変換し、BERTやGPTで採用されています。他にも、初期に使われたシグモイド関数やtanh(勾配消失を起こしやすい)、ReLUの負側を改良したLeaky ReLUなども頻出です。それぞれ「グラフの形」と「勾配消失への強さ」をセットで整理しておくと万全です。

3072次元から768次元へ戻す

GELUで変換した後は、二つ目の線形変換を行います。

3072次元 → 768次元

Transformer Blockの入出力は768次元で統一されているため、MLPの出力も768次元へ戻します。

これにより、次のTransformer Blockへ同じ形式でデータを渡せます。

Transformer Block 1:768次元を入力し、768次元を出力
Transformer Block 2:768次元を入力し、768次元を出力
Transformer Block 3:768次元を入力し、768次元を出力
……
Transformer Block 12:768次元を入力し、768次元を出力

途中で3072次元へ広げるのは、内部で複雑な変換を行うためです。Blockの外へ出すときには、元の768次元へ戻します。

768次元へ戻すのは情報圧縮なのか

3072次元から768次元へ戻すため、オートエンコーダーのような情報圧縮を連想するかもしれません。

しかし、MLPの主な目的は、データを小さく保存することではありません。

3072次元の空間で非線形な変換を行い、その結果を次のTransformer Blockで扱える768次元へ射影することが目的です。

処理主な目的
オートエンコーダーの圧縮少ない次元へ本質的な特徴をまとめる
TransformerのMLP高次元で特徴を加工し、元の形式へ戻す

残差接続とは何か

Transformer Blockの図を見ると、Self-AttentionやMLPを迂回するような線があります。

これは、Residual Connectionです。

日本語では、残差接続またはスキップ接続と呼ばれます。

残差接続では、変換前の入力を、変換後の出力へ足します。

最終的な出力
= 元の入力
+ 層で変換した結果

例えば、MLPの入力をx、MLPによる変換をF(x)とすると、出力は次のように表せます。

x + F(x)

入力された情報をすべて作り直すのではなく、元の情報へ必要な変化だけを加える仕組みです。

残差接続を文章の修正に例える

残差接続は、文章を一から書き直すのではなく、元の文章に修正点を加える作業に例えられます。

元の文章が次の内容だったとします。

Transformerは文章を処理します。

これに補足情報を加えます。

トークン同士の関係をAttentionで計算する。

元の文章を捨てずに補足を加えると、次のようになります。

Transformerは、トークン同士の関係をAttentionで計算しながら文章を処理します。

残差接続も、元の情報を残しながら、各層で学習した変化を加えます。

残差接続が必要な理由

ニューラルネットワークを深くすると、多くの層を通じて複雑な特徴を学習できます。

一方で、層が深くなるほど、学習時の勾配が前の層まで伝わりにくくなることがあります。

これが、勾配消失問題です。

残差接続は、層を迂回する経路を用意します。

通常の経路

入力 → 複雑な変換 → 出力


残差接続を含む経路

入力 ─────────────┐
  ↓                │
複雑な変換          │
  ↓                │
変換結果 + 元の入力 ←┘

この近道を通じて、情報や勾配が前の層まで伝わりやすくなります。

Transformer Explainerでは、残差接続が深いモデルの学習を助け、勾配消失を軽減する仕組みとして説明されています。GPT-2では、各Transformer Block内のAttentionとMLPの周辺で残差接続が使われています。

残差接続は処理を省略する仕組みではない

スキップ接続という名前から、Self-AttentionやMLPの処理を実行せずに飛ばす機能だと誤解することがあります。

しかし、通常はSelf-AttentionやMLPの処理も実行されます。

その出力へ、処理前の入力を加えます。

誤解実際の処理
MLPを実行せずに飛ばすMLPを実行し、元の入力も加える
元の情報だけを使う元の情報と変換後の情報を組み合わせる
計算量をなくす深いモデルを学習しやすくする

【G検定対策コラム④:残差接続(Residual Connection)と勾配消失問題】

残差接続(Residual Connection/Skip Connection:スキップ接続)は、層の入力xを出力F(x)に足してx+F(x)とする仕組みで、G検定の重要用語です。目的は勾配消失問題の緩和です。層を深くすると、誤差逆伝播の際に勾配が前の層まで伝わりにくくなり学習が進まなくなりますが、残差接続が勾配の「近道」を作ることで深いネットワークでも学習できます。この技術は画像認識のResNet(2015年、ILSVRCで優勝)で有名になり、152層という当時としては非常に深いネットワークを実現しました。Transformerもこの考え方を受け継いでいます。

Layer Normalizationとは何か

Transformer Blockでは、Layer Normalizationも使われます。

日本語では、層正規化と呼ばれます。

ニューラルネットワークの各層を通る数値は、極端に大きくなったり、ばらつきが大きくなったりすることがあります。

Layer Normalizationは、各トークンの特徴量について、平均や分散を基準に値を整えます。

イメージとしては、単位や尺度が異なる複数の数値を、比較しやすい状態へそろえる処理です。

正規化前のイメージ正規化後のイメージ
値の大きさやばらつきが不安定一定の範囲で扱いやすくなる
層ごとに分布が変わりやすい学習が安定しやすくなる

Transformer Explainerでは、GPT-2の各Transformer BlockでLayer NormalizationがSelf-AttentionとMLPの前に使われる構成が示されています。

Layer Normalizationはデータの意味を消さないのか

数値をそろえると、トークンが持っていた情報まで失われるように感じるかもしれません。

Layer Normalizationには、正規化した後の値を調整するための学習可能なパラメータがあります。

単純にすべての値を同じにするのではありません。

値の分布を整えたうえで、モデルが必要な大きさや位置関係を学習できるようにします。

【G検定対策コラム⑤:正規化(Batch Normalization・Layer Normalization)】

Layer Normalization(層正規化)は、各層を通る数値の分布(平均・分散)を整えて学習を安定させる手法で、G検定頻出です。よく対比されるBatch Normalization(バッチ正規化)は「複数データ(バッチ)をまたいで」正規化するのに対し、Layer Normalizationは「1データ内の特徴量をまたいで」正規化します。Transformerでは系列長が可変でバッチ内のばらつきが大きいため、バッチに依存しないLayer Normalizationが好まれます。本文にあるとおり、正規化後にも学習可能なパラメータで調整するため、情報が失われるわけではない点も押さえましょう。

Dropoutとは何か

Transformer Blockでは、Dropoutも使われます。

Dropoutは、学習中に一部の出力をランダムに無効化する正則化手法です。

通常の出力

[0.4, 0.8, -0.2, 0.5, 0.7]


Dropoutのイメージ

[0.4, 0, -0.2, 0, 0.7]

毎回同じ場所が無効になるわけではありません。

学習のたびに異なる場所がランダムに選ばれます。

特定のニューロンだけに頼ることを防ぎ、未知のデータにも対応しやすいモデルを作ることが目的です。

Transformer Explainerでは、Dropoutは過学習を抑えるための補助的な仕組みとして説明されています。推論時にはDropoutを無効にします。

【G検定対策コラム⑥:Dropoutと過学習・正則化】

Dropout(ドロップアウト)は、学習中に一部のニューロンをランダムに無効化する正則化手法で、G検定の最重要用語の一つです。目的は過学習(Overfitting:訓練データに適合しすぎて未知データで性能が落ちる現象)を防ぐことです。本文の「特定の社員一人に業務を任せない」という例えのとおり、特定のニューロンへの依存を防ぎ、汎化性能を高めます。重要なのは、Dropoutを使うのは学習(訓練)時のみで、推論(予測)時には無効にする点。他の過学習対策として、L1/L2正則化、早期終了(Early Stopping)、データ拡張(Data Augmentation)も関連キーワードとして押さえておきましょう。

研修チームに例えると

Dropoutは、ある業務を特定の社員一人だけに任せないことに例えられます。

いつも同じ社員だけが重要な作業を担当していると、その社員が不在になったときに業務が止まります。

学習中に担当者をランダムに休ませることで、ほかの社員も同じ作業を担当できるようにします。

ニューラルネットワーク研修チームの例
特定のニューロンへ依存する特定の社員に業務が集中する
Dropoutで一部を無効にする担当者をランダムに休ませる
複数のニューロンが特徴を学ぶ複数の社員が業務を習得する
未知のデータへ対応しやすくなる担当者が変わっても業務を継続できる

Transformer Block全体の流れ

ここまでに説明した処理をまとめると、Transformer Blockでは、おおよそ次の流れでトークンを処理します。

入力
 ↓
Layer Normalization
 ↓
Multi-Head Self-Attention
 ↓
残差接続で元の入力を加える
 ↓
Layer Normalization
 ↓
MLP
  ├ 768次元から3072次元へ拡張
  ├ GELUで非線形変換
  └ 3072次元から768次元へ戻す
 ↓
残差接続でMLP前の入力を加える
 ↓
次のTransformer Blockへ

Self-Attentionでは、トークン間で情報を交換します。

MLPでは、各トークンが取り込んだ情報を個別に加工します。

Layer Normalizationで数値を扱いやすく整え、残差接続で元の情報と勾配の通り道を確保します。

学習時にはDropoutも使い、特定の経路への依存を抑えます。

12個のTransformer Blockで表現を深める

GPT-2 smallでは、同じ基本構造を持つTransformer Blockが12個積み重なっています。

ただし、それぞれのBlockで使用される重みは異なります。

そのため、すべてのBlockがまったく同じ処理結果を出すわけではありません。

下位のBlockでは、比較的基本的な関係が処理され、Blockを重ねるにつれて、より文脈を反映した表現へ変化していきます。

最初の埋め込み
「高い」というトークンの基本的な表現
        ↓
前半のTransformer Block
周囲の語や文法的な関係を反映
        ↓
後半のTransformer Block
文章全体の文脈や次トークン予測に必要な特徴を反映
        ↓
最終的な表現

複数のTransformer Blockを通じて、各トークンの表現が段階的に更新されます。

【G検定対策コラム⑦:層の深さと表現の階層性】

GPT-2 smallでは12個のTransformer Blockが積み重なり、本文のとおり下位の層では基本的な関係、上位の層ほど文脈を反映した抽象的な表現を獲得していきます。この「層が深くなるほど抽象度の高い特徴を捉える」性質は、Transformerに限らずディープラーニング全般に共通する重要な考え方で、G検定でも問われます。画像認識のCNNでも、浅い層はエッジや色などの単純な特徴、深い層は物体の部位や全体といった複雑な特徴を捉えることが知られています。「層を深くする(ディープにする)ことで階層的な特徴表現を自動獲得できる」点が、ディープラーニングが従来の機械学習より高性能を発揮する理由の核心です。

Transformer Explainerで確認するポイント

Transformer ExplainerのMLPとTransformer Blockを操作し、次の点を確認してください。

  1. Self-Attentionの出力がMLPへ渡される
  2. MLPはトークンを一つずつ独立して処理する
  3. 最初の線形変換で768次元から3072次元へ広がる
  4. 二つの線形変換の間にGELUがある
  5. 二つ目の線形変換で3072次元から768次元へ戻る
  6. Self-AttentionとMLPの周囲に残差接続がある
  7. Self-AttentionとMLPの前にLayer Normalizationがある
  8. GPT-2 smallでは同様のTransformer Blockが12個積み重なっている

今回のまとめ

  • Transformer Blockは、Self-AttentionとMLPを中心に構成される
  • Self-Attentionはトークン同士で情報を交換する
  • MLPは各トークンを独立して加工する
  • GPT-2 smallのMLPでは、768次元を3072次元へ拡張する
  • 高次元へ広げることで、複雑な特徴を表現しやすくなる
  • 二つの線形変換の間にはGELU活性化関数がある
  • GELUによって非線形な関係を学習できる
  • 処理後は3072次元から768次元へ戻す
  • 残差接続は、元の入力へ変換結果を加える仕組みである
  • 残差接続によって、深いモデルでも情報や勾配を伝えやすくなる
  • Layer Normalizationは数値の分布を整え、学習を安定させる
  • Dropoutは特定のニューロンへの依存を抑え、過学習を防ぐ

次回は、12個のTransformer Blockを通過した結果から、どのように次のトークンを選ぶのかを解説します。

Transformer Explainerを操作しながら、Logit、Softmax、Temperature、Top-k、Top-pの役割を確認します。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。