Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Hay un término especial "LoRA" que aparece con frecuencia en el campo AIGC. Suena un poco como el nombre de una persona, pero es un método de entrenamiento modelo. El nombre completo de LoRA es Adaptación de bajo rango de modelos de lenguaje grandes, que se llama en chino.Adaptación de bajo nivel de grandes modelos de lenguaje. . Hoy en día se utiliza con mucha frecuencia en difusión estable.
Debido a la gran cantidad de parámetros de los grandes modelos de lenguaje, muchas grandes empresas necesitan capacitarse durante varios meses. Por lo tanto, se han propuesto varios métodos de capacitación con menor consumo de recursos, y LoRA es uno de ellos.
Este artículo presentará el principio de LoRA en detalle y utilizará PyTorch para implementar el entrenamiento LoRA de modelos pequeños.
La mayor parte del entrenamiento de modelos ahora utiliza el algoritmo de descenso de gradiente. El algoritmo de descenso de gradiente se puede dividir en los siguientes 4 pasos:
Tomando el modelo lineal como ejemplo, los parámetros del modelo son W, la entrada y la salida son x, y y la función de pérdida es el error cuadrático medio. Luego, el cálculo de cada paso es el siguiente. El primero es la propagación hacia adelante. Para el modelo lineal, es una multiplicación de matrices:
L = MSE(Wx,y)L = MSE(Wx, y)L = MSE(Wx,y)
Después de encontrar la pérdida, se puede calcular el gradiente de L versus W para obtener dW:
dW=∂L∂WdW = frac{L parcial}{W parcial}dW=∂W∂L
dW es una matriz que apunta en la dirección donde L aumenta más rápido, pero nuestro objetivo es hacer que L caiga, así que sea W menos dW. Para ajustar el ritmo de las actualizaciones, también se multiplica una tasa de aprendizaje η, calculada de la siguiente manera:
W′=W−ηdWW' = W - ηdWW′=W−ηdW
Repita todo el tiempo al final. El pseudocódigo para los tres pasos anteriores es el siguiente:
# 4、重复1、2、3
for i in range(10000):
# 1、正向传播计算损失
L = MSE(Wx, y)
# 2、反向传播计算梯度
dW = gradient(L, W)
# 3、利用梯度更新参数
W -= lr * dW
Una vez completada la actualización, se obtiene el nuevo parámetro W'. Cuando usamos la predicción del modelo en este momento, el cálculo es el siguiente:
pred=W′xpred = W'xpred=W′x
Podemos pensar en la relación entre W y W'. W generalmente se refiere a los parámetros del modelo básico, y W 'se obtiene después de varias sumas y restas de matrices basadas en el modelo básico. Supongamos que se actualiza 10 veces durante el proceso de capacitación, y cada vez que dW es dW1, dW2,..., dW10, entonces el proceso de actualización completo se puede escribir como una sola operación:
W′=W−ηdW1−ηdW2−…−ηdW10 Sea: dW=∑i=110dWiW′=W−ηdWW' = W - ηdW_1 - ηdW_2 - … - ηdW_{10} \ Sea: dW = sum_{i=1} ^{10}dW_i \ W' = W - ηdW W′=W−ηdW1−ηdW2−…−ηdW10Sea: dW=i=1∑10dWiW′=W−ηdW
donde dW es una matriz con la misma forma que W'. Escribimos -ηdW como matriz R, entonces los parámetros actualizados son:
W′=W+RW' = W + RW′=W+R
En este momento, el proceso de capacitación se simplifica a la matriz original más otra matriz R. Sin embargo, resolver la matriz R no es más simple y no ahorra recursos. En este momento, se introduce la idea de LoRA.
Una matriz completamente entrenada suele tener un rango completo o básicamente satisface el rango, es decir, ninguna columna de la matriz es redundante. En el artículo "Leyes de escala para el modelo de lenguaje neuronal", se propone la relación entre el conjunto de datos y el tamaño del parámetro. Si esta relación se cumple y el entrenamiento es bueno, el modelo resultante es básicamente de rango completo. Al ajustar el modelo, seleccionaremos un modelo base, que es básicamente de rango completo. ¿Cuál es la situación de actualizar el rango de la matriz R?
Suponemos que la matriz R es una matriz de rango bajo. Una matriz de rango bajo tiene muchas columnas repetidas y, por lo tanto, se puede descomponer en dos matrices más pequeñas. Si la forma de W es m×n, entonces la forma de A también es m×n. Descomponemos la matriz R en AB (donde la forma de A es m×r y la forma de B es r×N). Por lo general, se elige un valor mucho menor que m, el valor de n, como se muestra en la figura:
Descomponer una matriz de bajo rango en dos matrices tiene varias ventajas. La primera es que el número de parámetros se reduce significativamente. Supongamos que la forma de la matriz R es 100 × 100, entonces el número de parámetros de R es 10000. Cuando seleccionamos el rango 10, la forma de la matriz A es 100 × 10 y la forma de la matriz B es 10 × 100. El número de parámetros es 2000, que es un 80% menor que la matriz R.
Y dado que R es una matriz de bajo rango, con suficiente entrenamiento, las matrices A y B pueden lograr el efecto de R. La matriz AB aquí es lo que a menudo llamamos modelo LoRA.
Después de introducir LoRA, nuestra predicción necesita ingresar x en W y AB respectivamente. En este momento, el cálculo de la predicción es:
pred=Wx+ABxpred = Wx + ABxpred=Wx+ABx
Será un poco más lento que el modelo original al predecir, pero la diferencia básicamente no se siente en los modelos grandes.
Para captar todos los detalles, no utilizamos un modelo grande como el combate real de lora. En cambio, elegimos usar una red pequeña como vgg19 para entrenar el modelo de lora. Importe los módulos necesarios:
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
Aquí, los pesos previamente entrenados de vgg19 en imagenet se utilizan como modelo base, por lo que es necesario preparar un conjunto de datos de clasificación.Para mayor comodidad, aquí solo se preparan una categoría y 5 imágenes. Las imágenes están bajo el proyecto.data/goldfish
Abajo:
La categoría de peces de colores está incluida en imagenet, pero aquí se selecciona la versión ilustrada de peces de colores. Después de las pruebas, el modelo previamente entrenado no puede clasificar correctamente las imágenes de arriba. Nuestro propósito es entrenar LoRA y hacer que el modelo se clasifique correctamente.
Creamos un 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)
Encapsulamos LoRA en una capa. Solo hay dos matrices que deben entrenarse en LoRA. El código de LoRA es el siguiente:
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)
Donde m es el tamaño de la entrada, n es el tamaño de la salida, el rango es el tamaño del rango, podemos establecer un valor menor.
Al inicializar los pesos, inicializamos A con ruido gaussiano e inicializamos B con una matriz 0. Esto es para garantizar que el entrenamiento comience desde el modelo inferior. Como AB es una matriz 0, LoRA no funciona en el estado inicial.
El siguiente paso es el entrenamiento. Este es básicamente el mismo que el código de entrenamiento normal de PyTorch. Veamos el código primero:
# 加载底模和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()}")
Hay dos puntos a tener en cuenta aquí. El primer punto es que configuramos el peso de vgg19 para que no se pueda entrenar. Esto es muy similar al aprendizaje por transferencia, pero en realidad es diferente.
El segundo punto es que durante la propagación hacia adelante, utilizamos el siguiente código:
pred = vgg19(image) + lora(image)
Hagamos una prueba sencilla:
# 测试
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')
El resultado es el siguiente:
goldfish
goldfish
goldfish
goldfish
goldfish
La predicción básica es correcta, pero el resultado de esta prueba no significa nada. Finalmente, guardamos un modelo LoRA de 5M, que es muy pequeño en comparación con las decenas de MB de vgg19.
LoRA es un método de entrenamiento eficiente para modelos grandes, y este artículo utiliza LoRA en una pequeña red de clasificación para brindar a los lectores una comprensión más clara de la implementación detallada de LoRA (pero también porque no puede ejecutar modelos grandes). Debido al volumen limitado de datos, cuestiones como la precisión y eficiencia de LoRA no se analizan en detalle. Los lectores pueden consultar los materiales relevantes para una comprensión profunda.
He trabajado en empresas de Internet de primera línea durante más de diez años y he sido mentor de muchos colegas jóvenes. Ayudó a muchas personas a aprender y crecer.
Me doy cuenta de que hay mucha experiencia y conocimiento que vale la pena compartir con todos, y también podemos usar nuestras habilidades y experiencia para responder muchas de sus confusiones en el aprendizaje de inteligencia artificial, por lo que sigo insistiendo en organizar y compartir varias cosas a pesar de que soy ocupado en el trabajo. Sin embargo, debido a los canales limitados para la difusión del conocimiento, muchos amigos en la industria de Internet no pueden obtener los materiales correctos para mejorar su aprendizaje. Por lo tanto, los materiales importantes de modelos grandes de IA incluyen mapas mentales de aprendizaje introductorios de modelos grandes de IA y aprendizaje de modelos grandes de IA de alta calidad. libros y manuales, tutoriales en vídeo, aprendizaje práctico y otros vídeos grabados se comparten de forma gratuita.
La primera etapa: comenzar con el diseño de sistemas de modelos grandes y explicar los métodos principales de los modelos grandes;
La segunda etapa: a través del proyecto de palabras de indicaciones del modelo grande, comience desde la perspectiva de las indicaciones para utilizar mejor la función del modelo;
La tercera etapa: el desarrollo de aplicaciones de plataformas de modelos grandes utiliza la plataforma Alibaba Cloud PAI para construir un sistema de ajuste virtual en el campo del comercio electrónico;
La cuarta etapa: el desarrollo de aplicaciones de base de conocimientos de modelos grandes toma el marco LangChain como ejemplo para construir un sistema inteligente de preguntas y respuestas para consultas de la industria logística;
La quinta etapa: perfeccionar el desarrollo de modelos grandes utilizando los campos de la gran salud, el nuevo comercio minorista y los nuevos medios para construir modelos grandes adecuados para los campos actuales;
La sexta etapa: basado en el modelo grande multimodal SD, se construyó un caso de subprograma de diagrama Wensheng;
La séptima etapa: centrarse en la aplicación y el desarrollo de plataformas de modelos grandes y crear aplicaciones industriales de modelos grandes a través de modelos grandes maduros, como el modelo grande Xinghuo y el modelo grande Wenxin.
👉学会后的收获:👈
• Basado en la implementación de ingeniería full-stack de grandes modelos (front-end, back-end, product manager, diseño, análisis de datos, etc.), a través de este curso se pueden adquirir diferentes habilidades;
• Capaz de utilizar modelos grandes para resolver necesidades reales relevantes de proyectos: en la era del big data, cada vez más empresas e instituciones necesitan procesar cantidades masivas de datos. El uso de tecnología de modelos grandes puede procesar mejor estos datos y mejorar la precisión del análisis de datos. y toma de decisiones. Por lo tanto, dominar las habilidades de desarrollo de aplicaciones de modelos grandes puede permitir a los programadores afrontar mejor las necesidades reales del proyecto;
• Basado en el desarrollo de aplicaciones de IA de datos empresariales y modelos grandes, implemente la teoría de modelos grandes, domine la potencia informática de GPU, el hardware, el marco de desarrollo LangChain y las habilidades prácticas de proyectos, y aprenda a perfeccionar el entrenamiento vertical de modelos grandes (preparación de datos, destilación de datos, implementación del modelo) Dominio integral;
• Capacidad para completar capacidades populares de capacitación de modelos de campo vertical de modelos grandes y mejorar las capacidades de codificación de los programadores: el desarrollo de aplicaciones de modelos grandes requiere dominar los algoritmos de aprendizaje automático, los marcos de aprendizaje profundo y otras tecnologías. Dominar estas tecnologías puede mejorar las capacidades de codificación y análisis de los programadores, lo que permite a los programadores. para volverse más competente en la escritura de código de alta calidad.
1. Hoja de ruta de aprendizaje de modelos grandes de IA
2. Plan de implementación comercial para 100 conjuntos de grandes modelos de IA.
3.100 episodios de vídeotutoriales de modelos grandes
4.200 libros PDF modelo grande
5. Colección de preguntas de la entrevista LLM
6.Recopilación de recursos del administrador de productos de IA
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