LoRA・QLoRAとは?少ないリソースでLLMをファインチューニングする手法

LoRAとは?LLMを効率的にファインチューニングする革新的手法

AIを知りたい

先生、「LoRA」っていうファインチューニング手法を聞いたんですが、普通のファインチューニングとは何が違うんですか?

AIエンジニア

LoRAは「Low-Rank Adaptation」の略で、モデルの全パラメータを更新する代わりに、小さな追加行列だけを学習させる効率的な手法だよ。例えば70億パラメータのモデルをフルでファインチューニングするには140GBのVRAMが必要だけど、LoRAなら16GBで済むんだ。

AIを知りたい

そんなにメモリが節約できるんですね!でも性能は落ちないんですか?

AIエンジニア

意外なことに、多くのタスクでフルファインチューニングと同等かそれに近い性能が出るんだ。しかも、LoRAで学習した部分は「アダプタ」として元のモデルとは別に保存できるから、一つのベースモデルに複数のアダプタを付け替えて、用途ごとに切り替えて使えるという利点もあるんだよ。

LoRAとは。

人工知能に関わる言葉である「LoRA(Low-Rank Adaptation)」について説明します。大規模言語モデルのファインチューニングを効率化する手法で、モデルの重み行列に低ランクの追加行列を挿入し、その追加部分のみを学習させます。元のモデルの重みは固定されるため、メモリ使用量と計算コストを大幅に削減できます。

LoRAとは

LoRA(Low-Rank Adaptation / ローラ)は、2021年にMicrosoftの研究者Edward Huらが発表した、大規模言語モデルを効率的にファインチューニングするための手法です。論文タイトルは「LoRA: Low-Rank Adaptation of Large Language Models」で、発表以来LLMのファインチューニングにおけるデファクトスタンダードとなっています。

従来のフルファインチューニングでは、モデルの全パラメータ(数十億〜数千億個)を更新する必要があり、膨大なGPUメモリと計算時間が必要でした。例えば、70億パラメータのモデルをフルファインチューニングするには140GB以上のVRAMが必要で、A100やH100といった高価なGPUが複数台必要でした。

LoRAの核心的なアイデアは、重み行列の変化が「低ランク(Low-Rank)」で近似できるという発見に基づいています。つまり、ファインチューニングで変化する重みは、元の行列のごく一部の次元の変化で表現できるということです。この性質を利用して、元のモデルの重みは凍結(固定)し、小さな低ランク行列のみを学習させます。

LoRAの仕組み

LoRAの数学的な仕組みを見ていきましょう。元のモデルの重み行列をW(d×dの行列)とすると、ファインチューニングによる変化分ΔWは、二つの小さな行列AとBの積で近似されます。

具体的には、W’ = W + BA として表現されます。ここで、Bはd×rの行列、Aはr×dの行列です。rはランク(通常4〜64)で、元の次元dよりもはるかに小さい値です。例えば、d=4096、r=16の場合、元のW行列は4096×4096=約1677万パラメータですが、BAは(4096×16)+(16×4096)=約13万パラメータで済みます。パラメータ数が約99%削減されるのです。

学習中は、元の重みWは完全に凍結され、行列AとBのみが更新されます。推論時には、W+BAを一つの行列に統合できるため、追加の推論コストがゼロで済みます。これはLoRAの大きな利点で、アダプタを適用してもモデルの推論速度は変わりません。

項目 フルファインチューニング LoRA(r=16)
学習パラメータ数(7Bモデル) 約70億 約800万〜2000万
必要VRAM 140GB+ 16GB〜
学習速度 遅い 2〜3倍高速
アダプタサイズ モデル全体 10〜100MB
複数タスク対応 タスクごとにモデルが必要 アダプタの切替で対応
推論速度への影響 なし なし(統合可能)

LoRAのハイパーパラメータ

LoRAの性能は、いくつかの重要なハイパーパラメータに左右されます。

