LLM・RAG

Transformerとは?自己注意の仕組みとBERT・GPTの違いを実装目線で解説

Transformerとは?自己注意の仕組みとBERT・GPTの違いを実装目線で解説

Transformerは、文中のすべての単語の関係を一度に捉える自己注意(Self-Attention)という機構を中核に据えた深層学習アーキテクチャで、ChatGPTをはじめとする大規模言語モデルの土台になっています。2017年の論文「Attention Is All You Need」で提案されて以降、自然言語処理の主役が従来のRNNからTransformerへ置き換わりました。この記事では、自己注意がQuery・Key・Valueの計算で文脈をどう捉えるか、マルチヘッドアテンションと位置エンコーディングが担う役割、Transformerを構成する各層の働き、エンコーダ型のBERTとデコーダ型のGPTがどう分かれるか、そして企業が自社の課題にTransformer系モデルを実装すべきかどうかの判断基準までを、実装する側の目線で整理します。あわせて、PyTorch 2.14系とTransformers 5.16系(2026年9月時点)で自己注意の計算とBERT・GPT-2の出力差を手元から確かめる手順も載せます。

まとめ:Transformerの要点と企業の実装判断の結論

Transformerの心臓部は自己注意です。文中の各単語を、ほかのすべての単語とどれだけ関係するかという重みで結び直し、文脈を織り込んだ表現へ変換します。単語を1つずつ順番に読むRNNと違い、系列全体を並列に処理できるため、長い文の離れた語どうしの関係も捉えやすく、学習も高速化しました。この構造が、エンコーダ型のBERT、デコーダ型のGPTへと枝分かれし、現在の生成AIの基盤を形づくっています。

実装判断の結論を先に述べます。自社でTransformerをゼロから設計・事前学習する必要は、ほとんどの企業にありません。事前学習には数百万ドル規模の計算資源と膨大なデータが要り、費用対効果が見合う場面は限られます。現実的な出発点は、公開された学習済みモデルや商用APIを土台に、自社データで追加学習(ファインチューニング)するか、あるいは学習させずにプロンプトと検索連携(RAG)で足りるかを見極めることです。まずAPIとRAGで試し、精度や機密要件で届かない範囲だけ追加学習に進む。この順序が、投資を抑えつつ成果に近づく道筋になります。

手を動かす順序も先に示します。自己注意の計算はPyTorchのscaled_dot_product_attention1本で再現でき、BERTとGPT-2の性格の差はTransformersのpipelineを2行ずつ書けば目で確かめられます。概念の理解と実装の確認を別の日に分けないほうが、結局は速い進み方です。

Transformerとは何かと従来のRNNが抱えた逐次処理の限界

Transformerは、自然言語のような系列データを扱う深層学習モデルの一種です。ニューラルネットワークの一形態であり、その基本である重み付き和と非線形変換の積み重ねという土台はニューラルネットワークの仕組みを入力層・隠れ層・出力層から解説した記事と共通します。Transformerが独自なのは、層の組み方と、単語どうしの関係を捉える自己注意という機構にある点です。まず、なぜTransformerが必要とされたのか、それ以前の主役だったRNNの課題から見ていきます。

RNNの逐次処理と長距離依存の学習で生じた精度と速度の二つの課題

Transformer登場以前、文章のような系列データはRNN(再帰型ニューラルネットワーク)が担っていました。RNNは単語を先頭から1つずつ読み、直前までの文脈を隠れ状態として次へ持ち越します。この逐次処理には二つの弱点がありました。一つは速度です。前の単語の計算が終わらないと次に進めないため、系列を並列に処理できず、学習に時間がかかります。もう一つは長距離依存の難しさです。文頭の主語が文末の動詞に係るような離れた関係は、隠れ状態を伝えるうちに情報が薄れ、勾配消失も起きて捉えにくくなりました。LSTMやGRUがゲート機構でこれを緩和したものの、逐次処理という枠組み自体は残ります。この二つを同時に解いたのがTransformerでした。

エンコーダとデコーダの二部構成とAttention論文が示した設計

