TransformerLens入門:GPT-2 の Attention を可視化して「LLMの中身」を覗いてみた
はじめに — 50代サラリーマンが LLM の「中身」を見たくなった話
私は IT 企業で働く 50代のサラリーマンで、ほとんどプログラミング経験がないまま
「自分で LLM を作ってみたい」と思い立ち、学習を始めました。
そんな中、Anthropic のブログで
「AI が言っていることと、内部で考えていることが違う場合がある」
という記事を読み、大きな衝撃を受けました。
「それなら、中身を自分の目で見てみたい」
そう思って調べていくと、海外では “解釈可能性(Interpretability)” という分野の研究が進んでいることを知りました。
そして TransformerLens を触ってみたところ、
「意外と自分でも扱えそうだ…!」
と感じ、今回この記事を書くことにしました。
この記事では Google Colab 上で GPT-2 Small の Attention を可視化するところまで を、最小のコードで紹介します。
解釈可能性(Interpretability)とは?
解釈可能性とは 「モデルがどのように判断しているかを、人間が理解しようとする試み」 のことです。
私自身 nanoGPT を作ってみて感じたのですが、Transformer の内部は、
まるで “専門家が集まった会議” のようになっています。
- Attention の専門家 → 過去の文脈を参照して「こういう情報が重要だよ」と意見する
- MLP の専門家 → パターンを見つけて「次はこの方向じゃないか」と意見する
- 残差ストリーム → それらの意見をすべて受け取って更新されていく「現在の考え」
というように、それぞれが 次のトークンを予測するために意見を持ち寄る仕組み になっています。
この視点を知ると、「Attention を可視化する」という行為は、
「誰がどこを見て、どんな意見を出しているのか」を覗き見る ことだと分かります。
ただし今回は、難しい理屈には踏み込みません。
まずはシンプルに 「実際に図を出してみる」 ところから始めてみましょう。
TransformerLens とは?
TransformerLens は、解釈可能性研究を進める Neel Nanda 氏が開発したライブラリです。
特徴を一言でまとめると:
Transformer の内部(Attention・MLP・残差ストリームなど)を、Python から簡単に覗けるツール
具体的には:
- GPT-2 Small を 1 行でロードできる
- Attention Pattern を簡単に取得できる
- Hook 機能で中間層のテンソルが自由に取り出せる
- CircuitsVis と連携して図として表示できる
「LLM の内部を理解したい」という最初の一歩に最適なライブラリです。
Google Colab で環境を準備する
以下のコードをそのまま貼れば動きます。
1. ライブラリのインストール
!pip install transformer-lens circuitsvis
2. モデルを読み込む
from transformer_lens import HookedTransformer
import torch
import circuitsvis as cv
device = "cuda" if torch.cuda.is_available() else "cpu"
model = HookedTransformer.from_pretrained("gpt2-small", device=device)
3. テキストをトークン化
text = "The cat sat on the mat because it was tired."
tokens = model.to_tokens(text)
str_tokens = model.to_str_tokens(text)
4. run_with_cache で中間層のデータを取得
logits, cache = model.run_with_cache(tokens)
cache には、モデルが logits を計算するまでの、各層の Attention Weight や MLP の出力など、全ての中間データが辞書形式で格納されています。
5. Layer 0 の Attention Pattern を取り出す
layer = 0 # 表示したいレイヤ
pattern = cache[f"blocks.{layer}.attn.hook_pattern"][0] # shape: [n_heads, seq, seq]
Attention を可視化してみる
CircuitsVis で Attention 図を表示
head = 0 # 表示したいヘッド番号
cv.attention.attention_patterns(
tokens=str_tokens,
attention=pattern[head:head+1].detach().cpu().numpy()
)
実行すると、Attention の流れが視覚化されて表示されます。

図:GPT-2 Small Layer 0, Head 0 の Attention Pattern
横軸:参照されているトークン
縦軸:現在のトークン
「濃いマス」は「この位置のトークンが、どの単語を強く参照しているか」を示します。
文章によっては:
- 直前の語を見るヘッド
- 主語に戻るヘッド
- because の前後を見て文の因果を補完するヘッド
など、ヘッドごとの“役割”がなんとなく見えてきます。
AI がどこを見て、どう次の語を選んでいるのかが、目に見える形で理解できます。
まとめ
この記事では次のことを行いました。
- TransformerLens をインストールした
- GPT-2 Small を読み込んだ
- run_with_cache で Attention Pattern を取得した
- CircuitsVis で Attention を図として表示した
これだけでも、
「LLM の内部は完全なブラックボックスではない」
という感覚をつかめたのではないでしょうか。
以上で TransformLens を使った「LLM の中身の可視化」の最初の一歩は完了です。
次回予告
次回は、LLM が文中の “誰” を指しているのかを判断する
IOI(Indirect Object Identification)回路を扱います。
これは「Attention の可視化」から一歩進んだ、
“モデルはどんな因果関係を内部で追っているのか?” を理解する入口です。
今回の内容がわかった今なら、
LLM がどんな仕組みで「意味」を組み立てているのかが、ぐっと見えやすくなります。
次回もぜひ一緒に、LLM の中身を探検していきましょう!
Discussion