ランク(r)は最も重要なパラメータで、追加行列の次元を決定します。ランクが高いほど表現力が増しますが、パラメータ数とメモリ使用量も増加します。一般的にはr=8〜32が推奨されます。単純なタスク(文体の変更など)ではr=4でも十分ですが、複雑なタスク(新しい知識の獲得など)ではr=64以上が必要になることもあります。

alpha(α)は、LoRA行列の出力をスケーリングするパラメータです。通常はランクの2倍(α=2r)に設定されます。αが大きいほどLoRAの影響が強くなり、元のモデルの知識からの変化が大きくなります。

ターゲットモジュールは、LoRAを適用するTransformerの層を指定します。通常はAttention層のQ(Query)とV(Value)の投影行列に適用しますが、K(Key)やFFN(Feed-Forward Network)層にも適用することで性能が向上するケースがあります。

QLoRA:さらに効率的なファインチューニング

QLoRA(Quantized LoRA)は、2023年にワシントン大学のTim Dettmersらが発表した手法で、LoRAをさらに効率化したものです。モデルの重みを4ビットに量子化した上でLoRAを適用することで、メモリ使用量を劇的に削減します。

QLoRAの主な技術的革新は3つあります。第一に、NF4(4-bit NormalFloat)量子化という新しい量子化手法で、精度の劣化を最小限に抑えながら重みを4ビットに圧縮します。第二に、二重量子化で、量子化パラメータ自体もさらに量子化してメモリを節約します。第三に、ページドオプティマイザで、GPUメモリが不足した場合にCPUメモリに自動的にオフロードします。

QLoRAにより、70億パラメータのモデルが12GBのVRAM(RTX 3060相当)でファインチューニング可能になりました。これは個人の一般的なゲーミングPCでLLMのファインチューニングが可能になったことを意味し、LLMのカスタマイズの民主化に大きく貢献しました。

手法 ベースモデル精度 学習可能層 7Bモデル必要VRAM
フルFT FP32/FP16 全層 140GB+
LoRA FP16 低ランク行列のみ 16GB
QLoRA NF4(4bit) 低ランク行列のみ 6〜12GB

LoRAの実践とエコシステム

LoRAを実装するための主要なライブラリとツールを紹介します。

PEFT(Parameter-Efficient Fine-Tuning)は、Hugging Faceが提供するLoRAを含む効率的ファインチューニング手法のライブラリです。transformersライブラリと統合されており、数行のコードでLoRAを適用できます。LoRA以外にも、Prefix Tuning、P-Tuning、IA3などの手法が利用可能です。

Unslothは、LoRA/QLoRAの学習を2〜5倍高速化するライブラリです。カスタムCUDAカーネルにより、Hugging FaceのPEFTよりも大幅に高速で、メモリ使用量も70%削減されます。個人での学習には特に推奨されます。

Axolotlは、LoRA学習の設定をYAMLファイルで管理できるツールで、データの前処理からモデルの学習、評価までの全プロセスを統合的に管理します。

画像生成の分野でも、Stable DiffusionにLoRAを適用して特定のスタイルやキャラクターを学習させることが一般的になっています。テキストLLMと同じ原理で、画像生成モデルの一部のパラメータを効率的に微調整できます。

まとめ

LoRAは、大規模モデルのファインチューニングを劇的に効率化した革新的な手法です。低ランク近似というシンプルなアイデアにより、メモリ使用量を99%削減しながら、フルファインチューニングに匹敵する性能を実現します。QLoRAとの組み合わせにより、個人のGPUでもLLMのカスタマイズが可能になりました。

テキストLLMから画像生成モデルまで幅広く活用されており、AI開発の民主化に大きく貢献しています。ファインチューニングを検討する際は、まずLoRA/QLoRAを第一選択肢として検討することをお勧めします。

項目 説明
正式名称 Low-Rank Adaptation
提案 2021年 Microsoft Research(Edward Huら)
原理 重み行列の変化を低ランク行列の積で近似
主要パラメータ ランク(r)、alpha(α)、ターゲットモジュール
発展形 QLoRA(4bit量子化+LoRA)
ツール PEFT, Unsloth, Axolotl

関連記事