Transformerは論文「Attention Is All You Need」で、機械翻訳のモデルとして提案されました。原論文の構造は、入力文を理解するエンコーダと、出力文を生成するデコーダの二部構成です。エンコーダは入力系列全体を受け取り、各単語に文脈を織り込んだ表現へ変換します。デコーダはその表現を参照しながら、出力を1語ずつ生成する側です。この1語ずつの生成を、過去のKey・Valueを再利用して高速化する内部機構はKVキャッシュとは何かと推論高速化の解説で扱っています。両者に共通して埋め込まれているのが自己注意で、論文の題名が示すとおり、再帰も畳み込みも使わず注意機構だけで系列を扱えることを実証した点が転換点になりました。原論文が示した基本設定はエンコーダ・デコーダとも6層、モデル次元512、ヘッド8で、全文はarXivで公開されています。この二部構成のうち、エンコーダ側だけを使ったのがBERT、デコーダ側だけを使ったのがGPTです。

自己注意(Self-Attention)が文脈を捉える計算の仕組み

Transformerを理解する鍵は自己注意に尽きます。ある単語の意味は、それ単体ではなく周囲の単語との関係で決まります。「銀行の口座」と「川の銀行(土手)」では、同じ「銀行」でも周囲の語によって意味が変わる、という文脈依存を数式で扱う仕組みが自己注意です。ここでは、その計算を段階を追って分解します。

QueryとKeyとValueの内積で重みを求めるアテンション計算

自己注意では、各単語の表現ベクトルからQuery・Key・Valueという3つのベクトルを、それぞれ別の重み行列を掛けて作ります。Queryは「私は何に注目したいか」、Keyは「私はどんな情報を持つか」、Valueは「実際に渡す中身」という役割です。計算は次の順に進みます。

  1. 注目元の単語のQueryと、文中すべての単語のKeyとの内積を取り、関連度スコアを出す
  2. スコアをベクトルの次元数の平方根で割り、値が大きくなりすぎないよう調整する
  3. softmax関数でスコアを合計1の重み(アテンション重み)に変換する
  4. その重みで各単語のValueを加重平均し、文脈を織り込んだ新しい表現を得る

この一連の処理を、文中のすべての単語を注目元として同時に行います。行列の掛け算にまとまるため、RNNと違い系列全体をGPU上で並列に計算できます。単語どうしの関係の強さを、距離に関係なく直接スコア化できる点が、長距離依存に強い理由です。なお、この4手順はPyTorchでは1つの関数に畳まれており、後半の実装章でそのまま実行して確かめます。

マルチヘッドアテンションと位置エンコーディングが担う役割と効果

自己注意は1組のQuery・Key・Valueだけでなく、複数の異なる重み行列で並行して計算します。これがマルチヘッドアテンションです。あるヘッドは文法的な係り受けを、別のヘッドは意味的な関連を、というように、異なる観点の関係を同時に捉え、最後に結合します。1つの見方に偏らず多面的に文脈を読むための工夫だと考えると分かりやすいでしょう。このヘッドのうちKeyとValueだけをグループで共有し、推論時のメモリを抑える派生がグループ化クエリアテンション(GQA)の仕組みと実装判断です。もう一つ補うべきものが語順です。自己注意は単語を集合として扱い、そのままでは「猫が犬を追う」と「犬が猫を追う」を区別できません。そこで各単語の埋め込みに、位置ごとに定まる位置エンコーディングのベクトルを足し込み、何番目の単語かという順序情報を持たせます。並列処理と引き換えに失われる語順を、この加算で補っているわけです。

現在の大規模言語モデルの多くは、この足し込む方式ではなくQueryとKeyを位置に応じて回転させる方式を採ります。その仕組みと長文への伸ばし方はRoPE(回転位置埋め込み)の解説にまとめました。入力が長くなると全トークン対のスコア計算が重くなるため、見る相手を絞る設計も併用されます。その分類と実装判断はスパースアテンションの仕組みと採用条件で整理しました。見る相手を絞らず、同じ計算のままGPUのメモリ往復だけを減らす実装もあり、そちらはFlashAttentionの仕組みと版の選び方で扱っています。

