Berbagi teknologi

Prinsip dan implementasi LoRA--PyTorch membangun model LoRA sendiri

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

I. Pendahuluan

Ada istilah khusus "LoRA" yang sering muncul di bidang AIGC. Kedengarannya seperti nama seseorang, tetapi ini adalah metode pelatihan model. Nama lengkap LoRA adalah Adaptasi Tingkat Rendah Model Bahasa Besar, yang disebut dalam bahasa CinaAdaptasi tingkat rendah dari model bahasa besar . Saat ini, sangat sering digunakan dalam difusi stabil.

Karena banyaknya parameter model bahasa besar, banyak perusahaan besar perlu pelatihan selama beberapa bulan. Oleh karena itu, berbagai metode pelatihan dengan konsumsi sumber daya lebih sedikit telah diusulkan, dan LoRA adalah salah satunya.

Artikel ini akan memperkenalkan prinsip LoRA secara mendetail dan menggunakan PyTorch untuk mengimplementasikan pelatihan LoRA pada model kecil.

2. Pelatihan model

Sebagian besar pelatihan model sekarang menggunakan algoritma penurunan gradien. Algoritma penurunan gradien dapat dibagi menjadi 4 langkah berikut:

  1. Propagasi maju menghitung nilai kerugian
  2. Propagasi mundur menghitung gradien
  3. Perbarui parameter menggunakan gradien
  4. Ulangi langkah 1, 2, dan 3 hingga diperoleh kerugian yang lebih kecil

Mengambil contoh model linier, parameter modelnya adalah W, input dan outputnya adalah x, y, dan fungsi kerugiannya adalah mean square error. Maka perhitungan tiap langkahnya adalah sebagai berikut. Yang pertama adalah perambatan maju. Untuk model linier adalah perkalian matriks:

L = MSE(Lebar x, y)L = MSE(Lebar x, y)L = MSE(Lebar x, y)

Setelah menemukan kerugian, gradien L versus W dapat dihitung untuk memperoleh dW:

dW=∂L∂WdW = frac{sebagian L}{sebagian W}dW=∂W∂L​

dW adalah matriks yang menunjuk ke arah dimana L naik paling cepat, namun tujuan kita adalah membuat L turun, jadi misalkan W dikurangi dW. Untuk menyesuaikan kecepatan pembaruan, kecepatan pembelajaran η juga dikalikan, dihitung sebagai berikut:

W′=W−ηdWW' = W - ηdWW′=W−ηdW

Ulangi sepanjang waktu di akhir. Pseudocode untuk ketiga langkah di atas adalah sebagai berikut:

# 4、重复1、2、3
for i in range(10000):
    # 1、正向传播计算损失
    L = MSE(Wx, y)
    # 2、反向传播计算梯度
    dW = gradient(L, W)
    # 3、利用梯度更新参数
    W -= lr * dW

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Setelah pembaruan selesai, parameter baru W' diperoleh. Jika kita menggunakan prediksi model kali ini, perhitungannya adalah sebagai berikut:

pred = W′xpred = W'xpred = W′x

3. Memperkenalkan LoRA

Kita dapat memikirkan tentang hubungan antara W dan W'. W biasanya mengacu pada parameter model dasar, dan W' diperoleh setelah beberapa kali penambahan dan pengurangan matriks berdasarkan model dasar. Asumsikan bahwa ini diperbarui 10 kali selama proses pelatihan, dan setiap kali dW adalah dW1, dW2,..., dW10, maka proses pembaruan lengkap dapat ditulis sebagai satu operasi:

W′=W−ηdW1−ηdW2−…−ηdW10 Misalkan: dW=∑i=110dWiW′=W−ηdWW' = W - ηdW_1 - ηdW_2 - … - ηdW_{10} \ Misalkan: dW = jumlah_{i=1} ^{10}dW_i \ W' = W - ηdW W′=W−ηdW1​−ηdW2​−…−ηdW10​ Misalkan: dW=i=1∑10​dWi​W′=W−ηdW

dimana dW adalah matriks yang bentuknya sama dengan W'. Kita tulis -ηdW sebagai matriks R, maka parameter yang diperbarui adalah:

L′=L+RW' = L + RW′=L+R

Pada saat ini, proses pelatihan disederhanakan menjadi matriks asli ditambah matriks R lainnya. Namun, menyelesaikan matriks R tidaklah lebih sederhana, dan tidak menghemat sumber daya. Saat ini, ide LoRA diperkenalkan.

Matriks yang terlatih penuh biasanya berpangkat penuh atau pada dasarnya memenuhi peringkat, yaitu tidak ada kolom dalam matriks yang berlebihan. Dalam makalah "Hukum Penskalaan untuk Model Bahasa Neural", diusulkan hubungan antara kumpulan data dan ukuran parameter. Jika hubungan ini terpenuhi dan pelatihannya baik, model yang dihasilkan pada dasarnya memiliki peringkat penuh. Saat menyempurnakan model, kita akan memilih model dasar, yang pada dasarnya adalah peringkat penuh. Bagaimana situasi pemutakhiran pangkat matriks R?

