深層学習のコードを読むと、ほとんどの行が「行列をかける」か「要素ごとにかける」のどちらかです。この章では、その2つを定義から置き、形(shape)が合う条件と、固有値・ランクという2つの見方を入れます。第3章の誤差逆伝播も、第8章の注意機構も、ここで置いた記号のまま書けます。
1. 内積 ── 「どれだけ同じ向きか」を1つの数にする
定義. n 次元のベクトル x,y∈Rn に対し、内積を
x⊤y=i=1∑nxiyi (1)
で定める。また ∥x∥=x⊤x を x の長さ(ユークリッドノルム)という。
幾何的には x⊤y=∥x∥∥y∥cosθ です(θ は2つの向きのなす角)。ここから
cosθ=∥x∥∥y∥x⊤y (2)
で、長さを打ち消した「向きだけの一致度」が取れます。式(2)がコサイン類似度で、埋め込みの比較に使う量そのものです(第10章)。
FIG 1b の向きと長さを動かすと、内積とコサイン類似度が別々に動く。長さを変えても角度が同じならコサインは変わらない——式(2)で長さが打ち消えていることが目で見える
数値例. x=(1,2,3)⊤、y=(7,9,11)⊤ のとき x⊤y=1⋅7+2⋅9+3⋅11=58。
2. 行列積 ── 内積を並べただけのもの
定義. A∈Rm×k、B∈Rk×n に対し、積 AB∈Rm×n の第 (i,j) 成分を
(AB)ij=p=1∑kAipBpj (3)
で定める。
式(3)の右辺は、A の第 i 行と B の第 j 列の内積です。つまり行列積は内積を m×n 個並べた表にすぎません。A の列数と B の行数が一致していなければならない理由も、式(3)を見れば分かります。足し合わせる添字 p が両方に出てくるので、その範囲が同じでなければ和が書けません。
数値例. 実際に計算すると、
A=(142536),B=791181012,AB=(5813964154)
(2,3)×(3,2)→(2,2) と形が縮みました。成分を1つ確かめます。(AB)22=4⋅8+5⋅10+6⋅12=32+50+72=154。
注意. AB と BA は一般に別物です。上の例では BA は (3,3) 行列になり、形すら違います。
3. アダマール積 ── 形が同じでなければ書けない
定義. 同じ形の C,D∈Rm×n に対し、アダマール積(要素ごとの積)を
(C∘D)ij=CijDij (4)
で定める。
式(3)と式(4)は見た目が似ていますが、求められる形が正反対です。行列積は「内側の次元が一致」、アダマール積は「全部の次元が一致」。
数値例.
(142536)∘(210312)=(24015312)
アダマール積が主役になる場所は決まっています。活性化関数の微分を勾配にかけるとき(第3章の式に ∘ が出ます)と、ゲートで通す量を調節するとき(第5章の LSTM)です。
4. ランク ── 「実質いくつの方向があるか」
定義. 行列 A のランク rank(A) とは、A の列ベクトルが張る空間の次元をいう。
行や列が互いの定数倍で書けてしまうと、見た目の大きさよりも「実質の方向の数」が少なくなります。
数値例.
E=121240361
第2行は第1行の2倍です。3×3 なのに、独立な行は2本しかありません。実際に特異値を計算すると 8.4354, 0.9183, 0.0000 となり、0でない特異値の数は2。これが rank(E)=2 です(ランクは0でない特異値の個数に等しい)。
FIG 228×28 の行列を、上位 r 個の特異方向だけで組み直す。ランク r のつまみを上げるほど元の絵に近づく。少ない r でかなり近づくなら、その行列は「実質それだけの方向しか持っていない」
この見方が効くのは、大きな行列を小さな2枚の積で置き換えられるときです。ΔW∈Rd×d をランク r に限ると ΔW=BA(B は d×r、A は r×d)と書けて、持つ数は d2 から 2dr に減ります。LoRA がやっていることはこれです(第9章)。
5. 固有値と対角化 ── 行列が回せない向き
定義. 正方行列 A に対し、Av=λv(v=0)を満たす λ を固有値、v を固有ベクトルという。
固有ベクトルの向きは、A をかけても向きが変わらず、長さだけ λ 倍になる向きです。
FIG 32×2 行列は単位円を楕円に変形する。v の向きを回していくと、変形後も同じ直線に乗る向きが見つかる——それが固有ベクトルで、伸び率が固有値
導出. Av=λv は (A−λI)v=0 と書けます。v=0 の解があるのは A−λI が逆行列を持たないときで、それは det(A−λI)=0 と同値です。2×2 で書き下すと
det(a−λcbd−λ)=λ2−(a+d)λ+(ad−bc)=0 (5)
つまり λ2−(trA)λ+detA=0。
数値例. F=(2112) では trF=4、detF=3 なので λ2−4λ+3=0、よって λ1=3, λ2=1。対応する固有ベクトルは (1,1)⊤/2 と (−1,1)⊤/2 です。
対角化. 固有ベクトルを列に並べた P と、固有値を並べた対角行列 Λ を作ると A=PΛP−1 と書けます。F は対称なので P は直交行列で、P−1=P⊤。実際に PΛP⊤ を計算すると元の (2112) に戻ります。
ここから繰り返しかける計算が一気に軽くなります。
Ak=(PΛP−1)k=PΛP−1PΛP−1⋯PΛP−1=PΛkP−1 (6)
途中の P−1P が全部 I で消えるので、残るのは対角行列の k 乗——つまり各固有値を k 乗するだけです。検算します。F4 を素直に4回かけると (41404041)。一方 PΛ4P⊤ は λ4=81,1 を使って同じ (41404041)。一致しました。
式(6)は第5章で効いてきます。RNN は同じ重みを時刻の数だけかける計算なので、固有値が1より大きければ λk が発散し、小さければ0に潰れます。勾配爆発と勾配消失は、式(6)の Λk の話です。
6. テンソルの形合わせ ── 実装で9割これ
深層学習の「テンソル」は、添字が3本以上ある数の並びです。実装で詰まるのはほぼ形の不一致なので、1層分を具体的に追います。
バッチ32件・入力784次元を、128次元に線形変換する層は
(32,784)X(784,128)W→(32,128)XW
内側の 784 が消え、外側の 32 と 128 が残ります(式(3)の形のまま)。掛け算の回数は 32×784×128=3,211,264 回です。
バイアス b は (128,) の1本しかありませんが、32行すべてに同じものを足します。これがブロードキャストで、形の足りない軸を「同じ値の繰り返し」として扱う規則です。(32,128)+(128,)→(32,128)。
この章で言っていないこと
- 非対称行列の対角化は扱っていません。 A=PΛP−1 が書けるのは固有ベクトルが n 本そろう場合で、そろわない行列もあります(ジョルダン標準形の話は使いません)。
- 特異値分解(SVD)は「ランク=0でない特異値の個数」という事実だけを使い、導出はしていません。rank の定義は列空間の次元の方を採っています。
- 数値計算の誤差(丸め・条件数)は扱っていません。上の特異値 0.0000 は厳密な0ではなく、計算で 10−16 程度に落ちた値です。
本文の数値はすべて実際に計算して確かめています(行列積・アダマール積・特異値・固有値・F4 と PΛ4P⊤ の一致)。
もっと詳しく
コメント
コメントにはログインが必要です