LoRAのランク(r)は高いほうがいいのか?

  • LoRAファインチューンでは様々なハイパーパラメータがあります。モデルとデータセットに合ったパラメータを選ぶことで、学習速度・精度が変わります。
  • 今日は主要なハイパーパラメータの一つであるLoRAランク (r)が気になったので、簡単な備忘録を書いておきます。

LoRAのランクとは

  • LoRA(Low Rank Adaptation)は、モデルの追加学習の際に膨大な重み行列を低ランク行列に分解することで計算資源を節約する手法です。
  • 低ランクに分解するとモデルが追加学習するパラメータ数が減るので、ランクを低い値に設定するほど計算コストが低下します。
  • 学習パラメータ数を減らすと学習精度も悪化するようにに思えますが「実はファインチューンの際の重みの変化は低い固有のランクを持っているため、低ランクでの学習でもフルのファインチューンに匹敵する精度を得られる」というのがLoRA論文の主張です。
    • 言語モデルにはある種の冗長性があって、重要なパラメータは低い固有次元に偏っている、と理解すればいいようです。
  • さて、このLoRAによる学習時の具体的なランクの値としては、8,16,32,64, 128 あたりがよく使われますが、この値の選び方について所説あるようです(別に8の倍数である必要はありません)。

「だからランクは低くて十分だよ」説

  • 上述のとおり、おおもとのLoRA論文では低いランクでも十分高い精度が期待できるとされています。具体的には、ランク8程度でもランク64とほとんど変わらない学習パフォーマンスを得たようです(GPT-3の場合)。
  • LoRAに量子化を組み合わてさらなる効率化を図ったQLoRA論文でも、8~64のどのランクを選んでも学習パフォーマンスの差はみられないという分析を示しています(Llama-1-7B、4bitのQLoRAの場合)。
  • 通常のファインチューンとして行うならランクは8ないし16(高くても32程度)でOK、というのがLoRAの一般的な考え方です。

「とはいえランクは高い方がいいよ」説

  • とはいえ計算資源に余裕があれば無理にランクを下げる必要はありません。場合によっては64や128などのランクを使いたくなるかもしれません。
  • 例えば前回のDoRA論文などをみると、フルのファインチューンとLoRAでは依然として学習精度にギャップが残るとする主張も根強いようです。
  • ランクを上げれば学習パラメータ数が増えるので、実質的にフルファインチューンに近くなるという想定ができます。
  • ドメイン知識追加の目的で最適なLoRAハイパーパラメータを探索した研究では、100程度の高いランクが効果的と示唆しています(Llama-2の場合)。

「むしろランクは低い方がいいよ」説

  • 一方で、ランクを上げると学習が不安定化するので値はむしろ低いほうがよい、とする検証結果もあります。
  • ランクの違いによるLlama-2モデルの挙動を調べた研究では、1)モデルの当惑度(perplexity)はLoRAランクを上げても改善しないうえ、r=2048など極端な値をとればむしろ悪化する、2)高いLoRAランクをとると勾配ノルムが破綻する、という結果を示しています。
  • 他にもモデルに日本語知識の追加を試みた検証では、Llama-2-7Bの場合にランクが低いほうが学習が安定したと報告しています(ただし13Bではランクの影響なし)。

雑感

  • 前提として、適切なランクの設定にはモデル、データセット、エポック数や学習率など他の要素との兼ね合いが重要で、一般化するのはあまりに難しい気がします。
  • そのうえで強いて言うなら、会話スタイルなど形式面のファインチューンを行いたい場合は8~16の低いランク、知識の追加など内容理解を伴うファインチューンを行うならもっと高めのランクがよさそうな印象です。
  • 一方で、高すぎるランクを使うと学習が不安定化するリスクがあり、また、当然ながら必要な計算コストも膨らみます。基本的に128~などの高いランクは避けたほうが無難に見えます。

補足:LoRAのアルファについて

  • ランク(r)とは別にLoRAにはアルファ(α)というハイパーパラメータもあります。
  • アルファはLoRAにおけるスケーリングファクターで(weight += (lora_B @ lora_A) * (alpha / r))、学習がモデルの重みに与える影響を強さを決定します。例えばr=32, α=16なら、32/16=2倍のスケールとなります。
  • よく使われるのはLoRA論文の実装で使われた2倍(つまりランクの半分のアルファ)ですが、スケールは1倍がよいという人、2.5倍や3倍がよいという人もいて、ケースバイケースのようです。
  • QLoRA論文では、アルファは常に学習率に比例するとして、ランクとは独立にアルファを固定しています(ランクより小さい、つまり1倍未満のスケールを採用している)。
  • アルファを高めに設定しても基本的に問題なさそうですが、学習率が高めになる場合には、対応して下げざるを得なくなるかもしれません。

参考

LoRA論文:[2106.09685] LoRA: Low-Rank Adaptation of Large Language Models

QLoRA論文:[2305.14314] QLoRA: Efficient Finetuning of Quantized LLMs

DoRA論文:[2402.09353] DoRA: Weight-Decomposed Low-Rank Adaptation

ドメイン知識追加論文:[2312.03360] Teaching Specific Scientific Knowledge into Large Language Models through Additional Training

rsLoRA論文:[2312.03732] A Rank Stabilization Scaling Factor for Fine-Tuning with LoRA

日本語知識追加:大規模言語モデルのFine-tuningによるドメイン知識獲得の検討 - Preferred Networks Research & Development