기술나눔

LoRA 원리 및 구현 - PyTorch는 LoRA 모델을 자체적으로 구축합니다.

2024-07-12

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

I. 소개

AIGC 분야에서는 'LoRA'라는 특별한 용어가 자주 등장하는데, 약간 사람 이름처럼 들리지만 모델 훈련 방법이다. LoRA의 전체 이름은 Low-Rank Adaptation of Large Language Models이며 중국어로 불립니다.대규모 언어 모델의 저수준 적응 . 요즘은 안정확산에 매우 자주 사용됩니다.

대규모 언어 모델은 매개변수가 너무 많기 때문에 많은 대기업에서는 수개월 동안 훈련해야 하기 때문에 자원 소모가 적은 다양한 훈련 방법이 제안되었으며, LoRA도 그 중 하나입니다.

이 기사에서는 LoRA의 원리를 자세히 소개하고 PyTorch를 사용하여 소형 모델의 LoRA 교육을 구현합니다.

2. 모델 훈련

이제 대부분의 모델 교육에서는 경사하강법 알고리즘을 사용합니다. 경사하강법 알고리즘은 다음 4단계로 나눌 수 있습니다.

  1. 순방향 전파는 손실 값을 계산합니다.
  2. 역전파는 기울기를 계산합니다.
  3. 그라데이션을 사용하여 매개변수 업데이트
  4. 손실이 더 작아질 때까지 1, 2, 3단계를 반복합니다.

선형 모델을 예로 들면, 모델 매개변수는 W이고 입력과 출력은 x, y이며 손실 함수는 평균 제곱 오차입니다. 그러면 각 단계의 계산은 다음과 같습니다. 첫 번째는 선형 모델의 경우 행렬 곱셈입니다.

L = MSE(Wx, y)L = MSE(Wx, y)L = MSE(Wx, y)

손실을 찾은 후 L 대 W의 기울기를 계산하여 dW를 얻을 수 있습니다.

dW = ∂L∂WdW = 부분 L { 부분 W}dW = ∂W∂L​

dW는 L이 가장 빠르게 상승하는 방향을 가리키는 행렬이지만, 우리의 목표는 L을 하락시키는 것이므로 W에서 dW를 빼도록 하겠습니다. 업데이트 속도를 조정하기 위해 학습률 θ도 곱해 다음과 같이 계산됩니다.

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

마지막에는 항상 반복하십시오. 위의 세 단계에 대한 의사코드는 다음과 같습니다.

# 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

업데이트가 완료된 후 새로운 매개변수 W'가 획득됩니다. 이때 모델 예측을 사용하면 계산은 다음과 같다.

예측 = W′x 예측 = W'x 예측 = W′x

3. LoRA 소개

W와 W'의 관계를 생각해 볼 수 있습니다. W는 일반적으로 기본 모델의 매개변수를 의미하며, W'는 기본 모델을 기반으로 여러 행렬의 덧셈과 뺄셈을 거쳐 구해집니다. 학습 과정 중에 10번 업데이트되고 dW가 dW1, dW2,..., dW10일 때마다 전체 업데이트 프로세스를 하나의 작업으로 작성할 수 있다고 가정합니다.

W′=W−ndW1−ndW2−… ^{10}dW_i \ W' = W - etadW W'=W−ndW1​−ndW2​−…−ndW10​Let: dW=i=1∑10​dWi​W'=W−ndW

여기서 dW는 W'와 모양이 같은 행렬입니다. -θdW를 행렬 R로 작성하면 업데이트된 매개변수는 다음과 같습니다.

W′=W+RW' = W + RW′=W+R

이때 학습 과정은 원래 행렬에 다른 행렬 R을 더해 단순화됩니다. 그러나 행렬 R을 푸는 것은 더 간단하지 않으며, 자원도 절약되지 않습니다. 이때 LoRA라는 아이디어가 도입됩니다.

완전히 훈련된 행렬은 일반적으로 전체 순위이거나 기본적으로 순위를 충족합니다. 즉, 행렬의 어떤 열도 중복되지 않습니다. "Scaling Laws for Neural Language Model" 논문에서는 데이터 세트와 매개변수 크기 간의 관계를 제안합니다. 이 관계가 만족되고 훈련이 좋으면 결과 모델은 기본적으로 전체 순위입니다. 모델을 미세 조정할 때 기본적으로 전체 순위인 기본 모델을 선택합니다. 행렬 R의 순위를 업데이트하는 상황은 무엇입니까?

