DIVE

Part 6: 並列ハード・数学基盤

第 17 章

行列とベクトル — AIが世界を『数』で捉える方法

前章の最後で、私は「AIの計算の正体は行列の掛け算だ」と述べた。GPUが数千のコアで押し流しているのは、この単純な数の演算の途方もない繰り返しだ。

「線形代数」と聞くと身構えるかもしれない。だが恐れることはない。その本質は、記号の難しさではなく、たった一つの発想にある。あらゆるデータを「空間の中の点(ベクトル)」として捉え、それを「変換(行列)」する。この幾何学的な直感さえ掴めば、AIが世界をどう「見て」いるかが見えてくる。この章は、Part 7でニューラルネットを自作するための数学の土台だ。


なぜ数学が必要か — 歴史の必然

コンピュータは数しか扱えない(第1章)。ならば、猫の画像も、文章も、音声も——AIに扱わせるには、すべてを数の列に変換せねばならない。

この「数の列」こそがベクトルだ。そして、いったんデータをベクトルにしてしまえば、「似ているか」「どう変換するか」を数学の計算で扱える。AIの知能とは、突き詰めればベクトルをうまく変換し、比較する技術なのだ。線形代数は、そのための共通言語である。


ベクトル — 「空間の中の矢印」

ベクトルとは、数を順に並べたものだ。だがその真価は、それを空間の中の点(あるいは原点からの矢印)として捉えたときに現れる。

2つの数の組 (3,2)(3, 2) は、2次元平面上の一点を指す。3つなら3次元空間の点。そして——ここが重要だ——数を100個並べれば「100次元空間の点」になる。人間には想像できないが、数学的には何の問題もない。AIは日常的に、数百〜数千次元の空間でデータを扱う。

2次元ベクトル (3, 2) の図示:
    y
  3 │
  2 │      ● (3, 2)  ← 空間の中の一点
  1 │    ╱
    └──────────── x
    0  1  2  3

各データを「空間の点」として置くと、
「近い点=似ている」という幾何学が使えるようになる

この「データ=空間の点」という見方が決定的だ。似たデータは空間内で近くに、異なるデータは遠くに配置されるように学習させれば、「似ている/似ていない」を距離という数値で測れる。第20章で見る「王 − 男 + 女 ≒ 女王」という有名な計算も、単語をベクトルにして空間に配置したからこそ可能になる。


厨房のアナロジー — 料理を「味の座標」で表す

一皿の料理を、数字で表現してみよう。たとえば5つの軸で採点する:(甘さ, 辛さ, 酸味, 塩味, うま味)。

これで各料理が「5次元の味空間の一点」になった。麻婆豆腐とカレーは空間内で近い(どちらも辛くうま味が強い)。ショートケーキは遠く離れている。

私が飲食店でメニューを考えたとき、無意識にこれをやっていた。「この料理はあの料理と方向性が近い」「これは真逆の味」——頭の中で味を多次元の座標として比較していたのだ。AIが「似た商品をおすすめする」のも、まさにこれと同じ。商品を味の代わりに何百もの特徴でベクトル化し、空間内で近いものを探しているだけなのだ。


内積 — 「似ている度」を測る

2つのベクトルが「どれくらい似た方向を向いているか」を測るのが内積(dot product)だ。AIで最も頻繁に登場する演算と言っていい。

計算は単純で、対応する成分同士を掛けて、すべて足す:

a⃗⋅b⃗=a1b1+a2b2+⋯+anbn=∑i=1naibi\vec{a} \cdot \vec{b} = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n = \sum_{i=1}^{n} a_i b_i

内積の幾何学的な意味が本質だ。2つのベクトルのなす角を θ\theta とすると:

a⃗⋅b⃗=∣a⃗∣ ∣b⃗∣cos⁡θ\vec{a} \cdot \vec{b} = |\vec{a}|\,|\vec{b}| \cos\theta

つまり内積は「似ている度」の数値化だ。大きさの影響を除いて向きだけを見るコサイン類似度(cos⁡θ\cos\theta)は、検索・推薦・そして第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)とは、数を格子状に並べたものだ。だがその本質は、ベクトルを別のベクトルに変換する「装置」だという点にある。

行列 AA をベクトル x⃗\vec{x} に掛けると、新しいベクトル y⃗\vec{y} が生まれる:

y⃗=Ax⃗\vec{y} = A\vec{x}

この変換は、空間を回転させたり、伸縮させたり、別の次元へ写したりする。たとえば2次元の点を回転させる、100次元のデータを10次元に圧縮する——すべて行列の掛け算一つで表せる。

計算規則は「行 × 列の内積」だ。結果の各成分は、行列の各行とベクトルの内積になっている:

(y1y2)=(abcd)(x1x2)=(ax1+bx2cx1+dx2)\begin{pmatrix} y_1 \\ y_2 \end{pmatrix} = \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} = \begin{pmatrix} a x_1 + b x_2 \\ c x_1 + d x_2 \end{pmatrix}

ここで、前章のGPUの話と繋がる。この計算は、独立した大量の内積(掛けて足す)でできている。だからこそ、SIMTで数千のコアに配って一斉に計算できる。AIの「行列演算」とGPUの「超並列」は、こうして必然的に結びついている。

ニューラルネットの1層 = 行列変換

なぜこれがAIに直結するのか。第19章で作るニューラルネットの「1層」の計算は、実は行列を掛けて、ずらすだけだ:

y⃗=Wx⃗+b⃗\vec{y} = W\vec{x} + \vec{b}

WW(重み行列)が入力ベクトル x⃗\vec{x} を変換し、b⃗\vec{b}(バイアス)でずらす。ニューラルネットとは、この行列変換を何層も積み重ねたものに他ならない。「AIの学習」とは、この行列 WW の中身(数値)を、うまく調整することそのものなのだ。

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は、この一貫した数学の上で、人間には見えない高次元空間の中でデータの構造を捉えている。


まとめ — 「おまじない」の消し方

  1. すべてをベクトルにする:画像も文章も好みも、数の列=空間の点として表す。これがAIの入り口
  2. ベクトルは空間の点:似たデータは近く、異なるデータは遠くに配置される幾何学が使える
  3. 内積は似ている度:向きが揃うほど大きい。コサイン類似度は検索・推薦・Attentionの心臓
  4. 行列は変換装置:ベクトルを回転・伸縮・射影する。y⃗=Wx⃗+b⃗\vec{y}=W\vec{x}+\vec{b} がニューラルネットの1層
  5. AIの学習=行列の調整:大量の内積からなる行列演算だからこそ、GPUの超並列と結びつく

「AIの計算とは何なのか」——その答えは、データを空間の点として捉え、行列で変換し、内積で比較するという、意味の幾何学にあった。

だが、まだ核心が残っている。学習とは「行列 WW をうまく調整すること」だと述べた。では、どうやってその膨大な数値を、正しい方向へ調整するのか。その答えを与えるのが、次章の主役——偏微分と勾配降下法だ。


「世界を理解するとは、それを正しい言葉で書き直すことだ。線形代数とは、複雑な現実を『点と変換』という驚くほど単純な言葉に翻訳する、AIのための文法である。」