前章の最後で、私は「AIの計算の正体は行列の掛け算だ」と述べた。GPUが数千のコアで押し流しているのは、この単純な数の演算の途方もない繰り返しだ。
「線形代数」と聞くと身構えるかもしれない。だが恐れることはない。その本質は、記号の難しさではなく、たった一つの発想にある。あらゆるデータを「空間の中の点(ベクトル)」として捉え、それを「変換(行列)」する。この幾何学的な直感さえ掴めば、AIが世界をどう「見て」いるかが見えてくる。この章は、Part 7でニューラルネットを自作するための数学の土台だ。
なぜ数学が必要か — 歴史の必然
コンピュータは数しか扱えない(第1章)。ならば、猫の画像も、文章も、音声も——AIに扱わせるには、すべてを数の列に変換せねばならない。
- 画像 → ピクセルの明るさを並べた数の列
- 文章 → 単語を表す数の列(第20章で詳しく)
- ユーザーの好み → 各ジャンルへの関心度を並べた数の列
この「数の列」こそがベクトルだ。そして、いったんデータをベクトルにしてしまえば、「似ているか」「どう変換するか」を数学の計算で扱える。AIの知能とは、突き詰めればベクトルをうまく変換し、比較する技術なのだ。線形代数は、そのための共通言語である。
ベクトル — 「空間の中の矢印」
ベクトルとは、数を順に並べたものだ。だがその真価は、それを空間の中の点(あるいは原点からの矢印)として捉えたときに現れる。
2つの数の組 は、2次元平面上の一点を指す。3つなら3次元空間の点。そして——ここが重要だ——数を100個並べれば「100次元空間の点」になる。人間には想像できないが、数学的には何の問題もない。AIは日常的に、数百〜数千次元の空間でデータを扱う。
2次元ベクトル (3, 2) の図示:
y
3 │
2 │ ● (3, 2) ← 空間の中の一点
1 │ ╱
└──────────── x
0 1 2 3
各データを「空間の点」として置くと、
「近い点=似ている」という幾何学が使えるようになる
この「データ=空間の点」という見方が決定的だ。似たデータは空間内で近くに、異なるデータは遠くに配置されるように学習させれば、「似ている/似ていない」を距離という数値で測れる。第20章で見る「王 − 男 + 女 ≒ 女王」という有名な計算も、単語をベクトルにして空間に配置したからこそ可能になる。
厨房のアナロジー — 料理を「味の座標」で表す
一皿の料理を、数字で表現してみよう。たとえば5つの軸で採点する:(甘さ, 辛さ, 酸味, 塩味, うま味)。
- 麻婆豆腐 = (1, 9, 2, 6, 8)
- カレー = (3, 7, 3, 5, 7)
- ショートケーキ = (9, 0, 3, 1, 2)
これで各料理が「5次元の味空間の一点」になった。麻婆豆腐とカレーは空間内で近い(どちらも辛くうま味が強い)。ショートケーキは遠く離れている。
私が飲食店でメニューを考えたとき、無意識にこれをやっていた。「この料理はあの料理と方向性が近い」「これは真逆の味」——頭の中で味を多次元の座標として比較していたのだ。AIが「似た商品をおすすめする」のも、まさにこれと同じ。商品を味の代わりに何百もの特徴でベクトル化し、空間内で近いものを探しているだけなのだ。
内積 — 「似ている度」を測る
2つのベクトルが「どれくらい似た方向を向いているか」を測るのが内積(dot product)だ。AIで最も頻繁に登場する演算と言っていい。
計算は単純で、対応する成分同士を掛けて、すべて足す:
内積の幾何学的な意味が本質だ。2つのベクトルのなす角を とすると:
- 同じ方向を向く(, )→ 内積が大きい → よく似ている
- 直交する(, )→ 内積がゼロ → 無関係
- 逆方向(, )→ 内積が負 → 正反対
つまり内積は「似ている度」の数値化だ。大きさの影響を除いて向きだけを見るコサイン類似度()は、検索・推薦・そして第20章の単語の意味比較で中心的な役割を果たす。第21章のTransformerのAttentionも、その核心は「クエリとキーの内積で関連度を測る」——つまりこの内積だ。
import numpy as np
mabo = np.array([1, 9, 2, 6, 8]) # 麻婆豆腐
curry = np.array([3, 7, 3, 5, 7]) # カレー
cake = np.array([9, 0, 3, 1, 2]) # ショートケーキ
def cosine_sim(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(f"麻婆 vs カレー: {cosine_sim(mabo, curry):.3f}") # 高い(似ている)
print(f"麻婆 vs ケーキ: {cosine_sim(mabo, cake):.3f}") # 低い(似ていない)
行列 — 「ベクトルを変換する装置」
行列(matrix)とは、数を格子状に並べたものだ。だがその本質は、ベクトルを別のベクトルに変換する「装置」だという点にある。
行列 をベクトル に掛けると、新しいベクトル が生まれる:
この変換は、空間を回転させたり、伸縮させたり、別の次元へ写したりする。たとえば2次元の点を回転させる、100次元のデータを10次元に圧縮する——すべて行列の掛け算一つで表せる。
計算規則は「行 × 列の内積」だ。結果の各成分は、行列の各行とベクトルの内積になっている:
ここで、前章のGPUの話と繋がる。この計算は、独立した大量の内積(掛けて足す)でできている。だからこそ、SIMTで数千のコアに配って一斉に計算できる。AIの「行列演算」とGPUの「超並列」は、こうして必然的に結びついている。
ニューラルネットの1層 = 行列変換
なぜこれがAIに直結するのか。第19章で作るニューラルネットの「1層」の計算は、実は行列を掛けて、ずらすだけだ:
(重み行列)が入力ベクトル を変換し、(バイアス)でずらす。ニューラルネットとは、この行列変換を何層も積み重ねたものに他ならない。「AIの学習」とは、この行列 の中身(数値)を、うまく調整することそのものなのだ。
import numpy as np
# ニューラルネットの1層: 3次元入力 → 2次元出力
x = np.array([1.0, 2.0, 3.0]) # 入力ベクトル
W = np.array([[0.2, 0.8, -0.5], # 重み行列 (2行 × 3列)
[0.1, -0.3, 0.9]])
b = np.array([0.5, -0.2]) # バイアス
y = W @ x + b # 行列変換 + ずらし(@ が行列積)
print(y) # 2次元の出力ベクトル
# この W の中身を学習で調整するのが「AIが賢くなる」ということ
次元という言語 — 高次元の直感
AIが数百・数千次元を扱うと聞くと怖気づくかもしれない。だが「次元」とは、単にデータを表現する特徴の数にすぎない。味の例で軸を5つ使ったように、単語や画像を表すのに数百の軸を使う、というだけだ。
高次元空間には人間の直感が効かない不思議な性質もある(次元の呪い——高次元では点同士がどれも遠くなりがち、など)。だが基本の操作は次元数によらず同じだ。足し算・内積・行列変換——この3つが、2次元でも1000次元でも、まったく同じ規則で動く。AIは、この一貫した数学の上で、人間には見えない高次元空間の中でデータの構造を捉えている。
まとめ — 「おまじない」の消し方
- すべてをベクトルにする:画像も文章も好みも、数の列=空間の点として表す。これがAIの入り口
- ベクトルは空間の点:似たデータは近く、異なるデータは遠くに配置される幾何学が使える
- 内積は似ている度:向きが揃うほど大きい。コサイン類似度は検索・推薦・Attentionの心臓
- 行列は変換装置:ベクトルを回転・伸縮・射影する。 がニューラルネットの1層
- AIの学習=行列の調整:大量の内積からなる行列演算だからこそ、GPUの超並列と結びつく
「AIの計算とは何なのか」——その答えは、データを空間の点として捉え、行列で変換し、内積で比較するという、意味の幾何学にあった。
だが、まだ核心が残っている。学習とは「行列 をうまく調整すること」だと述べた。では、どうやってその膨大な数値を、正しい方向へ調整するのか。その答えを与えるのが、次章の主役——偏微分と勾配降下法だ。
「世界を理解するとは、それを正しい言葉で書き直すことだ。線形代数とは、複雑な現実を『点と変換』という驚くほど単純な言葉に翻訳する、AIのための文法である。」