моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
В области AIGC часто появляется специальный термин «LoRA». Он немного похож на имя человека, но это метод модельного обучения. Полное название LoRA — низкоранговая адаптация больших языковых моделей, которая по-китайски называетсяНизкоуровневая адаптация больших языковых моделей . В настоящее время он очень часто используется в стабильной диффузии.
Из-за огромного количества параметров больших языковых моделей многим крупным компаниям приходится обучаться несколько месяцев. Поэтому были предложены различные методы обучения с меньшими затратами ресурсов, и LoRA — один из них.
В этой статье подробно рассматривается принцип 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
Повторяйте все время в конце. Псевдокод для трех вышеуказанных шагов выглядит следующим образом:
# 4、重复1、2、3
for i in range(10000):
# 1、正向传播计算损失
L = MSE(Wx, y)
# 2、反向传播计算梯度
dW = gradient(L, W)
# 3、利用梯度更新参数
W -= lr * dW
После завершения обновления получается новый параметр W'. Когда мы используем прогноз модели в это время, расчет выглядит следующим образом:
пред=W′xпред = W'xпред=W′x
Мы можем подумать об отношениях между W и W'. W обычно относится к параметрам базовой модели, а W' получается после нескольких сложений и вычитаний матриц на основе базовой модели. Предположим, что в процессе обучения он обновляется 10 раз, и каждый раз dW равен dW1, dW2,..., dW10, тогда полный процесс обновления можно записать как одну операцию:
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∑10dWiW′=W−ηdW
где dW — матрица той же формы, что и W'. Мы пишем -ηdW как матрицу R, тогда обновленные параметры будут следующими:
В′=В+РВ' = В + РВ′=В+Р
В это время процесс обучения упрощается до исходной матрицы плюс еще одной матрицы R. Однако решение матрицы R не проще и не экономит ресурсы. В настоящее время представлена идея LoRA.
Полностью обученная матрица обычно является полноранговой или в основном удовлетворяет рангу, то есть ни один столбец в матрице не является лишним. В статье «Законы масштабирования для модели нейронного языка» предлагается связь между набором данных и размером параметра. Если это соотношение удовлетворяется и обучение хорошее, полученная модель в основном имеет полный ранг. При тонкой настройке модели мы выберем базовую модель, которая по сути является полноранговой. Какова ситуация с обновлением ранга матрицы R?
Мы предполагаем, что матрица R представляет собой матрицу низкого ранга. Матрица низкого ранга имеет много повторяющихся столбцов и поэтому может быть разложена на две матрицы меньшего размера. Если форма W равна m×n, то форма A также равна m×n. Мы разлагаем матрицу R на AB (где форма A равна m×r, а форма B — r×r). обычно выбирает значение, намного меньшее значения m, как показано на рисунке:
Разложение матрицы низкого ранга на две матрицы имеет ряд преимуществ. Во-первых, значительно сокращается количество параметров. Предположим, форма матрицы R 100х100, тогда количество параметров R равно 10000. Когда мы выбираем ранг 10, форма матрицы A равна 100×10, а форма матрицы B — 10×100. Количество параметров равно 2000, что на 80% меньше, чем у матрицы R.
А поскольку R — матрица низкого ранга, то при достаточном обучении матрицы A и B могут достичь эффекта R. Матрица AB здесь — это то, что мы часто называем моделью LoRA.
После введения LoRA наш прогноз должен ввести x в W и AB соответственно. На данный момент расчет прогноза выглядит так:
пред=Wx+ABxпред = Wx + ABxпред=Wx+ABx
При прогнозировании он будет немного медленнее исходной модели, но в больших моделях разница в принципе не ощущается.
Чтобы понять все детали, мы не используем большую модель в качестве реальной боевой системы Лоры. Вместо этого мы решили использовать небольшую сеть, такую как vgg19, для обучения модели Лоры. Импортируйте необходимые модули:
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
Здесь в качестве базовой модели используются предварительно обученные веса vgg19 в imagenet, поэтому необходимо подготовить набор данных для классификации.Для удобства здесь подготовлена всего одна категория и 5 картинок. Картинки находятся в рамках проекта.data/goldfish
Вниз:
Категория «Золотая рыбка» включена в сеть изображений, но здесь выбрана иллюстрированная версия золотой рыбки. После тестирования предварительно обученная модель не может правильно классифицировать приведенные выше изображения. Наша цель — обучить 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 необходимо обучить только две матрицы. Код 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 — матрица с нулевым значением, 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()}")
Здесь следует отметить два момента. Во-первых, мы установили необучаемый вес vgg19. Это очень похоже на трансферное обучение, но на самом деле оно другое.
Второй момент заключается в том, что во время прямого распространения мы используем следующий код:
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
Основной прогноз верен, но этот результат теста ничего не значит. Наконец, мы сохранили модель LoRA размером 5 МБ, которая очень мала по сравнению с десятками МБ vgg19.
LoRA — это эффективный метод обучения для больших моделей, и в этой статье LoRA используется в небольшой классификационной сети, чтобы дать читателям более четкое понимание подробной реализации LoRA (но также потому, что он не может запускать большие модели). Из-за ограниченного объема данных такие вопросы, как точность и эффективность LoRA, подробно не обсуждаются. Читатели могут обратиться к соответствующим материалам для более глубокого понимания.
Я проработал в ведущих интернет-компаниях более десяти лет и был наставником многих младших коллег. Помог многим людям учиться и расти.
Я понимаю, что есть много опыта и знаний, которыми стоит поделиться со всеми, и мы также можем использовать наши способности и опыт, чтобы ответить на многие ваши затруднения в обучении искусственному интеллекту, поэтому я по-прежнему настаиваю на организации и обмене различными вещами, даже несмотря на то, что я занят на работе. Однако из-за ограниченных каналов распространения знаний многие друзья в интернет-индустрии не могут получить правильные материалы для улучшения своего обучения. Поэтому важные материалы для больших моделей ИИ включают карты вводного обучения для больших моделей ИИ, высококачественное обучение для больших моделей ИИ. книги и руководства, а также видеоуроки, практические занятия и другие записанные видеоролики распространяются бесплатно.
Первый этап: начать с проектирования больших модельных систем и объяснить основные методы создания больших моделей;
Второй этап: в рамках проекта слов-подсказок большой модели начните с точки зрения подсказок, чтобы лучше использовать роль модели;
Третий этап: разработка приложений для крупных моделей платформы использует платформу Alibaba Cloud PAI для создания виртуальной системы примерки в области электронной коммерции;
Четвертый этап: разработка приложения базы знаний большой модели на примере структуры LangChain для создания интеллектуальной системы вопросов и ответов для консультаций в логистической отрасли;
Пятый этап: точная настройка разработки крупных моделей с использованием областей большого здравоохранения, новой розничной торговли и новых медиа для создания крупных моделей, подходящих для текущей области;
Шестой этап: на основе мультимодальной большой модели SD был построен апплет-кейс диаграммы Вэньшэн;
Седьмой этап: сосредоточить внимание на применении и разработке платформ больших моделей и создавать отраслевые приложения для больших моделей с помощью зрелых больших моделей, таких как большая модель Синхуо и большая модель Вэньсинь.
👉学会后的收获:👈
• В ходе этого курса можно приобрести различные навыки, основанные на комплексной инженерной реализации крупных моделей (интерфейсная, серверная часть, менеджер по продукту, дизайн, анализ данных и т. д.);
• Возможность использовать большие модели для решения актуальных задач проекта. В эпоху больших данных все больше и больше предприятий и учреждений должны обрабатывать огромные объемы данных. Использование технологии больших моделей может лучше обрабатывать эти данные и повышать точность анализа данных. и принятие решений. Таким образом, овладение навыками разработки приложений для больших моделей может позволить программистам лучше справляться с реальными потребностями проекта;
• На основе разработки приложений искусственного интеллекта для больших моделей и корпоративных данных реализовать теорию больших моделей, освоить вычислительную мощность графического процессора, аппаратное обеспечение, среду разработки LangChain и практические навыки проектов, а также изучить тонкую настройку вертикального обучения больших моделей (подготовка данных, очистка данных, большие развертывание модели) Комплексное мастерство;
• Возможность завершить обучение популярным моделям вертикальных полей больших моделей и улучшить возможности программистов по кодированию: разработка приложений для больших моделей требует владения алгоритмами машинного обучения, структурами глубокого обучения и другими технологиями. Освоение этих технологий может улучшить возможности программистов по кодированию и анализу, позволяя программистам. стать более опытным в написании высококачественного кода.
1. Дорожная карта обучения большой модели искусственного интеллекта
2. План коммерческого внедрения 100 комплектов крупных моделей ИИ.
3.100 серий видеоуроков по крупным моделям
4200 крупных моделей PDF-книг
5. Сбор вопросов для собеседования на степень LLM.
6. Коллекция ресурсов AI-менеджера по продукту
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