線形代数 入門

Transformer の図解を読む前に必要な最低限の線形代数。9 つの短いトピックで、ベクトル、行列、 その基本演算、ドット積、行列積、コサイン類似度、ノルム、そしてアテンションで多用する 転置 / reshape をカバーする。高校レベルの代数を超える前提知識は不要。

01

ベクトル(Vector)

順序のある数字の列 —— しかも、どこかを指している。

じつはベクトルが何か、あなたはもう知っている —— ただそう呼んでいないだけ。住所 (中央通り 123 番地 4B 号室) を伝えるとき、それは順序のあるリストだ。 順序が肝心:「中央通り 123 番地の 4B 号室」は通じるが、要素を並べ替えれば意味不明。順序が意味をエンコードしている

画面で色を選ぶとき、(255, 0, 0) は鮮やかな赤、(0, 255, 0) は鮮やかな緑。 同じ 3 つの数字でも、順序が違えば別の色になる。GPS 座標 (37.78, −122.42) は サンフランシスコ;順序を入れ替えると南極に飛ばされる。順序こそが意味。

数学におけるベクトルとは、この発想を形式化したもの:順序のある数字の列で、 各位置が特定の意味を持つ。各数字を 成分(component)、成分の個数をベクトルの 次元(dimension) という。

教科書での記法:ベクトルは v = (v₁, v₂, …, vₙ) あるいは v = [v₁, v₂, …, vₙ] と書く —— 太字 v もよく使われる。 実数の n 次元ベクトルは ℝⁿ という空間にあり、これを v ∈ ℝⁿ と書く。例の [3, 4]ℝ² にある。

v34
2 次元ベクトル v = [3, 4]。各セルが 1 つの成分;セルの位置が重要。

ただ、ベクトルはラベル付きの箱ではない —— 幾何学的な意味を持つ。各成分を座標とみなすと、 ベクトルは空間内の点になる。慣例として、それを 原点から伸びる矢印 として描く。

v34
1 / 2
数列から、平面上の点へ、そして方向と長さを持つ矢印へ。▶ で再生、⏮ ⏭ で 1 フレームずつ移動できる。

矢印で描くと、ベクトルの本領が見えてくる。ベクトルは 方向(どこを指すか)と 大きさ(どれだけ長いか)を同時に持つ「方向のある量」だ。 「100 メートル歩いた」だけでは行き先は分からないが、「東に 100 メートル歩いた」と言えば 正確に行き先が伝わる。これがベクトルの強み。

意識して見ると、ベクトルは物理と日常のいたるところに潜んでいる:

  • :南西から吹く時速 20 マイル = 2 次元速度ベクトル。
  • :ドアに向かってソファを 50 N で押す = 3 次元力ベクトル。
  • RGB 色:画面の各ピクセルは 3 次元ベクトル(赤・緑・青)。
  • あなたの 1 日:(睡眠時間, 仕事時間, 運動時間) = 3 次元ベクトル。
  • 音楽:1 秒間に 44100 サンプル = N 次元ベクトル(N は巨大)。

同じ平面に 2 本目のベクトルも置ける:

v34
w12
2 本のベクトル vw が同じ座標系を共有。比較、加算、スケール —— 以降のすべての節は、こうしたペア(あるいはグリッド)のベクトルに対する演算だ。

ベクトルの真価は高次元で発揮される。ここでは見やすさのため 2D で 描いているが、本記事のあらゆる演算 —— 加算、スケール、ドット積 —— は 任意 の次元数に一般化できる。線形代数は、目で見えない空間に対しても 幾何学的な推論を可能にする。

Transformer では:各トークンが数百〜数千次元のベクトルになる。 単語 cat[0.42, −0.17, 0.88, …] のような値 (GPT-2 は 768 個、最大の OSS モデルは 16000 を超える)、dog は別の似た値のベクトル。モデルは単語そのものを「見て」いない —— この数字列だけを見て、そこからパターンを学ぶ。高次元空間で catdog 近くに位置すること、これがモデルが両者を関連語と「知る」仕組み。 LLM の知能は、各トークンがこのベクトル空間のどこに位置するかに宿っている。

02

行列(Matrix)

2 次元の数字の格子 —— あるいは、ベクトルを積み重ねたもの。

ベクトルと同じく、行列もすでに使ったことがある —— あらゆるスプレッドシートが行列だ: 生徒を行、試験成績を列にした成績表;曜日を行、時間帯を列にした週間スケジュール。 デジタル写真を限界まで拡大した姿も、各セルにピクセル輝度が入った行列 (RGB なら 3 枚積み重ね)。

