Gary Gan

Gary Gan's Blog

I am a student pursuing a Computer Science and Engineering major at Northeastern University. I am interested in Deep Learning.

理解LoRA: 低ランク適応

注:以下の理解は私自身の理解に過ぎません。権威ある説明を見たい場合は、論文を参照してください。もちろん、権威ある説明も時には理解しづらいことがあります。何か問題があれば、コメント欄で指摘してください🥰

LoRA とは#

簡単に言うと、LoRA はモデル(神経ネットワーク)のパラメータを微調整するための技術です。モデルは多くのパラメータを持つ関数と考えることができ、何かを入力すると、そのモデルは数字、テキスト、または画像を出力します。ChatGPT を例に挙げると、入力されたテキストはまず数字(Word Embedding)に変換され、これらの数字がモデルという関数に入れられます。このモデルは一連の出力数字を生成し、各数字は[0,1][0,1]の範囲にあり、各数字は文中の単語が出現する確率を表します。ChatGPT はこのように単語を一つずつ「吐き出します」。

モデルが関数である以上、関数内の各パラメータ、例えばy=ax+by= ax + baabbはこの一次関数のパラメータです。任意のパラメータを変更すると、この一次関数が表す直線の位置が変わります。モデルにおいても同様で、モデルのパラメータを変更すると、そのモデルの機能も変わります。

したがって、もしあなたがオンラインでモデルをダウンロードし、そのモデルが異なる果物を分類するためのものであった場合、分類タスクを行う際にそのモデルの性能があまり良くないことに気づくかもしれません。例えば、このモデルがブドウを誤ってレーズンとして認識した場合、そのモデル内のパラメータが良くないために性能が悪化していることを示しています。そこで、あなたはこのモデルのパラメータを調整して、モデルがブドウを正しくレーズンとして認識できるようにしたいと考えます。モデルのパラメータを調整する方法の一つが LoRA の使用です。簡単に言えば、現在のモデルの機能があなたの要求を満たさないと感じた場合、LoRA を使用して現在のモデルを微調整することができます。

注:LoRA の能力を直感的に感じるために、以前私が試していた Stable Diffusion(AI 描画ソフト)について話したいと思います。その中のモデルは生成される画像が二次元か三次元かに影響を与えますが、このモデルに LoRA を追加して AI 画家を微調整することができます。私はその中に水墨風 LoRAというものがあったことを非常に明確に覚えています。この LoRA をモデルに適用すると、最終的に描かれる画像は水墨風になりますが、画像の本質的な違い — 二次元か三次元か — は変わりません。

水墨風 LoRA で微調整された画像

既存のモデルを微調整する理由#

現在、大規模モデルの種類はますます増えています。基本的に大きなインターネット企業は自社の大規模モデルを発表しています。なぜ私たちは自分で大規模モデルを訓練するのではなく、他人が訓練したモデルを微調整したいのでしょうか。その大きな理由の一つは「大きさ」です。現在のモデルのパラメータは 7B や 12B(十億)に達することがあります。これほど多くのパラメータを変更(訓練)するには、一方でコンピュータの計算速度が速く(GPU や CPU の計算能力が高い)、もう一方でコンピュータに十分なメモリが必要です。例えば 7B のモデルを考えてみましょう。もしモデルのパラメータの型が float16 で、一つのパラメータが 2 バイトを占めるとすると、7B 個のパラメータは27000000000=140000000002*7000000000=14000000000バイトを占め、GB に換算すると 13GB になります。つまり、このモデルを GPU 上で実行するには、GPU のメモリが 13GB 必要です。また、内部のパラメータを調整したい場合、コンピュータは各パラメータの勾配を保存するためにさらにメモリを確保する必要があるため、モデルを訓練するには少なくとも132=2613*2=26GB が必要です。このような大きなメモリは一般的な消費者向け GPU では通常存在しません。例えば、現在の最高性能の消費者向け GPU である 4090 のメモリは最大でも 24GB です。一方、A100 のような専門的な計算カードは 80GB に達することがありますが、専門的な計算カードは非常に高価です。

大規模モデルを訓練するには多くの専門的な GPU が必要であり、大きなインターネット企業だけが訓練できるのです。一部の大企業は訓練済みのモデルをオープンソースにし、他の人がその基盤の上でモデルのパラメータを調整できるようにしています。

したがって、一般的な消費者向け GPU でモデルのパラメータを調整できるようにするためには、つまり一般の人々のコンピュータでモデルの性能を変更するためには、私たちはモデル内の一部のパラメータのみを微調整することができ、大企業がモデルを訓練するようにすべてのパラメータを調整することはできません。言い換えれば、私たちが必要とするモデルを 100% 訓練する必要がある場合、大企業の初期の訓練が 80% を占め、私たちのコンピュータでのモデルの微調整がその 20% を占めることになります。

