LoRAとプルーニングの融合：LoRAPruneで実現するメモリ効率と計算コスト削減

※ このページは「LORAPRUNE: PRUNING MEETS LOW-RANK PARAMETER-EFFICIENT FINE-TUNING」の要約になります。

## このページでわかること
- LoRAPruneは、LoRAの勾配を使用して重要度を推定し、構造的なプルーニングを行う
- LoRAPruneは、大規模事前学習モデルのメモリと計算コストを削減しながら高い性能を維持

## 対象読者
- 機械学習やディープラーニングの研究者やエンジニア、大規模事前学習モデル (LPM) を効率的に微調整したり、プルーニングしたりする方法を探している人
- 特に、計算資源やメモリ使用量を削減しながら、高性能を維持する方法に関心のある人


## 従来手法の問題点
1. **LLMの大規模性と計算コスト**：大規模な事前学習モデルは、高性能を発揮する一方で、非常に大きな計算リソースとメモリを必要とします。これにより、効率的な展開が困難になる
   
2. **従来のプルーニング手法の制約**：現在のプルーニング手法はLoRA（低ランク適応）と互換性がなく、LoRAの重みを統合することができない。また、従来のプルーニング手法は事前学習済みの重みの勾配を利用してプルーニングを行うため、メモリオーバーヘッドが大きくなる

3. **プルーニングとLoRAの統合の難しさ**：LoRAを利用することで計算リソースの節約が可能ですが、従来のプルーニング手法とLoRAを統合することは困難であり、プルーニングの効果が減少する

### 従来のプルーニング手法
従来のプルーニング手法にはいくつかの種類があり、それぞれ異なるアプローチを採用しています。主なものとして以下があります：

1. **非構造的プルーニング (Unstructured Pruning)**：
   - **重みの大きさに基づくプルーニング (Magnitude-based Pruning)**：重みの絶対値が小さいものを削除します。この方法は単純で効果的ですが、非構造的なスパース性をもたらし、ハードウェア上での効率的な実行が困難
   - **勾配に基づくプルーニング (Gradient-based Pruning)**：重みの勾配に基づいて重要度を評価し、影響が少ない重みを削除する。計算コストが高く、メモリのオーバーヘッドが大きいという欠点がある

2. **構造的プルーニング (Structured Pruning)**：
   - **チャネルプルーニング (Channel Pruning)**：ネットワーク内の特定のフィルタやチャネルを削除する。これにより、モデルのサイズが減少し、ハードウェア上での効率的な実行が可能になる
   - **ヘッドプルーニング (Head Pruning)**：注意機構を持つモデル（例えば、トランスフォーマーモデル）において、不要な注意ヘッドを削除する

3. **その他のプルーニング手法**：
   - **Optimal Brain Surgeon**：ネットワークの重みを削除する際の誤差を最小限に抑えるように計算する。計算コストが高いため、実用性は低い
   - **Lottery Ticket Hypothesis**：初期化された重みの中に「勝利チケット」と呼ばれる、訓練後に高性能を発揮するサブネットワークが存在するという仮説に基づき、プルーニングを行う

## LoRAPrune
### LoRAPrune とは？

LoRAPruneは、低ランク適応（LoRA）と構造的プルーニングを統合した新しいフレームワークです。この手法は、LLMの重みを効率的にプルーニングし、メモリと計算コストを削減しながら、高い性能を維持することを目的としています。LoRAの勾配を用いて重みの重要度を評価し、不要なチャネルやヘッドを削除することで、プルーニング後のモデルの重みとLoRAの重みをシームレスに統合します。


概要を理解するには下図を見るとわかりやすいですね。a や b のように元行列 $W$ をプルーニングすると高コストですが、LoRA 部分を上手く使って間接的に元行列 $W$ をプルーニングしてやると、低コストで上手くプルーニングできるということかと思っています。
```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  LoRAPrune の概要図\n(出典：LORAPRUNE: PRUNING MEETS LOW-RANK PARAMETER-EFFICIENT FINE-TUNING)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/7bc65f11-100d-53f1-9f1c-d4f641257a0c.png>
@enduml
```

### LoRAPrune のメリット

1. **メモリ効率の向上**：LoRAPruneはLoRAの勾配のみを使用して重みの重要度を評価するため、事前学習された重みの勾配を計算する必要がなく、メモリ消費を大幅に削減する
2. **計算コストの削減**：LoRAPruneは、プルーニングと微調整を同時に行うため、追加の計算コストを発生させずに効率的なプルーニングが可能
3. **高い圧縮率**：LoRAPruneは高い圧縮率を達成しつつ、プルーニング後のモデル性能を維持することができます。例えば、LLaMAモデルに対する実験では、LoRAPruneが他のプルーニング手法よりも優れた性能を示す

### LoRAPrune の手順

1. **重みの初期化とデータの準備**：
   - 重みを初期化し、キャリブレーションデータを準備する
       - キャリブレーションデータ：モデルのプルーニングや量子化などのプロセスにおいて、モデルのパフォーマンスを調整・最適化するために使用されるデータセットのこと

2. **LoRAの勾配に基づく重要度の計算**：
   - LoRAの勾配を用いて重みの重要度を計算し、各グループの重要度を評価する

3. **プルーニングの実行**：
   - 重要度が低いグループを削除するバイナリマスクを設定し、繰り返しプルーニングを実行する

4. **微調整とプルーニングの反復**：
   - プルーニング後のモデルを微調整し、目標のスパース比率に達するまでこのプロセスを繰り返す

### LoRAPrune の性能

LoRAPruneの性能は、複数のベンチマークデータセットおよび異なるスケールのLPMで実験され、その優れた性能が確認されています。例えば、LLaMA-65bモデルに対して、LoRAPruneは他のプルーニング手法よりも低いパープレキシティを達成し、メモリ使用量を52.6%削減しました。また、実験ではLoRAPruneが他の手法と比較しても一貫して優れた性能を示し、様々なデータセットで競争力のある結果を達成しました。

## まとめ
以上がLoRAPruneの要約でした。LoRAPrune はよりコストを下げるという方向に進んだ手法のようですね。ただ、実際、LoRA を使うときはコストは問題なく、性能の問題が出ることが多い気がするので実際この手法はどうなんだろうという気もしますが、低コストにした分 LoRA のハイパーパラメータを調整すれば性能が高くなるということなんでしょうか？

誰か検証してください。

おわり。