注:以下の理解は私自身の理解に過ぎません。権威ある説明を見たい場合は、論文を参照してください。もちろん、権威ある説明も時には理解しづらいことがあります。何か問題があれば、コメント欄で指摘してください🥰
LoRA とは#
簡単に言うと、LoRA はモデル(神経ネットワーク)のパラメータを微調整するための技術です。モデルは多くのパラメータを持つ関数と考えることができ、何かを入力すると、そのモデルは数字、テキスト、または画像を出力します。ChatGPT を例に挙げると、入力されたテキストはまず数字(Word Embedding)に変換され、これらの数字がモデルという関数に入れられます。このモデルは一連の出力数字を生成し、各数字はの範囲にあり、各数字は文中の単語が出現する確率を表します。ChatGPT はこのように単語を一つずつ「吐き出します」。
モデルが関数である以上、関数内の各パラメータ、例えばのとはこの一次関数のパラメータです。任意のパラメータを変更すると、この一次関数が表す直線の位置が変わります。モデルにおいても同様で、モデルのパラメータを変更すると、そのモデルの機能も変わります。
したがって、もしあなたがオンラインでモデルをダウンロードし、そのモデルが異なる果物を分類するためのものであった場合、分類タスクを行う際にそのモデルの性能があまり良くないことに気づくかもしれません。例えば、このモデルがブドウを誤ってレーズンとして認識した場合、そのモデル内のパラメータが良くないために性能が悪化していることを示しています。そこで、あなたはこのモデルのパラメータを調整して、モデルがブドウを正しくレーズンとして認識できるようにしたいと考えます。モデルのパラメータを調整する方法の一つが LoRA の使用です。簡単に言えば、現在のモデルの機能があなたの要求を満たさないと感じた場合、LoRA を使用して現在のモデルを微調整することができます。
注:LoRA の能力を直感的に感じるために、以前私が試していた Stable Diffusion(AI 描画ソフト)について話したいと思います。その中のモデルは生成される画像が二次元か三次元かに影響を与えますが、このモデルに LoRA を追加して AI 画家を微調整することができます。私はその中に水墨風 LoRAというものがあったことを非常に明確に覚えています。この LoRA をモデルに適用すると、最終的に描かれる画像は水墨風になりますが、画像の本質的な違い — 二次元か三次元か — は変わりません。
既存のモデルを微調整する理由#
現在、大規模モデルの種類はますます増えています。基本的に大きなインターネット企業は自社の大規模モデルを発表しています。なぜ私たちは自分で大規模モデルを訓練するのではなく、他人が訓練したモデルを微調整したいのでしょうか。その大きな理由の一つは「大きさ」です。現在のモデルのパラメータは 7B や 12B(十億)に達することがあります。これほど多くのパラメータを変更(訓練)するには、一方でコンピュータの計算速度が速く(GPU や CPU の計算能力が高い)、もう一方でコンピュータに十分なメモリが必要です。例えば 7B のモデルを考えてみましょう。もしモデルのパラメータの型が float16 で、一つのパラメータが 2 バイトを占めるとすると、7B 個のパラメータはバイトを占め、GB に換算すると 13GB になります。つまり、このモデルを GPU 上で実行するには、GPU のメモリが 13GB 必要です。また、内部のパラメータを調整したい場合、コンピュータは各パラメータの勾配を保存するためにさらにメモリを確保する必要があるため、モデルを訓練するには少なくともGB が必要です。このような大きなメモリは一般的な消費者向け GPU では通常存在しません。例えば、現在の最高性能の消費者向け GPU である 4090 のメモリは最大でも 24GB です。一方、A100 のような専門的な計算カードは 80GB に達することがありますが、専門的な計算カードは非常に高価です。
大規模モデルを訓練するには多くの専門的な GPU が必要であり、大きなインターネット企業だけが訓練できるのです。一部の大企業は訓練済みのモデルをオープンソースにし、他の人がその基盤の上でモデルのパラメータを調整できるようにしています。
したがって、一般的な消費者向け GPU でモデルのパラメータを調整できるようにするためには、つまり一般の人々のコンピュータでモデルの性能を変更するためには、私たちはモデル内の一部のパラメータのみを微調整することができ、大企業がモデルを訓練するようにすべてのパラメータを調整することはできません。言い換えれば、私たちが必要とするモデルを 100% 訓練する必要がある場合、大企業の初期の訓練が 80% を占め、私たちのコンピュータでのモデルの微調整がその 20% を占めることになります。
LoRA#
上記で述べたように、一般の人々のコンピュータでモデルの性能を変更することができるのは、私たちがモデル内の一部のパラメータを微調整することだけですが、これらのパラメータを微調整する方法はいくつかあります。その中で最も一般的な方法が LoRA です。
論文では重要な公式が述べられています:
ここで、はモデルの元のパラメータで、これは行列の形式です。論文によれば、$W_0$ 行列の数字は不変であり、$\Delta W = BA$ は別の行列で、LoRA は主にこの行列を変更します。とを加えることで新しいパラメータが得られ、この新しいパラメータをモデルに適用すると、モデルのパラメータが変更され、モデルの機能も変わり、微調整の目的が達成されます。
ここで問題が発生します。行列の加法に基づくと、2 つの行列が加算されるためには、同じサイズでなければなりません。例えば、以下のでは、行列のサイズはです。がと加算されるためには、のサイズもでなければなりません。もし私たちが直接を変更する、つまりその中の個のパラメータを変更するのであれば、なぜ元のモデルのパラメータを直接変更しないのでしょうか。結局、これら 2 つの行列のサイズは同じです。そうすると、私たちの目的は達成されません — 一般の人々のコンピュータでモデルの性能を変更するためには、私たちはモデル内の一部のパラメータのみを微調整することができるのです。消費者向けのコンピュータの計算能力とメモリでは、元のモデルの何千ものパラメータを変更することは不可能です。
この問題を解決するために、論文は新しい方法を提案しました。
LoRA は、事前訓練された重みを固定したまま、適応中に密な層の変化のランク分解行列を最適化することによって、神経ネットワーク内のいくつかの密な層を間接的に訓練できるようにします。
この文の中で、私が重要だと思うキーワードはランク分解です。直接の翻訳は秩分解でしょうか?
ランク分解とは#
行列の乗算に基づくと、行列のサイズがで、行列のサイズがの場合、これらを掛け合わせると行列のサイズはになります。
上記の等式を例に取ると、からのサイズはであり、行列の加法により、のサイズもでなければなりません。重要な点は、を得るために、とすることができます。つまり、を 2 つの行列の積に変えることができます。ここで、行列のサイズはで、行列はです。ここでの $r$ は変数であり、自由に変更できます。この $r$ は非常に重要で、後で説明します。行列の乗算により、の結果の行列サイズはになります。これにより、と加算することができます。
からわかるように、9 個のパラメータを持つ大きな行列が、3 個のパラメータを持つ 2 つの小さな行列の積に分解されました。ランク分解は、大きな行列を小さな行列の積に分解することを簡単に理解することができます。これにより、を得るためには、2 つの小さな行列の 6 個のパラメータを変更するだけで済みます。の 9 個のパラメータと比べて、6 個のパラメータは大幅に減少します。
LoRA による訓練パラメータの削減効果は顕著であり、論文では次のように述べられています。
事前訓練されたモデルが GPT-3 175B の場合、訓練可能なパラメータの数は $W_0$ の 0.01% まで小さくできます。
つまり、LoRA を使用して GPT-3 を訓練すると、訓練可能なパラメータはモデルパラメータの 0.01% になります。
LoRA における $r$(ランク)パラメータの選択#
前述のように、は 2 つの行列の積に分解され、その中で行列のサイズはで、行列はです。線形代数の知識に基づくと、一般的に 2 つの行列の積の結果行列のランクは、元の 2 つの行列のランクの最小値を超えることはありません。つまり、選択した $r$ が 3 未満であれば、との積から得られる行列のランクは $r$ を超えず、3 未満になります。実際、この例では、選択した $r$ は 3 未満でなければなりません。もし $r$ を 4 に設定すると、変更(訓練)するパラメータはとなり、元のモデルのパラメータよりも多くなります。これは LoRA を使用する目的 — 訓練可能なパラメータの数を減らす — に反します。
ここで問題が発生します。もしモデルの元のパラメータ行列がフルランクである場合、LoRA によって得られるのランクはよりも小さくなります。つまり、LoRA はモデルパラメータ行列の部分空間のみを微調整できるということです。再びを例に挙げると、のランクは 3 です。簡単に言えば、このモデルは三次元座標系を使用して問題を解決する必要がありますが、LoRA を使用し、と設定すると、モデルの 1 次元のみを変更しており、他の 2 次元は考慮されていません。このため、モデルのパラメータをどのように変更しても、効果はあまり良くありません。
LoRA がモデルパラメータ行列の部分空間のみを微調整できるのであれば、LoRA を使用する意味は何でしょうか。どのようにしても一つか二つの次元が考慮されていないのです。
幸いなことに、以前の論文によれば:the learned over-parametrized models in fact reside on a low intrinsic dimension. つまり、私たちはモデルを三次元座標系で構築していますが、モデルは最終的にただの 1 本の線を利用しており、その中の 1 次元だけを使用しています。これは、モデルパラメータのこの行列の列ベクトルが線形に関連していることを示しており、モデルパラメータのランクは実際には 1 です。これが論文で言われているlow intrinsic dimensionです。この場合、と設定すると、効果が良くなります。私たちは 2 つの小さな行列の 6 個のパラメータを変更するだけで済み、の 9 個のパラメータと比べて、6 個のパラメータは大幅に減少します。しかし、と設定することもできますが、そうすると訓練可能なパラメータは 12 になり、副作用が生じます。
私たちはモデルがいくつの次元を使用してモデル化しているかを知らないため、パラメータ $r$ は手動で最適値を試行する必要があります。このようなパラメータはハイパーパラメータと呼ばれます。$r$ が大きいと、訓練可能なパラメータが増え、$r$ が小さいと訓練効果が悪くなります。
LoRA の利点#
比較のために、他の微調整可能なモデルパラメータの方法について先に説明します。
-
Adapter Layers:これはモデルのアーキテクチャを変更し、モデルにいくつかの層を追加し、これらの層のパラメータのみを変更することに相当します。しかし、これには問題があります。これによりモデルの推論時間が長くなります。専門用語ではInference Latencyと呼ばれます。例えるなら、モデルを A と B をつなぐコンクリート道路と考えます。あなたの入力は A にいる車で、この車はコンクリート道路を通って B に到達し、結果を得ます。車は道を走るのに時間がかかります。そしてAdapter Layersはこの道路に小さなコンクリートの部分を追加し、その部分のパラメータのみを最適化します。しかし、道のりが長くなり、車の移動時間が長くなります。これが推論時間の増加です。しかし LoRA は、道路の長さを変えずに、一部の道路を高速道路にアップグレードするようなものです(速さを意味するのではなく、効果が良いという意味です。LoRA は推論速度を速くするわけではありません)。
-
Prefix tuning: プレフィックス微調整は実際にはプロンプトエンジニアリングの一種であり、モデルを直接変更するものではありません。プロンプトをプレフィックス(前置き)とサフィックス(後置き)に分けます。ユーザーはサフィックスに入力し、プレフィックスは微調整に使用されます。これにより、ユーザーの入力が少なくなります。これが欠点です。