Transformerを構成する主要コンポーネントと処理の全体像

自己注意は中核ですが、Transformerの1ブロックはそれだけでは成り立ちません。入力を数値化する層、非線形性を加える層、深い層でも学習を安定させる仕掛けが組み合わさって、初めて何十層と積み重ねられます。

埋め込み層・フィードフォワード層・残差接続と層正規化が担う働き

入り口の埋め込み層は、単語をID化したうえで、意味の近い語が近くに配置される密ベクトルへ変換します。ここに前章の位置エンコーディングが加わったうえで、自己注意へ渡る流れです。自己注意の出力は、各単語ごとに独立して働くフィードフォワード層(2層の全結合ネットワーク)を通り、非線形な変換を受けます。深く積むための要が、残差接続と層正規化です。残差接続は、ある層の入力を出力に足し戻す配線で、勾配が浅い層まで届きやすくなり、層を深くしても学習が崩れにくくなります。層正規化は各層の出力の分布を整え、学習を安定させる役割です。主要な部品の対応を整理します。

構成要素 担う働き 置かれる位置
埋め込み層 単語を意味ベクトル化 入力の最前段
位置エンコーディング 語順情報を付与 埋め込みに加算
自己注意 単語間の関係を計算 各ブロック前半
フィードフォワード層 非線形変換で表現力を追加 各ブロック後半
残差接続・層正規化 深い層の学習を安定化 各サブ層の前後

この自己注意とフィードフォワードを1組としたブロックを縦に積み、原論文では6層、大規模言語モデルでは数十層に及びます。層を重ねるほど抽象度の高い文脈を捉えられる一方、必要な計算資源も比例して増えていきます。

Transformerから派生したBERT・GPT・ViTという代表モデル

Transformerの二部構成は、片側だけを取り出す形で代表的なモデルへ枝分かれしました。どちら側を使うかで、得意なタスクがはっきり分かれます。

エンコーダ型BERTとデコーダ型GPTの構造の違いと使い分け

BERTはエンコーダ側を使い、文の前後両方向から文脈を読みます。文全体を一度に見渡せるため、分類・固有表現抽出・文書検索といった「理解」のタスクに向くのが持ち味です。GPTはデコーダ側を使い、左から右へ次の単語を予測しながら文を生成します。この一方向の生成が、対話や文章作成に直結します。両者の性格を対比すると次のとおりです。

観点 エンコーダ型(BERT系) デコーダ型(GPT系)
文脈の読み方 前後の双方向 左から右の一方向
得意な処理 分類・抽出・検索 文章生成・対話
代表的な用途 感情分析・検索改善 チャット・要約・作文

規模の目安も押さえておくと選定が速くなります。BERTの原論文が公開した構成は、Baseが12層・隠れ次元768・ヘッド12でおよそ1億1000万パラメータ、Largeが24層・隠れ次元1024・ヘッド16でおよそ3億4000万パラメータでした。GPT系のデコーダ型をひたすら巨大化し、膨大なテキストで事前学習したものが大規模言語モデルです。Transformerがどう大規模言語モデルへ発展し、企業がその導入をどう判断するかは、LLMの仕組みと企業導入の判断基準を解説した記事で扱っています。エンコーダ型の系譜も止まってはおらず、学習データと文脈長を刷新した後継についてはModernBERTの特徴とbase・largeの選び方をまとめた記事で整理しました。本記事はその内側の構造に絞ります。

画像へ広げたVision Transformerとマルチモーダルの展開

自己注意は言語専用の仕組みではありません。2020年に提案されたVision Transformer(ViT)は、画像を小さなパッチに分割し、各パッチを単語のように並べて自己注意を適用することで、畳み込みを使わず画像分類を行いました。原論文の題名「An Image is Worth 16×16 Words」が示すとおり、パッチの一辺は16画素です。学習済みの重みはTransformersのViTモデルページから、言語モデルと同じAutoModel系の書き方で読み込みが可能です。この考え方は、テキストと画像、音声を同じ枠組みで扱うマルチモーダルへの入り口になります。テキストと画像を横断して理解・生成する技術の全体像は、マルチモーダルAIの仕組みと実装の要点を解説した記事で整理しています。単一の注意機構が言語と視覚の両方を統一的に扱えたことが、Transformerの適用範囲を大きく広げました。

