教科書 › 第0部 数学の土台
CHAPTER 0-1

並べると計算になる ── 線形代数

無料10分

深層学習のコードを読むと、ほとんどの行が「行列をかける」か「要素ごとにかける」のどちらかです。この章では、その2つを定義から置き、形(shape)が合う条件と、固有値・ランクという2つの見方を入れます。第3章の誤差逆伝播も、第8章の注意機構も、ここで置いた記号のまま書けます。

1. 内積 ── 「どれだけ同じ向きか」を1つの数にする

定義. nn 次元のベクトル x,y∈Rnx, y \in \mathbb{R}^n に対し、内積を

x⊤y  =  ∑i=1nxiyix^{\top} y \;=\; \sum_{i=1}^{n} x_i y_i
(1)

で定める。また ∥x∥=x⊤x\|x\| = \sqrt{x^{\top}x} を xx の長さ(ユークリッドノルム)という。

幾何的には x⊤y=∥x∥ ∥y∥cos⁡θx^{\top}y = \|x\|\,\|y\|\cos\theta です(θ\theta は2つの向きのなす角)。ここから

cos⁡θ  =  x⊤y∥x∥ ∥y∥\cos\theta \;=\; \frac{x^{\top}y}{\|x\|\,\|y\|}
(2)

で、長さを打ち消した「向きだけの一致度」が取れます。式(2)がコサイン類似度で、埋め込みの比較に使う量そのものです(第10章)。

FIG 1b の向きと長さを動かすと、内積とコサイン類似度が別々に動く。長さを変えても角度が同じならコサインは変わらない——式(2)で長さが打ち消えていることが目で見える

数値例. x=(1,2,3)⊤x = (1,2,3)^{\top}、y=(7,9,11)⊤y = (7,9,11)^{\top} のとき x⊤y=1⋅7+2⋅9+3⋅11=58x^{\top}y = 1\cdot7 + 2\cdot9 + 3\cdot11 = 58。

2. 行列積 ── 内積を並べただけのもの

定義. A∈Rm×kA \in \mathbb{R}^{m \times k}、B∈Rk×nB \in \mathbb{R}^{k \times n} に対し、積 AB∈Rm×nAB \in \mathbb{R}^{m \times n} の第 (i,j)(i,j) 成分を

(AB)ij  =  ∑p=1kAipBpj(AB)_{ij} \;=\; \sum_{p=1}^{k} A_{ip} B_{pj}
(3)

で定める。

式(3)の右辺は、AA の第 ii 行と BB の第 jj 列の内積です。つまり行列積は内積を m×nm \times n 個並べた表にすぎません。AA の列数と BB の行数が一致していなければならない理由も、式(3)を見れば分かります。足し合わせる添字 pp が両方に出てくるので、その範囲が同じでなければ和が書けません。

数値例. 実際に計算すると、

A=(123456),B=(789101112),AB=(5864139154)A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix},\quad B = \begin{pmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{pmatrix},\quad AB = \begin{pmatrix} 58 & 64 \\ 139 & 154 \end{pmatrix}

(2,3)×(3,2)→(2,2)(2,3) \times (3,2) \to (2,2) と形が縮みました。成分を1つ確かめます。(AB)22=4⋅8+5⋅10+6⋅12=32+50+72=154(AB)_{22} = 4\cdot8 + 5\cdot10 + 6\cdot12 = 32 + 50 + 72 = 154。

注意. ABAB と BABA は一般に別物です。上の例では BABA は (3,3)(3,3) 行列になり、形すら違います。

3. アダマール積 ── 形が同じでなければ書けない

定義. 同じ形の C,D∈Rm×nC, D \in \mathbb{R}^{m \times n} に対し、アダマール積(要素ごとの積)を

(C∘D)ij  =  CijDij(C \circ D)_{ij} \;=\; C_{ij} D_{ij}
(4)

で定める。

式(3)と式(4)は見た目が似ていますが、求められる形が正反対です。行列積は「内側の次元が一致」、アダマール積は「全部の次元が一致」。

数値例.

(123456)∘(201132)=(20341512)\begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} \circ \begin{pmatrix} 2 & 0 & 1 \\ 1 & 3 & 2 \end{pmatrix} = \begin{pmatrix} 2 & 0 & 3 \\ 4 & 15 & 12 \end{pmatrix}

アダマール積が主役になる場所は決まっています。活性化関数の微分を勾配にかけるとき(第3章の式に ∘\circ が出ます)と、ゲートで通す量を調節するとき(第5章の LSTM)です。

4. ランク ── 「実質いくつの方向があるか」

定義. 行列 AA のランク rank(A)\mathrm{rank}(A) とは、AA の列ベクトルが張る空間の次元をいう。

行や列が互いの定数倍で書けてしまうと、見た目の大きさよりも「実質の方向の数」が少なくなります。

数値例.

E=(123246101)E = \begin{pmatrix} 1 & 2 & 3 \\ 2 & 4 & 6 \\ 1 & 0 & 1 \end{pmatrix}

第2行は第1行の2倍です。3×33 \times 3 なのに、独立な行は2本しかありません。実際に特異値を計算すると 8.4354, 0.9183, 0.0000 となり、0でない特異値の数は2。これが rank(E)=2\mathrm{rank}(E) = 2 です(ランクは0でない特異値の個数に等しい)。

FIG 228×28 の行列を、上位 r 個の特異方向だけで組み直す。ランク r のつまみを上げるほど元の絵に近づく。少ない r でかなり近づくなら、その行列は「実質それだけの方向しか持っていない」

