特異値分解を解説する記事なんていくらでもありますが、LoRAに関連付けて話す記事なんてないと思うので、ここで書いてみます。まあ自分が特異値分解を理解するためでもあります。行列の右上カッコつき添え字に行数と列数を書きます。
参考記事:
yutomiyatake.github.io
LoRA
まずLoRAについて、重みの全結合層に対して、rank=のLoRAは重みの差分を学習します。学習後の重みはになります。LoRAはの列、の行を分解すると、
となって、rank=のLoRAをrank個分合計したような形になっています。
特異値分解
特異値分解はの行列を、
とする操作です。ここでは直交行列(転置すると逆行列になる行列)で、は特異値と呼ばれるものです。
図にすると以下のような形に変形できます。
どんどんLoRAと似たような形になっていくことが分かるでしょうか。
特異値分解の方法
が直交行列であることを考えると、
となります。これは対角化の形になっていますね。つまりの固有ベクトルを計算すれば、を求めることができます。特異値は固有値の平方根になっています。実装上でどうやってるかは知らないですけど、アルゴリズム的には解けることはわかりますね。
特異値分解とrank
正則行列をかけても階数が変わらないという性質を考えると、になります。は対角成分以外が0の行列ですので、非零の対角成分の個数がrankと一致します。つまり特異値の数がrankと一致します。
低ランク近似
特異値分解した結果、で、特異値は大きい順にソートされているとします。すると上位個の特異値のみを使った行列で近似することができます。です。0でない対角成分が個となるわけですから、となります。この近似を低ランク近似と呼びます。
特異値分解によるLoRAの抽出
特異値分解によって、LoRAの抽出が行えます。事前学習済みモデルの重みに対して、何らかのファインチューニングモデルがあるとすると、学習差分をLoRAの形に変換することができます。を特異値分解すれば、の形に変換できます。すると低ランク近似により、ランクのLoRAに近似できます。具体的にはで、, のようにすればできます。はとどっちに入れてもいいですけどね。
LoRAのリサイズ
任意のLoRAをそれより小さいランクのLoRAに近似することもできます。といってもほぼ抽出と同じで、LoRAのを計算して後は低ランク近似を用いて同様の操作をするだけです。ところでKohya氏によるLoRAのリサイズにはを自動で決める実装があります。決め方に三通りあります。何らかの閾値を決めて、
- 最大特異値に対して%の大きさまでの特異値を選ぶ。
- 特異値の累積和を求めて全体の%以上になるまで特異値を選ぶ。
- 特異値の累積二乗和を求めて全体の%以上になるまで特異値を選ぶ。
直感的には上の二つが分かりやすそうですが、3つ目には数学的な意味があります。
LoRAのマージ
LoRAのマージには重みをそのままマージする方法と、特異値分解を行う方法があります。
二つのLoRAをマージするとき、やりたいことはとなります(weightは省略)。しかし単に全重みをマージしたLoRAは、となって目標とは違うものになってしまいます。特異値分解を行う方法では、の低ランク近似を行います。これも近似ではありますが、全く別のLoRAをマージするときは特異値分解を行う方法の方が精度が高くなりそうです。ちなみにランクが上がってしまいますが、とすればマージ・・というかただの結合ですが精度を落とさず一つのLoRAにできます。
特異値とフロベニウスノルム
フロベニウスノルムとは、行列の各要素の二乗和の平方根です。という感じです。ユークリッド距離をそのまま行列に適用したような形ですね。実は特異値の二乗和はフロベニウスノルムの二乗と一致します。まずそれを確認します。
補題1. (は対角成分の和です。)
証明:
を行列とすると、ですので、対角成分は、となり
です。の場合も多分同じようなもん。
補題2. 直交行列をかけてもフロベニウスノルムは変わらない。つまり
証明:
補題1を使ってます。正の数なので両辺のルートをとれば成立です。系として両側からかけてもとなります。
定理:特異値の二乗和=フロベニウスノルムの二乗
特異値分解された形を考えれば、補題2を使って、
つまりLoRAのリサイズに特異値の二乗和を利用するのは、フロベニウスノルムを使った行列間の距離に基づく方法になります。閾値を%としたのは特異値の累積二乗和の平方根をとるより閾値を二乗したほうが計算も実装が楽だからだと思います。
低ランク近似の根拠
LoRAの抽出において、特異値を大きい順にソートして、個で打ち切ることで近似しましたが、これには根拠があります。以下の定理が成り立ちます。
エッカート・ヤングの定理.
ここでは低ランク近似を行った行列です。つまり低ランク近似はフロベニウスノルムを距離としたときに最適な近似ということです、
証明:
と特異値分解できるとすると、
となります。ここでとして、要素をとすると、
ここでとなるので、上の値とのrankをなるべく小さくしたいですね。このときまでのとでは0にすればrankももあがりません。あとはでの、です。これはそれぞれ、とすれば0になりますが、rankの制限のことを考えると、0より大きくしていいのは最大個です。そこで大きい順から個選んで、それ以外を0とすれば最適解になります。これはまさにそのものであり、になります。
LoConの特異値分解
この記事と関連しています。
畳み込み層と全結合層の関係とLoRAの畳み込みへの拡張について|gcem156
いままでは全結合層の重みについて話していきましたが、畳み込みニューラルネットワークでも同様の操作が行えます。LoConですね。畳み込みニューラルネットワークは、フィルター1回分の計算を考えてみると、入力チャンネル×フィルターサイズ→出力チャンネル×1の全結合層になります。この全結合層を位置を動かしながら適用するだけです。
フィルターサイズ3×3の畳み込み層の重みをとすれば、LoConはであり、要素の順番さえ気をつかえば特異値分解によるLoRA抽出も行えます。
CP分解についてはLyCORISで実装されていますが特異値分解とはまた別の分解でありよく分かっていません。
upの方を3×3にする方式は多分特異値分解による抽出は出来ないと思います。down層はin×9次元からrank×9次元への変換ですが、実際には9マスそれぞれ同じ重みを共有しているからです。つまりとしたいのですが、実際にはdownはではなく、になります。ただし特異値分解による抽出ができないだけで、マージはできます。2×2を2回適用する方法も特異値分解できないと思います。こっちはもはや行列としても表現しにくいです。ただしこちらもマージはできます。まあこの辺多分そうでしょうという感じで語ってます。