LASSIC Media らしくメディア

2026.10.06 らしくコラム

Transformerの仕組み、Attentionの考え方と弱点

監修・編集責任者:牛尾 昭昌(株式会社LASSIC 執行役員)

黒い台の上に並べられた2枚のグラフィックボードを、冷却ファンとヒートシンクが見える角度で上から写した写真。

この記事の結論

  • Transformerは、Attentionで系列の中の位置どうしの関係を一度に計算し、再帰を使わずに入力を出力へ変換する構造です。
  • Attentionは、QとKの内積から重みを求めてVを足し合わせる計算で、離れた位置の語とも1回で結び付けられます。
  • 弱点は、計算量とメモリーが入力の長さの2乗で増えることと、学習に多くのデータが要ることです。

※ 本記事は2026年10月時点の公式情報(省庁・公的機関、および製品やサービスを提供する事業者が公開している資料)に基づきます。

Transformerという言葉は生成AIの説明でよく目にするものの、それまでの仕組みと何が違うのかを聞かれると答えに詰まる。長い文書を読ませると急に処理が重くなる理由も、よく分からない——。AIを業務システムに組み込もうとする開発の現場では、こうした疑問が起こりがちです。Transformerとは、文章などの並び(系列)の中でどの位置どうしが関係するかをAttention(注意機構)という計算で直接求め、再帰や畳み込みを使わずに入力を出力へ変換するニューラルネットワークの構造を指します。

2017年に機械翻訳のために提案され、いまでは大規模言語モデル(LLM)や画像認識にも使われています。ただし万能ではなく、入力が長くなるほど計算量とメモリーが急に増えるという弱点を抱えています。本記事では、システム開発やIT運用に携わる方に向けて、Transformerの仕組み、Attentionの計算を短いコードで確かめる具体例、使いどころとつまずきやすい点、そして外部に頼むときに確認したい点を整理します。

Transformerとは

GoogleのVaswaniらが2017年に発表した論文「Attention Is All You Need」は、Transformerを、Attentionだけに基づき、再帰と畳み込みを完全に使わない新しいネットワーク構造として提案しました。*1 それまでの翻訳のモデルは、RNN(再帰型ニューラルネットワーク)で単語を先頭から1つずつ処理するのが主流で、論文はこの逐次的な性質が学習の並列化を妨げると指摘しています。

全体は、入力を読み取るエンコーダーと、出力を1語ずつ作るデコーダーの2つで構成されます。原論文の標準の構成では、エンコーダーとデコーダーをそれぞれ同じ形の層を6つ重ねて作り、各層が出力するベクトルの次元は512です。*1 1つの層は、次の部品の組み合わせでできています。

  • マルチヘッドAttention:各位置が、ほかのどの位置の情報をどれだけ取り込むかを計算する部品
  • フィードフォワード層:位置ごとに同じ変換をかける全結合の層
  • 残差接続と層の正規化:部品の入力を出力に足し戻し、値の大きさをそろえて学習を安定させる仕組み
  • 位置エンコーディング:語順の情報を入力に足し込む仕組み

デコーダーには、エンコーダーの出力を参照するAttentionが加わり、まだ作っていない後ろの位置を隠す処理(マスク)もかかっています。

Attentionの仕組み

Attentionの計算の流れを示した図。入力のトークンからQ(クエリ)、K(キー)、V(バリュー)を作り、①QとKの内積を√dkで割り、②softmaxで合計1の重みにし、③その重みを掛けてVを足し合わせ、文脈を取り込んだベクトルを出力する。

原論文は、Attentionを、クエリ(Q)と、キー(K)とバリュー(V)の組を受け取って出力に写す関数だと説明しています。出力はVの重み付きの和で、それぞれのVに掛ける重みは、QとそれぞれのKの相性から決まります。検索に例えると、Qが検索語、Kが文書の見出し、Vが文書の中身で、見出しがよく合う文書ほど中身を多く取り込みます。

論文が採用した「Scaled Dot-Product Attention」では、QとすべてのKの内積を求め、それぞれをKの次元dkの平方根で割り、softmax関数(数値の並びを合計1の重みに変える関数)をかけてVの重みを得ます。式で書くと Attention(Q, K, V) = softmax(QKᵀ / √dk) V です。*1 √dkで割るのは、内積が大きくなりすぎてsoftmaxの勾配が極端に小さくなるのを防ぐためです。

文の中の語どうしで互いに参照し合う使い方を、自己注意(Self-Attention)と呼びます。Q・K・Vはすべて同じ入力から作られ、「それ」が指す名詞のように離れた位置の語とも、間の語をたどらずに1回の計算で結び付きます。