LoRA#

上記で述べたように、一般の人々のコンピュータでモデルの性能を変更することができるのは、私たちがモデル内の一部のパラメータを微調整することだけですが、これらのパラメータを微調整する方法はいくつかあります。その中で最も一般的な方法が LoRA です。

論文では重要な公式が述べられています:

h=W0x+ΔWx=W0x+BAx=(W0+BA)x\begin{equation} h=W_0x+\Delta Wx=W_0x+BAx=(W_0+BA)x \tag{1} \end{equation}

ここで、W0W_0はモデルの元のパラメータで、これは行列の形式です。論文によれば、$W_0$ 行列の数字は不変であり、$\Delta W = BA$ は別の行列で、LoRA は主にこの行列を変更します。W0W_0ΔW\Delta Wを加えることで新しいパラメータW1W_1が得られ、この新しいパラメータW1W_1をモデルに適用すると、モデルのパラメータが変更され、モデルの機能も変わり、微調整の目的が達成されます。

ここで問題が発生します。行列の加法に基づくと、2 つの行列が加算されるためには、同じサイズでなければなりません。例えば、以下の等式(2)等式(2)では、W0W_0行列のサイズは333*3です。ΔW\Delta WW0W_0と加算されるためには、ΔW\Delta Wのサイズも333*3でなければなりません。もし私たちが直接ΔW\Delta Wを変更する、つまりその中の33=93*3=9個のパラメータを変更するのであれば、なぜ元のモデルのパラメータW0W_0を直接変更しないのでしょうか。結局、これら 2 つの行列のサイズは同じです。そうすると、私たちの目的は達成されません — 一般の人々のコンピュータでモデルの性能を変更するためには、私たちはモデル内の一部のパラメータのみを微調整することができるのです。消費者向けのコンピュータの計算能力とメモリでは、元のモデルの何千ものパラメータを変更することは不可能です。

W0=(123456789)\begin{equation} W_0 = \left( %左括号 \begin{matrix} %この行列は合計3列で、各列は中央に配置されています 1 & 2 & 3\\ %第一行の要素 4 & 5 & 6\\ %第二行の要素 7 & 8 & 9\\ %第三行の要素 \end{matrix} \right) \tag{2} \\ \end{equation}

この問題を解決するために、論文は新しい方法を提案しました。

LoRA は、事前訓練された重みを固定したまま、適応中に密な層の変化のランク分解行列を最適化することによって、神経ネットワーク内のいくつかの密な層を間接的に訓練できるようにします。

この文の中で、私が重要だと思うキーワードはランク分解です。直接の翻訳は秩分解でしょうか?

ランク分解とは#

行列の乗算に基づくと、行列AAのサイズが434*3で、行列BBのサイズが343*4の場合、これらを掛け合わせるとABAB行列のサイズは444*4になります。

上記の等式を例に取ると、等式(2)等式(2)からW0W_0のサイズは333*3であり、行列の加法により、ΔW\Delta Wのサイズも333*3でなければなりません。重要な点は、ΔW\Delta Wを得るために、ΔW=BA\Delta W = BAとすることができます。つまり、ΔW\Delta Wを 2 つの行列の積に変えることができます。ここで、BB行列のサイズは3r3*rで、AA行列はr3r*3です。ここでの $r$ は変数であり、自由に変更できます。この $r$ は非常に重要で、後で説明します。行列の乗算により、BABAの結果の行列サイズは333*3になります。これにより、W0W_0と加算することができます。

r=1とすると、B=(b1b2b3)A=(a1a2a3)r=1とすると、\\ \begin{equation} B = \left( \begin{matrix} b_1 \\ b_2 \\ b_3 \\ \end{matrix} \right) A = \left( \begin{matrix} a_1 & a_2 & a_3 \\ \end{matrix} \right) \\ \end{equation}
ΔW=BA=(b1b2b3)(a1a2a3)=(b1a1b1a2b1a3b2a1b2a2b2a3b3a1b3a2b3a3)\begin{equation} \Delta W = BA = \left( \begin{matrix} b_1 \\ b_2 \\ b_3 \\ \end{matrix} \right) * \left( \begin{matrix} a_1 & a_2 & a_3 \\ \end{matrix} \right) = \left( \begin{matrix} b_1a_1 & b_1a_2 & b_1a_3 \\ b_2a_1 & b_2a_2 & b_2a_3 \\ b_3a_1 & b_3a_2 & b_3a_3 \\ \end{matrix} \right) \tag{3} \end{equation}

等式(3)等式(3)からわかるように、9 個のパラメータを持つ大きな行列が、3 個のパラメータを持つ 2 つの小さな行列の積に分解されました。ランク分解は、大きな行列を小さな行列の積に分解することを簡単に理解することができます。これにより、ΔW\Delta Wを得るためには、2 つの小さな行列の 6 個のパラメータを変更するだけで済みます。ΔW\Delta Wの 9 個のパラメータと比べて、6 個のパラメータは大幅に減少します。

