2023-12-21 ML勉強会
LoRA: Low-Rank Adaptation of Large Language Models
- Edward J. Hu, Yelong Shen, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Lu Wang, Weizhu Chen
モチベーション
- 自然言語処理における多くのアプリケーションは大規模な事前学習モデルをファインチューニングすることで下流のタスクへ適応させている
- しかし、基本的にファインチューニングでは元のモデルのすべてのパラメータを更新するため、GPT-3のような膨大なパラメータを持つモデルの場合は大量のGPUが必要となり法外なコストがかかる
- これまでにも計算効率を改善するために数多くの研究がなされてきたが、代表的な手法には以下のような問題がある
- タスク固有のAdapter Layerの追加
- Adapter Layerで追加の推論コストが必要となる
- Adapter Layerは順次処理する必要があり効率的に並列処理を行うことができない
- Prefix-Tuning
- 学習が難しい
- 入力の先頭にタスク固有のベクトルを追加するため系列長を圧迫する
- 上記のような既存の手法ではファインチューニングのベースラインの性能に達さないことが多く、計算効率と性能がトレードオフとなってしまっている
- そこで著者らは over-parametrized なモデルが実際には低い次元(intrinsic dimension)に存在する という論文からインスピレーションを得て、モデル適応時のパラメータの変化も本質的にランクが低いと仮定し、Low-Rank Adaptation (LoRA) を導いた
- LoRAでは学習パラメータ数を大幅に削減することでGPUをはじめとする計算資源を削減しつつ、追加の推論レイテンシも不要でファインチューニングと同等以上の性能を発揮することを示す
提案手法
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/layerx/c6a7d8a4-48e8-4b0d-94c0-0889abee7669/e6f083ea2bca6b50f253827fc60f9603.png)
- LoRAでは事前学習した線形層の重みを凍結し、かわりに重みの差分 となるような行列 を学習させることで間接的に線形層を学習させることができる
- 事前学習した重み行列を とすると、 となり、ここで となるようなランク を選択することで、元の線形層と比較して学習パラメータ数を大幅に削減することができる
- LoRAの利点
- 事前学習済みモデルを共有することで、様々なタスクに対応したLoRAを効率的に切り替えることができる
- 学習パラメータが少ないため、勾配の計算やオプティマイザの状態を保持する必要がなく効率的に学習させることができる
- GPT-3ではファインチューニングと比較して25%の高速化を確認
- 推論時には事前学習した重みと学習した重みを加算することで元のモデルと同じアーキテクチャになるので余分な推論レイテンシが発生することがない
- LoRAは多くの先行手法と独立しているため、Prefix-Tuningなど他の手法と組み合わせることができる
- メモリとストレージの使用量を減らすことで、GPUを大幅に削減し、I/Oボトルネックを回避することができる
- GPT-3ではVRAMを1.2TBから350GBに削減し、 でAttention Layerのquery, valueの重み行列にLoRAを適用した場合チェックポイントのモデルサイズは350GBから35MBに削減される
実験
- LoRAの下流タスク(NLU, NLG)の性能をRoBERTa, DeBERTa, GPT-2, GPT-3におけるいくつかの学習手法と比較した
- 比較対象
- Fine-Tuning (FT)
- 通常のファインチューニング、すべてのパラメータが学習される
- Bias-only or BitFit
- バイアスベクトルのみを更新し他のパラメータを凍結して学習
- Prefix-embedding tuning (PreEmbed)
- 入力トークンの中にspecial tokenを挿入する。これらのspecial tokenは学習可能な単語埋め込みを持つ
- Prefix-layer tuning (PreLayer)
- Prefix-embedding tuningの拡張で、special tokenに対して単語埋め込みを学習するかわりに、すべてのTransformer Layerの後の活性度を学習する
- Adapter tuning
- Houlsbyらで提案されたAdapter tuningはself-attention(およびMLPモジュール)とその後の残差接続の間にAdapter Layerを挿入する。Adapter Layerにバイアスを持つ全結合層が2つあり、その間に活性化関数がある
- オリジナルの設計
- LinらはMLPモジュールの後とLayerNormの後にのみAdapter Layerを適用し、より効率的な設計を提案
- これはPfeifferらで提案された別の設計に類似
- LoRA
- 既存の重み行列と並行して学習可能なランク分解行列のペアを追加する。簡単のためにほとんどの実験ではSelf-Attentionのquery, valueの重み行列にのみLoRAを適用している。
NLU
- GLUEベンチマーク
- RoBERTa base / large, DeBERTa XXL
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/layerx/9ff81a77-0be7-4d7a-9b59-e030806b158c/a099bbeb4b9e4fcf5ec5e9029a5169b1.png)
NLG
- E2E NLG Challenge
- GPT-2 medium / large
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/layerx/e6b0078b-a52f-4847-8a6c-27a4e4483178/934325ef9c3e64774c8152699f651ded.png)
NLU / NLG GPT-3 175B
- WikiSQL, MNLI, SAMSum
- 3つのデータセットすべてにおいてファインチューニングと同等以上
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/layerx/85eb6ba5-d743-43f3-a6e4-df00410fd78c/a74957b4745ffbcdc6a574dfa9845321.png)
精度と学習可能なパラメータ数の関係 GPT-3 175B
- すべての手法が学習可能なパラメータを増やせば単調に精度が上がるわけではない
- PrefixEmbedに256以上のspecial tokenを使用した場合やPrefixLayerに32以上のspecial tokenを使用した場合大幅な性能低下が観察された
- special tokenを増やすことで入力分布が事前学習データの分布から離れてしまうからではないかと推測される
- LoRAは性能が安定している
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/layerx/6da7f708-53dc-41fa-83e4-ab3b5ab4daec/44c08b8e072d545293900a3377b755fd.png)
Transformerにおいてどの重み行列に適用すべきか
- パラメータの総数を固定したうえで、Self Attentionにおけるquery, key, value, outputにLoRAを適用し、WikiSQL, MNLI で精度を比較
- query, keyのどちらか一方のみ適用した場合は性能が著しく低下し、query, valueの2つに適用した場合に最高の性能が得られた
- 大きなランクでひとつの重み行列だけに適用するよりも、小さなランクで複数の重み行列に適用した方が望ましい結果となった
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/layerx/eacda4f9-2a76-4a7d-bbea-8b4bff140c5b/b50d8141f863a20b82219bf969c076c0.png)
最適なランクはいくつか
- 異なるランクにおけるWikiSQL, MNLIの精度を比較
- 非常に小さなランクで高い性能を発揮しており、このことは更新行列 が非常に小さなintrinsic rankを持つ可能性があることを示唆している
- queryを単独で学習する場合は大きなランクが必要となる
![](https://s3.ap-northeast-1.amazonaws.com/wraptas-prod/layerx/501b14b1-a974-46ba-bb69-255df489b29e/84873d6bf4d84cd0de0e01c9e39d35e5.png)
参考資料
こちらのスライドが非常にわかりやすくまとまっていてよかったです