実際のモデルでは、Q・K・Vを学習で得た行列でそれぞれ別の空間に写し、Attentionを並列に何組も計算します。これがマルチヘッドAttentionで、原論文では8つのヘッドを使い、各ヘッドの次元を64にしています。*1 ヘッドごとに異なる観点で関係をとらえられるのが利点です。

RNNとの違い

TransformerとRNNの差は、計算の並べ方にあります。RNNは前の位置の結果を待って次を計算しますが、自己注意はすべての位置の組を一度に計算します。

自己注意とRNNの比較(原論文の表1をもとに作成。nは系列の長さ、dは表現の次元)
観点 自己注意 RNN
1層あたりの計算量 O(n²・d) O(n・d²)
順番に実行する計算の数 O(1) O(n)
離れた位置どうしを結ぶ経路の長さ O(1) O(n)

論文は、系列の長さnが表現の次元dより小さいときには、自己注意の層はRNNの層より速いとしています。原論文では、標準の構成を8枚のNVIDIA P100 GPUで12時間学習させています。英語からドイツ語への翻訳の評価では、大きい構成がBLEU(機械翻訳の評価指標)で28.4を記録し、それまでに報告された最良の結果を上回りました。*1

一方で、表の1行目が示すとおり、自己注意の計算量は系列の長さの2乗に比例して増えます。また、Transformerはそのままでは語順を区別できないため、原論文は周波数の異なる正弦波と余弦波から作った位置エンコーディングを、入力の埋め込み(語を表すベクトル)に足し込んでいます。

具体例:Attentionを短いコードで計算する

仕組みを手元で確かめるために、先の式の計算をPythonの標準ライブラリだけで書いた例を示します。3つのトークンを2次元のベクトルで表し、同じベクトルをQ・K・Vのすべてに使う自己注意として計算します。学習済みの行列で写す処理は省いています。

import math
def attention(Q, K, V, causal=False):
    d_k = len(K[0])
    outs, weights = [], []
    for i, q in enumerate(Q):
        scores = [sum(a * b for a, b in zip(q, k)) / math.sqrt(d_k) for k in K]
        if causal:                          # 後ろの位置を見えなくする
            scores = [s if j <= i else -math.inf for j, s in enumerate(scores)]
        m = max(scores)
        e = [math.exp(s - m) for s in scores]
        w = [x / sum(e) for x in e]         # softmaxで重みに(合計1)
        weights.append([round(x, 2) for x in w])
        outs.append([sum(wj * v[c] for wj, v in zip(w, V)) for c in range(len(V[0]))])
    return outs, weights
X = [[1.0, 0.0], [0.0, 1.0], [1.0, 1.0]]    # 3つのトークンを2次元で表した例
print(attention(X, X, X)[1])
print(attention(X, X, X, causal=True)[1])

実行すると、1行目に [[0.4, 0.2, 0.4], [0.2, 0.4, 0.4], [0.25, 0.25, 0.5]] が表示されます。各トークンがどのトークンをどれだけ参照したかを表す重みで、各行の合計は1です。3番目のトークン[1.0, 1.0]は自分自身に0.5の重みを付けており、向きの近いベクトルほど重みが大きくなります。

2行目の [[1.0, 0.0, 0.0], [0.33, 0.67, 0.0], [0.25, 0.25, 0.5]] は、causal=Trueで自分より後ろの位置を隠した結果です。1番目のトークンは自分しか参照できないので重みが1.0になります。デコーダーはこの隠し方で、まだ作っていない後ろの語を見ないようにしており、原論文も隠す位置のsoftmaxへの入力を−∞にしています。

実務では、PyTorchのscaled_dot_product_attentionという関数を使い、マスクを渡すattn_maskや、後ろの位置を隠すis_causalを指定します。公式ドキュメントによれば、この関数にはFlashAttention-2を含む3つの実装があり、CUDA(NVIDIAのGPU向けの計算基盤)では最適化された計算を呼び出すことがあります。*2

エンコーダー型とデコーダー型の使いどころ

原論文の後、エンコーダーとデコーダーのどちらかだけを使う形が広がりました。2018年のBERTの論文は、左右両方の文脈を参照する構成を「Transformer encoder」、左側の文脈だけを参照する構成を、文章の生成に使えることから「Transformer decoder」と呼ぶことが多いと説明し、BERTを前者、OpenAIのGPTを左から右へ参照する形として対比しています。*3