形式的には、行列は 2 次元の数字の格子。ベクトルが 1 つの軸(長さ)しか持たないのに対し、 行列は の 2 つの軸を持つ。表記は常に「行 × 列」——2 × 3 の行列は 2 行 3 列、逆ではない。

教科書での記法:R × C の実行列は M ∈ ℝR×C と書く。第 i 行・第 j 列の要素は Mij (コードでは通常 M[i][j])。

M (2 × 3)
123456
1 / 3
ひとつの行列、ふたつの読み方。(長さ 3)を強調、次に (長さ 2)を強調。同じ数字、別のベクトル。

この「行で読むか、列で読むか」の二重性こそ、行列の隠れた超能力。同じ格子でも、 どちらに切るかで意味が大きく変わる。

小さなオンラインストアの売上行列を考えよう:

            月    火    水
  T シャツ    4     7     2
  マグカップ  1     0     5
  本          3     2     1

方向で読めば、各行は商品の週間売上(T シャツは 4 + 7 + 2 = 13)。方向で読めば、各列はその日の全商品の売上(月曜は 4 + 1 + 3 = 8)。 ひとつの格子に両方の見方が成り立つ;どちらを使うかは問題による。

行列はベクトルにはできないこともする:変換を表す。行列は、ひそかに 関数 でもある —— 入力にベクトルを与えると、別のベクトルが返ってくる。 具体的な計算は第 06 節(行列積)で詳しくやるが、要点は:回転・拡大縮小・剪断・射影 —— ベクトルに施せるおよそすべての線形操作を、整然とした 1 枚の数字の格子に詰め込める、 ということ。

だから行列はグラフィックス、物理、機械学習のあちこちに登場する:

  • 3D ゲームでモデルを回す = 各頂点に 3×3 の回転行列を掛ける。
  • 写真のリサイズ = ピクセル行列にスケーリング行列を掛ける。
  • ニューラルネットの 1 層 = 入力ベクトルに学習済みの重み行列を掛ける。
  • 検索エンジンは数百万の文書を巨大な行列の各行に格納している。
  • マルコフ連鎖は「遷移行列」で次の状態を予測する。

Transformer では:学習可能なパラメータのほぼ全てが、なんらかの行列に収まる。埋め込み行列V × D(V ≈ 50,000 行、各行に学習済み D 個の数値)。 アテンションの投影行列 WQWK WV はそれぞれ D × D で、 トークンベクトルを Query / Key / Value 空間に変換する。 70 億パラメータのモデルは、機械的には、ひとにぎりの大きな行列 + その掛け算の規則。

03

加減(Add / Subtract)

2 つの「方向のある量」を 1 つにまとめる。

ベクトル同士の足し算は、直感どおりの動作をする。

東に 3 ブロック歩いた後、向きを変えて 北に 4 ブロック歩いたら、どこに着く?「東に 3、北に 4」と別々のままではなく、 新しいひとつの場所 —— 出発点から東に 3、北に 4 —— に着いている。この終着点こそが、 2 つの歩行ベクトルのだ。

ルールは単純:成分ごとに足す。2 つのベクトルは同じ次元でなければならない (2 次元の歩行ベクトルを 3 次元には足せない。緯度と価格を足せないのと同じ)。u = [3, 1]v = [1, 2] の和は [3+1, 1+2] = [4, 3]

教科書での記法:任意の添字 i について (u + v)i = ui + vi。 両ベクトルは同じ空間にある必要がある —— 形式的には u, v ∈ ℝn なら u + v ∈ ℝn

算術は易しい部分。直感を生むのは幾何のほうだ。v の 「しっぽ」を u の「頭」につなぐと、原点から v の新しい先端へ伸びる矢印が u + v —— これが「先端と末端をつなぐ」ルール。 地図上で自分の歩いた経路をたどるのと同じだ。

u31
v12
1 / 3
3 フレーム:uv を並べ、成分ごとに足して [3+1, 1+2] = [4, 3]、そして v のしっぽを u の頭につなぐ —— 原点から新しい先端へ伸びる矢印が u + v。元の 2 本と和で三角形ができる (4 本とも原点から描けば平行四辺形)。

これは抽象的な数学遊びではない。船乗り・パイロット・気象予報士は毎日ベクトル加算を使う: 北東に 10 ノットで進むヨットが、南へ 3 ノットの潮流の中にあるとき、実際の 進行方向と速度は、これら 2 ベクトルを先端と末端でつないだ合成ベクトルだ。 パイロットはこれを「対地航跡と機首方位」と呼ぶ。間違えれば飛行機は別の国に着く。

引き算は同じ発想で符号を 1 つ反転するだけ。u − v は 「v に何を足せば u になるか」—— 同じことだが、 「両者の指す向きの差」。

