LangChain 101 Часть 2d. Улучшение LLM с помощью обратной связи людей

ЛангЧейн 101 Улучшение LLM с помощью обратной связи от людей (Часть 2d)

Это часть 2d и последняя часть раздела “Модели” курса “LangChain 101”. Сильно рекомендуется ознакомиться с первыми двумя частями, чтобы лучше понять контекст данной статьи.

LangChain 101: Часть 2ab. Всё, что вам нужно знать о (больших языковых) моделях

Это часть 2ab курса “LangChain 101”. Сильно рекомендуется ознакомиться с первой частью для лучшего понимания…

pub.towardsai.net

LangChain 101: Часть 2c. Настройка LLMs с помощью PEFT, LORA и RL

Всё, что вам нужно знать о настройке LLMs, PEFT, LORA и тренировке больших языковых моделей

pub.towardsai.net

(подпишитесь на автора, чтобы не пропустить следующую часть).

RLHF (Обучение с подкреплением с помощью обратной связи от человека) является важной составляющей текущего метода обучения продвинутых языковых моделей. Он помогает учесть отзывы людей при настройке моделей, что в конечном итоге делает модель более ценной и надежной.

Давайте рассмотрим наиболее распространенные методы обучения:

Базовая модель

Базовая модель – это предварительно обученная большая языковая модель, обученная на огромном обобщающем наборе данных текста (иногда кода): GPT, LLAMA, Falcon и других.

Базовые модели хороши для генерации текста для общих предметных областей. Однако их производительность для конкретных задач или предметных областей может потерпеть неудачу.

Промптинг

Промптинг – это техника, которая улучшает производительность LLMs, предоставляя модели конкретный промпт для задачи.

Например, предположим, вы хотели бы, чтобы LLM дал вам совет по готовке. В этом случае вы можете добавить что-то вроде “Действовать как профессиональный повар Мишель” в начале вашего запроса. Затем LLM будет использовать этот промпт, чтобы “действовать как опытный повар”.

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

Настройка

Настройка – это техника, которая улучшает производительность LLMs путем обучения их на конкретных наборах данных – примеры желаемого ввода и вывода.

Например, вы хотите настроить LLM для перевода с английского на арабский. В этом случае вам необходимо предоставить набор данных из пар английско-арабского перевода.

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

LangChain 101: Часть 2c. Настройка LLMs с помощью PEFT, LORA и RL

Всё, что вам нужно знать о настройке LLMs, PEFT, LORA и тренировке больших языковых моделей

pub.towardsai.net

Настройка + RLHF

Настройка с обучением с подкреплением от обратной связи от человека (RLHF) – это техника, которая повышает производительность LLMs путем их обучения на конкретных наборах данных, оцененных человеком. Эти данные включают примеры желаемого ввода и вывода для задачи, а также отзывы от человеческих оценщиков о качестве продукции.

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

На основе исследования: https://arxiv.org/pdf/2203.02155.pdf

(Instruct) Структура RLHF конвейера

Давайте ближе познакомимся с тем, как строится RLHF конвейер Instruct (скорее всего, конвейер ChatGPT выглядит похожим).

Конвейер Instruct(GPT) RLHF предполагает взятие предварительно обученной модели и ее усовершенствование путем обучения с учителем (похожего на “Обучение с точной настройкой” в традиционном конвейере обучения). После этого обновленная модель дополнительно усовершенствуется с помощью процесса оптимизации проксимальной политики.

Конвейер RLHF можно описать как трехэтапный процесс обучения:

  1. Усовершенствование предварительно обученной модели с помощью руководства
  2. Создание модели для предоставления вознаграждений
  3. Дополнительное усовершенствование с использованием оптимизации проксимальной политики (PPO)

На первом этапе конвейера RLHF мы генерируем или выбираем подсказки (возможно, из набора данных или базы данных) и просим людей создавать высококачественные ответы. Мы используем эту собранную информацию для точной настройки уже существующей базовой модели.

Этап 1. (Instruct)GPT RLHF конвейер

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

Для преобразования модели с конвейера RLHF на втором этапе в модель вознаграждений мы заменяем ее выходной слой (слой следующего токена) регрессионным слоем с одним выходным узлом.

Этап 2. (Instruct)GPT RLHF конвейер

На третьем и последнем этапе RLHF конвейера мы используем модель вознаграждений (v2) для дополнительной точной настройки предыдущей модели, которая уже прошла точную настройку с учителем (v1).

Мы корректируем модель v1, используя оптимизацию проксимальной политики (PPO) с помощью оценок вознаграждения, полученных от модели вознаграждений, которую мы создали на втором этапе конвейера RLHF.

Этап 3. (Instruct)GPT RLHF конвейер

Вот в основном, как работает (Instruct)GPT RLHF конвейер. Этот метод дает качественные результаты, но требует много времени и усилий людей. Можем ли мы сделать это более эффективно?