R 행렬은 낮은 순위 행렬이라고 가정합니다. 낮은 순위 행렬은 반복되는 열이 많기 때문에 두 개의 작은 행렬로 분해될 수 있습니다. W의 모양이 m×n이면 A의 모양도 m×n입니다. 행렬 R을 AB로 분해합니다(여기서 A의 모양은 m×r이고 B의 모양은 r×N입니다). 일반적으로 그림에 표시된 것처럼 n 값인 m보다 훨씬 작은 값을 선택합니다.

이미지.png

낮은 순위 행렬을 두 개의 행렬로 분해하면 여러 가지 장점이 있습니다. 첫 번째는 매개변수 수가 크게 줄어든다는 것입니다. R 행렬의 모양이 100×100이라고 가정하면 R의 매개변수 개수는 10000개입니다. 랭크 10을 선택하면 행렬 A의 모양은 100×10이고, 행렬 B의 모양은 10×100이며, 매개변수 개수는 R 행렬보다 80% 적습니다.

그리고 R은 낮은 순위의 행렬이므로 충분한 훈련을 통해 A와 B 행렬은 R의 효과를 얻을 수 있습니다. 여기서 행렬 AB는 우리가 종종 LoRA 모델이라고 부르는 것입니다.

LoRA를 도입한 후 예측은 x를 W와 AB에 각각 입력해야 합니다. 이때 예측 계산은 다음과 같습니다.

예측 = 폭x + ABx 예측 = 폭x + ABx 예측 = 폭x + ABx

예측할 때 원래 모델보다 약간 느려지겠지만, 대형 모델에서는 기본적으로 차이가 느껴지지 않습니다.

4. 실제 전투

모든 세부 사항을 파악하기 위해 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

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

4.1 데이터 세트 준비

여기서는 이미 학습된 이미지넷의 vgg19 가중치를 기본 모델로 사용하므로 분류 데이터 세트를 준비해야 합니다.여기서는 편의상 하나의 카테고리와 5개의 사진만 준비했습니다. 사진은 프로젝트 아래에 있습니다.data/goldfish아래에:

이미지.png

금붕어 카테고리는 이미지넷에 포함되어 있지만 여기에서는 금붕어 그림 버전이 선택되었습니다. 테스트 후 사전 훈련된 모델은 위 사진을 올바르게 분류할 수 없습니다. 우리의 목적은 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)

  • 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 LoRA 모델 생성

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)

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

여기서 m은 입력의 크기, n은 출력의 크기, 순위는 순위의 크기이므로 더 작은 값을 설정할 수 있습니다.

가중치를 초기화할 때 A는 가우스 노이즈로 초기화하고 B는 0 행렬로 초기화합니다. 이는 훈련이 하단 모델에서 시작되도록 하기 위한 것입니다. AB는 0 행렬이므로 LoRA는 초기 상태에서는 작동하지 않습니다.

4.3 하이퍼파라미터 설정 및 학습

다음 단계는 훈련입니다. 이는 기본적으로 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()}")

  • 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

여기서 주목해야 할 두 가지 사항이 있습니다. 첫 번째 사항은 vgg19의 가중치를 훈련 불가능으로 설정했다는 것입니다. 이는 전이 학습과 매우 유사하지만 실제로는 다릅니다.

두 번째 요점은 순방향 전파 중에 다음 코드를 사용한다는 것입니다.

pred = vgg19(image) + lora(image)

  • 1
  • 2

4.4 테스트

간단한 테스트를 해보자:

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

출력은 다음과 같습니다.

goldfish
goldfish
goldfish
goldfish
goldfish

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

기본적인 예측은 맞지만, 이번 테스트 결과는 아무런 의미가 없습니다. 마지막으로 vgg19의 수십 MB에 비해 매우 작은 5M LoRA 모델을 저장했습니다.

5. 요약

LoRA는 대형 모델을 위한 효율적인 훈련 방법이며, 이 기사에서는 소규모 분류 네트워크에서 LoRA를 사용하여 독자가 LoRA의 세부 구현에 대해 더 명확하게 이해할 수 있도록 합니다(하지만 대형 모델을 실행할 수 없기 때문이기도 합니다). 제한된 데이터 양으로 인해 LoRA의 정확성 및 효율성과 같은 문제는 자세히 논의되지 않습니다. 독자는 관련 자료를 참조하여 심층적으로 이해할 수 있습니다.

대규모 AI 모델을 학습하는 방법은 무엇입니까?

나는 10년 넘게 일선 인터넷 기업에서 일하며 많은 후배들을 멘토링해 왔다. 많은 사람들이 배우고 성장하도록 도왔습니다.