Kita asumsikan matriks R merupakan matriks berpangkat rendah. Matriks berpangkat rendah mempunyai banyak kolom yang berulang sehingga dapat didekomposisi menjadi dua matriks yang lebih kecil. Jika bentuk W adalah m×n, maka bentuk A juga m×n. Kita dekomposisi matriks R menjadi AB (bentuk A adalah m×r dan bentuk B adalah r×N r). biasanya memilih nilai yang jauh lebih kecil dari m, nilai n, seperti yang ditunjukkan pada gambar:

gambar.png

Mengurai matriks peringkat rendah menjadi dua matriks memiliki beberapa keuntungan. Yang pertama adalah jumlah parameter berkurang secara signifikan. Misalkan bentuk matriks R adalah 100×100, maka banyaknya parameter R adalah 10000. Jika kita memilih rank 10, bentuk matriks A adalah 100×10 dan bentuk matriks B adalah 10×100. Jumlah parameternya adalah 2000, yaitu 80% lebih kecil dari matriks R.

Dan karena R adalah matriks peringkat rendah, dengan pelatihan yang memadai, matriks A dan B dapat mencapai efek R. Matriks AB disini sering kita sebut dengan model LoRA.

Setelah memperkenalkan LoRA, prediksi kita perlu memasukkan x masing-masing ke dalam W dan AB, saat ini perhitungan prediksinya adalah:

pred = Lebar + ABxpred = Lebar + ABxpred = Lebar + ABx

Ini akan sedikit lebih lambat dibandingkan model asli saat memprediksi, namun perbedaannya pada dasarnya tidak terasa pada model besar.

4. Pertarungan sebenarnya

Untuk memahami semua detailnya, kami tidak menggunakan model besar sebagai pertarungan lora yang sebenarnya. Sebaliknya, kami memilih untuk menggunakan jaringan kecil seperti vgg19 untuk melatih model lora. Impor modul yang diperlukan:

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4.1 Persiapan kumpulan data

Di sini, bobot vgg19 yang telah dilatih sebelumnya di imagenet digunakan sebagai model dasar, sehingga kumpulan data klasifikasi perlu disiapkan.Untuk kenyamanan, hanya satu kategori dan 5 gambar yang disiapkan di sinidata/goldfishTurun:

gambar.png

Kategori ikan mas disertakan dalam imagenet, tetapi versi ilustrasi ikan mas dipilih di sini. Setelah pengujian, model yang telah dilatih sebelumnya tidak dapat mengklasifikasikan gambar di atas dengan benar. Tujuan kami adalah untuk melatih LoRA dan membuat model terklasifikasi dengan benar.

Kami membuat 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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

4.2 Membuat model LoRA

Kami merangkum LoRA menjadi sebuah lapisan. Hanya ada dua matriks yang perlu dilatih di LoRA. Kode LoRA adalah sebagai berikut:

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Dimana m adalah besarnya masukan, n adalah besarnya keluaran, rank adalah besarnya rangking, kita dapat menetapkan nilai yang lebih kecil.

Saat menginisialisasi bobot, kami menginisialisasi A dengan noise Gaussian, dan menginisialisasi B dengan matriks 0. Hal ini untuk memastikan bahwa pelatihan dimulai dari model terbawah. Karena AB adalah matriks 0, LoRA tidak bekerja pada keadaan awal.

4.3 Tetapkan hyperparameter dan latih

Langkah selanjutnya adalah pelatihan. Ini pada dasarnya sama dengan kode pelatihan reguler PyTorch. Mari kita lihat kodenya terlebih dahulu:

# 加载底模和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()}")

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

Ada dua hal yang perlu diperhatikan di sini. Poin pertama adalah kami menetapkan bobot vgg19 menjadi tidak dapat dilatih. Ini sangat mirip dengan pembelajaran transfer, tetapi sebenarnya berbeda.

Poin kedua adalah selama propagasi maju, kami menggunakan kode berikut:

pred = vgg19(image) + lora(image)

  • 1
  • 2

4.4 Pengujian

Mari kita lakukan tes sederhana:

# 测试  
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')

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Outputnya adalah sebagai berikut:

goldfish
goldfish
goldfish
goldfish
goldfish

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Prediksi dasarnya benar, namun hasil tes ini tidak berarti apa-apa. Terakhir, kami menyimpan model LoRA 5M, yang sangat kecil dibandingkan dengan puluhan MB vgg19.

5. Ringkasan

