- Authors
- Name
- 1. はじめに
- 2. Full Fine-tuningの問題点
- 3. LoRAの核心アイデア:重み変化量のLow-Rank分解
- 4. 数学的背景:Intrinsic Dimensionality
- 5. Rank選択戦略と適用レイヤー
- 6. QLoRA:4-bit量子化 + LoRA
- 7. HuggingFace PEFTライブラリ実習
- 8. LoRA vs Full Fine-tuning性能比較
- 9. 実務Tips:Learning Rate、Rank、Alpha調整
- 10. LoRAエコシステムと変形手法
- 11. おわりに
- References
1. はじめに
GPT-3(175B)、LLaMA(65B)、Falcon(180B)などの大規模言語モデル(LLM)は、様々なNLPタスクで驚異的な性能を示している。しかし、これらのモデルを特定のドメインやタスクに適応させるファインチューニングの過程は、依然として膨大な計算リソースを必要とする。2021年にMicrosoft Researchが発表した**LoRA(Low-Rank Adaptation of Large Language Models)**論文は、この問題に対する優雅な解法を提示し、現在LLMファインチューニングのデファクトスタンダードとなっている。
本稿では、LoRA論文(Hu et al., 2021)の核心原理を数学的に分析し、後続研究であるQLoRA、そしてHuggingFace PEFTライブラリを活用した実践的な適用方法まで体系的にまとめる。
2. Full Fine-tuningの問題点
2.1 パラメータ数とGPUメモリ
Full Fine-tuningは、事前学習済みモデルのすべてのパラメータを更新する。GPT-3 175Bモデルを基準に見ると、そのコストは明白である。
| 項目 | Full Fine-tuning | LoRA (r=4) |
|---|---|---|
| 学習可能パラメータ数 | 175B (100%) | 4.7M (~0.003%) |
| GPU VRAM要件 | ~1.2TB | ~350GB |
| チェックポイントサイズ | ~350GB | ~35MB |
Full Fine-tuningでAdamオプティマイザを使用する場合、各パラメータに対してmomentumとvarianceの2つの状態値を追加で保存する必要がある。したがって、16-bit精度でもモデル重み(2バイト)+ 勾配(2バイト)+ オプティマイザ状態(8バイト)= パラメータあたり約12バイトが必要となる。175Bモデルの場合、約2.1TBのメモリが必要になる計算だ。
2.2 ストレージとデプロイコスト
Full Fine-tuningを行うと、タスクごとにモデル全体のコピーを保存する必要がある。10の異なるタスクにGPT-3をFine-tuningするなら、350GB x 10 = 3.5TBのストレージが必要になる。一方、LoRAはタスクごとに約35MBのadapter重みを保存するだけでよいため、同じシナリオで350MBで十分である。これは約10,000倍のストレージ削減に相当する。
2.3 推論レイテンシの問題
従来のAdapter基盤の手法(Houlsby et al., 2019)は、モデル構造に追加のレイヤーを挿入するため、推論時のレイテンシが増加する問題があった。特にバッチサイズが小さいオンラインサービング環境では、このオーバーヘッドが無視できないレベルになる。LoRAはこの問題を根本的に解決する。
3. LoRAの核心アイデア:重み変化量のLow-Rank分解
3.1 核心仮説
LoRAの核心仮説は以下の通りである:
事前学習済みモデルの重みを特定のタスクに適応させる際、重みの変化量(delta W)は低い内在的次元(low intrinsic rank)を持つ。
この仮説はAghajanyan et al.(2020)の研究に着想を得たもので、事前学習済みモデルがすでに十分良い表現を学習しているため、タスク適応に必要な変化量はパラメータ空間全体のごく一部に集中するという直観に基づいている。
3.2 数学的定式化
事前学習済み重み行列を とする。Full Fine-tuningでは に更新され、 はパラメータ空間全体と同じ次元を持つ。
LoRAはこの を2つの低ランク行列の積に分解する:
ここで:
- (down-projection)
- (up-projection)
- (rank、通常1〜64)
したがって、Forward passは以下のように変更される:
学習可能なパラメータ数は から へ大幅に削減される。例えば、(GPT-3のhidden dimension)で の場合:
- Full Fine-tuning: パラメータ
- LoRA: パラメータ(約768倍の削減)
3.3 初期化戦略
LoRAの初期化は、学習開始時点で となるよう設計されている:
- 行列A:Random Gaussian初期化
- 行列B:ゼロ初期化
これにより学習開始時に となるため、LoRA adapterが追加されても元の事前学習済みモデルと同一の出力を生成する。これは学習の安定性を保証する重要な設計上の決定である。
3.4 スケーリングファクター:alpha/r
実際のForward passでは、LoRAの出力にスケーリングファクター が乗じられる:
ここで は定数(ハイパーパラメータ)である。原論文では、 を最初に試した の値に設定し、その後変更しなかったと述べている。このスケーリングファクターの役割は、rank を変更する際にlearning rateを再調整する必要性を軽減することである。
最近では**Rank-Stabilized LoRA(rsLoRA)**が提案され、スケーリングファクターを に設定することで、高いrankでの学習安定性が改善された。HuggingFace PEFTでは use_rslora=True オプションでこれを有効化できる。
3.5 推論時のマージ(Merge)
LoRAの最大の利点の一つは、推論時に追加のレイテンシがないことである。学習が完了すれば、adapter重みを元のモデルにマージできる:
マージ後は元のモデルと同一の構造であるため、推論速度は全く低下しない。一方、別のタスクのadapterに切り替えたい場合は、 を引いて別の を加えればよい。この柔軟性により、一つのbase modelに複数のタスク別adapterを効率的に管理できる。
4. 数学的背景:Intrinsic Dimensionality
4.1 Intrinsic Dimensionalityとは?
Aghajanyan et al.(2020)は、論文**"Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning"**で、事前学習済み言語モデルのFine-tuning過程が驚くほど低い内在的次元(intrinsic dimension)を持つことを実験的に示した。
核心的なアイデアは以下の通りである。全パラメータ空間 (Dは全パラメータ数)での最適化問題を、はるかに小さい部分空間 ()での最適化問題に再パラメータ化(reparameterize)しても、Full Fine-tuningと同等の性能を達成できるということだ。
4.2 LoRAとの関連
LoRAはこの観察を直接的に活用している。重み更新 が低いintrinsic rankを持つなら、これを低ランク行列積 で近似することは合理的である。
実際、LoRA論文の実験結果はこの仮説を強く裏付けている。GPT-3 175Bモデルで 、 にLoRAを適用した場合、rank r=1だけでも十分に競争力のある性能を達成した:
| Rank (r) | WikiSQL Acc. | MultiNLI Acc. |
|---|---|---|
| 1 | 73.4% | 91.3% |
| 2 | 73.3% | 91.4% |
| 4 | 73.7% | 91.3% |
| 8 | 73.8% | 91.6% |
| 64 | 73.5% | 91.4% |
と の性能差がほとんどないことは、重み変化量のintrinsic rankが非常に低いという仮説を実験的に証明している。これは「より大きなrankが常に良いとは限らない」という実用的な示唆を与えている。
5. Rank選択戦略と適用レイヤー
5.1 どのレイヤーにLoRAを適用すべきか?
TransformerのSelf-Attentionブロックには4つの重み行列がある:(Query)、(Key)、(Value)、(Output projection)。LoRA論文では、GPT-3 175Bモデルに同一のパラメータバジェット(18M)の下で様々な組み合わせを実験した。
結果として、とを同時に適用するのが最適な性能を示した。単一の行列にのみ適用すると(例: のみや のみ)性能が低下し、すべての行列に適用すると各行列に割り当てられるrankが減少し、かえって性能が低下した。
しかし、その後の研究と実務経験から、すべてのLinearレイヤーにLoRAを適用する方がより良い結果をもたらすケースが多いことが判明した。Sebastian Raschkaの実験によると、LLaMA-2 7BモデルでAttentionのQ, K, V, OおよびMLPのgate, up, down projectionまですべてのレイヤーにLoRAを適用した場合:
- 学習可能パラメータ:4,194,304 -> 20,277,248(約5倍増加)
- GPUメモリ:14.18 GB -> 16.62 GB(約17%増加)
- 性能:顕著な改善
パラメータ数とメモリはやや増加するものの、性能対効率の比が優れているため、実務では target_modules="all-linear" の設定が推奨される傾向にある。
5.2 Rank選択ガイドライン
Rank選択に絶対的なルールはないが、以下のガイドラインを参考にできる:
| ユースケース | 推奨Rank | 理由 |
|---|---|---|
| 単純なタスク適応(感情分類など) | r=4〜8 | 低いintrinsic dimensionで十分 |
| 一般的なInstruction tuning | r=16〜32 | 多様な指示への適応が必要 |
| 複雑なドメイン適応(医療、法律など) | r=64〜256 | 専門知識の表現により多くの容量が必要 |
| 性能最大化が目標の場合 | r=256+ | rsLoRAとの併用を推奨 |
Sebastian Raschkaの実験では、r=256がr=8、32、64、128より良い性能を示したが、r=512では逆に性能が低下する傾向が観察された。これは過度なrankがoverfittingを引き起こし得ることを示唆している。
6. QLoRA:4-bit量子化 + LoRA
6.1 QLoRAの概要
2023年にTim Dettmers et al.が発表したQLoRA(Quantized LoRA)は、LoRAのメモリ効率をさらに一段階引き上げた手法である。核心アイデアは、base modelの重みを4-bitで量子化して保存し、LoRA adapterのみを16-bit(またはBFloat16)で学習することである。
QLoRAの3つの技術的革新:
6.2 4-bit NormalFloat(NF4)
NF4はQLoRAで提案された新しいデータ型で、正規分布に従う重みに対して情報理論的に最適な量子化方式である。
事前学習済みニューラルネットワークの重みは一般的にゼロ中心の正規分布に従う。NF4はquantile quantizationを使用し、各量子化区間(bin)が目標正規分布で同数の期待値を表現するよう設計されている。これにより、従来のINT4やFP4より元の重み分布をはるかに正確に保存できる。
6.3 Double Quantization
Double Quantizationは、量子化定数(quantization constants)自体を再度量子化する手法である。Block-wise quantizationでは各ブロックにスケーリングファクターが必要だが、このスケーリングファクター自体を再度量子化することで、パラメータあたり平均約0.37ビットを追加で削減する。65Bモデル基準で約3GBのメモリを追加削減できる。
6.4 Paged Optimizers
Paged OptimizersはNVIDIA Unified Memoryを活用し、GPUメモリが飽和状態になるとオプティマイザ状態を自動的にCPUメモリへページアウトする手法である。長いシーケンス処理時に発生するgradient checkpointingメモリスパイクを効果的に処理する。CUDA Toolkit 6.0で導入されたUnified Memoryモデルに基づき、CPUとGPUが直接アクセスできる単一メモリ空間を活用する。
6.5 QLoRAの性能
QLoRAにより、65Bパラメータモデルを単一48GB GPUでFine-tuningできるようになり、16-bit Full Fine-tuningと同等のタスク性能を維持する。QLoRAで学習されたGuanacoモデルファミリーはVicunaベンチマークで以前のすべてのオープンモデルを上回り、ChatGPT性能の99.3%に到達した。これは単一GPUで24時間の学習だけで達成された結果である。
6.6 LoRA vs QLoRA比較
| 項目 | LoRA (16-bit) | QLoRA (4-bit) |
|---|---|---|
| 学習時間 (7B, 同一データ) | ~1.85時間 | ~2.79時間 |
| GPUメモリ | ~21.33 GB | ~14.18 GB |
| 性能 | 基準 | ほぼ同等(微差) |
| 利点 | 高速な学習 | 少ないメモリ要件 |
QLoRAは約33%のメモリを削減する代わりに、量子化/逆量子化プロセスにより約39%の学習時間増加が発生する。メモリが制限された環境ではQLoRAが、学習速度が重要な環境ではLoRAがより適している。
7. HuggingFace PEFTライブラリ実習
7.1 インストール
pip install peft transformers trl datasets bitsandbytes accelerate
7.2 基本LoRA設定と学習
以下は、HuggingFace PEFTを使用してCausal Language ModelにLoRAを適用する基本的な例である。
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
import torch
# 1. モデルとトークナイザーのロード
model_id = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
device_map="auto",
)
# 2. LoRA設定
lora_config = LoraConfig(
r=16, # rank
lora_alpha=32, # scaling factor (alpha)
target_modules="all-linear", # すべてのLinearレイヤーに適用
lora_dropout=0.05, # dropout比率
bias="none", # bias学習を無効化
task_type=TaskType.CAUSAL_LM, # タスクタイプ
)
# 3. PEFTモデル作成
model = get_peft_model(model, lora_config)
# 4. 学習可能パラメータの確認
model.print_trainable_parameters()
# 出力例: trainable params: 20,277,248 || all params: 6,758,404,096 || trainable%: 0.30
7.3 SFTTrainerを活用したInstruction Tuning
TRLライブラリの SFTTrainer とPEFTを組み合わせることで、より簡潔にFine-tuningを実行できる。
from trl import SFTTrainer, SFTConfig
from peft import LoraConfig
from datasets import load_dataset
# データセットのロード
dataset = load_dataset("tatsu-lab/alpaca", split="train")
# LoRA設定
peft_config = LoraConfig(
r=16,
lora_alpha=32,
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
)
# SFTTrainerの設定と学習
trainer = SFTTrainer(
model=model_id,
args=SFTConfig(
output_dir="./lora-output",
num_train_epochs=1,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
bf16=True,
logging_steps=10,
save_strategy="epoch",
max_seq_length=2048,
),
train_dataset=dataset,
peft_config=peft_config,
)
trainer.train()
# 学習済みadapterの保存
trainer.save_model("./lora-adapter")
7.4 QLoRA適用例
QLoRAを適用するには、bitsandbytes を使って4-bit量子化設定を追加する。
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
import torch
# 4-bit量子化設定
bnb_config = BitsAndBytesConfig(
load_in_4bit=True, # 4-bit量子化を有効化
bnb_4bit_quant_type="nf4", # NormalFloat4タイプを使用
bnb_4bit_compute_dtype=torch.bfloat16, # 演算時にBFloat16を使用
bnb_4bit_use_double_quant=True, # Double Quantizationを有効化
)
# 量子化モデルのロード
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantization_config=bnb_config,
device_map="auto",
)
# k-bit学習のためのモデル準備
model = prepare_model_for_kbit_training(model)
# LoRA設定(QLoRAでも同様に使用)
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules="all-linear",
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
# PEFTモデル作成
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
7.5 学習済みAdapterのロードと推論
from peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
# Baseモデルのロード
base_model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
torch_dtype=torch.bfloat16,
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
# LoRA adapterのロード
model = PeftModel.from_pretrained(base_model, "./lora-adapter")
# (オプション)Adapterをbase modelにマージして推論速度を最適化
model = model.merge_and_unload()
# 推論
inputs = tokenizer("AIの未来は", return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
8. LoRA vs Full Fine-tuning性能比較
8.1 原論文の結果(GPT-3 175B)
LoRA原論文で報告されたGPT-3 175Bの結果は以下の通りである:
| Method | Params | WikiSQL Acc. | MNLI-m Acc. | SAMSum (R1/R2/RL) |
|---|---|---|---|---|
| Full Fine-tuning | 175B | 73.8% | 89.5% | 52.0/28.0/44.5 |
| Prefix Tuning | 0.77M | - | - | - |
| LoRA | 4.7M | 73.4% | 91.7% | 53.8/29.8/45.9 |
| LoRA | 37.7M | 74.0% | 91.6% | 53.4/29.2/45.1 |
注目すべきは、LoRAがMNLIとSAMSumでFull Fine-tuningを上回ったことである。全体の0.003%にあたるわずか4.7Mパラメータの学習だけで、175B全体を学習したよりも良い結果を得た。これはLoRAのimplicit regularization効果と解釈される。すなわち、低ランク分解が一種の正則化の役割を果たし、overfittingを防止するのである。
8.2 推論性能と学習効率
| 指標 | Full Fine-tuning | LoRA |
|---|---|---|
| 学習速度 | 基準 | 約25%高速 |
| VRAM使用量 | 基準 | 約67%削減 |
| 推論レイテンシ | 基準 | 同等(マージ後) |
| マルチタスク切替 | モデル全体の交換が必要 | Adapterのみ交換 |
8.3 LoRAの限界
LoRAが常にFull Fine-tuningと同等であるわけではない。最近の研究(Biderman et al., 2024, "LoRA vs Full Fine-tuning: An Illusion of Equivalence")では以下が指摘されている:
- SVD構造の違い:LoRAとFull Fine-tuningで学習された重み行列のSingular Value Decomposition構造が異なる。
- 分布外汎化(OOD Generalization):学習データ分布から外れた入力に対して、LoRAとFull Fine-tuningモデルが異なる汎化パターンを示す。
- データセットサイズ依存性:データセットサイズがLoRAの学習可能パラメータ数を大幅に超える場合、Full Fine-tuningが優位になり得る。
したがって、LoRAを適用する際は、タスクの複雑さとデータセット規模を考慮してrankとtarget modulesを適切に設定する必要がある。
9. 実務Tips:Learning Rate、Rank、Alpha調整
9.1 Learning Rate
- LoRAではFull Fine-tuningの約10倍高いlearning rateが必要である。Full Fine-tuningで1e-5〜3e-5を使用するなら、LoRAでは1e-4〜3e-4の範囲が適切である。
- Learning rateは他のハイパーパラメータより先に最適化すべきである。RankとalphaのEffectがlearning rateに依存するためだ。
- Cosine annealingスケジューラはSGDでは効果的だが、Adam/AdamWでは影響が微小である。
9.2 Rank(r)設定
- 開始点:r=16から始め、性能を評価した後、必要に応じて調整する。
- 過少設定のリスク:Rankが低すぎるとタスクに必要な表現力が不足する。
- 過大設定のリスク:Rankが高すぎるとoverfittingが発生し、メモリと計算コストが増加する。
- rsLoRAの活用:r=32以上の高いrankを使用する場合は
use_rslora=Trueを設定し、スケーリングファクターを に調整するのがよい。高rankでの学習安定性が改善される。
9.3 Alpha設定
- 一般的なヒューリスティック:
alpha = 2 * rと設定する。つまり、rankが16ならalphaは32に設定する。 - この比率は多くの場合良い結果を示すが、最適な比率はモデルとデータセットによって異なり得る。
- Sebastian Raschkaの実験では、r=256、alpha=128(0.5倍比率)がより良い結果を示したケースもあった。
9.4 Dropout
- LoRA dropoutは一般的に0.05〜0.1の範囲に設定する。
- データセットが小さい場合やoverfittingが懸念される場合は0.1、大規模データセットでは0.05または無効化(0.0)を検討する。
9.5 オプティマイザ選択
- AdamW:最も安定的で広く使われる選択肢である。
- SGD:低いrankではAdamWとのメモリ差は微小だが、高いrank(r=256)では有意なメモリ削減が可能(17.86 GB vs 14.46 GB)。
- 多くの場合AdamWをデフォルトとして使用し、メモリが極めて制限された環境で高いrankを使用する必要がある場合にSGDを検討する。
9.6 データセット関連Tips
- マルチエポック学習に注意:同一データセットを複数回繰り返すとoverfittingが発生し得る。Sebastian Raschkaの実験では、Alpacaデータセットで2エポック学習した際に性能がかえって低下した。
- データ品質が量に勝る:1K例のLIMAデータセットが50K例のAlpacaデータセットと同等またはそれ以上の結果を示したケースがある。高品質データセットの構築がハイパーパラメータチューニングより重要である可能性がある。
9.7 実践設定テンプレート
以下は実務ですぐに活用できるLoRA設定テンプレートである。
from peft import LoraConfig
# 一般的なInstruction Tuning設定
config_standard = LoraConfig(
r=16,
lora_alpha=32,
target_modules="all-linear",
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
# メモリ節約優先設定(QLoRAと併用)
config_memory_efficient = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM",
)
# 性能最大化設定
config_high_performance = LoraConfig(
r=64,
lora_alpha=128,
target_modules="all-linear",
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
use_rslora=True, # 高rankでRank-Stabilized LoRAを使用
)
10. LoRAエコシステムと変形手法
LoRAの成功以降、様々な変形手法が登場した。簡潔にまとめると以下の通りである:
| 手法 | 核心アイデア | PEFT対応 |
|---|---|---|
| LoRA | 低ランク行列分解(BA) | O |
| QLoRA | 4-bit量子化 + LoRA | O |
| DoRA | Weight-Decomposed LoRA(方向/大きさ分離) | O |
| AdaLoRA | 重要度ベースのrank動的割り当て | O |
| LoHa | Hadamard Productベース分解 | O |
| LoKr | Kronecker Productベース分解 | O |
| PiSSA | Principal Singular Valuesベース初期化 | O |
| rsLoRA | Rank-Stabilizedスケーリングファクター | O |
HuggingFace PEFTライブラリはこれらすべての手法を LoraConfig のオプションや個別のConfigクラスでサポートしており、最小限のコード変更で様々な手法を実験できる。
11. おわりに
LoRAは「事前学習済みモデルの重み変化量が低いintrinsic rankを持つ」という簡潔な仮説から出発し、大規模言語モデルのFine-tuningコストを劇的に削減した手法である。数学的に優雅であること、実装が簡単であること、推論時に追加コストがないことの3つの利点が、LoRAを現在のLLMファインチューニングの標準にした。
QLoRAの登場によりコンシューマー向けGPUでも大規模モデルのFine-tuningが可能になり、HuggingFace PEFTライブラリはこれらの手法をわずか数行のコードで適用できるようにした。LLMを活用したプロジェクトに取り組むなら、LoRAは必ず習得すべき核心技術である。
References
Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., Wang, L., & Chen, W. (2021). LoRA: Low-Rank Adaptation of Large Language Models. arXiv. https://arxiv.org/abs/2106.09685
Dettmers, T., Pagnoni, A., Holtzman, A., & Zettlemoyer, L. (2023). QLoRA: Efficient Finetuning of Quantized LLMs. arXiv. https://arxiv.org/abs/2305.14314
Aghajanyan, A., Gupta, S., & Zettlemoyer, L. (2020). Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning. arXiv. https://arxiv.org/abs/2012.13255
HuggingFace PEFT - LoRA Documentation. https://huggingface.co/docs/peft/en/package_reference/lora
HuggingFace PEFT - LoRA Methods Guide. https://huggingface.co/docs/peft/en/task_guides/lora_based_methods
HuggingFace PEFT GitHub Repository. https://github.com/huggingface/peft
Microsoft LoRA GitHub Repository. https://github.com/microsoft/LoRA
Raschka, S. (2023). Practical Tips for Finetuning LLMs Using LoRA (Low-Rank Adaptation). Sebastian Raschka's Magazine. https://magazine.sebastianraschka.com/p/practical-tips-for-finetuning-llms
Biderman, S., et al. (2024). LoRA vs Full Fine-tuning: An Illusion of Equivalence. arXiv. https://arxiv.org/abs/2410.21228
Kalajdzievski, D. (2023). Rank-Stabilized LoRA (rsLoRA). arXiv. https://arxiv.org/abs/2312.03732
Liu, S., et al. (2024). DoRA: Weight-Decomposed Low-Rank Adaptation. arXiv. https://arxiv.org/abs/2402.09353
HuggingFace Blog - Making LLMs even more accessible with bitsandbytes, 4-bit quantization and QLoRA. https://huggingface.co/blog/4bit-transformers-bitsandbytes