業務の用途に置き換えると次のとおりです。

  • エンコーダー型(BERTなど):文書の分類、問い合わせの振り分け、検索のための文のベクトル化など、入力を読み取って判断する用途
  • デコーダー型(GPTなど):文章の生成、要約、対話、コードの補完など、1語ずつ出力を作る用途
  • エンコーダーとデコーダーの両方:翻訳のように、入力の文を別の文へ変換する用途

対象は文章にとどまりません。2020年に発表されたVision Transformer(ViT)は、画像を小さな区画(パッチ)に分け、それを文章のトークンと同じように並べて標準のTransformerに入力し、画像を分類しました。*4 センサーの時系列データなど、並び順に意味がある情報にも同じ考え方を当てはめられます。

自社で使う場合は、学習済みモデルを業務のデータで調整するか、社内の文書を検索して生成AIに渡す構成から検討すると進めやすくなります。どちらを選ぶかは「LLMファインチューニングとRAGの使い分け」で、より小さなモデルを自社の環境で動かす選択肢は「SLM(小規模言語モデル)の活用」で扱っています。

つまずきやすい点

まず挙がる弱点は、入力が長くなったときの重さです。系列の長さが2倍になると、自己注意で計算する重みの数は4倍になります。FlashAttentionの論文は、自己注意の時間とメモリーの計算量が系列の長さの2乗に比例するため、Transformerは長い系列では遅く、メモリーを多く使うと述べています。*5 一度に扱えるトークン数の上限の考え方は「LLMのトークンとコンテキストウィンドウとは」で説明しています。

同じ論文によれば、計算を省く近似の手法の多くは実際の処理時間が短くならず、広くは使われていません。同論文はGPUのメモリーの読み書きを減らし、近似をせずにAttentionを速く計算する手法を示しました。こうした実装はライブラリに組み込まれているので、Attentionは自作せずライブラリの関数を使うのが近道です。

2つ目は、学習に要るデータの量です。ViTの論文は、ImageNetのような中程度の規模のデータで強い正則化をせずに学習させると、同程度の大きさのResNet(畳み込みを使う代表的な画像認識モデル)より精度が数ポイント低くなったと報告しています。畳み込みが持つ画像向けの前提を持たないためで、1,400万〜3億枚の大きなデータで学習させると状況は変わったとされています。*4 データが少ない業務では、学習済みモデルを出発点にするのが現実的です。

3つ目に、Attentionの重みを判断の理由と見なしすぎないことです。原論文は、自己注意で解釈しやすいモデルになる可能性に触れ、ヘッドごとに文の構造に関係する振る舞いが見られた例を示しています。*1 ただしこれは観察の例で、重みの大きさがそのまま判断の根拠を表すとは限りません。

外部に委託するときに確認しておきたい点

Transformerを使ったシステムの開発を外部に頼むときは、まず、モデルの型と用途の対応が説明されているか、生成AIのAPIを呼ぶのか自社の環境でモデルを動かすのかが決まっているかを見ます。基盤も費用もここで変わります。

次に、入力の長さの見積もりです。文書の長さの分布と1回に渡すトークン数の上限を決めておかないと、応答時間やGPUのメモリーが想定を超えることがあります。長い文書の分割や、必要な部分だけを検索して渡す設計が提案にあるかを確かめます。

三つ目は、評価の方法です。業務のデータで測る指標と目標の水準、比べる相手(いまのルールや人の作業、より小さなモデル)を、開発の前に合意しておきます。Attentionの重みを「判断の理由」として示す提案には、その根拠を尋ねます。

最後に、モデルとライブラリの版の管理、応答時間とGPUの使用量の監視、入力の傾向が変わったときの再評価の基準を、提案の段階で確かめておきます。

まとめ:Transformerで確かめる3つの点

Transformerを業務に使ううえで、確かめておきたい点は3つに整理できます。第一に、用途に合わせてエンコーダー型かデコーダー型かを選ぶこと。第二に、計算量が入力の長さの2乗で増えることを踏まえ、1回に渡す入力の上限を先に決めること。第三に、学習済みモデルを出発点にし、業務のデータで評価の指標を決めてから採否を判断することです。この3点を踏まえておけば、「試作では動いたのに、本番の長い文書では遅くて使えない」という事態を避けやすくなります。モデルの選び方や検証の進め方に迷いがあれば、外部の手を借りるのも一つの選択肢です。

LASSICに相談するメリット