u31
v12
u − v = [3−1, 1−2]
u−v2-1
u − v = [3−1, 1−2] = [2, −1]。成分ごと、負数も OK。

引き算がこっそり重い仕事をしている場面:「この 2 つはどれだけ違うか」を問うとき、答えは 引き算。2 つの RGB 色?引き算すれば、どのチャネルがどれだけ違うか正確に出る。 2 人のプレイヤーのスキルプロファイル?引き算。差ベクトルの長さが、 2 人がどれだけ似ていないかを定量化する。

Transformer では:現代の深層学習で間違いなく最重要のアーキテクチャ手法、残差接続(residual connection)がベクトル加算そのもの。各層の出力は入力に 足し戻される:xout = xin + Layer(xin)。 上で見た成分ごとの足し算が、ここに直接出てくる。これがあるから、情報は 100 層以上を 滲まずに流れる。残差接続なしでは深層 Transformer はそもそも学習できない。

04

スカラー倍(Scalar Multiplication)

伸ばす・縮める・反転する —— 大きさを変える、あるいは向きを反転する。

スカラー(scalar) はベクトル(数の列)に対して 1 つの数のこと。 語源は "scale"(尺度・拡大縮小):スカラーはベクトルを何倍にするかを表す。 ベクトルに 2 を掛ければ長さ 2 倍(向きはそのまま)、0.5 を掛ければ半分、 −1 を掛ければ反対向きに反転(長さは不変)。

ルールはシンプル:全成分にそのスカラーを掛けるv = [2, 1] なら 2v = [4, 2]−v = [−2, −1]0.5v = [1, 0.5]

教科書での記法:任意のスカラー α ∈ ℝ とベクトル v ∈ ℝn に対し、積は成分ごとに (αv)i = α · vi

v21
2 × [2, 1]
2v42
1 / 3
3 つのフレーム:2v 長さ 2 倍、−v 方向反転、0.5v 長さ半分。方向は保持(または完全反転)、長さだけが変わる。

あなたはすでに何千回もスカラー倍をしている、ただそう呼んでいないだけ:

  • レシピ倍量。材料ベクトル (卵 2, 小麦粉 1 カップ, 牛乳 0.5 カップ) に 2 を掛けると (卵 4, 小麦粉 2 カップ, 牛乳 1 カップ)。全成分が一緒にスケール。
  • 音量つまみ。音声波形はサンプル値の列。全体に 0.5 を掛ければ小さく、 2 を掛ければ大きく(クリッピングは別問題)。
  • 写真の拡大縮小。各ピクセルの座標に倍率を掛ける。2 倍拡大なら 各ピクセルが中心から 2 倍遠ざかる。
  • 進行方向の反転。車の速度ベクトルに −1 を掛ければ、同じ速度で逆向き (同じ速さでバックする)。

3 つの覚えどころ:

  • 正のスカラーは方向を保つ。長さはスカラー倍。
  • 負のスカラーは方向を反転。長さは絶対値倍。
  • 0 はベクトルを原点に潰す(長さ 0)。1 は何も変えない。

スカラー倍は本記事で最も単純な演算だが、軽く見てはいけない。 ニューラルネット学習を支える勾配降下法 —— その 1 イテレーションが、本質的にスカラー倍だ。 機械学習でよく聞く「学習率(learning rate)」は、勾配ベクトルをスケールして重みから引く、その スカラーそのもの:

new_weights = old_weights − learning_rate · gradient

学習率が大きすぎると学習が振動して発散、小さすぎると学習が遅々として進まない。 このスカラー 1 つの調整が、機械学習実務で最もよく出てくる作業の 1 つ。

Transformer では:上の学習率更新に加え、いくつかの要所でスカラー倍が動く。softmax 温度は正規化前に logits をスケールする(softmax は Transformer 章で詳述)。アテンションスケーリングはドット積スコアを √dk で割って、 次元が大きくなっても値が安定するようにする。勾配クリッピングの 「最大ノルムまで縮める」もただのスカラー倍。 「全体に数を掛ける」と見えたら、その裏ではスカラー倍が働いている。

05

ドット積(Dot Product)

ディープラーニングで断トツに使われる演算。

本記事から 1 つだけ覚えるなら、ドット積を覚えてほしい。 以後のあらゆる概念 —— アテンション、類似度、射影、行列積 —— は どれもドット積が形を変えただけのものだ。

手順は単純:同じ次元の 2 ベクトルを取り、対応する成分を掛けて足す。 結果は 1 つの数。これがすべて。

教科書での記法:総和記号で書くと

u · v = ∑i=1n ui vi

