hacktricks/todo/llm-training-data-preparation/7.0.-lora-improvements-in-fine-tuning.md

4 KiB
Raw Blame History

7.0. LoRAのファインチューニングにおける改善

LoRAの改善

{% hint style="success" %} LoRAを使用することで、ファインチューニングに必要な計算量が大幅に削減されます。 {% endhint %}

LoRAは、モデルの小さな部分のみを変更することで、大規模モデルを効率的にファインチューニングすることを可能にします。これにより、トレーニングする必要のあるパラメータの数が減り、メモリ計算リソースが節約されます。これは以下の理由によります:

  1. トレーニング可能なパラメータの数を削減: モデル内の全体の重み行列を更新する代わりに、LoRAは重み行列を2つの小さな行列AB)に分割します。これにより、トレーニングが速くなり、更新する必要のあるパラメータが少なくなるため、メモリ少なくて済みます。
  2. これは、レイヤー行列の完全な重み更新を計算する代わりに、2つの小さな行列の積に近似するため、更新計算が削減されるからです
2. **元のモデルの重みを変更しない**: LoRAを使用すると、元のモデルの重みをそのままにしておき、**新しい小さな行列**AとBだけを更新できます。これは、モデルの元の知識が保持され、必要な部分だけを調整することを意味するため、便利です。 3. **効率的なタスク特化型ファインチューニング**: モデルを**新しいタスク**に適応させたい場合、モデルの残りの部分をそのままにしておき、**小さなLoRA行列**AとBだけをトレーニングすればよいです。これは、モデル全体を再トレーニングするよりも**はるかに効率的**です。 4. **ストレージ効率**: ファインチューニング後、各タスクのために**全く新しいモデル**を保存する代わりに、**LoRA行列**だけを保存すればよく、これは全体のモデルに比べて非常に小さいです。これにより、あまりストレージを使用せずにモデルを多くのタスクに適応させることが容易になります。

ファインチューニング中にLinearの代わりにLoraLayersを実装するために、ここに提案されたコードがあります https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb:

import math

# Create the LoRA layer with the 2 matrices and the alpha
class LoRALayer(torch.nn.Module):
def __init__(self, in_dim, out_dim, rank, alpha):
super().__init__()
self.A = torch.nn.Parameter(torch.empty(in_dim, rank))
torch.nn.init.kaiming_uniform_(self.A, a=math.sqrt(5))  # similar to standard weight initialization
self.B = torch.nn.Parameter(torch.zeros(rank, out_dim))
self.alpha = alpha

def forward(self, x):
x = self.alpha * (x @ self.A @ self.B)
return x

# Combine it with the linear layer
class LinearWithLoRA(torch.nn.Module):
def __init__(self, linear, rank, alpha):
super().__init__()
self.linear = linear
self.lora = LoRALayer(
linear.in_features, linear.out_features, rank, alpha
)

def forward(self, x):
return self.linear(x) + self.lora(x)

# Replace linear layers with LoRA ones
def replace_linear_with_lora(model, rank, alpha):
for name, module in model.named_children():
if isinstance(module, torch.nn.Linear):
# Replace the Linear layer with LinearWithLoRA
setattr(model, name, LinearWithLoRA(module, rank, alpha))
else:
# Recursively apply the same function to child modules
replace_linear_with_lora(module, rank, alpha)

参考文献