この見方が効くのは、大きな行列を小さな2枚の積で置き換えられるときです。ΔW∈Rd×d\Delta W \in \mathbb{R}^{d \times d} をランク rr に限ると ΔW=BA\Delta W = BA(BB は d×rd \times r、AA は r×dr \times d)と書けて、持つ数は d2d^2 から 2dr2dr に減ります。LoRA がやっていることはこれです(第9章)。

5. 固有値と対角化 ── 行列が回せない向き

定義. 正方行列 AA に対し、Av=λvAv = \lambda v(v≠0v \neq 0)を満たす λ\lambda を固有値、vv を固有ベクトルという。

固有ベクトルの向きは、AA をかけても向きが変わらず、長さだけ λ\lambda 倍になる向きです。

FIG 32×2 行列は単位円を楕円に変形する。v の向きを回していくと、変形後も同じ直線に乗る向きが見つかる——それが固有ベクトルで、伸び率が固有値

導出. Av=λvAv = \lambda v は (A−λI)v=0(A - \lambda I)v = 0 と書けます。v≠0v \neq 0 の解があるのは A−λIA - \lambda I が逆行列を持たないときで、それは det⁡(A−λI)=0\det(A - \lambda I) = 0 と同値です。2×22 \times 2 で書き下すと

det⁡ ⁣(a−λbcd−λ)=λ2−(a+d)λ+(ad−bc)=0\det\!\begin{pmatrix} a-\lambda & b \\ c & d-\lambda \end{pmatrix} = \lambda^2 - (a+d)\lambda + (ad - bc) = 0
(5)

つまり λ2−(trA)λ+det⁡A=0\lambda^2 - (\mathrm{tr}A)\lambda + \det A = 0。

数値例. F=(2112)F = \begin{pmatrix} 2 & 1 \\ 1 & 2 \end{pmatrix} では trF=4\mathrm{tr}F = 4、det⁡F=3\det F = 3 なので λ2−4λ+3=0\lambda^2 - 4\lambda + 3 = 0、よって λ1=3, λ2=1\lambda_1 = 3,\ \lambda_2 = 1。対応する固有ベクトルは (1,1)⊤/2(1,1)^{\top}/\sqrt{2} と (−1,1)⊤/2(-1,1)^{\top}/\sqrt{2} です。

対角化. 固有ベクトルを列に並べた PP と、固有値を並べた対角行列 Λ\Lambda を作ると A=PΛP−1A = P\Lambda P^{-1} と書けます。FF は対称なので PP は直交行列で、P−1=P⊤P^{-1} = P^{\top}。実際に PΛP⊤P \Lambda P^{\top} を計算すると元の (2112)\begin{pmatrix} 2&1\\1&2\end{pmatrix} に戻ります。

ここから繰り返しかける計算が一気に軽くなります。

Ak=(PΛP−1)k=PΛP−1PΛP−1⋯PΛP−1=P Λk P−1A^{k} = (P\Lambda P^{-1})^{k} = P\Lambda P^{-1}P\Lambda P^{-1}\cdots P\Lambda P^{-1} = P\,\Lambda^{k}\,P^{-1}
(6)

途中の P−1PP^{-1}P が全部 II で消えるので、残るのは対角行列の kk 乗——つまり各固有値を kk 乗するだけです。検算します。F4F^4 を素直に4回かけると (41404041)\begin{pmatrix} 41 & 40 \\ 40 & 41 \end{pmatrix}。一方 PΛ4P⊤P\Lambda^4 P^{\top} は λ4=81,1\lambda^4 = 81, 1 を使って同じ (41404041)\begin{pmatrix} 41 & 40 \\ 40 & 41 \end{pmatrix}。一致しました。

式(6)は第5章で効いてきます。RNN は同じ重みを時刻の数だけかける計算なので、固有値が1より大きければ λk\lambda^k が発散し、小さければ0に潰れます。勾配爆発と勾配消失は、式(6)の Λk\Lambda^k の話です。

6. テンソルの形合わせ ── 実装で9割これ

深層学習の「テンソル」は、添字が3本以上ある数の並びです。実装で詰まるのはほぼ形の不一致なので、1層分を具体的に追います。

バッチ32件・入力784次元を、128次元に線形変換する層は

X⏟(32, 784)  W⏟(784, 128)  →  XW⏟(32, 128)\underbrace{X}_{(32,\,784)} \; \underbrace{W}_{(784,\,128)} \;\to\; \underbrace{XW}_{(32,\,128)}

内側の 784 が消え、外側の 32 と 128 が残ります(式(3)の形のまま)。掛け算の回数は 32×784×128=3,211,26432 \times 784 \times 128 = 3{,}211{,}264 回です。

バイアス bb は (128,)(128,) の1本しかありませんが、32行すべてに同じものを足します。これがブロードキャストで、形の足りない軸を「同じ値の繰り返し」として扱う規則です。(32,128)+(128,)→(32,128)(32,128) + (128,) \to (32,128)。

この章で言っていないこと

  • 非対称行列の対角化は扱っていません。 A=PΛP−1A = P\Lambda P^{-1} が書けるのは固有ベクトルが nn 本そろう場合で、そろわない行列もあります(ジョルダン標準形の話は使いません)。
  • 特異値分解(SVD)は「ランク=0でない特異値の個数」という事実だけを使い、導出はしていません。rank\mathrm{rank} の定義は列空間の次元の方を採っています。
  • 数値計算の誤差(丸め・条件数)は扱っていません。上の特異値 0.0000 は厳密な0ではなく、計算で 10−1610^{-16} 程度に落ちた値です。

本文の数値はすべて実際に計算して確かめています(行列積・アダマール積・特異値・固有値・F4F^4 と PΛ4P⊤P\Lambda^4P^{\top} の一致)。

もっと詳しく

コメント

コメントにはログインが必要です