2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Erityinen termi "LoRA" esiintyy usein AIGC:n alalla. Se kuulostaa vähän henkilön nimeltä, mutta se on mallikoulutusmenetelmä. LoRA:n koko nimi on Low-Rank Adaptation of Large Language Models, jota kutsutaan kiinaksiSuurien kielimallien matalan tason mukauttaminen . Nykyään sitä käytetään hyvin usein vakaassa diffuusiossa.
Suurien kielimallien parametrien valtavan määrän vuoksi monet suuret yritykset joutuvat harjoittelemaan useita kuukausia. Siksi on ehdotettu erilaisia koulutusmenetelmiä, jotka kuluttavat vähemmän resursseja, ja LoRA on yksi niistä.
Tämä artikkeli esittelee LoRA-periaatteen yksityiskohtaisesti ja käyttää PyTorchia pienten mallien LoRA-koulutuksen toteuttamiseen.
Suurin osa mallikoulutuksesta käyttää nyt gradienttilaskeutumisalgoritmia. Gradientin laskeutumisalgoritmi voidaan jakaa seuraaviin 4 vaiheeseen:
Lineaarisen mallin esimerkkinä mallin parametrit ovat W, tulo ja lähtö x, y ja häviöfunktio on keskineliövirhe. Sitten kunkin vaiheen laskenta on seuraava. Lineaarisille malleille se on matriisikerto.
L=MSE(Lx,y)L = MSE(Lx,y)L=MSE(Lx,y)
Kun häviö on löydetty, L:n gradientti W vastaan voidaan laskea dW:n saamiseksi:
dW=∂L∂WdW = murto{osittainen L}{osittainen W}dW=∂W∂L
dW on matriisi, joka osoittaa suuntaan, jossa L nousee nopeimmin, mutta tavoitteemme on saada L putoamaan, joten anna W miinus dW. Päivitysnopeuden säätämiseksi kerrotaan myös oppimisnopeus η, joka lasketaan seuraavasti:
W′=W−ηdWW' = W - ηdWW′=W−ηdW
Toista koko ajan lopussa. Yllä olevien kolmen vaiheen pseudokoodi on seuraava:
# 4、重复1、2、3
for i in range(10000):
# 1、正向传播计算损失
L = MSE(Wx, y)
# 2、反向传播计算梯度
dW = gradient(L, W)
# 3、利用梯度更新参数
W -= lr * dW
Kun päivitys on valmis, saadaan uusi parametri W'. Kun käytämme malliennustetta tällä hetkellä, laskenta on seuraava:
pred=W′xpred = W'xpred=W′x
Voimme ajatella W:n ja W:n välistä suhdetta. W viittaa yleensä perusmallin parametreihin ja W' saadaan useiden perusmalliin perustuvien matriisilisäysten ja -vähennysten jälkeen. Oletetaan, että se päivitetään 10 kertaa harjoitusprosessin aikana ja joka kerta kun dW on dW1, dW2,..., dW10, niin koko päivitysprosessi voidaan kirjoittaa yhdeksi operaatioksi:
W′=W−ηdW1−ηdW2−…−ηdW10 Olkoon: dW=∑i=110dWiW′=W−ηdWW' = W - ηdW_1 - ηdW_2 - … - ηdW_{10} \ Olkoon: _{iW = 1 ^{10}dW_i \ W' = W - ηdW W′=W−ηdW1−ηdW2−…−ηdW10 Olkoon: dW=i=1∑10dWiW′=W−ηdW
missä dW on matriisi, jolla on sama muoto kuin W'. Kirjoitamme -ηdW matriisiksi R, jolloin päivitetyt parametrit ovat:
W'=W+RW' = W + RW'=W+R
Tällä hetkellä opetusprosessi on yksinkertaistettu alkuperäiseen matriisiin ja toiseen matriisiin R. Matriisin R ratkaiseminen ei kuitenkaan ole yksinkertaisempaa, eikä se säästä resursseja. Tällä hetkellä esitellään LoRA:n idea.
Täysin koulutettu matriisi on yleensä täysarvoinen tai pohjimmiltaan täyttää arvon, eli mikään matriisin sarake ei ole tarpeeton. Paperissa "Scaling Laws for Neural Language Model" ehdotetaan suhdetta tietojoukon ja parametrin koon välillä. Jos tämä suhde täyttyy ja koulutus on hyvä, tuloksena oleva malli on periaatteessa täysi. Mallia hienosäädettäessä valitsemme perusmallin, joka on periaatteessa full rank. Mikä on matriisin R arvon päivityksen tilanne?
Oletetaan, että R-matriisi on matala-arvoinen matriisi, jossa on useita toistuvia sarakkeita, ja siksi se voidaan hajottaa kahdeksi pienemmäksi matriisiksi. Jos W:n muoto on m×n, niin myös A:n muoto on m×n. Jaamme matriisin R muotoon AB (jossa A:n muoto on m×n ja B:n muoto on r×N). valitsee yleensä arvon, joka on paljon pienempi kuin m , n:n arvo, kuten kuvassa:
Matalan matriisin jakamisella kahdeksi matriisiksi on useita etuja. Ensimmäinen on se, että parametrien määrä vähenee merkittävästi. Oletetaan, että R-matriisin muoto on 100×100, niin R:n parametrien lukumäärä on 10000. Kun valitsemme arvon 10, matriisin A muoto on 100×10 ja matriisin B muoto on 10×100. Parametrien määrä on 2000, mikä on 80 % pienempi kuin R-matriisin.
Ja koska R on matala-arvoinen matriisi, riittävällä harjoittelulla A- ja B-matriisit voivat saavuttaa R:n vaikutuksen. Tässä matriisia AB kutsutaan usein LoRA-malliksi.
LoRA:n käyttöönoton jälkeen ennusteemme on syötettävä x arvoon W ja AB. Tällä hetkellä ennustelaskenta on:
pred=Lx+ABxpred = Lx + ABxpred=Lx+ABx
Se tulee olemaan ennustettaessa hieman alkuperäistä mallia hitaampi, mutta suurissa malleissa eroa ei periaatteessa tunnu.
Ymmärtääksemme kaikki yksityiskohdat, emme käytä suurta mallia varsinaisena loran taisteluna. Sen sijaan päätämme käyttää pientä verkkoa, kuten vgg19, lora-mallin harjoittamiseen. Tuo tarvittavat moduulit:
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
Tässä pohjamallina käytetään imagenetissä esiopetettuja vgg19:n painoja, joten luokittelutietojoukko on valmisteltava.Mukavuuden vuoksi tässä on vain yksi kategoria ja 5 kuvaa. Kuvat ovat projektin alladata/goldfish
Alas:
Kultakala-kategoria on mukana imagenetissä, mutta tässä on valittu kuvitettu kultakalaversio Testauksen jälkeen esikoulutettu malli ei pysty luokittelemaan yllä olevia kuvia oikein. Tarkoituksenamme on kouluttaa LoRAa ja saada malli luokittamaan oikein.
Luomme LoraDatasetin:
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)
Kapseloimme LoRA:n kerrokseen. LoRA:ssa on harjoitettava vain kaksi matriisia.
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)
Jos m on syötteen koko, n on lähdön koko, rank on arvon koko, voimme asettaa pienemmän arvon.
Painoja alustaessa alustamme A Gaussin kohinalla ja B:n 0-matriisilla. Näin varmistetaan, että harjoittelu alkaa pohjamallista. Koska AB on 0-matriisi, LoRA ei toimi alkutilassa.
Seuraava vaihe on harjoitus Tämä on periaatteessa sama kuin PyTorchin tavallinen harjoituskoodi.
# 加载底模和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()}")
Tässä on huomioitava kaksi seikkaa. Ensimmäinen seikka on, että asetamme vgg19:n painon olemaan harjoittelematon. Tämä on hyvin samanlaista kuin siirto-oppiminen.
Toinen kohta on, että eteenpäin leviämisen aikana käytämme seuraavaa koodia:
pred = vgg19(image) + lora(image)
Tehdään yksinkertainen testi:
# 测试
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')
Tulos on seuraava:
goldfish
goldfish
goldfish
goldfish
goldfish
Perusennuste on oikea, mutta tämä testitulos ei tarkoita mitään. Lopuksi tallensimme 5M LoRA-mallin, joka on hyvin pieni verrattuna vgg19:n kymmeniin megatavuihin.
LoRA on tehokas koulutusmenetelmä suurille malleille, ja tämä artikkeli käyttää LoRAa pienessä luokitusverkossa antaakseen lukijoille selkeämmän käsityksen LoRA:n yksityiskohtaisesta toteutuksesta (mutta myös siksi, että se ei voi ajaa suuria malleja). Rajoitetun datamäärän vuoksi sellaisia kysymyksiä kuin LoRA:n tarkkuus ja tehokkuus ei käsitellä yksityiskohtaisesti.
Olen työskennellyt etulinjan Internet-yrityksissä yli kymmenen vuoden ajan ja mentoroinut monia nuorempia kollegoita. Auttoi monia ihmisiä oppimaan ja kasvamaan.
Ymmärrän, että kokemusta ja tietoa on paljon jakamisen arvoinen kaikkien kanssa, ja voimme myös käyttää kykyjämme ja kokemustamme vastataksemme moniin hämmennyksiisi tekoälyoppimisessa, joten vaadin silti erilaisten asioiden järjestämistä ja jakamista, vaikka olenkin kiireinen töissä. Rajoitettujen tiedon levittämiskanavien vuoksi monet Internet-alan ystävät eivät kuitenkaan pysty hankkimaan oikeita materiaaleja parantaakseen oppimistaan. Tästä syystä tärkeitä tekoälyn suuria mallimateriaaleja ovat AI suuren mallin johdanto-oppimisen ajatuskartat, korkealaatuinen tekoälyn suuren mallin oppiminen. kirjoja ja oppaita sekä video-opetusohjelmia, käytännön opetusta ja muita tallennettuja videoita jaetaan ilmaiseksi.
Ensimmäinen vaihe: Aloita suurten mallijärjestelmien suunnittelusta ja selitä suurten mallien päämenetelmät;
Toinen vaihe: suuren mallikehotteen sanaprojektin kautta aloita Prompts-näkökulmasta hyödyntääksesi paremmin mallin roolia;
Kolmas vaihe: Suuren mallialustan sovelluskehitys käyttää Alibaba Cloud PAI -alustaa virtuaalisen sovitusjärjestelmän rakentamiseen sähköisen kaupankäynnin alalla;
Neljäs vaihe: Laajan mallitietokannan sovelluskehitys ottaa LangChain-kehyksen esimerkkinä älykkään kysymys-vastausjärjestelmän rakentamiseen logistiikkaalan konsultointiin;
Viides vaihe: suurten mallien kehittämisen hienosäätö käyttämällä suuren terveyden, uuden vähittäiskaupan ja uuden median aloja rakentamaan suuria, nykyiseen alaan sopivia malleja;
Kuudes vaihe: SD-multimodaalisen suuren mallin perusteella rakennettiin Wensheng-kaaviosovelmakotelo;
Seitsemäs vaihe: Keskity suurten mallialustojen soveltamiseen ja kehittämiseen ja rakenna suuria malliteollisuuden sovelluksia kypsillä suurilla malleilla, kuten Xinghuo suuri malli ja Wenxin suuri malli.
👉学会后的收获:👈
• Suurien mallien (etuosa, tausta, tuotepäällikkö, suunnittelu, data-analyysi jne.) täyden pinon suunnittelutoteutuksen perusteella tällä kurssilla voidaan hankkia erilaisia kykyjä;
• Pystyy käyttämään suuria malleja todellisten projektitarpeiden ratkaisemiseen: Big datan aikakaudella yhä useammat yritykset ja laitokset tarvitsevat valtavia tietomääriä ja päätöksentekoa. Siksi suurten mallisovellusten kehitystaitojen hallitseminen voi auttaa ohjelmoijia selviytymään paremmin todellisista projektitarpeista;
• Perustuu laajaan malli- ja yritysdataan tekoälysovelluskehitykseen, ota käyttöön suurten mallien teoria, hallitse GPU:n laskentateho, laitteisto, LangChain-kehityskehys ja projektin käytännön taidot sekä opettele suurten mallien vertikaalista hienosäätöä (tietojen valmistelu, tietojen tislaus, suuret). mallin käyttöönotto) Yhden luukun hallinta;
• Mahdollisuus täydentää suosittujen suurten mallien pystykenttämallien koulutusvalmiuksia ja parantaa ohjelmoijien koodausominaisuuksia: Laajojen mallisovellusten kehittäminen edellyttää koneoppimisalgoritmien, syväoppimiskehysten ja muiden teknologioiden hallitsemista. Näiden tekniikoiden hallitseminen voi parantaa ohjelmoijien koodaus- ja analysointivalmiuksia oppia lisäämään korkealaatuisen koodin kirjoittamista.
1. Tekoälyn suuren mallin oppimissuunnitelma
2. Kaupallinen toteutussuunnitelma 100 sarjalle suuria tekoälymalleja
3 100 jaksoa suuria mallivideoita
4 200 PDF-kirjaa
5. Kokoelma LLM-haastattelukysymyksiä
6.AI tuotepäällikkö resurssikokoelma
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