LoRA adalah metode pelatihan yang efisien untuk model besar, dan artikel ini menggunakan LoRA dalam jaringan klasifikasi kecil untuk memberikan pemahaman yang lebih jelas kepada pembaca tentang implementasi LoRA secara mendetail (tetapi juga karena LoRA tidak dapat menjalankan model besar). Karena terbatasnya volume data, isu-isu seperti akurasi dan efisiensi LoRA tidak dibahas secara rinci. Pembaca dapat merujuk pada materi yang relevan untuk pemahaman mendalam.

Bagaimana cara mempelajari model AI besar?

Saya telah bekerja di perusahaan Internet garis depan selama lebih dari sepuluh tahun dan telah membimbing banyak rekan junior. Membantu banyak orang belajar dan berkembang.

Saya menyadari bahwa banyak sekali pengalaman dan ilmu yang layak untuk dibagikan kepada semua orang, dan kita juga dapat menggunakan kemampuan dan pengalaman kita untuk menjawab banyak kebingungan anda dalam pembelajaran kecerdasan buatan, oleh karena itu saya tetap ngotot untuk mengatur dan berbagi berbagai hal meskipun saya. sibuk di tempat kerja. Namun, karena terbatasnya saluran penyebaran pengetahuan, banyak teman di industri Internet tidak dapat memperoleh materi yang benar untuk meningkatkan pembelajaran mereka. Oleh karena itu, materi model besar AI yang penting mencakup peta pikiran pembelajaran pengantar model besar AI, pembelajaran model besar AI berkualitas tinggi buku dan manual, serta video tutorial, pembelajaran praktik, dan rekaman video lainnya dibagikan secara gratis.

Masukkan deskripsi gambar di sini

Tahap pertama: Mulailah dengan merancang sistem model besar dan menjelaskan metode utama model besar;

Tahap kedua: melalui proyek kata cepat model besar, mulai dari perspektif Anjuran untuk memanfaatkan peran model dengan lebih baik;

Tahap ketiga: Pengembangan aplikasi platform model besar menggunakan platform Alibaba Cloud PAI untuk membangun sistem pemasangan virtual di bidang e-commerce;

Tahap keempat: Pengembangan aplikasi basis pengetahuan model besar menggunakan kerangka LangChain sebagai contoh untuk membangun sistem tanya jawab yang cerdas untuk konsultasi industri logistik;

Tahap kelima: menyempurnakan pengembangan model besar dengan menggunakan bidang kesehatan besar, ritel baru, dan media baru untuk membangun model besar yang sesuai dengan bidang saat ini;

Tahap keenam: Berdasarkan model besar multi-modal SD, kasus applet diagram Wensheng dibangun;

Tahap ketujuh: Fokus pada penerapan dan pengembangan platform model besar, dan membangun aplikasi industri model besar melalui model besar yang matang seperti model besar Xinghuo dan model besar Wenxin.

Masukkan deskripsi gambar di sini

👉学会后的收获:👈
• Berdasarkan implementasi rekayasa full-stack model besar (front-end, back-end, manajer produk, desain, analisis data, dll.), berbagai kemampuan dapat diperoleh melalui kursus ini;

• Mampu menggunakan model besar untuk menyelesaikan kebutuhan proyek aktual yang relevan: Di era data besar, semakin banyak perusahaan dan institusi yang perlu memproses data dalam jumlah besar. Penggunaan teknologi model besar dapat memproses data tersebut dengan lebih baik dan meningkatkan akurasi analisis data dan pengambilan keputusan. Oleh karena itu, menguasai keterampilan pengembangan aplikasi model besar dapat memungkinkan pemrogram untuk mengatasi kebutuhan proyek sebenarnya dengan lebih baik;

• Berdasarkan pengembangan aplikasi AI model besar dan data perusahaan, menerapkan teori model besar, menguasai daya komputasi GPU, perangkat keras, kerangka pengembangan LangChain, dan keterampilan praktis proyek, serta mempelajari penyempurnaan pelatihan vertikal model besar (persiapan data, penyulingan data, besar penerapan model) Penguasaan terpadu;

• Kemampuan untuk menyelesaikan kemampuan pelatihan model bidang vertikal model besar yang populer dan meningkatkan kemampuan pengkodean pemrogram: Pengembangan aplikasi model besar memerlukan penguasaan algoritme pembelajaran mesin, kerangka pembelajaran mendalam, dan teknologi lainnya. Menguasai teknologi ini dapat meningkatkan kemampuan pengkodean dan analisis pemrogram, memungkinkan pemrogram untuk menjadi lebih mahir dalam menulis kode berkualitas tinggi.

Masukkan deskripsi gambar di sini

1. Peta jalan pembelajaran model besar AI
2. Rencana implementasi komersial untuk 100 set model AI besar
3.100 episode tutorial video model besar
4.200 buku PDF model besar
5. Kumpulan pertanyaan wawancara LLM
6. Pengumpulan sumber daya manajer produk AI

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

Masukkan deskripsi gambar di sini