JA EN
体系線形代数
·無料·10分で読めます

LoRAとRAGを支える線形代数 — 固有値・低ランク・ベクトル検索を、動かして掴む

行列は空間の変形、固有ベクトルは変形しても向きが変わらない方向、SVDはその一般化、内積は「似ている」の定義。LoRAのΔW=BAとRAGのベクトル検索がどちらも同じ線形代数の上に建っていることを、4つの動く図と数式で確かめる。読むだけでなく、スライダーとドラッグで手を動かすためのコラム。

対象textタスクmath

行列は「表」ではなく「変形」

線形代数でつまずく最大の原因は、行列を数の表だと思って読むことです。表だと思うと、固有値も特異値もただの計算手順になってしまいます。

行列 AA は、空間をひしゃげさせる変形装置です。ベクトル vv を入れると、別のベクトル AvAv が出てくる。2×2なら平面の変形で、単位円(半径1の円)を入れると楕円になって出てきます。この見方に切り替わった瞬間、LoRAもRAGも同じ景色の上に見えてきます。

固有ベクトル — 変形しても向きが変わらない方向

たいていのベクトルは、AA を通すと向きが変わります。ところが特別な方向だけは、変形後も同じ直線の上に残ります。伸び縮みはするが、回らない。それが固有ベクトルで、伸び縮みの倍率が固有値です。

Av=λvA\boldsymbol{v} = \lambda \boldsymbol{v}
(1)

つまり、「AA で変形しても、vv は向きを保ったまま λ\lambda 倍されるだけ」という方向 vv を探す式です。λ\lambda(ラムダ)がその倍率。

2×2行列なら λ\lambda は手で解けます。det(AλI)=0\det(A - \lambda I) = 0 を展開すると、

λ2(a+d)λ+(adbc)=0\lambda^2 - (a+d)\,\lambda + (ad - bc) = 0
(2)

ただの二次方程式です。和 a+da+d(トレース)と積 adbcad-bc(行列式)だけで固有値が決まる、というのが式の言っていることです。判別式が負なら実数解がない——つまり「回転が混ざった変形には、向きを保てる実方向が存在しない」ことまで、二次方程式がそのまま教えてくれます。

下の図で確かめてください。点線の2本が固有ベクトルの方向です。vを回して、Avが同じ直線に乗る瞬間を探すこと。「回転ぎみ」のプリセットにすると点線が消えます——固有ベクトルが実在しない状態です。

FIG 12×2行列の変形。うすい点の輪が「単位円の行き先」。点線が固有ベクトルの方向で、vをその向きに合わせるとAvが同じ直線上に乗る(=λ倍されるだけ)

SVD — どんな行列も「回して・伸ばして・回す」

固有値の話は正方行列限定ですが、これを長方形の行列にまで広げたのが特異値分解(SVD)です。

A=UΣVA = U\Sigma V^{\top}
(3)

どんな行列 AA も、「回転 VV^\top → 軸ごとの伸縮 Σ\Sigma → 回転 UU」の3段に必ず分解できる、という定理です。Σ\Sigma の対角に並ぶ伸縮率 σ1σ2\sigma_1 \ge \sigma_2 \ge \dots が特異値で、大きい順に「その行列が持つ情報の強い方向」を表します。

この式が言っているのは要するに、どんなに複雑に見える変形も、中身は「向きを揃える → 軸ごとに伸ばす → 向きを戻す」の3手順しかないということです。UUVV は長さを変えない変換(回転や鏡映)で、伸び縮みを担当するのは Σ\Sigma だけ。だから「その行列がどういう性格か」は、Σ\Sigma に並ぶ数字だけを見ればほぼ分かります。

これを和の形に書き直すと、行列がrank-1の層の重ね合わせであることが見えます。

A=kσkukvkA = \sum_{k} \sigma_k\, \boldsymbol{u}_k \boldsymbol{v}_k^{\top}
(4)

各層 ukvk\boldsymbol{u}_k \boldsymbol{v}_k^\top は「1方向の情報」しか持たない最も薄い行列で、σk\sigma_k がその層の濃さです。上位 rr 層だけで打ち切ったものが低ランク近似で、これが打ち切りとして最良であることも証明されています(Eckart–Young の定理)。

要するにこの式は、行列とは薄い層を重ねたものだと言っています。σ1\sigma_1 の層がいちばん濃く、あとは順に薄くなっていく。上位 rr 枚だけ残して後ろを捨てても見た目がほとんど変わらないのは、捨てた層がもともと薄かったからです。

LoRA — 「更新は低ランクで足りる」への賭け

LoRAの式は、この打ち切りそのものの形をしています。

W=W+ΔW=W+BA,BRd×r, ARr×dW' = W + \Delta W = W + BA,\qquad B \in \mathbb{R}^{d\times r},\ A \in \mathbb{R}^{r\times d}
(5)