教科書によってはドット積を ⟨u, v⟩ と書く —— 同じもので、内積(inner product)とも呼ぶ。

u34
v21
1 / 4
u = [3, 4]v = [2, 1]。対応する成分を掛けて [6, 4]、 足して 6 + 4 = 10。よって u · v = 10

ドット積は地味に見える。だが、ひそかに強力な質問に答えている:この 2 ベクトルはどれくらい揃っているか?

あなたと友人がそれぞれ「映画ジャンル選好」ベクトルを 0–5 で書いたとする:

             アクション  コメディ  恋愛  ホラー  SF
  あなた     5           3         1     2       4
  友人 A     5           3         0     3       4   ← あなたと一致
  友人 B     0           2         5     0       1   ← あなたと正反対

あなたと各友人のドット積を計算する。正例 —— A とは: 5·5 + 3·3 + 1·0 + 2·3 + 4·4 = 56反例 —— B とは: 5·0 + 3·2 + 1·5 + 2·0 + 4·1 = 15

A の値が大きいのは、好みが同じジャンルで重なっているから(同じ行で両方が大きな数字)。 B の値が小さいのは、B が高得点をつけたジャンルがあなたの興味薄、あなたが高得点をつけた ジャンルが B の興味薄 —— つまり山が噛み合わないから。同じ演算、正反対の結果:たった 1 つの数で、誰があなたと同じ映画を 楽しめるかの順位が一発で出る。レコメンドシステムの源流はこれそのもの。

なぜこの単純な操作で「揃い具合」が測れるのか?魔法のすべては 掛け算 の中に隠れている: 積 a · b が大きくなるのは、両方の数が大きく、しかも同符号 のときだけ —— 掛け算は次元ごとの「両者ともに満たす」AND ゲートのように働く。

例の「アクション」列を 1 つ追ってみよう。あなたは 5、友人 A も 5、積は 5 · 5 = 25 —— 総和への大きな寄与。なぜなら 2 人ともアクション好きだから。 友人 B は 0 で、積は 5 · 0 = 0 —— 寄与はゼロ。 あなたが好きなジャンルに B は無関心だから。噛み合わない箇所は静かに 0(または小さな数)を 貢献するだけで、両方向の一致がある箇所だけが大きく貢献する。

全次元にわたって足し合わせると、実は「2 人が一致した回数」を数えているのと 同じこと。数が大きいほど、2 ベクトルは「揃って」いる。全機構はこれだけ —— しかも任意の次元に一般化できる。だから同じ演算が、映画の相性スコアにも LLM のアテンションにも同じように使える。

もう一つ、きれいな幾何学的意味がある:

u · v = ‖u‖ · ‖v‖ · cos(θ)

二重縦線 ‖v‖ は「v の長さ」のこと —— 第 08 節で正式にノルム(norm)として登場する。

つまりドット積は 3 つの情報を 1 つの数に詰める:u の長さ、v の長さ、向きの揃い具合。 同方向 → 大きな正の数。直交 → ちょうど 0。逆方向 → 大きな負の数。

u · v > 0
1 / 3
同方向 → 大きな正の数。直交 → ちょうど 0。逆方向 → 大きな負の数。

直交のケースが特に強烈:直交する 2 ベクトルのドット積はちょうど 0。 方向の情報は何ひとつ共有していない。あなたの選好ベクトルが誰かのと直交するなら、 二人は映画で絶対に合意しない。これは数学的に強い主張で、たった数回の掛け算と足し算から 即座に導かれる。

ドット積を「2 つがどれくらい揃っているか」と読み替えると、応用が一気に開ける:

  • 3D グラフィックスの光源処理。面の明るさは「光線方向」と「面法線」の ドット積。光に正対 = 明るい。斜め = 暗い。背中 = 暗(または 0)。
  • Google の検索関連度。クエリはベクトル、各文書もベクトル。 ドット積で「クエリとどれだけ揃っているか」をランキングする。
  • スパムフィルタ。メール特徴はベクトル、モデルは学習した「スパム方向」を 持つ。ドット積大 = スパム可能性高い。

Transformer では:アテンションスコア。 「このトークンはあのトークンにどれだけ注目すべきか?」というあらゆる問いが、 ドット積 —— 具体的には Query ベクトルと Key ベクトルのドット積 —— で答えられる。 大きい → 「大いに注目」。ほぼ 0 → 「無視」。負 → 「積極的に抑制」。 この種のドット積を多層・多ヘッドで何十億回と積み重ねた結果が GPT。

06

行列積(Matrix Multiplication)

ドット積を一度にたくさん —— 現代 AI の主力演算。

