今日はLLMのfinutuningで有名な「LoRA」について簡単に説明してみたいと思います。
LoRAは「モデルのfinetuningを高速化する技術」です。
finetuningはモデルの重みを調整することで実現しています。ニューラルネットワークには多くの「全結合層」が含まれており、これらの層は主に行列乗算によって構成されています。また、多くの全結合層の重み行列はフルランクです。(d x d)
従来のfinetuning手法は、フルランクですので、基本的にはすべての重みを調整することでチューニングしていました。
そうすると、非常に大量なGPUリソースと時間が必要です。
そこで、LoRAの提出者はモデルのfinetuningにすべての重みが調整する必要がなく、タスクによって必要な重みだけ調整すればいいではないかと考えて、層(d)を次元削減して、ほとんどの重みは調整せず、必要な重みだけを調整する小さな並列層(r)を作りました。(r < < d)
そうすると、数式は(d x d)から(d x r + r x d)に変わって、パラメータ数がかなり少なくなります。処理時間も全パラメータ調整より10-100倍くらい速くなりました。
イメージとしては⇩の画像の通りです。
わかりにくいかもしれないので、簡単な例で説明すると、モデルのfinetuningは料理を作ることと似ています。
「モデル」自体は色んな食材を保管されている大きな冷蔵庫のようなもので、そして、一つの「重み」は一つの食材となります。
例えば、チャーハンを作る時には、「卵」と「ご飯」あと「醤油」がいりますね。(これらは3つの重みと考えられます)
そして、もっとおいしいチャーハンを作りたい時(finetuning)には、食材(重み)を調整することがありますね。
例えば、もっと美味しい品種のご飯を使うことなどです。(これは重みの調整、つまりfinetuningのことです)
ですが、チャーハンおいしくするために、冷蔵庫の中のすべての食材を変える必要はありません。
同様に、モデルのfinetuningも、特定のタスクに必要な「重み」だけを更新すれば良いという考え方です。
LoRAをベースとして、改善されたバージョン「QLoRA」や「AdaLoRA」もあります。
AdaLoRAはメモリーの使用方法を改善するもので、重みを全て一箇所のメモリに保存するのではなく、分散して保存することでメモリの使用効率を向上させます。
(処理時間長くなりますが)
QLoRAは4bitの微調整の精度を高め、16bitとの差を小さくする手法です。(小規模なfinetuningでは結構使われています。)
興味ある方⇩の論文参考してください
https://arxiv.org/abs/2106.09685