私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
AIGCの分野で「LoRA」という専門用語がよく出てきますが、ちょっと人名っぽいですが、モデル学習の手法のことです。 LoRA の正式名称は、中国語で「Low-Rank Adaptation of Large Language Models」と呼ばれます。大規模な言語モデルの低レベルの適応 。現在では安定した普及で非常によく使われています。
大規模な言語モデルのパラメータ数は膨大であるため、多くの大企業では数カ月間のトレーニングが必要となるため、リソース消費を抑えたさまざまなトレーニング方法が提案されており、LoRA もその 1 つです。
この記事では、LoRA の原理を詳しく紹介し、PyTorch を使用して小規模モデルの LoRA トレーニングを実装します。
現在、ほとんどのモデル トレーニングでは勾配降下アルゴリズムが使用されています。勾配降下アルゴリズムは次の 4 つのステップに分割できます。
線形モデルを例にとると、モデル パラメーターは W、入力と出力は x、y、損失関数は平均二乗誤差です。各ステップの計算は次のようになります。線形モデルの場合、最初の計算は行列の乗算です。
L = MSE(Wx,y)L = MSE(Wx,y)L = MSE(Wx,y)
損失を見つけた後、L 対 W の勾配を計算して dW を取得できます。
dW=∂L∂WdW = frac{部分 L}{部分 W}dW=∂W∂L
dW は L が最も速く上昇する方向を示す行列ですが、目的は L を下降させることなので、W から dW を引いたものとします。更新のペースを調整するために、学習率 η も乗算され、次のように計算されます。
W′=W−ηdWW' = W - ηdWW′=W−ηdW
最後にずっと繰り返します。上記の 3 つのステップの疑似コードは次のとおりです。
# 4、重复1、2、3
for i in range(10000):
# 1、正向传播计算损失
L = MSE(Wx, y)
# 2、反向传播计算梯度
dW = gradient(L, W)
# 3、利用梯度更新参数
W -= lr * dW
更新が完了すると、新しいパラメータ W' が取得されます。このときモデル予測を使用すると、計算は次のようになります。
pred=W′xpred = W'xpred=W′x
W と W' の関係について考えることができます。 通常、W は基本モデルのパラメータを指し、W' は基本モデルに基づいていくつかの行列の加算と減算の後に得られます。トレーニング プロセス中に 10 回更新され、毎回 dW が dW1、dW2、...、dW10 になると仮定すると、完全な更新プロセスは 1 つの操作として記述できます。
W′=W−ηdW1−ηdW2−…−ηdW10 としましょう: dW=∑i=110dWiW′=W−ηdWW' = W - ηdW_1 - ηdW_2 - … - ηdW_{10} \ しましょう: dW = sum_{i=1} ^{10}dW_i \ W' = W - ηdW W'=W−ηdW1 −ηdW2 −…−ηdW10 としましょう: dW=i=1∑10 dWi W'=W−ηdW
ここで、dW は W' と同じ形状の行列です。 -ηdW を行列 R として記述すると、更新されたパラメーターは次のようになります。
W′=W+RW' = W + RW′=W+R
このとき、トレーニング プロセスは、元の行列と別の行列 R を加えたものに簡略化されます。ただし、行列 R を解くことはそれほど単純ではなく、リソースを節約することはできません。現時点では、LoRA のアイデアが導入されています。
完全にトレーニングされた行列は通常、フルランクであるか、基本的にランクを満たします。つまり、行列内のどの列も冗長ではありません。論文「神経言語モデルのスケーリング則」では、データセットとパラメータサイズの関係が提案されており、この関係が満たされ、トレーニングが良好であれば、結果として得られるモデルは基本的にフルランクになります。モデルを微調整する場合、基本的にフルランクのベースモデルを選択します。行列 R のランクの更新はどのような状況ですか?
R 行列は低ランクの行列であると仮定します。低ランクの行列には多くの繰り返し列があるため、2 つの小さな行列に分解できます。 W の形状が m×n の場合、A の形状も m×n になります。行列 R を AB に分解します (A の形状は m×r、B の形状は r×N です)。通常は、図に示すように、 n の値である m よりもはるかに小さい値を選択します。
低ランク行列を 2 つの行列に分解すると、いくつかの利点があります。1 つ目は、パラメーターの数が大幅に削減されることです。 R 行列の形状が 100×100 であるとすると、R のパラメータの数は 10000 になります。ランク 10 を選択すると、行列 A の形状は 100×10、行列 B の形状は 10×100 となり、パラメータの数は R 行列より 80% 少なくなります。
また、R は低ランク行列であるため、十分なトレーニングがあれば、A 行列と B 行列は R の効果を達成できます。ここでの行列 AB は、私たちがよく LoRA モデルと呼ぶものです。
LoRA を導入した後、予測では W と AB にそれぞれ x を入力する必要があります。このときの予測計算は次のようになります。
予測値=Wx+ABx予測値 = Wx + ABx予測値=Wx+ABx
予測時は元のモデルより若干遅くなりますが、大規模なモデルでは基本的に差は感じられません。
すべての詳細を把握するために、lora の実戦では大規模なモデルを使用せず、vgg19 などの小規模なネットワークを使用して lora モデルをトレーニングします。必要なモジュールをインポートします。
import os
import torch
from torch import optim, nn
from PIL import Image
from torch.utils import data
from torchvision import models
from torchvision.transforms import transforms
ここでは、imagenet 上の vgg19 の事前トレーニングされた重みがベース モデルとして使用されるため、分類データ セットを準備する必要があります。便宜上、ここでは 1 つのカテゴリと 5 つの写真のみがプロジェクトの下に用意されています。data/goldfish
下:
imagenet には金魚のカテゴリが含まれていますが、ここではイラスト付きバージョンの金魚が選択されています。テストの結果、事前トレーニングされたモデルは上記の画像を正しく分類できません。私たちの目的は、LoRA をトレーニングし、モデルを正しく分類することです。
LoraDataset を作成します。
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
class LoraDataset(data.Dataset):
def __init__(self, data_path="datas"):
categories = models.VGG19_Weights.IMAGENET1K_V1.value.meta["categories"]
self.files = []
self.labels = []
for dir in os.listdir(data_path):
dirname = os.path.join(data_path, dir)
for file in os.listdir(dirname):
self.files.append(os.path.join(dirname, file))
self.labels.append(categories.index(dir))
def __getitem__(self, item):
image = Image.open(self.files[item]).convert("RGB")
label = torch.zeros(1000, dtype=torch.float64)
label[self.labels[item]] = 1.
return transform(image), label
def __len__(self):
return len(self.files)
LoRA をレイヤーにカプセル化します。 LoRA でトレーニングする必要がある行列は次のとおりです。
class Lora(nn.Module):
def __init__(self, m, n, rank=10):
super().__init__()
self.m = m
self.A = nn.Parameter(torch.randn(m, rank))
self.B = nn.Parameter(torch.zeros(rank, n))
def forward(self, inputs):
inputs = inputs.view(-1, self.m)
return torch.mm(torch.mm(inputs, self.A), self.B)
ここで、m は入力のサイズ、n は出力のサイズ、rank はランクのサイズであり、より小さい値を設定できます。
重みを初期化するとき、A をガウス ノイズで初期化し、B を 0 行列で初期化します。これは、トレーニングが最下位のモデルから開始されるようにするためです。 AB は 0 行列なので、初期状態では LoRA は動作しません。
次のステップはトレーニングです。これは基本的に PyTorch の通常のトレーニング コードと同じです。まずコードを見てみましょう。
# 加载底模和lora
vgg19 = models.vgg19(models.VGG19_Weights.IMAGENET1K_V1)
for params in vgg19.parameters():
params.requires_grad = False
vgg19.eval()
lora = Lora(224 * 224 * 3, 1000)
# 加载数据
lora_loader = data.DataLoader(LoraDataset(), batch_size=batch_size, shuffle=True)
# 加载优化器
optimizer = optim.Adam(lora.parameters(), lr=lr)
# 定义损失
loss_fn = nn.CrossEntropyLoss()
# 训练
for epoch in range(epochs):
for image, label in lora_loader:
# 正向传播
pred = vgg19(image) + lora(image)
loss = loss_fn(pred, label)
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
optimizer.zero_grad()
print(f"loss: {loss.item()}")
ここで注意すべき点が 2 つあります。1 つ目は、vgg19 の重みを学習不可能に設定していることです。これは転移学習と非常に似ていますが、実際には異なります。
2 番目のポイントは、順伝播中に次のコードを使用することです。
pred = vgg19(image) + lora(image)
簡単なテストを行ってみましょう。
# 测试
for image, _ in lora_loader:
pred = vgg19(image) + lora(image)
idx = torch.argmax(pred, dim=1).item()
category = models.VGG19_Weights.IMAGENET1K_V1.value.meta["categories"][idx]
print(category)
torch.save(lora.state_dict(), 'lora.pth')
出力は次のとおりです。
goldfish
goldfish
goldfish
goldfish
goldfish
基本的な予測は正しいですが、このテスト結果には何の意味もありません。最後に、5M LoRA モデルを保存しました。これは、vgg19 の数十 MB に比べて非常に小さいです。
LoRA は大規模なモデルの効率的なトレーニング方法であり、この記事では読者に LoRA の詳細な実装をより明確に理解していただくために、小規模な分類ネットワークで LoRA を使用しています (ただし、LoRA では大規模なモデルを実行できないため)。データ量が限られているため、LoRA の精度や効率などの問題については詳しく説明しません。読者は関連資料を参照して深く理解することができます。
私は 10 年以上、インターネット企業の第一線で働き、多くの後輩を指導してきました。多くの人が学び、成長するのを助けました。
皆さんと共有する価値のある経験と知識がたくさんあることを認識しています。また、私たちの能力と経験を活用して、人工知能の学習における多くの混乱に答えることもできます。そのため、私は今でもさまざまなことを整理して共有することに固執しています。仕事で忙しい。しかし、知識を広めるためのチャネルが限られているため、インターネット業界の多くの友人は学習を改善するための正しい教材を入手できません。そのため、重要なAI大規模モデル教材には、AI大規模モデル入門学習マインドマップ、高品質AI大規模モデル学習が含まれます。書籍やマニュアル、ビデオチュートリアル、実践的な学習、その他の録画ビデオが無料で共有されます。
第 1 段階: 大規模モデル システムの設計から開始し、大規模モデルの主な方法を説明します。
第 2 段階: 大規模モデルのプロンプト ワード プロジェクトを通じて、モデルの役割をより効果的に活用するためにプロンプトの観点から開始します。
第 3 段階: 大規模モデル プラットフォーム アプリケーション開発では、Alibaba Cloud PAI プラットフォームを使用して、電子商取引分野での仮想フィッティング システムを構築します。
第 4 段階: 大規模モデルの知識ベース アプリケーション開発では、LangChain フレームワークを例として、物流業界のコンサルティング用のインテリジェントな質疑応答システムを構築します。
第 5 段階: ビッグヘルス、ニューリテール、ニューメディアの分野を使用して大規模モデルの開発を微調整し、現在の分野に適した大規模モデルを構築します。
第 6 段階: SD マルチモーダル大規模モデルに基づいて、Wensheng ダイアグラム アプレット ケースを構築しました。
第7段階:大型モデルプラットフォームのアプリケーションと開発に焦点を当て、Xinghuo大型モデルやWenxin大型モデルなどの成熟した大型モデルを通じて大型モデル業界アプリケーションを構築します。
👉学会后的收获:👈
• 大規模モデル(フロントエンド、バックエンド、プロダクトマネージャー、設計、データ分析など)のフルスタックエンジニアリング実装に基づいて、このコースを通じてさまざまな能力を習得できます。
• 大規模なモデルを使用して関連する実際のプロジェクトのニーズを解決できる: ビッグデータの時代には、ますます多くの企業や機関が大量のデータを処理する必要があり、大規模なモデル テクノロジを使用することで、これらのデータをより適切に処理し、データ分析の精度を向上させることができます。そして意思決定。したがって、大規模モデル アプリケーションの開発スキルを習得すると、プログラマーは実際のプロジェクトのニーズにうまく対処できるようになります。
• 大規模モデルとエンタープライズデータ AI アプリケーション開発に基づいて、大規模モデル理論を実装し、GPU コンピューティング能力、ハードウェア、LangChain 開発フレームワークとプロジェクトの実践スキルを習得し、大規模モデルの垂直トレーニングの微調整 (データ準備、データ蒸留、大規模なデータ抽出) を学びます。モデル展開)ワンストップで習得。
• 一般的な大規模モデルの垂直フィールド モデルのトレーニング機能を完了し、プログラマのコーディング能力を向上させる機能: 大規模モデルのアプリケーション開発には、機械学習アルゴリズム、深層学習フレームワーク、その他のテクノロジを習得する必要があり、これらのテクノロジを習得することで、プログラマのコーディングおよび分析能力が向上します。高品質のコードを書くことにさらに習熟するため。
1. AI大規模モデル学習ロードマップ
2. 大型AIモデル100セットの商用化計画
3.100 エピソードの大規模モデル ビデオ チュートリアル
4,200 冊の大型模型 PDF ブック
5. LLM 面接の質問集
6.AIプロダクトマネージャーリソースコレクション
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