ドット積を理解したあとなら、行列積はあとは記帳のような作業。R 行の行列 M とベクトル v を 掛けると、R 個の成分を持つ新しいベクトルが出てくる ——各成分は M の 1 行と v の 1 つのドット積。これがすべて。

M
1234
×
v
56
=
Mv
??
1 / 4
M · v:行ごとのドット積。行 0 → 17、行 1 → 39。よって Mv = [17, 39]

なぜ重要か。1 つの行列でベクトルを変換できるから —— 回転版、伸縮版、平面に射影した版、その他あらゆる線形変換。 第 02 節で「行列は関数のようなもの」と予告したが、その具体的な計算がこの掛け算だ。

具体例。第 02 節のオンラインストア(T シャツ、マグカップ、本)に各単価があるとする:

prices = [ T シャツ 20, マグカップ 8, 本 15 ]   # ベクトル

sales =  月     火     水
T シャツ  4      7      2
マグカップ 1     0      5
本        3      2      1                       # 3×3 行列

日ごとの売上を出すには、prices を販売行列に掛ければよい:

月の売上:  20·4 + 8·1 + 15·3 = 133
火の売上:  20·7 + 8·0 + 15·2 = 170
水の売上:  20·2 + 8·5 + 15·1 =  95

3 つのドット積、3 つの答え、1 回の演算。これが行列積 —— 行と列が何を表していても(揃い具合、加重和、射影など)、ドット積を一気に処理できる。

行列 × 行列。発想は同じで、右辺に複数の「v」を並べるだけ。 M が R × K、N が K × C なら、MN は R × C、 R · C 個の独立なドット積で計算される。両方の K が一致しないとダメ —— 初学者が必ずひっかかる「形状の規則」。

教科書での記法:MN の第 i 行・第 j 列の要素は

(MN)ij = ∑k=1K Mik Nkj

—— M の i 行目と N の j 列目のドット積そのもの。

行列積はあらゆる場所に潜んでいる、見えていないだけ:

  • 3D ゲーム。毎フレーム、全モデルの全頂点に「カメラ行列」を掛けて、 画面のどこに描くかを決めている。1 秒に数千万回の行列積。
  • PageRank。Google の元のアルゴリズムは、本質的に巨大な「リンク行列」を 自分自身に掛け続けて収束させるもの。
  • 画像フィルタ。シャープ化、ぼかし、エッジ検出 —— 小さな行列(カーネル)を画像のパッチに掛けて実現する。
  • 畳み込みニューラルネット。各層は画像パッチと学習済みフィルタ行列を掛けて エッジ・質感・形を検出する。1 枚の写真の認識に何兆回もの掛け算。

GPU の桁違いの速さ。現代の GPU は事実上、行列積のために作られている。 出力行列の各セルは互いに独立 —— 並列ハードウェアに完璧 —— だから何千ものドット積を同時に処理できる。コンシューマ GPU で 1 秒に数兆回の積和。 兆パラメータ規模のモデルをそもそも訓練できるのは、 行列積が GPU ハードウェアと美しく噛み合うからだ。

Transformer では:行列積は文字どおり Transformer そのもの。 1 層に最低でも:トークンを Q に投影する matmul、K に投影する matmul、 V に投影する matmul、アテンション出力を統合する matmul、フィードフォワード部の 2 つの matmul、 が含まれる。最後にもう 1 つ、隠れベクトルを語彙 logits に戻す matmul。 これを 32 〜 80 層積むと —— それが現代の LLM。訓練・推論の高速化は、 ほぼ「同じハードからどれだけ多くの matmul を絞り出すか」のエンジニアリングだ。

07

コサイン類似度(Cosine Similarity)

向きのみ、長さは正規化して消す。

ドット積を思い出そう。ドット積は 2 つの情報を混ぜている:長さ向きの揃い具合。多くの場面では揃い具合だけが欲しくて、長さの影響を消したい。 それがコサイン類似度の仕事。

映画の例を少し現実的にしてみよう。あなた は映画オタクで 0–10 尺度で評価する、 友人 A と B は第 05 節と同じ 0–5 で評価する、とする。3 つのベクトルは:

              アクション  コメディ  恋愛  ホラー  SF
あなた (0–10) 10          6         2     4       8
友人 A         5          3         0     3       4
友人 B         0          2         5     0       1

このデータでドット積を計算する:

  • あなた · A = 10·5 + 6·3 + 2·0 + 4·3 + 8·4 = 112
  • あなた · B = 10·0 + 6·2 + 2·5 + 4·0 + 8·1 = 30

