Parameter-Efficient Fine-Tuning (PEFT) — это новый подход к точной настройке больших языковых моделей (LLM), который эффективно снижает требования к вычислительным ресурсам и памяти по сравнению с традиционными методами.
PEFT использует тонкую настройку только для небольшого подмножества параметров модели, при этом замораживая большую часть предварительно обученной сети. Эта тактика снижает риск катастрофического забывания и значительно снижает затраты на вычисления и хранение. О традиционных методах я писал в этой очередной статье.
Были разработаны различные методы PEFT, такие как:
- Настройка подсказок под управлением задачи. В этом методе используются подсказки для конкретной задачи, чтобы направлять выходные данные LLM, что устраняет необходимость переобучения всей модели для конкретной задачи.
- Адаптация низкого ранга (LoRA). Путем аппроксимации параметров LLM с помощью матрицы низкого ранга LoRA уменьшает количество точно настроенных параметров, повышая производительность LLM.
- Адаптеры. Эти небольшие специализированные уровни можно добавлять в LLM для адаптации к задачам, обеспечивая гибкость и повышение производительности.
- Настройка префиксов, соответствующих задаче. Точная настройка LLM на репрезентативных префиксах, связанных с текущей задачей, повышает производительность и адаптивность задачи.
Методы PEFT продемонстрировали эффективность в различных задачах, включая вывод на естественном языке, ответы на вопросы и обобщение текста. Исследователи и практики могут использовать PEFT для эффективного использования LLM в различных задачах.
Вот больше информации об упомянутых методах PEFT:
- Настройка подсказок с помощью задач. Добавляя подсказки для конкретных задач во входные данные, LLM выполняет требуемую задачу. Например, предоставив подсказку «Какая столица Бразилии?» направляет LLM генерировать ответ «Бразилиа».
- Адаптация низкого ранга (LoRA). Этот усовершенствованный метод аппроксимирует параметры LLM с помощью матриц низкого ранга, что значительно повышает его производительность.
- Адаптеры. Адаптеры — это небольшие универсальные уровни, интегрированные в LLM для повышения производительности при выполнении конкретных задач.
- Настройка префиксов, соответствующих задаче. Для точной настройки 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 делает это, используя двухэтапный процесс:
- К предварительно обученной модели добавляется небольшое количество слоев адаптера. Эти переходные слои отвечают за адаптацию модели к новой задаче.
- Слои адаптера обучаются с использованием небольшого количества данных из новой задачи.
Этот двухэтапный процесс позволяет PEFT добиться хорошей производительности в новой задаче, используя значительно меньше параметров, чем традиционная тонкая настройка.
Напротив, трансферное обучение — это более общий подход к использованию предварительно обученной модели для решения новой задачи. Трансферное обучение можно использовать различными способами, в том числе:
- Переносное обучение на основе признаков: в переносном обучении на основе признаков функции, извлеченные из предварительно обученной модели, используются в качестве входных данных для новой модели, которая обучается новой задаче.
- Точная настройка: при точной настройке веса предварительно обученной модели обновляются с использованием небольшого количества данных из новой задачи.
- Предварительно обученные адаптеры. Предварительно обученные адаптеры — это тип слоя адаптера, предварительно обученный на большом наборе неразмеченных данных. Предварительно обученные адаптеры можно использовать для повышения производительности PEFT в новой задаче.
Итак, является ли PEFT новым? Да, PEFT — это новый подход к переносу обучения, который разработан, чтобы быть более эффективным, чем традиционная тонкая настройка. Однако трансферное обучение — это более общий подход к использованию предварительно обученной модели для решения новой задачи.