Parameter-Efficient Fine-Tuning (PEFT) — это новый подход к точной настройке больших языковых моделей (LLM), который эффективно снижает требования к вычислительным ресурсам и памяти по сравнению с традиционными методами.

PEFT использует тонкую настройку только для небольшого подмножества параметров модели, при этом замораживая большую часть предварительно обученной сети. Эта тактика снижает риск катастрофического забывания и значительно снижает затраты на вычисления и хранение. О традиционных методах я писал в этой очередной статье.

Были разработаны различные методы PEFT, такие как:

  1. Настройка подсказок под управлением задачи. В этом методе используются подсказки для конкретной задачи, чтобы направлять выходные данные LLM, что устраняет необходимость переобучения всей модели для конкретной задачи.
  2. Адаптация низкого ранга (LoRA). Путем аппроксимации параметров LLM с помощью матрицы низкого ранга LoRA уменьшает количество точно настроенных параметров, повышая производительность LLM.
  3. Адаптеры. Эти небольшие специализированные уровни можно добавлять в LLM для адаптации к задачам, обеспечивая гибкость и повышение производительности.
  4. Настройка префиксов, соответствующих задаче. Точная настройка LLM на репрезентативных префиксах, связанных с текущей задачей, повышает производительность и адаптивность задачи.

Методы PEFT продемонстрировали эффективность в различных задачах, включая вывод на естественном языке, ответы на вопросы и обобщение текста. Исследователи и практики могут использовать PEFT для эффективного использования LLM в различных задачах.

Вот больше информации об упомянутых методах PEFT:

  1. Настройка подсказок с помощью задач. Добавляя подсказки для конкретных задач во входные данные, LLM выполняет требуемую задачу. Например, предоставив подсказку «Какая столица Бразилии?» направляет LLM генерировать ответ «Бразилиа».
  2. Адаптация низкого ранга (LoRA). Этот усовершенствованный метод аппроксимирует параметры LLM с помощью матриц низкого ранга, что значительно повышает его производительность.
  3. Адаптеры. Адаптеры — это небольшие универсальные уровни, интегрированные в LLM для повышения производительности при выполнении конкретных задач.
  4. Настройка префиксов, соответствующих задаче. Для точной настройки LLM для ответов на вопросы используется последовательность префиксов, соответствующих задачам, представляющих вопросы.

Ниже приведен пример кода Python, демонстрирующий, как реализовать эффективную с параметрами точную настройку (PEFT) для точной настройки предварительно обученной языковой модели с использованием библиотеки Hugging Face Transformers. Мы будем использовать TextClassificationPipeline для точной настройки предварительно обученной модели BERT в наборе данных IMDb для анализа настроений.

import torch
from transformers import BertTokenizer, BertForSequenceClassification, AdamW, pipeline
from datasets import load_dataset

# Load the IMDb dataset
dataset = load_dataset("imdb")

# Load the pre-trained BERT model and tokenizer
model_name = "bert-base-uncased"
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertForSequenceClassification.from_pretrained(model_name, num_labels=2)  # Binary sentiment analysis

# Tokenize the dataset
def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

tokenized_dataset = dataset.map(tokenize_function, batched=True)

# Split the dataset into training and validation sets
train_dataset, val_dataset = tokenized_dataset["train"], tokenized_dataset["test"].train_test_split(test_size=0.1)

# Hyperparameters and Training Configuration
learning_rate = 2e-5
batch_size = 16
num_epochs = 3

# Define the optimizer
optimizer = AdamW(model.parameters(), lr=learning_rate)

# Fine-tuning function using PEFT
def fine_tune(model, train_dataset, optimizer, num_epochs, batch_size):
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model.to(device)

    for epoch in range(num_epochs):
        total_loss = 0
        model.train()

        for i in range(0, len(train_dataset), batch_size):
            batch = train_dataset[i:i+batch_size]
            input_ids = torch.tensor(batch["input_ids"]).to(device)
            attention_mask = torch.tensor(batch["attention_mask"]).to(device)
            labels = torch.tensor(batch["label"]).to(device)

            optimizer.zero_grad()
            outputs = model(input_ids=input_ids, attention_mask=attention_mask, labels=labels)
            loss = outputs.loss
            loss.backward()
            optimizer.step()
            total_loss += loss.item()

        print(f"Epoch: {epoch+1}/{num_epochs}, Average Loss: {total_loss / len(train_dataset)}")

# Fine-tune the model using PEFT
fine_tune(model, train_dataset, optimizer, num_epochs, batch_size)

# Save the fine-tuned model
output_dir = "fine_tuned_model/"
model.save_pretrained(output_dir)
tokenizer.save_pretrained(output_dir)

# Load the fine-tuned model using the TextClassificationPipeline
classifier = pipeline("text-classification", model=output_dir, tokenizer=output_dir)

# Test the fine-tuned model on a sample text
sample_text = "This movie was fantastic! I loved every bit of it."
result = classifier(sample_text)
print(result)

Этот код демонстрирует, как реализовать PEFT для точной настройки модели BERT для анализа настроений в наборе данных IMDb. Точно настроенную модель можно сохранить и использовать для логического вывода с помощью TextClassificationPipeline.

PEFT (параметрически эффективное трансферное обучение) — это новый подход к трансферному обучению, который разработан, чтобы быть более эффективным, чем традиционная точная настройка. PEFT делает это, используя двухэтапный процесс:

  1. К предварительно обученной модели добавляется небольшое количество слоев адаптера. Эти переходные слои отвечают за адаптацию модели к новой задаче.
  2. Слои адаптера обучаются с использованием небольшого количества данных из новой задачи.

Этот двухэтапный процесс позволяет PEFT добиться хорошей производительности в новой задаче, используя значительно меньше параметров, чем традиционная тонкая настройка.

Напротив, трансферное обучение — это более общий подход к использованию предварительно обученной модели для решения новой задачи. Трансферное обучение можно использовать различными способами, в том числе:

  • Переносное обучение на основе признаков: в переносном обучении на основе признаков функции, извлеченные из предварительно обученной модели, используются в качестве входных данных для новой модели, которая обучается новой задаче.
  • Точная настройка: при точной настройке веса предварительно обученной модели обновляются с использованием небольшого количества данных из новой задачи.
  • Предварительно обученные адаптеры. Предварительно обученные адаптеры — это тип слоя адаптера, предварительно обученный на большом наборе неразмеченных данных. Предварительно обученные адаптеры можно использовать для повышения производительности PEFT в новой задаче.

Итак, является ли PEFT новым? Да, PEFT — это новый подход к переносу обучения, который разработан, чтобы быть более эффективным, чем традиционная тонкая настройка. Однако трансферное обучение — это более общий подход к использованию предварительно обученной модели для решения новой задачи.