LoRA による訓練パラメータの削減効果は顕著であり、論文では次のように述べられています。

事前訓練されたモデルが GPT-3 175B の場合、訓練可能なパラメータの数は $W_0$ の 0.01% まで小さくできます。

つまり、LoRA を使用して GPT-3 を訓練すると、訓練可能なパラメータはモデルパラメータの 0.01% になります。

LoRA における $r$(ランク)パラメータの選択#

前述のように、ΔW\Delta Wは 2 つの行列の積に分解され、その中でBB行列のサイズは3r3*rで、AA行列はr3r*3です。線形代数の知識に基づくと、一般的に 2 つの行列の積の結果行列のランクは、元の 2 つの行列のランクの最小値を超えることはありません。つまり、選択した $r$ が 3 未満であれば、AABBの積から得られる行列のランクは $r$ を超えず、3 未満になります。実際、この例では、選択した $r$ は 3 未満でなければなりません。もし $r$ を 4 に設定すると、変更(訓練)するパラメータは43+34=244*3 + 3*4 = 24となり、元のモデルのパラメータよりも多くなります。これは LoRA を使用する目的 — 訓練可能なパラメータの数を減らす — に反します。

ここで問題が発生します。もしモデルの元のパラメータ行列W0W_0がフルランクである場合、LoRA によって得られるΔW\Delta WのランクはW0W_0よりも小さくなります。つまり、LoRA はモデルパラメータ行列の部分空間のみを微調整できるということです。再び等式(2)等式(2)を例に挙げると、W0W_0のランクは 3 です。簡単に言えば、このモデルは三次元座標系を使用して問題を解決する必要がありますが、LoRA を使用し、r=1r=1と設定すると、モデルの 1 次元のみを変更しており、他の 2 次元は考慮されていません。このため、モデルのパラメータをどのように変更しても、効果はあまり良くありません。

LoRA がモデルパラメータ行列の部分空間のみを微調整できるのであれば、LoRA を使用する意味は何でしょうか。どのようにしても一つか二つの次元が考慮されていないのです。

幸いなことに、以前の論文によれば:the learned over-parametrized models in fact reside on a low intrinsic dimension. つまり、私たちはモデルを三次元座標系で構築していますが、モデルは最終的にただの 1 本の線を利用しており、その中の 1 次元だけを使用しています。これは、モデルパラメータW0W_0のこの333*3行列の列ベクトルが線形に関連していることを示しており、モデルパラメータのランクは実際には 1 です。これが論文で言われているlow intrinsic dimensionです。この場合、r=1r=1と設定すると、効果が良くなります。私たちは 2 つの小さな行列の 6 個のパラメータを変更するだけで済み、ΔW\Delta Wの 9 個のパラメータと比べて、6 個のパラメータは大幅に減少します。しかし、r=2r=2と設定することもできますが、そうすると訓練可能なパラメータは 12 になり、副作用が生じます。

私たちはモデルがいくつの次元を使用してモデル化しているかを知らないため、パラメータ $r$ は手動で最適値を試行する必要があります。このようなパラメータはハイパーパラメータと呼ばれます。$r$ が大きいと、訓練可能なパラメータが増え、$r$ が小さいと訓練効果が悪くなります。

LoRA の利点#

比較のために、他の微調整可能なモデルパラメータの方法について先に説明します。

  • Adapter Layers:これはモデルのアーキテクチャを変更し、モデルにいくつかの層を追加し、これらの層のパラメータのみを変更することに相当します。しかし、これには問題があります。これによりモデルの推論時間が長くなります。専門用語ではInference Latencyと呼ばれます。例えるなら、モデルを A と B をつなぐコンクリート道路と考えます。あなたの入力は A にいる車で、この車はコンクリート道路を通って B に到達し、結果を得ます。車は道を走るのに時間がかかります。そしてAdapter Layersはこの道路に小さなコンクリートの部分を追加し、その部分のパラメータのみを最適化します。しかし、道のりが長くなり、車の移動時間が長くなります。これが推論時間の増加です。しかし LoRA は、道路の長さを変えずに、一部の道路を高速道路にアップグレードするようなものです(速さを意味するのではなく、効果が良いという意味です。LoRA は推論速度を速くするわけではありません)

  • Prefix tuning: プレフィックス微調整は実際にはプロンプトエンジニアリングの一種であり、モデルを直接変更するものではありません。プロンプトをプレフィックス(前置き)とサフィックス(後置き)に分けます。ユーザーはサフィックスに入力し、プレフィックスは微調整に使用されます。これにより、ユーザーの入力が少なくなります。これが欠点です。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。