(Instruct)GPT RLHF конвейер

LLAMA RLHF конвейер

Модель Meta AI Llama 2, используя подход RLHF, аналогичный InstructGPT, вводит несколько замечательных отличий:

  • Две модели вознаграждения
  • Потеря отступа
  • Метод отказа выборки

Две модели вознаграждения: Llama2 использует две модели вознаграждений, одну, сосредоточенную на полезности, и другую, на безопасности. Окончательная оптимизация модели основана на комбинации этих двух оценок.

Потеря отступа: Llama2 вводит “отступ” метку в ранжировании ответов модели, которая измеряет разницу между предпочтениями. Этот параметр отступа помогает уточнить расчет потери ранжирования.

Этап 2. LLAMA RLHF конвейер

Генерация отбора: Llama2 использует итеративный подход RLHF, создавая несколько версий модели (от RLHF-V1 до RLHF-V5). В дополнение к PPO, они применяют генерацию отбора.

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

Шаг 3. LLAMA RLHF конвейер

Конечный конвейер будет выглядеть следующим образом:

LLAMA RLHF конвейер

Видно, что выбор лучшего ответа из 2х является быстрее, чем ранжирование набора из 4х. Добавление отступа также понятно помогает модели учиться быстрее, так как это похоже на классический процесс обучения ML. Наконец, отклонение выборки звучит как интересная концепция для получения качества в конечном итоге.

Почётные упоминания

Перед тем, как мы перейдём к коду, я бы хотел перечислить некоторые другие техники RLHF:

Исследователи предлагают самообучающийся метод на основе набора правил, предоставленных людьми.

В исследовании представлена HIR (Hindsight Instruction Labeling) – метод, включающий двухэтапный процесс отбора подсказок и обучения, который эффективно преобразует случаи, когда модель языка отклоняется от инструкций.

Исследование о RLAIF показывает, что оценка, используемая для обучения модели вознаграждению в RLHF, может быть создана с помощью LLM, а не полностью полагаться на вход от человека.

ReST – это метод, который выравнивает модели языка с предпочтениями человека через выборочный подход, итеративное обучение на прогрессивно более качественных подмножествах для усиления функции вознаграждения.

Время для кода

Полный код доступен на GitHub.

Вначале нам нужно определить общие параметры обучения и конфигурации Lora, которые мы будем использовать. Это очень похоже на код из части серии по настройке моделей.

from transformers import TrainingArgumentsfrom peft import LoraConfig# Подготовка параметров обученияtraining_args = TrainingArguments(    output_dir="./train_logs",  # Выходная папка    max_steps=100,  # Максимальное количество шагов обучения    per_device_train_batch_size=4,  # Размер пакета на одном GPU для обучения    gradient_accumulation_steps=1,  # Количество шагов для накопления градиентов    learning_rate=1.0e-4,  # Скорость обучения    optim="adamw_torch",  # Оптимизатор    save_steps=50,  # Как часто сохранять контрольные точки    logging_steps=10,  # Как часто регистрировать информацию об обучении    report_to="tensorboard",  # Метод отчетности (в этом случае, TensorBoard)    remove_unused_columns=False,  # Удалять ли неиспользуемые столбцы    evaluation_strategy="steps",  # Стратегия оценки    num_train_epochs=5,  # Количество этапов обучения)# Подготовка параметров PEFTpeft_config = LoraConfig(    r=16,  # Значение r    lora_alpha=16,  # Значение lora_alpha    bias="none",  # Настройка смещения    task_type="SEQ_CLS",  # Тип задачи (Последовательная классификация)    modules_to_save=["scores"],  # Модули для сохранения)

Теперь пришло время определить нашу конвейерную линию RLHF.

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

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

from trl import RewardTrainer# Подготовка RewardTrainertrainer = RewardTrainer(    model=model,  # Модель для обучения с подкреплением    tokenizer=tokenizer,  # Токенизатор для обработки входных данных    args=training_args,  # Аргументы обучения    train_dataset=formatted_dataset["train"],  # Набор данных для обучения    eval_dataset=formatted_dataset["test"],  # Набор данных для оценки    peft_config=peft_config,  # Конфигурация PEFT    max_length=512,  # Максимальная длина входных данных)# Выполнение обученияtrainer.train()# Сохранение предварительно обученной модели наградtrainer.model.save_pretrained("./reward_model")

Этого достаточно для запуска обучения с подкреплением с использованием обратной связи от людей!

Теперь вы знаете, когда использовать RLHF, как должны выглядеть данные и как запустить код.

Это конец части 2d. Это последняя часть раздела Модели в моем курсе “Языковая цепочка 101”.

Поставьте лайк и подпишитесь на меня, так как это мотивирует меня писать новые статьи 🙂