PyTorchとtransformersで自己注意とBERT・GPTを動かす手順

ここまでの説明を読んだだけでは、行列の形とマスクの効き方までは腹に落ちません。ここから先は手元で動かす前提に切り替えます。GPUを持っていなくても最後まで通る範囲に絞りました。

torchとtransformersの版を確認するCPU環境の準備手順

最初に版を揃えます。Transformers公式のインストール手順には「Python 3.10以降・PyTorch 2.5以降でテスト済み」と明記されています。GitHubのリリース一覧では5.16系が最新で、PyTorch側はPyPIのtorchが2.14系を配布していました(いずれも2026年9月時点)。フレームワークそのものの位置づけを先に押さえたい場合はPyTorchの特徴とTensorFlowとの違いを解説した記事を先に読むと迷いません。

uv pip install "transformers[torch]"
python -c "import torch, transformers; print(torch.__version__, transformers.__version__)"

2つの版が出力されれば準備は完了です。モデルの重みは初回実行時にHubから取得され、既定では~/.cache/huggingface/hubへ置かれます。社内の閉じた環境で動かすなら、この保存先と取得経路を先に決めておくと、後の配布と運用が楽になります。

scaled_dot_product_attentionで注意重みを計算する実装

前章で分解した4手順は、PyTorchでは1つの関数に畳まれています。公式ドキュメントのscaled_dot_product_attentionのシグネチャは(query, key, value, attn_mask=None, dropout_p=0.0, is_causal=False, scale=None, enable_gqa=False)で、scaleを省くと埋め込み次元の平方根の逆数が既定で入ります。手順②の「次元数の平方根で割る」が、そのまま既定値として実装されているわけです。is_causal=Trueを渡すと注意行列が下三角に制限されます。これがGPT側の一方向、既定のままがBERT側の双方向にあたります。

import torch
import torch.nn.functional as F

torch.manual_seed(0)
B, H, T, E = 1, 1, 4, 8
q, k, v = (torch.randn(B, H, T, E) for _ in range(3))

out = F.scaled_dot_product_attention(q, k, v)
causal = F.scaled_dot_product_attention(q, k, v, is_causal=True)

w = torch.softmax(q @ k.transpose(-2, -1) / (E ** 0.5), dim=-1)
print(out.shape, torch.allclose(w @ v, out, atol=1e-6), causal.shape)

末尾のtorch.allcloseがTrueなら、手で組んだ加重平均と関数の出力が一致した証拠になります。causal側では4トークン目だけが全体を見渡し、1トークン目は自分しか参照できません。この差を数字で確かめておくと、BERTとGPTの性格の違いが「学習データの差」ではなく構造の差だと納得できます。

nn.TransformerEncoderLayerで1ブロックを組み立てる確認

自己注意・フィードフォワード・残差接続・層正規化を1組にまとめた既製部品がnn.TransformerEncoderLayerです。公式の既定値はdim_feedforward=2048・dropout=0.1・norm_first=Falseで、層正規化を後ろに置くPost-LNが初期状態になっています。原論文と同じ並びです。現行の大規模モデルはnorm_first=TrueのPre-LNを採ることが多く、深く積んでも学習が発散しにくくなります。正規化の計算自体を軽くした派生はRMSNormとLayerNormの違いを解説した記事で扱いました。

import torch
from torch import nn

layer = nn.TransformerEncoderLayer(
    d_model=512, nhead=8, dim_feedforward=2048,
    batch_first=True, norm_first=True,
)
encoder = nn.TransformerEncoder(layer, num_layers=6)
x = torch.randn(2, 16, 512)
print(encoder(x).shape)