第 05 節と同じく、A の方が合う —— だが、これらの値の半分はあなたの尺度が広いことが原因であり、嗜好が変わったからではない (第 05 節の 56 と 15 と比較:両方とも 2 倍になっている)。 生のドット積は「嗜好がどれだけ揃うか」と「どれだけ大きく採点するか」を混ぜていて、 どちらの寄与か区別できない。

解決法:ドット積を 2 ベクトルそれぞれの長さで割る。

cos_sim(u, v) = (u · v) / (‖u‖ · ‖v‖)

これで尺度が消え、方向だけが残る。u · v = ‖u‖ · ‖v‖ · cos(θ) なので、 長さで割れば長さは消え、ちょうど cos(θ) —— 2 ベクトルの なす角の余弦 —— が残る。値は常に [−1, 1]、採点尺度には依存しない。

各ベクトルのノルム(第 05 節で言った「長さ」)を計算する:

‖あなた‖ = √(10² + 6² + 2² + 4² + 8²) = √220 ≈ 14.83
‖A‖     = √(5²  + 3² + 0² + 3² + 4²) = √59  ≈  7.68
‖B‖     = √(0²  + 2² + 5² + 0² + 1²) = √30  ≈  5.48

代入:

  • cos_sim(あなた, A) = 112 / (14.83 × 7.68) ≈ 0.98 —— ほぼ同じ嗜好プロファイル。
  • cos_sim(あなた, B) = 30 / (14.83 × 5.48) ≈ 0.37 —— 多少重なるが、かなり違う。

これで数値自体が意味を持つ:0.98 は「ほぼ同じ嗜好」、0.37 は「弱く合う」。 もう一つ:仮にあなたも 0–5 で採点していたら(全成分を半分にして第 05 節と同じデータに戻す)、 コサインはまったく同じ 0.98 と 0.37 になる。 コサインは長さ/尺度を捨て、方向だけを残す —— この性質を スケール不変性(scale-invariance) と呼ぶ。

cos_sim = 0.99
1 / 3
ほぼ平行 → cos_sim ≈ 1。直交 → 0。逆方向 → −1。

実応用は本当に至るところに:

  • 文書検索。各文書も各クエリもベクトル化される(単語分布や意味埋め込み)。 コサイン類似度でテーマの揃い具合をランキング。長文書と短いクエリでも、 長さが正規化されるので公平に比較できる。
  • Spotify や Netflix の推薦。あなたの嗜好プロファイルがベクトル、 各曲・各映画もベクトル。推薦はおおよそ「あなたがまだ消費していないアイテムのうち、 コサイン類似度が最も高いもの」。
  • 剽窃検出。2 つの文書のベクトルで cos_sim が 1 に近ければ、 単語の構成・比率が酷似している可能性が高い。完璧な言い換えは検出できないが、 多くのケースを拾える。
  • 顔認識。各顔を 128 次元または 512 次元の「顔埋め込み」に変換。 2 つの顔の比較 = 埋め込みのコサイン類似度。閾値を超えたらマッチと判定。

Transformer では:アテンションスコアは厳密にはドット積で、コサインでは ない —— だが、ネットワーク自身がアテンション関連ベクトルを似たスケールに保つよう学習する ため、それらのドット積は実用上はコサイン類似度とよく似たふるまいになる。 モデルが「どの過去トークンが現在の新トークンに最も関連するか」を判定するのが、これ。 コサイン類似度は RAG(検索拡張生成)の「検索」側も支える: Pinecone、Weaviate、Qdrant、pgvector、Chroma … といった産業群が、 数十億の埋め込みベクトルを蓄え「このクエリに最も似ているのは?」を大規模に答えるためだけに 生まれた。

08

ノルム / 長さ(Norm)

ピタゴラスの定理 —— 任意の次元へ拡張。

問題:東に 3 ブロック歩いてから北に 4 ブロック歩いたとき、出発点からの距離は? 7 ブロックではない —— 遠回りしたわけではないから。あなたが歩いたのは 2 つの直角辺が 3 と 4 の直角三角形の斜辺で、ピタゴラスの定理から長さ √(3² + 4²) = √25 = 5 ブロック。 この斜辺がベクトル [3, 4]ノルム(norm)(または 長さ)で、‖v‖(二重縦線)と書く。

全アイデアはこれだけ。ベクトルのノルムは幾何学的な長さ —— 原点から先端までの距離。式はピタゴラスを「成分が何個あっても適用する」だけ。

v34
1 / 3
成分 3 と 4 が直角三角形の 2 辺、ベクトル本体が長さ 5 の斜辺。

D 次元への拡張も滑らか:

‖v‖ = √(v₁² + v₂² + … + vD²)

各成分を 2 乗、足し合わせ、平方根。終わり。2D、3D、100D、12288D —— 同じ手順がそのまま使える。