微調整で加えたい変化 ΔW\Delta W を、太い d×dd\times d 行列ではなく、細い2枚 BAB\cdot A(rank rrで表す。d=4096, r=8d=4096,\ r=8 なら、パラメータは d21678d^2 \approx 1678万個 から 2dr6.62dr \approx 6.6万個へ、0.4% になります。

この式が言っているのは要するに、元の重み WW には指一本触れず、その横に細い2枚を足すだけで微調整を済ませるということです。学習で動くのは BBAA だけで、WW は凍結したまま。だから同じ土台モデルに対して、用途ごとのLoRAを付け替えて使えます。

これが成立するのは、「微調整に必要な変化は少数の方向に集中している(=実質低ランクである)」という性質に賭けているからです。下の図は28×28の行列をrank-rrで再構成したものです。rを1から動かして、誤差が崩れ落ちる場所を見てください。784個の数が、56×r個でほぼ再現できてしまいます。

FIG 2左が元の行列W、右がrank-rの再構成BA。rを上げると誤差%が急落し、パラメータ数は56×rでしか増えない。LoRAのΔW=BAはこの図の右側だけを学習する

数式の対応をはっきりさせておくと——LoRAの BBσkuk\sigma_k \boldsymbol{u}_k たちを束ねた細長い行列、AAvk\boldsymbol{v}_k^\top たちを束ねた平たい行列に相当します。SVDと違って学習で求める点だけが異なります。詳細はLoRA論文の解説SVDと低ランク近似へ。

内積 — 「似ている」の定義

RAG側の主役は内積です。定義は2つの顔を持ちます。

ab=iaibi=abcosθ\boldsymbol{a}\cdot\boldsymbol{b} = \sum_i a_i b_i = \|\boldsymbol{a}\|\,\|\boldsymbol{b}\|\cos\theta
(6)

左は「成分を掛けて足すだけ」という計算の顔、右は「長さ×長さ×向きの一致度」という幾何の顔です。同じ向きなら正で大きく、直交なら0、逆向きなら負。「似ている」を数にする装置として、これ以上単純なものはありません。

要するにこの式は、掛けて足すという機械的な計算が、そのまま「向きがどれだけ揃っているか」を測ってしまうと言っています。計算しているのは左辺だけなのに、右辺の角度の情報がついてくる。検索が内積1発で済むのはこのためです。

FIG 3bを回すと内積が正→0→負と変わる。cosθが「向きの一致度」で、これが類似度の正体

長さの影響を消したければ、長さで割ります。これがコサイン類似度です。

cos_sim(a,b)=abab\mathrm{cos\_sim}(\boldsymbol{a},\boldsymbol{b}) = \frac{\boldsymbol{a}\cdot\boldsymbol{b}}{\|\boldsymbol{a}\|\,\|\boldsymbol{b}\|}
(7)

内積から長さの寄与を取り除き、向きだけを比べる式です。値は必ず −1〜1 に収まります。つまり、長い文書と短い文書を同じ土俵に載せるための式だ、ということです。

ベクトル検索 — RAGの心臓部で起きていること

RAGの検索は、質問文と文書をどちらも埋め込みベクトルにして、「質問に最も近い文書 top-k」を取り出す操作です。近さの物差しは、いま見た内積・コサイン・ユークリッド距離のどれかです。

どれを選んでも同じに見えますが、正規化していない内積は事故を起こします。埋め込みの長さは文書の長さや語の頻度に引きずられるため、「声の大きい文書」が向きが違っても上位に割り込むのです。下の図でクエリ qq をドラッグし、物差しを切り替えてください。わざと長くしてある房Cが、内積のときだけ不当に勝ち始めます。

FIG 4qをドラッグしてtop-5の顔ぶれを観察する。「内積」に切り替えると、向きが違うのに長いベクトル(房C)が割り込む。コサインなら向きだけで選ばれる

なお、全部のベクトルを単位長に正規化してしまえば3つの物差しは同じ順位を返します。ab2=22ab\|\boldsymbol{a}-\boldsymbol{b}\|^2 = 2 - 2\,\boldsymbol{a}\cdot\boldsymbol{b}(単位ベクトル同士のとき)なので、距離の近さと内積の大きさが同じ情報になるからです。実務のRAGが埋め込みを正規化して内積検索する理由は、この一行に尽きます。全体の流れはRAGを1から、埋め込み自体は埋め込みを1からで解説しています。

現場ではこう使う

MLエンジニア(微調整担当) — LoRAの rr は上の低ランク図の rr そのものです。r=8, lora_alpha=16 あたりから始め、タスクが複雑なら rr を上げます。誤差曲線が崩れ落ちる前で止めるのがコツで、rr を倍にしても品質が動かなければ変化は低ランクで足りている証拠です。

検索・RAG基盤の担当 — 埋め込みをDBに入れる前に必ず正規化します(faiss.normalize_L2、pgvectorなら vector_cosine_ops)。指標の混在は静かに壊れる典型で、「インデックスは内積・クエリだけ正規化」のような不一致は精度低下として現れ、原因究明に丸一日かかります。

落とし穴 — 固有値・特異値は数値計算では順序も符号も揺れます。「上位r個」を取るときは必ず絶対値でソートすること。もう1つ、コサイン類似度は分布の偏った埋め込みでは全文書が0.8以上に張り付くことがあり、閾値ではなく順位で使うのが安全です。

設計レビューでよく問われる2問 — 「なぜLoRAはrankをそこまで小さくしても効くのか」と「なぜ埋め込みを正規化するのか」。前者は「微調整で必要な変化が少数の方向に集中しているから」、後者は「単位長に揃えれば内積・コサイン・距離が同じ順位を返すから」。どちらも上の2つの図がそのまま答えになっています。

まとめ

数式は4本だけでした。4本とも、上の図でスライダーを動かした感覚と一対一に対応しています。

コメント

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