2018年から2019年にかけて、自然言語処理(NLP)は大きな転換期を迎えました。GoogleのBERTとOpenAIのGPTという2つのモデルが登場し、事前学習+ファインチューニングのパラダイムを確立したのです。どちらもTransformerをベースにしていますが、アーキテクチャと学習方法が根本的に異なります。
「メールが迷惑メールかどうかを自動判定したい」場合と、「ユーザーの質問に自然な日本語で回答したい」場合とでは、必要な能力がまったく違います。前者は文を理解する力、後者は文を生成する力です。BERTとGPTは、まさにこの2つの能力をそれぞれ突き詰めたモデルです。
BERTは「文の理解」に優れ、GPTは「文の生成」に優れます。この違いは、エンコーダ型とデコーダ型というTransformerの2つの使い方に起因しています。
たとえるなら、BERTは「穴埋め問題が得意な読解力の達人」、GPTは「続きを書くのが得意な作文の達人」です。穴埋め問題を解くには、空欄の前後をすべて見渡す必要があります。一方、作文では書いた内容の続きを次々に生み出していく能力が求められます。どちらも言語を深く理解していますが、その能力の発揮の仕方が異なるのです。
BERTとGPTの違いを理解すると、以下の判断ができるようになります。
- タスクに適したモデルの選択: 分類・抽出にはBERT系、生成にはGPT系
- 事前学習タスクの設計: マスク言語モデル vs 自己回帰言語モデル
- 最新モデルの理解: T5, LLaMA, Claude, ChatGPTの設計思想
- ファインチューニング戦略: タスクに応じた最適な活用法
これらの知識は、実務でNLPシステムを設計するときだけでなく、最新の大規模言語モデル(LLM)の論文を読むうえでも欠かせない基礎となります。
本記事の内容
- Transformerのエンコーダとデコーダの構造
- BERTの事前学習とファインチューニング
- GPTの事前学習とIn-context Learning
- 両者の比較と適用場面
- Encoder-Decoder モデル(T5)
- Pythonでの概念的な実装
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- Self-Attentionの理論と実装 — Attention機構の基本
- 位置エンコーディングの理論 — 位置情報の表現
- 転移学習の理論と実践 — 事前学習の考え方
Transformerの3つの使い方
Transformerという1つのアーキテクチャには、実は3つの使い方があります。これは日常で例えるなら、同じ「エンジン」でもセダン・トラック・SUVと異なる車体に搭載するようなものです。エンジン(Self-Attention)は共通ですが、その活用方法によって得意なタスクがまったく変わります。
エンコーダ型(BERT)
エンコーダは入力系列全体を双方向に処理します。各トークンは過去と未来の両方のトークンを参照できます。
イメージとしては、試験で問題文を読むときの目の動きに似ています。私たちは文を読むとき、前に戻ったり先を見たりしながら全体の意味を把握します。エンコーダも同じで、すべてのトークンが互いを参照し合い、文全体の文脈を捉えます。
Self-Attentionの計算式を確認しましょう。
$$ \text{Self-Attention}(\bm{Q}, \bm{K}, \bm{V}) = \text{softmax}\left(\frac{\bm{Q}\bm{K}^\top}{\sqrt{d_k}}\right)\bm{V} $$
ここでのポイントは、Attention重みの計算にマスクが一切かかっていないことです。つまり、Query行列 $\bm{Q}$ の各行(各トークン)は、Key行列 $\bm{K}$ の全行(全トークン)との内積を計算します。その結果、各トークンが文全体の文脈を考慮した表現を得ます。
たとえば「彼は銀行の前で釣りをした」という文で「銀行」が「金融機関」か「川岸」かを判断するには、後ろの「釣り」という単語を見る必要があります。エンコーダ型は後方の情報にもアクセスできるため、このような曖昧性を正しく解消できるのです。
適しているタスク: テキスト分類、固有表現認識、質問応答、文の類似度計算
デコーダ型(GPT)
デコーダは入力系列を左から右(自己回帰的)に処理します。各トークンは過去のトークンのみを参照でき、未来のトークンはCausal Maskで遮断されます。
これは、小説を一文字ずつ書いていく作家の思考過程に似ています。作家は「これまで書いた内容」だけを頼りに、次の一文字を選びます。まだ書いていない未来の文は参照できません。
Causal Attentionの計算式は次のようになります。
$$ \text{CausalAttention}(\bm{Q}, \bm{K}, \bm{V}) = \text{softmax}\left(\frac{\bm{Q}\bm{K}^\top}{\sqrt{d_k}} + \text{Mask}\right)\bm{V} $$
ここで $\text{Mask}$ は上三角部分が $-\infty$(実装上は非常に大きな負の値)の行列です。Softmaxを通すと $-\infty$ の部分は $0$ になるため、各トークンは自分より後ろのトークンを参照できなくなります。この制約は一見不便に見えますが、テキスト生成にとっては本質的に必要です。もし未来のトークンが見えてしまうと、「答えをカンニングしている」ことになり、正しい言語モデルとして機能しなくなります。
適しているタスク: テキスト生成、対話、コード生成、翻訳(デコーダ部分)
エンコーダ・デコーダ型(T5, 原論文のTransformer)
原論文のTransformer(Vaswani et al., 2017)は、エンコーダとデコーダの両方を使用します。エンコーダが入力を理解し、デコーダが出力を生成します。デコーダではエンコーダの出力に対するCross-Attentionも行います。
この構造は、通訳者の仕事に例えるとわかりやすいでしょう。通訳者はまず話者の発言全体を聞いて理解し(エンコーダ)、その後に別の言語で発話します(デコーダ)。理解と生成が分業されているため、入力と出力の形式が大きく異なるタスクに適しています。
Cross-Attentionでは、デコーダの各トークンがエンコーダの全出力を参照できます。これにより、生成の各ステップで入力情報を適切に取り出すことができるのです。
適しているタスク: 機械翻訳、要約、テキスト変換(入力と出力が異なる形式)
以上3つの型のうち、BERTとGPTはそれぞれエンコーダ型とデコーダ型の代表格です。ここからは、それぞれのモデルの詳細なアーキテクチャと学習方法を掘り下げていきましょう。
BERT — 双方向エンコーダ
アーキテクチャ
BERTはTransformerのエンコーダのみを使用します。名前の由来は Bidirectional Encoder Representations from Transformers(Transformerによる双方向エンコーダ表現)で、その名の通り双方向性がBERTの最大の特徴です。
- BERT-Base: 12層、768次元、12ヘッド、110Mパラメータ
- BERT-Large: 24層、1024次元、16ヘッド、340Mパラメータ
入力は [CLS] token1 token2 ... [SEP] の形式で、[CLS]トークンの出力が文全体の表現として使われます。[CLS]は Classification の略で、BERTのエンコーダを通過した後の [CLS] 位置の隠れ状態ベクトルは、入力文全体の情報を集約した「文ベクトル」として機能します。一方、[SEP]は Separator の略で、2つの文を区切る役割を果たします。
また、BERTの入力には3種類の埋め込みが加算されます。
- トークン埋め込み: 各サブワードに対応するベクトル
- 位置埋め込み: トークンの位置情報(最大512トークン)
- セグメント埋め込み: 文Aか文Bかを区別するためのベクトル
これら3つの埋め込みを足し合わせたものが、Transformerエンコーダへの入力になります。
事前学習タスク
BERTは2つの自己教師あり学習タスクで事前学習されます。ここで重要なのは、事前学習にはラベル付きデータが不要という点です。大量のテキスト(Wikipedia + BookCorpusなど)から、テキスト自体を使って自動的に学習信号を生成します。
Masked Language Model (MLM): 入力トークンの15%をランダムにマスクし、マスクされたトークンを予測します。
$$ P(x_i | \bm{x}_{\setminus i}) = \text{softmax}(\bm{W} \cdot \bm{h}_i + \bm{b}) $$
ここで $\bm{x}_{\setminus i}$ はマスクされたトークン以外の全入力トークン、$\bm{h}_i$ はマスク位置のエンコーダ出力、$\bm{W}$ は語彙サイズ分の出力射影行列です。この式は「周囲の文脈からマスク位置の単語を復元する確率分布」を表しています。
具体例を見てみましょう。「吾輩は [MASK] である」という入力に対して、BERTは周囲の文脈から [MASK] の位置に入る単語を予測します。正解は「猫」ですが、この予測を正しく行うには、文全体を双方向に読む必要があります。「吾輩」という古風な一人称と「である」という文末表現の両方を参照することで、文脈を正確に捉えるのです。
マスクの15%のうち、80%は [MASK] トークンに置換、10%はランダムなトークンに置換、10%はそのまま保持されます。なぜこのような複雑なマスク戦略を取るのでしょうか。もし100%を [MASK] に置換してしまうと、ファインチューニング時には [MASK] トークンが存在しないため、事前学習時と入力分布のギャップが生じます。ランダム置換や元のまま保持を混ぜることで、モデルは「どの位置でも正しい表現を維持する」よう訓練され、より汎用的な表現が学習されます。
Next Sentence Prediction (NSP): 2つの文が連続しているかどうかを予測します。[CLS]トークンの出力を2クラス分類に使用します。学習データの50%は実際に連続する文ペア(正例)、50%はランダムに組み合わせた文ペア(負例)で構成されます。ただし、後続の研究(RoBERTa等)でNSPは不要と判明し、現在ではあまり使われていません。RoBERTaでは、NSPを除去し、より大きなバッチサイズとデータ量で訓練するだけで性能が向上することが示されました。
ファインチューニング
BERTの強みは、事前学習済みモデルを各種タスクに容易にファインチューニングできることです。事前学習で獲得した言語知識を「土台」として、少量のラベル付きデータで目的のタスクに特化させます。
テキスト分類: [CLS]トークンの出力に分類ヘッドを追加します。たとえばスパム検出なら、[CLS] の出力ベクトル $\bm{h}_{\text{CLS}} \in \mathbb{R}^{768}$ に線形層を接続し、2クラス分類を行います。
$$ P(\text{spam} | \text{email}) = \text{softmax}(\bm{W}_c \cdot \bm{h}_{\text{CLS}} + \bm{b}_c) $$
固有表現認識(NER): 各トークンの出力にタグ予測ヘッドを追加します。各トークンの隠れ状態 $\bm{h}_i$ に対して「人名」「地名」「組織名」などのラベルを予測します。BERTの双方向文脈のおかげで、「Apple」が企業名なのか果物なのかを前後の文脈から正確に判定できます。
質問応答: 各トークンの出力から回答のスタート位置とエンド位置を予測します。たとえば「東京タワーの高さは?」という質問と「東京タワーは1958年に完成した333メートルの電波塔です」というパッセージが入力されたとき、「333メートル」の開始位置と終了位置を予測します。
BERTの制限
BERTは双方向文脈を活用できますが、テキスト生成が苦手です。マスク位置の予測は得意でも、文を左から右に逐次的に生成する能力は直接的には持ちません。これはBERTの学習方法に起因しています。MLMでは入力のランダムな位置を予測するだけで、「前のトークンから次のトークンを生成する」という逐次的なプロセスを学習していないのです。
BERTの双方向理解力がテキスト分類で威力を発揮する一方、テキスト生成にはGPTの自己回帰アプローチが適しています。次に、そのGPTの仕組みを見ていきましょう。
GPT — 自己回帰デコーダ
アーキテクチャ
GPTはTransformerのデコーダ部分のみを使用します(Cross-Attentionは除く)。名前は Generative Pre-trained Transformer(生成的事前学習Transformer)の略で、その名の通り「生成」が主目的のモデルです。
- GPT-1: 12層、768次元、12ヘッド、117Mパラメータ
- GPT-2: 48層、1600次元、25ヘッド、1.5Bパラメータ
- GPT-3: 96層、12288次元、96ヘッド、175Bパラメータ
GPT-1からGPT-3にかけて、パラメータ数が約1,500倍に増加していることに注目してください。この急速なスケールアップが、後述するIn-context Learningという新しい能力の獲得につながりました。
Causal Mask(因果マスク)により、各トークンは過去のトークンのみを参照します。エンコーダ・デコーダ型の元祖Transformerではデコーダにエンコーダ出力を参照するCross-Attentionがありましたが、GPTにはこれがありません。GPTは入力も出力もすべて1つのトークン列として扱い、自己回帰的に処理するシンプルな設計です。
事前学習タスク
GPTの事前学習タスクは自己回帰言語モデリングです。前のトークン列が与えられたとき、次のトークンを予測します。これはBERTのMLM(穴埋め)とは対照的で、GPTは常に「左から右へ」順番に予測を行います。
$$ P(x_t | x_1, x_2, \ldots, x_{t-1}) = \text{softmax}(\bm{W} \cdot \bm{h}_t + \bm{b}) $$
ここで $\bm{h}_t$ は位置 $t$ におけるデコーダの最終層出力、$\bm{W}$ は語彙サイズ $V$ への射影行列です。この式は「これまでのトークン列 $x_1, \ldots, x_{t-1}$ が与えられたとき、次にどのトークンが来るか」の確率分布を表しています。
損失関数は次トークン予測の交差エントロピーの和です。
$$ \mathcal{L} = -\sum_{t=1}^{T} \log P(x_t | x_1, \ldots, x_{t-1}) $$
この損失を最小化するということは、モデルがテキストの真の確率分布を正確に再現できるよう訓練することを意味します。大量のテキストでこの訓練を行うと、モデルは文法、事実知識、推論能力など、言語の多面的な構造を自然と獲得していきます。
BERTのMLMでは各マスク位置を独立に予測しますが、GPTの自己回帰モデリングでは全ての位置が連鎖的に依存しています。この違いが「理解vs生成」の性質の差を生む根本的な要因です。
スケーリングとIn-context Learning
GPT-3(Brown et al., 2020)は、モデルサイズとデータ量のスケーリングにより、ファインチューニングなしでタスクを解く能力(In-context Learning)を獲得しました。これはNLPの歴史における大きなパラダイムシフトです。
Zero-shot: タスクの説明のみを与えます。たとえば「以下の文を日本語に翻訳してください: Hello」とプロンプトに書くだけで翻訳を行います。
Few-shot: 数個の入力-出力例を与えます。「happy → 嬉しい, sad → 悲しい, angry →」のように例を示すと、パターンを推測して「怒っている」と回答します。
Chain-of-thought: 推論過程を含む例を与えます。「太郎は3個のリンゴを持っています。2個食べました。残りは3-2=1個です」のように、途中の推論ステップを明示すると、モデルも同様に段階的な推論を行うようになります。
これはBERTのファインチューニングアプローチとは根本的に異なり、モデルの重みを変更せずにプロンプトの工夫だけでタスクを解きます。なぜ大規模なモデルでこのような能力が現れるのか、理論的には完全に解明されていませんが、膨大なテキストを学習する過程で「文脈に応じて適切な処理を切り替える」メタ的な能力が身についたと考えられています。
BERTとGPTの設計思想と学習方法の違いを個別に見てきました。次のセクションでは、両者を直接比較し、どのような場面でどちらを選ぶべきかを整理します。
BERTとGPTの比較
ここまでBERTとGPTを個別に見てきましたが、改めて両者を並べて比較してみましょう。同じTransformerをベースにしながら、設計思想がいかに異なるかが浮き彫りになります。
アーキテクチャの比較
| 特性 | BERT | GPT |
|---|---|---|
| Transformerの使い方 | エンコーダのみ | デコーダのみ |
| Attention | 双方向(Full) | 単方向(Causal) |
| 事前学習 | MLM(マスク予測) | 自己回帰(次トークン予測) |
| 下流タスクへの適用 | ファインチューニング | ファインチューニング or プロンプト |
| 得意なタスク | 分類、抽出、理解 | 生成、対話、推論 |
| 文脈の利用 | 双方向(前後の文脈) | 左から右(過去の文脈のみ) |
この表から読み取れる最も本質的な違いは、情報の流れの方向性です。BERTは全方向から情報を集めるため「理解」に長け、GPTは一方向にのみ情報を流すため「生成」に適しています。
どちらを選ぶべきか
実務で「どちらのモデルを選ぶべきか」は、タスクの性質によって判断できます。大まかな指針として、入力を分析するタスクにはBERT系、出力を生成するタスクにはGPT系が適しています。
| タスク | 推奨モデル | 理由 |
|---|---|---|
| 感情分析 | BERT系 | 文全体の双方向理解が有効 |
| 固有表現認識 | BERT系 | 前後の文脈が必要 |
| テキスト生成 | GPT系 | 自己回帰生成が自然 |
| 対話システム | GPT系 | 応答の生成が主タスク |
| 質問応答(抽出型) | BERT系 | 文書中の答えの位置を特定 |
| 質問応答(生成型) | GPT系 | 自然な回答を生成 |
| 要約 | T5(Enc-Dec) | 入力の理解と出力の生成の両方が必要 |
ただし、GPT-3以降の大規模モデルはIn-context Learningにより、分類タスクでも高い性能を示すようになっています。モデルが十分に大きければ、タスクの種類に関わらずGPT系がBERT系を凌駕するケースも増えてきました。現在の実用的な選択基準としては、「小〜中規模モデルで効率よく特定タスクを解きたい」ならBERT系のファインチューニング、「大規模モデルで多様なタスクを柔軟に解きたい」ならGPT系のプロンプティングという棲み分けが主流です。
BERTとGPTの両方の長所を取り入れようとしたのが、次に紹介するT5です。
Encoder-Decoderモデル — T5
Text-to-Text Transfer Transformer
T5(Raffel et al., 2019)は全てのNLPタスクを「テキストからテキストへの変換」として統一的に扱うモデルです。Transformerのエンコーダ・デコーダの両方を使用します。
この「全タスクをテキスト変換に統一する」というアイデアは非常に強力です。BERTでは分類・NER・質問応答ごとに異なるヘッド(出力層)を設計する必要がありましたが、T5では全てが「テキスト入力 → テキスト出力」の同一フレームワークで処理されます。
たとえば感情分析なら「sentiment: I love this movie」→「positive」、翻訳なら「translate English to Japanese: Hello」→「こんにちは」のように、入力にタスクのプレフィックスを付けてテキストで入出力します。要約であれば「summarize: {長い文書}」→「{要約文}」となります。
T5の事前学習にはSpan Corruption(スパン破壊)というタスクが使われます。これはBERTのMLMを拡張したもので、1トークンではなく連続するトークンのスパン(範囲)をまとめてマスクし、デコーダで復元します。この方法により、複数トークンにわたる依存関係を学習でき、より高い生成能力を獲得できます。
T5はBERTの理解力とGPTの生成力の両方を兼ね備えており、翻訳、要約、質問応答など幅広いタスクで高い性能を示しました。特に、入力と出力の長さや形式が大きく異なるタスク(長文要約や機械翻訳など)では、エンコーダ・デコーダ型の構造が有利に働きます。
ここまで3つのアーキテクチャの違いを理論的に見てきました。次に、Pythonコードで実際にBERTとGPTのAttentionパターンの違いを可視化し、直感的に確認してみましょう。
Pythonでの概念的な実装
以下のコードでは、BERTとGPTのAttentionパターンの違いをNumPyで再現し、ヒートマップで可視化します。ランダムなQuery/Key行列を使ってAttention重みを計算し、マスクの有無による違いを視覚的に確認するのが目的です。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
def softmax(x, axis=-1):
e = np.exp(x - np.max(x, axis=axis, keepdims=True))
return e / np.sum(e, axis=axis, keepdims=True)
# --- BERT vs GPT のAttentionパターンの比較 ---
seq_len = 8
d_k = 16
tokens = ["[CLS]", "The", "cat", "is", "on", "the", "mat", "[SEP]"]
Q = np.random.randn(seq_len, d_k)
K = np.random.randn(seq_len, d_k)
scores = Q @ K.T / np.sqrt(d_k)
# BERT: Full Attention(マスクなし)
attn_bert = softmax(scores, axis=-1)
# GPT: Causal Attention(上三角マスク)
causal_mask = np.triu(np.ones((seq_len, seq_len)) * (-1e9), k=1)
attn_gpt = softmax(scores + causal_mask, axis=-1)
fig, axes = plt.subplots(1, 2, figsize=(14, 5.5))
# BERT
ax = axes[0]
im = ax.imshow(attn_bert, cmap="YlOrRd", vmin=0, vmax=0.4)
ax.set_xticks(range(seq_len))
ax.set_xticklabels(tokens, fontsize=9, rotation=45)
ax.set_yticks(range(seq_len))
ax.set_yticklabels(tokens, fontsize=9)
ax.set_title("BERT: Bidirectional Attention", fontsize=13)
ax.set_xlabel("Key", fontsize=11)
ax.set_ylabel("Query", fontsize=11)
plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04)
# GPT
ax = axes[1]
im = ax.imshow(attn_gpt, cmap="YlOrRd", vmin=0, vmax=0.7)
ax.set_xticks(range(seq_len))
ax.set_xticklabels(tokens, fontsize=9, rotation=45)
ax.set_yticks(range(seq_len))
ax.set_yticklabels(tokens, fontsize=9)
ax.set_title("GPT: Causal (Autoregressive) Attention", fontsize=13)
ax.set_xlabel("Key", fontsize=11)
ax.set_ylabel("Query", fontsize=11)
plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04)
plt.tight_layout()
plt.savefig("bert_vs_gpt.png", dpi=150, bbox_inches="tight")
plt.show()
この可視化から、BERTとGPTのAttentionパターンの根本的な違いが確認できます。
-
BERT(左図): 全てのトークンペアに対してAttention重みが計算されています(行列全体が非ゼロ)。各トークンは前後の全トークンを参照でき、双方向の文脈を活用しています。「cat」が「mat」を、「mat」が「cat」を参照できます
-
GPT(右図): 下三角部分のみに重みがあり、上三角は完全にゼロです。各トークンは自分自身と過去のトークンのみを参照できます。「mat」は前の全トークンを見られますが、「The」は「[CLS]」と自分自身しか見られません。この制約により、GPTはテキスト生成時に「未来の答えをカンニングする」ことがなく、正当な言語モデルとして機能します
また、GPTのヒートマップを注意深く見ると、列方向(Query側)で位置が後ろのトークンほど参照できるトークン数が増えるため、Attention重みがより分散する傾向にあることがわかります。最初のトークンは自分自身しか参照できないため重みが1.0に集中し、最後のトークンは全トークンに重みを分配します。この非対称性が、GPTにおける「文脈の蓄積」を表しています。
現在のトレンドと今後の展望
BERTとGPTが登場してから数年が経ち、NLPの景観は大きく変わりました。ここでは、両者の流れを汲む主要な発展を整理します。
BERT系の発展: RoBERTa(よりロバストな事前学習)、ALBERT(パラメータ効率の改善)、DeBERTa(Disentangled Attention)など、BERTの基本設計を改良したモデルが多数登場しました。特にDeBERTaは、SuperGLUEベンチマークで初めて人間のスコアを超えたエンコーダ型モデルとして知られています。
GPT系の発展: GPT-4、LLaMA、Claudeなど、大規模デコーダ型モデルの進化が著しいです。Instruction Tuning(指示に従うよう訓練)やRLHF(人間のフィードバックによる強化学習)といった追加の訓練手法により、In-context Learningの能力がさらに向上しています。
融合の流れ: 最近では、エンコーダ型とデコーダ型の厳密な区分が曖昧になりつつあります。たとえば、Prefix LM(prefix部分は双方向Attention、残りはCausal Attention)や、Mixture of Experts(MoE)を組み合わせた新しいアーキテクチャも研究されています。
まとめ
本記事では、BERTとGPTのアーキテクチャの違いを比較しました。
- BERTはTransformerのエンコーダを使い、双方向Attentionで文全体を理解する。MLM事前学習+ファインチューニングで分類・抽出タスクに強い
- GPTはTransformerのデコーダを使い、Causal Attentionで左から右に生成する。自己回帰事前学習で生成・対話タスクに強い
- T5はエンコーダ・デコーダの両方を使い、全タスクをテキスト変換として統一的に扱う
- スケーリング法則により、GPT-3以降はIn-context Learning(プロンプトのみでタスクを解く)能力を獲得
- タスクの性質(理解 vs 生成)に応じてモデルを選択することが重要
BERTとGPTの違いを理解することは、現代のNLPの土台を理解することと同義です。どちらのモデルも「Transformerのどの部分を使うか」「事前学習でどのようなタスクを解くか」という2つの設計判断で特徴付けられます。この視点を持つことで、今後登場する新しいモデルのアーキテクチャも、この枠組みの中で理解できるようになるでしょう。
次のステップとして、以下の記事も参考にしてください。
- トークナイゼーションの理論 — BPE・WordPieceの仕組み
- 単語埋め込みの理論 — Word2Vec・GloVeからの進化
- Self-Attentionの理論と実装 — Attention機構の詳細