第 05–07 節の映画選好ベクトルでは、この数値は何を意味するのか。 元の 0–5 尺度データで各人のノルムを計算する:

  • ‖あなた‖ = √(5² + 3² + 1² + 2² + 4²) = √55 ≈ 7.42
  • ‖A‖ = √(5² + 3² + 0² + 3² + 4²) = √59 ≈ 7.68
  • ‖B‖ = √(0² + 2² + 5² + 0² + 1²) = √30 ≈ 5.48

これらは全体的な好みの強さ —— 全ジャンルにわたる「採点エネルギーの総量」と 読める。A はノルムが最大:複数ジャンルで強く採点しているから。B は最小:ほとんど 0 で、唯一「恋愛」だけが高いので合計が小さい。あなた はその中間。同じベクトルでも視点が変わる:コサインは 「2 つは揃っているか」を、ノルムは「これはどれだけ大きいか」を聞いている。

第 07 節の 0–10 尺度の「映画オタク」版のあなたに切り替えると、ノルムはちょうど 2 倍に なる。嗜好が変わったからではなく、採点尺度が広がったから。ノルムは大きさを拾い、コサインは無視する。

なぜ重要か。「これはどれくらい大きいか?」が至るところで問われるから。 ノルムがその答えになる:

  • GPS 距離。2 つの座標の直線距離は、両者の差ベクトルのノルム。
  • 音量。音声信号の「大きさ」は、おおむねサンプルベクトルのノルム。
  • 写真同士の比較。2 枚のピクセル行列を引き算した差ベクトルのノルムが、 視覚的にどれだけ違うかを教えてくれる。
  • 物理の速度。速度ベクトルのノルム = 速さ;力ベクトルのノルム = 力の大きさ。

役立つテクニックに 正規化(normalization): ベクトルを自身のノルムで割る。結果は同じ方向で長さがちょうど 1 のベクトル(「単位ベクトル」)。 方向だけを比べたいときに便利。コサイン類似度も同じ発想 —— ただし各ベクトルを先に 正規化するのではなく、ドット積を 2 つのノルムでまとめて割っている。

厳密には、今定義したのは L2 ノルム(ユークリッドノルム)で、 明示する場合は ‖v‖2 と添字を付ける。 他のノルムも存在する —— ‖v‖1 は成分の絶対値の総和、‖v‖ は最大成分の絶対値、等々。 ただし深層学習で「ノルム」と言えば、特に断りがない限り L2 を指す。

Transformer では:LayerNormRMSNorm —— 現代 Transformer のどの層にも入っている正規化レイヤ —— は、ノルムを計算して割ることで、 各トークンのベクトルをだいたい同じスケールに保ち、後続の計算を安定させる。勾配クリッピング(PyTorch 訓練ループ定番の torch.nn.utils.clip_grad_norm_)は勾配のノルムに上限を設けて、 ロス曲面が急になっても学習が爆発しないようにする。そしてさっき学んだコサイン類似度は、 まさに「ドット積を 2 つのノルムで割ったもの」。

09

転置と Reshape(Transpose & Reshape)

同じ数、別の形。

「生徒 × 試験成績」の表計算をイメージしよう。ある生徒の全試験スコア(1 行)を見たいときも、 ある試験の全生徒スコア(1 列)を見たいときもある。データは同じ、変わるのは読む方向。転置(transpose) はこれを形式化したもの: 対角線で折って行と列を入れ替える。MT と書く。

具体例。第 02 節の店舗売上行列を思い出そう:

              月     火     水
  T シャツ    4      7      2
  マグカップ  1      0      5
  本          3      2      1

行 = 商品、列 = 日。「どの日が最も売れたか?」を答えるには、列ごとに足し上げる必要があり、 やや面倒。転置すれば、同じデータが 行 = 日、列 = 商品 になる:

       T シャツ  マグカップ  本
  月      4         1        3
  火      7         0        2
  水      2         5        1

「火曜の売上」がたった 1 行で済む。同じ 9 個の数値、別のアクセスパターン。 次の演算に必要な方向へ、転置 1 回で形を合わせられる。

教科書での記法:M ∈ ℝR×C なら MT ∈ ℝC×R、要素は (MT)ij = Mji —— 行・列インデックスが入れ替わる。便利な恒等式:(AB)T = BTAT(積の転置は順序が反転)。

M (2 × 3)
123456
1 / 2
M(2 × 3) ⇄ MT(3 × 2)。M の各行が MT の対応する列になる。