d_model=512・8ヘッド・6層は原論文のベース設定そのままで、1ヘッドあたりの次元は512を8で割った64という計算です。出力の形は入力と同じ(2, 16, 512)で返り、層を積んでも次元が変わらない構造だと確認できます。ヘッド単位の注意重みそのものを取り出したいときはnn.MultiheadAttentionを使うと、戻り値の2番目として受け取れます。

同じ英文をBERTとGPT-2に通して出力の違いを見る比較手順

構造の差は、同じ入力を2つのモデルに通すと一目で分かります。BERTの公式モデルページが代表例に挙げるタスクは穴埋め(fill-mask)で、GPT-2の公式モデルページは続きの生成(text-generation)でした。同じライブラリの同じ入口を使いながら、片方は文の途中を埋め、もう片方は末尾を伸ばします。

from transformers import pipeline

fill = pipeline(task="fill-mask", model="google-bert/bert-base-uncased")
print(fill("Transformer is a [MASK] architecture.")[0]["token_str"])

gen = pipeline(task="text-generation", model="openai-community/gpt2")
print(gen("Transformer is a", max_new_tokens=10)[0]["generated_text"])

公式のコード例ではattn_implementation="sdpa"を明示して読み込む書き方が示されており、この指定で先ほどのscaled_dot_product_attentionが内部の注意計算に呼ばれます。差し替えられる実装の一覧はAttention Interfaceのドキュメントが一次情報です。文字列を数値列へ変える前段の切り分け方はトークナイザーのBPE・WordPiece・Unigramの違いを解説した記事で扱っています。ここまで動かしたうえで社内データに寄せる段階へ進むなら、要件整理から実装まで引き受ける一創の生成AI導入支援にご相談ください。

企業がTransformer系モデルを実装する際の採用判断と費用対効果

ここからは技術解説から一歩進め、自社の課題にTransformer系モデルを持ち込むべきかの判断軸を示します。結論として、選ぶべきは「どのモデルを使うか」より前に「どこまで自前でやるか」です。この階層を取り違えると投資が跳ね上がります。

フルスクラッチ学習を避け公開された学習済みモデルを起点にする理由

Transformerを自社でゼロから事前学習する選択は、ほとんどの事業会社にとって過剰投資です。大規模言語モデルの事前学習には、数千枚規模のGPUと数週間から数か月の計算、そしてテラバイト級のテキストが要り、費用は数百万ドルに達することもあります。一度作れば終わりではなく、モデルの更新ごとに繰り返し発生するコストです。現実的な起点は、公開された学習済みモデルや商用APIを土台にすることです。画像・言語のどちらでも、大量データで訓練済みのモデルが公開されており、自社の少量データで一部を再学習させれば実用精度に届く場面が多くあります。この、学習済みモデルを土台に自社課題へ寄せる考え方は転移学習と呼ばれ、その手法の違いは転移学習とファインチューニング・特徴抽出の違いを解説した記事で整理しています。自社にデータがどれだけあっても、まず「作らずに済ませられないか」を最初に問うのが、費用対効果を左右する分岐点です。

追加学習で仕上げるかプロンプトとRAGで足りるかの見極めの基準

学習済みモデルを起点にすると決めても、追加学習が常に要るわけではありません。むしろ多くの業務課題は、モデルを学習させずに解けます。判断の順序を段階で示します。まず、モデルへの指示文(プロンプト)の工夫で足りるかを試す。次に、社内文書を検索してモデルに渡すRAG(検索拡張生成)で、最新情報や社内知識を反映できないかを検討する。それでも専門用語の言い回しや出力形式が安定しない場合に、初めて自社データでの追加学習(ファインチューニング)に進みます。RAGとファインチューニングは競合ではなく、知識の鮮度はRAG、応答の型はファインチューニングという役割分担です。両者の使い分けとファインチューニングの実装判断はファインチューニングの仕組みとRAGとの使い分けを解説した記事で詳しく扱っています。自社の業務にどのTransformer系モデルをどの深さで組み込むべきか、プロンプトとRAGで足りるのか追加学習まで要るのかの見極めに迷う段階では、機械学習・生成AIの受託開発を手がける一創のAIエンジン開発にご相談ください。課題データの性質と機密要件から、APIで足りる範囲と自社実装すべき範囲の切り分けまで含めて設計します。

