👩

LoRA

に公開

ややこしいが、"Adapter" (Houlsby) とは別の技術。派生でもない。

  • 対象は線形層のパラメータのみ
    • 線形層:Affine変換のみを行う層。例は以下
      • 出力層
        • LMヘッド、各NNの出力層
      • 注意機構の中で
        • q_proj: Query写像する層
        • k_proj: Key写像する層
        • v_proj: Value写像する層
        • o_proj: 出力層
      • FFNの中で
        • up_proj: 入力層
        • down_proj: 出力層
        • gate_proj: GLU
  • そのパラメータの差分をパラメータとして学習する

具体的な方法

対象の線形層(前段→後段の重み)の元の重みを W_{before} とし、追加学習によってこれを W_{after} へ更新したいとする。その差分を \Delta W とする。

W_{after} = W_{before} + \Delta W

この \Delta W だけが学習対象となり、元の重み W_{before} は凍結される。学習完了後に \Delta W + W_{before} = W_{after} として対象の線形層の重みを更新するので、推論時のコストは変わらない。

\Delta W の計算

\Delta W は、前段→後段の間に並列のルートを分岐し、追加の層 R を挟むことで計算する。

  • 前段 → R
  • R → 後段

の形でそれぞれ重み W_AW_B とすれば、 W_A \times W_B = \Delta W となる。

  • この層 R のサイズ(ノード数=次元数)は前後の層より「かなり小さく」する。
    • 数式では「 \text{Rのサイズ} \ll min(\text{前段のサイズ}, \text{後段のサイズ}) 」と書く。
    • このとき R のサイズは低ランク ( Low Rank ) であるという。
    • 例えば前段と後段がそれぞれ 768 次元に対して R8 次元といった具合。
  • W_A は乱数で、 W_B0 で初期化する。
    • そのため、学習開始時点では \Delta W = 0

Discussion