要素を 1 つ追って確かめよう:M の 2 は第 0 行・第 1 列にいる。 転置後、その 2 は MT の 第 1 行・第 0 列に移る —— 行・列のインデックスが 入れ替わる。すべての要素が同時にこの入れ替えを行う。対角線上の要素(行 = 列)はその場、 それ以外は対角線で折り返される。

なぜこんなに頻繁に転置するのか。理由は 2 つ。

1 つめは形状の整合。行列積は内側の次元が一致しないと成立しない:(R × K) × (K × C) は OK だが、(R × K) × (R × C) はダメ。2 つの行列がほぼ掛けられそうなのに向きが違うだけなら、 片方を転置すれば形状が合う。

実例:アテンションスコア。Transformer では Q(query)と K(key)が共に (N トークン × D 特徴) という形。モデルが計算 したいのは、各 query 行 と 各 key 行 のドット積 —— N × N の「揃い度」グリッド。 だが行列積は 行 · 列 を計算するので、行 · 行 にはならない。K を転置して行を列に変えれば、Q · KT は 1 回の matmul で N × N 個の点積をすべて一気に出してくれる。 転置がなければ形状が合わない。

2 つめは 転置はほぼ無料。数値は実際にはメモリ上を動かない —— GPU が「行軸」と「列軸」のラベルを付け替えるだけ。タダ同然の操作で「形状不一致」エラーを まるごと退治できるなら、これは大きな恵み。

Reshape はさらに一般的な操作。同じ総数の数を、任意の新しい形に並べ直す。 2×3 行列(6 個)は 1×6 の行、6×1 の列、3×2 の行列、その他要素数 6 のどんな形にもできる。 データは一切変わらない、変わるのは「どう番地付けするか」だけ。

52 枚のトランプを想像してほしい。4 つのスート × 13 のランク で並べれば、 1 枚は「ハートの 7」で引ける。13 のランク × 4 つのスート で並べれば、 「7 のハート」で引ける。カードは動かない —— 変わるのは「どの次元から引くか」だけ。 Reshape も数値の塊に同じことをする。

M (2 × 3)
123456
MT (3 × 2)
142536
reshape (1 × 6)
123456
reshape (6 × 1)
123456
同じ 6 個 [1, 2, 3, 4, 5, 6] の 2 つの reshape:1×6 の行と 6×1 の列。

Reshape と転置 —— 微妙だが重要な違い。Reshape は数値の線形順序を保ち、ただ再グループ化する。行列 M = [[1, 2, 3], [4, 5, 6]] を 6 要素に reshape すると [1, 2, 3, 4, 5, 6](行ごとに走査)、それを 3×2 に reshape すると [[1, 2], [3, 4], [5, 6]] —— これはMT ではない(M の転置は [[1, 4], [2, 5], [3, 6]])。Reshape は再グループ化、転置は要素を実際に動かす。この 2 つを混同するのは、機械学習コードで最もよく見るバグの 1 つ。

Reshape は大したことに見えないかもしれない —— ただのラベル付け替えではないか? だがこれが現代 AI の中核アイデアの 1 つ、マルチヘッドアテンション (multi-head attention) の鍵。

仕掛けは 1 行のコード:x.reshape(N, 12, 64)。GPT-2 では各トークンが D = 768 次元のベクトル。この 1 行で 768 個の数値が 12 組 × 64 個として再解釈される —— このグループが「ヘッド(head)」。モデルは 12 ヘッドで 12 個の独立アテンションを 並列に走らせる。各ヘッドは特化できる:あるヘッドは文法、別のは長距離依存、 さらに別のは単複の一致を追う。12 ヘッドが終わったら x.reshape(N, 768) で 768 次元の単一ベクトルに戻し、次の処理へ進む。

Reshape はデータを 1 つも変えていない、変えるのは「次の演算がどう切り分けるか」だけ。 だがこの 1 つの工夫 —— 全体ではなく 12 個に分割したビューでアテンションを走らせる —— が Transformer の能力の大きな部分を支えている。

Reshape は他にもあちこちで活躍する:

  • 画像処理。28×28 のグレースケール画像は 784 個の数。 全結合層に渡すには 28 × 28784 × 1 に reshape する。 ピクセルは同じ、配置だけ違う。
  • バッチ訓練。16 枚の 28×28 画像は 16 × 28 × 28 のテンソル (3D 行列)に積まれ、GPU で並列訓練される。
  • 畳み込み。画像の「パッチ」をベクトルに reshape してフィルタ行列と掛ける。 Reshape → matmul → reshape して戻す、を繰り返す。

Transformer では:上のマルチヘッドアテンション(reshape の代表用途)以外にも、 転置は matmul の形状を合わせるたびに登場する —— アテンションの中心ステップ Q · KT も含めて。K の行を列にしないとドット積が成立しない。