Transformerの仕組み・学習・実装に関するよくある質問

Transformerの学習・実装でよく検索される疑問に、実装目線で簡潔に答えます。

TransformerとBERT・GPTの違いは何ですか?

Transformerは、自己注意を中核とするアーキテクチャそのものの名前です。BERTとGPTは、そのTransformerを土台に作られた具体的なモデルを指します。BERTはエンコーダ側を使い文の双方向理解に、GPTはデコーダ側を使い文章生成に向く、という関係です。つまりTransformerが設計図で、BERTやGPTがそこから作られた製品にあたります。なお、Hugging Faceが配布するtransformersライブラリは名前が似ていても別物で、そうしたモデル群をまとめて読み込むためのPython実装です。

Transformerはなぜ自然言語処理の主流になったのですか?

系列全体を並列に処理でき、離れた単語どうしの関係も自己注意で直接捉えられるためです。原論文が示した6層・モデル次元512・ヘッド8という基本設定は、層数と次元を増やす方向へそのまま伸ばせる形でした。1語ずつ順に読むRNNの逐次処理の遅さと、長距離依存の捉えにくさという二つの弱点を同時に解消しました。並列化しやすい構造がGPUの性能を引き出し、モデルとデータを大きくするほど精度が伸びる性質が、大規模言語モデルへの道を開きました。

Transformerの学習には大量のデータとGPUが必要ですか?

ゼロから事前学習する場合は、テラバイト級のテキストと多数のGPUが要り、費用も数百万ドル規模になり得ます。ただし事業会社が自前で事前学習する必要はほとんどありません。公開された学習済みモデルやAPIを起点にすれば、少量データでの追加学習や、学習なしのプロンプト・RAGで多くの業務課題に対応できます。本記事の実装章で示したbert-base-uncasedやgpt2のような小さな公開モデルなら、GPUの無いノートPCでも読み込んで挙動を確かめられました。

自己注意(Self-Attention)とは何をしているのですか?

文中の各単語について、ほかのすべての単語とどれだけ関係するかを重みとして計算し、その重みで周囲の情報を集約して、文脈を織り込んだ表現へ変換しています。各単語からQuery・Key・Valueの3ベクトルを作り、QueryとKeyの内積で関連度を測り、softmaxで重みにしてValueを加重平均する、という計算です。PyTorchではscaled_dot_product_attentionという1つの関数がこの流れをまとめて担い、scaleを省略すると次元の平方根の逆数が既定で使われます。

Transformerは画像や音声にも使えますか?

使えます。画像を小さなパッチに区切り単語のように並べるVision Transformerが、畳み込みを使わず画像分類を実現しました。ViTの原論文が使ったパッチは一辺16画素で、系列長は画像サイズとパッチサイズから決まります。音声も系列データとして同じ枠組みで扱え、テキスト・画像・音声を横断するマルチモーダルモデルの基盤にもなっています。自己注意が特定のデータ形式に依存しない汎用的な仕組みだからです。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

ほか 12 件の記事からもリンクされています。

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.10.09 テックブログ IDCFクラウド(IDCフロンティア)不正アクセス・ランサムウェア:影響先・復旧・データは戻るか
  2. 2026.10.08 テックブログ 大阪公立大学のランサムウェア被害と仮想化基盤の停止|全授業休講に至った経緯とバックアップを守る設定
  3. 2024.11.08 テックブログ OpenAPI GeneratorでJavaコードを自動生成する方法|CLI導入からSpring・ライブラリ選択まで
  4. 2026.10.09 テックブログ ニッスイのサイバー攻撃で日水物流の入出荷停止|委託先クラウド障害に荷主が備える手順
  5. 2026.10.09 テックブログ 京王電鉄のランサムウェア被害とグループ共通基盤:決済・ポイント・予約が止まった範囲と遮断の初動

RELATED POSTS 関連記事

目次