모든 사람과 공유할 가치가 있는 경험과 지식이 많다는 것을 깨닫고, 우리의 능력과 경험을 활용하여 인공지능 학습에 대한 여러분의 많은 혼란에 답할 수도 있습니다. 일 때문에 바빠. 그러나 지식 전파를 위한 제한된 채널로 인해 인터넷 업계의 많은 친구들은 학습을 향상시키기 위한 올바른 자료를 얻을 수 없습니다. 따라서 중요한 AI 대형 모델 자료에는 AI 대형 모델 입문 학습 마인드 맵, 고품질 AI 대형 모델 학습이 포함됩니다. 책과 매뉴얼, 동영상 튜토리얼, 실습 학습, 기타 녹화된 동영상을 무료로 공유합니다.

여기에 이미지 설명을 삽입하세요.

첫 번째 단계: 대형 모델 시스템 설계부터 시작하여 대형 모델의 주요 방법을 설명합니다.

두 번째 단계: 대형 모델 프롬프트 단어 프로젝트를 통해 프롬프트 관점에서 시작하여 모델의 역할을 더 잘 활용합니다.

세 번째 단계: 대형 모델 플랫폼 애플리케이션 개발은 Alibaba Cloud PAI 플랫폼을 사용하여 전자상거래 분야의 가상 피팅 시스템을 구축합니다.

네 번째 단계: 대규모 모델 지식 기반 응용 프로그램 개발은 LangChain 프레임워크를 예로 들어 물류 산업 상담을 위한 지능형 질문 및 답변 시스템을 구축합니다.

다섯 번째 단계: 빅헬스, 뉴리테일, 뉴미디어 분야를 활용하여 현재 분야에 적합한 대형 모델을 구축함으로써 대형 모델 개발을 미세 조정합니다.

여섯 번째 단계: SD 다중 모드 대형 모델을 기반으로 Wensheng 다이어그램 애플릿 케이스가 구축되었습니다.

일곱 번째 단계: 대형 모델 플랫폼의 적용 및 개발에 중점을 두고 Xinghuo 대형 모델 및 Wenxin 대형 모델과 같은 성숙한 대형 모델을 통해 대형 모델 산업 애플리케이션을 구축합니다.

여기에 이미지 설명을 삽입하세요.

👉学会后的收获:👈
• 대형 모델(프론트엔드, 백엔드, 프로덕트 매니저, 디자인, 데이터 분석 등)의 풀스택 엔지니어링 구현을 바탕으로 다양한 능력을 습득할 수 있습니다.

• 관련 실제 프로젝트 요구 사항을 해결하기 위해 대형 모델 사용 가능: 빅 데이터 시대에 점점 더 많은 기업과 기관이 대량의 데이터를 처리해야 합니다. 대형 모델 기술을 사용하면 이러한 데이터를 더 잘 처리하고 데이터 분석의 정확성을 높일 수 있습니다. 그리고 의사결정. 따라서 대형 모델 애플리케이션 개발 기술을 익히면 프로그래머는 실제 프로젝트 요구 사항에 더 잘 대처할 수 있습니다.

• 대형 모델 및 엔터프라이즈 데이터 AI 응용 프로그램 개발을 기반으로 대형 모델 이론을 구현하고, GPU 컴퓨팅 성능, 하드웨어, LangChain 개발 프레임워크 및 프로젝트 실무 기술을 마스터하고, 대형 모델의 미세 조정 수직 훈련(데이터 준비, 데이터 증류, 대규모)을 학습합니다. 모델 배포) 원스톱 숙달;

• 인기 있는 대형 모델 수직 필드 모델 훈련 기능을 완성하고 프로그래머의 코딩 능력을 향상시키는 능력: 대형 모델 애플리케이션을 개발하려면 기계 학습 알고리즘, 딥 러닝 프레임워크 및 기타 기술을 숙달해야 합니다. 이러한 기술을 숙달하면 프로그래머의 코딩 및 분석 능력이 향상될 수 있습니다. 고품질 코드 작성에 더욱 능숙해집니다.

여기에 이미지 설명을 삽입하세요.

1. AI 대형 모델 학습 로드맵
2. 100개 세트의 대형 AI 모델에 대한 상용 구현 계획
대형 모델 비디오 튜토리얼 3.100편
대형 모형 PDF 도서 4,200권
5. LLM 면접 질문 모음
6.AI 제품 관리자 자원 수집

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

여기에 이미지 설명을 삽입하세요.