LASSICは、元請(プライムベンダー)としてシステムの開発と保守・運用を受託しています。Transformerを使ったAIを業務システムに組み込む場合は、PyTorchとHugging Face Transformersで学習済みモデルを扱い、推論をKubernetesのGPUノードで動かし、MLflowでモデルの版と評価結果を記録する構成を、要件に合わせて組み立てます。設計では、モデルの型、入力の上限と長い文書の分割、モデルの調整か社内文書の検索か、外部のAPIか自社での推論かを発注者と一緒に決めます。運用では、評価用のデータセットをGitHub ActionsのCI/CDで自動的に回し、PrometheusとGrafanaで応答時間とGPUのメモリーを監視し、Terraformで基盤をコードとして管理します。

よくある質問

TransformerとLLMは同じものですか

同じではありません。Transformerは構造の名前で、LLMはこうした構造を使って大量の文章で学習させた言語モデルを指します。BERTやGPTは、Transformerを土台にしたモデルの例です。

位置エンコーディングは、正弦波の方式でなければいけませんか

そうではありません。原論文は、学習で得る位置の埋め込みも試し、正弦波の方式とほぼ同じ結果だったと報告しています。*1 どの方式を使うかは、採用する学習済みモデルの設計に従うのが基本です。

マルチヘッドAttentionのヘッドは、多いほどよいのですか

多いほどよいわけではありません。原論文の実験では、計算量をそろえてヘッドの数を変えたところ、ヘッドが1つの場合は最良の設定よりBLEUが0.9低く、ヘッドが多すぎても品質が下がりました。*1

Transformerのモデルを試すには、GPUが必要ですか

小さなモデルで推論を試すだけならCPUでも動かせますが、学習や大きなモデルの推論にはGPUを使うのが現実的です。まずクラウドのGPUを時間単位で借りて検証し、費用の見通しを立ててから本番の基盤を決めるのがおすすめです。

Transformerを使ったAIシステムのご相談

元請(プライムベンダー)として、Transformerを使ったモデルの選定と検証から、業務システムへの組み込み、保守・運用までご提案します。

Remoguとリラシクなら、AIを組み込むシステムの開発や運用に加わるITエンジニアも探せます。

Remoguは、リモート前提で全国から即戦力のITプロ人材を調達するサービスです。リラシクは、扱う求人がすべてリモートワークのITエンジニア専門転職エージェントです。どちらもLASSICが運営しています。

無料相談はこちら

出典

  1. *1 参考:Ashish Vaswani ほか「Attention Is All You Need」(arXiv:1706.03762、NIPS 2017)(https://arxiv.org/abs/1706.03762)。出典:概要、第1章(RNNの逐次計算の制約)、第3.1節(層の数と次元)、第3.2節(Scaled Dot-Product Attentionの式とマルチヘッドAttention)、第3.5節(位置エンコーディング)、第4章と表1(計算量の比較・解釈のしやすさ)、第5.2節(学習の時間)、第6.1節(BLEU 28.4)、第6.2節と表3(ヘッドの数・位置の埋め込み)を参照(2026年10月確認)
  2. *2 参考:PyTorch Documentation「torch.nn.functional.scaled_dot_product_attention」(https://docs.pytorch.org/docs/stable/generated/torch.nn.functional.scaled_dot_product_attention.html)。出典:関数の引数(attn_mask・is_causal)と、FlashAttention-2を含む3つの実装に関する説明を参照(2026年10月確認)
  3. *3 参考:Jacob Devlin ほか「BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding」(arXiv:1810.04805、2018年)(https://arxiv.org/abs/1810.04805)。出典:第3章のうち、多層の双方向Transformerエンコーダーという構造と、「Transformer encoder」「Transformer decoder」の呼び方、OpenAI GPTとの対比を参照(2026年10月確認)
  4. *4 参考:Alexey Dosovitskiy ほか「An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale」(arXiv:2010.11929、ICLR 2021)(https://arxiv.org/abs/2010.11929)。出典:概要と第1章のうち、画像をパッチに分けて標準のTransformerに入力する手順・中程度の規模のデータでの精度・1,400万〜3億枚のデータでの学習の記述を参照(2026年10月確認)
  5. *5 参考:Tri Dao ほか「FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness」(arXiv:2205.14135、2022年)(https://arxiv.org/abs/2205.14135)。出典:概要と第1章のうち、自己注意の時間とメモリーの計算量が系列の長さの2乗に比例する点、近似の方法の多くが処理時間を短くできていない点、メモリーの読み書きを減らす正確なAttentionの計算を参照(2026年10月確認)




View