特異値分解と低ランク近似 — LoRAの数学的な下地
特異値分解(SVD)を「回す・伸ばす・回す」の比喩から出発し、行列がrank-1の層の重ね合わせであること、実データでは少数の層だけで十分なこと(低ランク近似)までを前提知識ゼロから解説。LoRAが巨大モデルを0.4%のパラメータで微調整できる理由の、数学的な土台を作る。
LoRA: Low-Rank Adaptation of Large Language Models
一次資料 — この記事の根拠
論文の発表 2021-06-17→この解説の公開 2026-08-135年2か月後
LoRA: Low-Rank Adaptation of Large Language ModelsEdward J. Hu, Yelong Shen, Phillip Wallis ほか · 2021-06-17 · v2arXiv:2106.09685論文ページ·PDF原文の要旨(Abstract)を読む
An important paradigm of natural language processing consists of large-scale pre-training on general domain data and adaptation to particular tasks or domains. As we pre-train larger models, full fine-tuning, which retrains all model parameters, becomes less feasible. Using GPT-3 175B as an example -- deploying independent instances of fine-tuned models, each with 175B parameters, is prohibitively expensive. We propose Low-Rank Adaptation, or LoRA, which freezes the pre-trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks. Compared to GPT-3 175B fine-tuned with Adam, LoRA can reduce the number of trainable parameters by 10,000 times and the GPU memory requirement by 3 times. LoRA performs on-par or better than fine-tuning in model quality on RoBERTa, DeBERTa, GPT-2, and GPT-3, despite having fewer trainable parameters, a higher training throughput, and, unlike adapters, no additional inference latency. We also provide an empirical investigation into rank-deficiency in language model adaptation, which sheds light on the efficacy of LoRA. We release a package that facilitates the integration of LoRA with PyTorch models and provide our implementations and model checkpoints for RoBERTa, DeBERTa, and GPT-2 at https://github.com/microsoft/LoRA.
巨大な行列は、見た目ほど「大きくない」
LLMの微調整手法として定番になったLoRAは、数十億パラメータのモデルを、その1%にも満たない追加パラメータで調整してしまいます。40億個のダイヤルがある機械を、数百万個の小さなダイヤルだけでチューニングできると言っているわけで、常識的には無茶な話です。
なぜ可能なのか。答えの根っこにあるのが、この記事の主役、特異値分解(SVD: Singular Value Decomposition)です。
行列はただの数値の表に見えますが、実データから生まれた行列は、見た目のサイズほどの情報を持っていないことがほとんどです。1000×1000で100万個の数値が並んでいても、実質は「10方向分」の情報しかない——そういうことが現実には頻繁に起きます。SVDはこの「実質的な情報量」を正確に測り、行列の中身を重要な順に並べ直す道具です。並べ直せば後ろを捨てられます。捨てたものが低ランク近似で、それを微調整に応用したものがLoRAです。
比喩: どんな変形も「回す・伸ばす・回す」
行列をベクトルに掛けるという操作は、空間の変形として絵に描けます。薄いゴムシートに円を描いて置き、行列を作用させると、シートが歪んで円が別の形になる——そんなイメージです。歪み方は千差万別に見えます。斜めに引き伸ばすもの、ぺちゃんこに潰すもの、裏返すもの。ところがSVDは、驚くほど単純なことを主張します。
どんな行列の変形も、「①シートを回す → ②縦横の軸に沿って別々の倍率で伸び縮みさせる → ③もう一度回す」の3手順で必ず再現できる。
例外はありません。正方形でない行列でも、対称でない行列でも、どんな行列でも成り立ちます。3手順のそれぞれに名前が付いていて、①最初の回転が 、②軸ごとの倍率が特異値 、③最後の回転が です。
回転は形を変えないので、行列の「個性」は真ん中の倍率だけに集約されます。円は倍率の違いで楕円になり、長い軸が (一番伸ばされる方向)、短い軸が に対応します。倍率がほぼ0の軸は変形でぺちゃんこに潰される軸——その方向の情報を行列がほとんど伝えていない軸です。低ランク近似の物語は、もうここから始まっています。
直感: 行列は一枚岩ではなく「層の重ね合わせ」
SVDにはもう1つ、この記事の本題により近い読み方があります。行列 を、rank-1(1方向の情報しか持たない、最も単純な行列)の層の足し算に分解するという読み方です。
右辺は式というより買い物リストです。要するに「 = 1枚目の層 + 2枚目の層 + 3枚目の層 + …」と言っているだけで、各層に掛かる数字は右へ行くほど小さくなります。
式の意味を言葉にします。各層 は「入力のうち 方向の成分だけを測り、その量を 方向に出力する」だけの単機能な部品です。(特異値)はその層の音量つまみで、大きい層ほど行列全体の振る舞いへの寄与が大きい。音量の大きい層から順に重ねていけば、少ない層数で元の行列にどんどん近づいていきます。
「 方向の成分を測る」の正体は内積です。内積は「片方のベクトルに、もう片方をどれだけ重ねられるか」を1つの数にしたものでした。下の図で2本のベクトルを回して、この感覚を確かめてください。
つまりSVDとは、「回す・伸ばす・回す」という幾何の分解であると同時に、「行列を単機能部品に分解して重要度順に並べる」という棚卸しでもあります。ここから先は、この棚卸しの強力さを定理と数字で確かめます。
仕組み: 式で書くSVD
ここまでの話を1本の式にまとめます。
つまりこの1行は、「 をベクトルに掛ける」とは「回して()、軸ごとに別々の倍率で伸ばして()、もう一度回す()」ということだ、と言っています。さっきのゴムシートの話を、そのまま記号に置き換えただけです。
各記号の意味はこうです。 は の任意の行列(分解したい対象)。 は の直交行列で、列ベクトル (左特異ベクトル)は互いに直角な長さ1のベクトル——つまり回転(または鏡映)を表します。 も同じく の直交行列で、列が右特異ベクトル です。 は対角線上に特異値 が大きい順に並んだ の行列で、対角以外はすべて0です。
固有値分解と違い、SVDはどんな行列にも必ず存在します。正方でなくてもよく、対称である必要もない。この「無条件で使える」性質が、SVDが実務の第一選択になる理由です。
コメント
コメントにはログインが必要です