LoRAは”手続き”を学習できない なぜエージェントのファインチューニングにFull FTが必要なのか

論文紹介

LoRAは便利です。私も最近改めて触り始めました。東方Projectの火焔猫燐の口調を、会話の脈絡を失わせずにどこまで真似させられるのかということを小さめのモデルで試しています。今のところ順調で、扱っているモデルの限界にまで到達したような気がします。

しかしLoRAには苦手な分野があります。それは手続き的な知識です。条件分岐を含み、「この場合はこうする」というような形式のものだと考えてもらって構いません。

そもそもLoRAとは

Low Rank Adaptationの略で、モデルの低ランクの行列に絞って重みを更新していくファインチューニングの手法です。ファインチューニングで獲得される知識はこの低ランクの部分に存在するだろうという暗黙の了解があったため、LoRAによってその部分の重みだけを更新することには合理性がありました。確かに単純な指示の追従、応答スタイルの変更、単純な事実の学習では成り立つようです。しかし先に述べた、手続きをたどる能力ではどうなのか? というのが今回紹介する論文の問いです。

Procedural Knowledge Is Not Low-Rank: Why LoRA Fails to Internalize Multi-Step Procedures

実験デザイン

従ってほしい手続きを有向グラフで定義し(≒図にして)、ノード間を繋ぐ複数のエッジによって条件分岐を再現します。旅行予約、Zoomサポート、保険請求という3つの場面を想定し、14から55個のノードからなる手続きを作成しました。この手続きをフルファインチューンとLoRAの両方で学習させ、その成績を比べてみます。

LoRAは全然だめ

LoRAでは、学習時にrankとalphaという値を設定します。口調を整えたいならrankは低め(8や16)に、新しい知識を覚えさせたいなら高め(32以上)というコンセンサスがありますが、どのようにランクを設定したとしても、この論文で学習させた手続き的な知識に関してはフルファインチューン時の成績に遠く及ばないどころか、一切の改善が見られませんでした。rankを上げるほど成績が悪くなっていきました。
さらに、複雑な手続きであるほどフルファインチューン時との成績の差は広がっていきました。

なぜだめだったのか?

LoRAで更新できる重みはLoRAという名前の通り低ランクです。そして手続き的な知識を覚えた際に更新された部分(MLP層の中にある)のrankは981~1872でした。LoRAで更新するrankはせいぜい128くらいまでですから、到底届きません。
手続き的な知識を覚えるのに必要な部分の重みを、LoRAでは更新できないということです。そりゃ失敗します。

LoRAは過学習する

lossという値があります。lossが高いと学習内容が回答に反映されず、低すぎると過学習といって回答が学習内容に引っ張られすぎて破綻します。そんな値です。LoRAのほうが学習時の最終的なlossという値が低くなり、かつ成績は悪くなりました。これはLoRAで過学習が起きていることを示しています。知識ではなく回答を丸暗記してしまった(こう聞かれたらこう答えればいいんでしょ、となって知識を応用できない)ということに近いです。
lossが低ければよく学習できている、というわけでもないのです(LoRAでファインチューンしてみたことがある人ならみんな感覚的にわかっています)。

手続き的な知識はフルファインチューンしよう

複雑な条件分岐に適切に対応して行動できるエージェントを作るにはLoRAは役に立たないため、フルファインチューンしなければなりません。
MLP層のみ高ランクで、K/Vを低ランクで学習するような手法が開発されれば、LoRAが持つ省メモリ性を活かしつつ手続き的な知識を持たせられるかもしれません。

感想

以前、ローカルLLMのキャラ付けにLoRAは不要。RAGやプロンプトで十分という記事でLoRAによってドメイン知識を学習させるのは難しいということを書きました。これに加えて、lossが低いにもかかわらず手続き的な知識の学習が進まなかったことや、口調を変えるのにLoRAが役立つことからもわかるとおり、LoRAファインチューンで学習させることができるのは回答の形式であって、知識ではないのかもしれません。

コメント

タイトルとURLをコピーしました