web analytics

Стратегии тонкой настройки LLM

Sztuczna Inteligencja (ИИ/AI)

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


С ростом подходов к генерации дополненного поиска (RAG) эти универсальные модели все чаще используются организациями для различных приложений, от простых чат-ботов до более сложных агентских автоматизаций (персон). Хотя такие методы, как GraphRAG, были разработаны для извлечения связей между документами на основе сущностей, они не могут полностью удовлетворить все потребности, связанные с доменом, из-за отсутствия существенного контекста в базовой модели. Это ограничение привело к непрерывному потоку новых моделей, выпускаемых каждый месяц.

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

Тонкая настройка: простая аналогия

Чтобы понять тонкую настройку, давайте воспользуемся аналогией. Представьте, что вы студент, готовящийся к экзамену по естественным наукам. Вы начинаете с прочной основы, полученной на занятиях. По мере приближения экзамена вы сосредотачиваетесь на конкретных темах, которые будут проверяться. Вы решаете практические вопросы, чтобы оценить свое понимание, а затем просматриваете материал на основе своих результатов по этим вопросам. Вы также можете обратиться за советом к друзьям, обратиться к онлайн-ресурсам или пересмотреть ключевые темы.

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

Распространенные варианты использования тонкой настройки

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

Изучение языка

Давайте сравним две версии «Ламы», которым было поручено ответить на тамильском языке.

ответ от модели Llama-2–7b-chat
ответ от Mozhi.ai HuggingFace space (тонко настроенная версия моделей отсюда )

Как показано в примере выше, базовый вариант Llama с трудом понимает запрошенный язык, в то время как тонко настроенная модель способна свободно отвечать на этом языке. Эта способность возникает из процесса тонкой настройки, который позволяет модели изучать и распознавать шаблоны на новом языке. Напротив, простые приложения Retrieval-Augmented Generation (RAG) ограничены, поскольку они не связывают эффективно новые контексты с существующими знаниями. Тонкая настройка становится необходимой в сценариях, где модель должна получать и интегрировать разнообразные контексты.

Эффективная защита LLM

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

Даже если мы дадим указание модели не отвечать на некоторые вопросы, возникнут две основные проблемы: взлом подсказок и контекстные окна. Взлом подсказок происходит, когда пользователи манипулируют вводом, чтобы обойти ограничения. Кроме того, хотя более крупные модели, такие как Llama 3.1 с контекстным окном размером 128 КБ, предоставляют больше места для инструкций, это не решает проблему полностью. Хотя контекстное окно может вместить больше информации, если для настройки контекста используется слишком много токенов, это уменьшает пространство, доступное для фактического контента.

Эффективные шаблоны подсказок могут помочь, но они не могут учесть все возможные нюансы. Хотя большое контекстное окно полезно, оно не является всеобъемлющим решением, что делает тонкую настройку более надежным вариантом.Даже такие крупные игроки, как Meta, представилиLlamaGuard, усовершенствованная версия модели Llama, предназначенная для обеспечения соблюдения правил чата и предотвращения вредоносных ответов.

Персоны ИИ

Новостные СМИ часто освещают одни и те же истории, но каждое издание представляет их с уникальной точки зрения. Представьте себе помощника чата, призванного помогать писать статьи, собирая информацию из разных источников. Если ваша организация использует предварительно обученную модель, такую ​​как ChatGPT, эффективные подсказки — как пользовательские, так и системные инструкции — могут генерировать полезные новостные фрагменты. Однако эти фрагменты не всегда могут соответствовать определенному стилю или рекомендациям вашей организации.

Чтобы обеспечить последовательность и соответствие тону и стандартам вашей организации, вы можете настроить модель с помощью новостных статей, написанных вашей собственной командой. Такой подход создает более персонализированный ИИ, который точно отражает голос вашей организации и на который можно положиться для последовательного и точного контента. Кроме того, несколько стартапов сейчас сосредоточены на разработке персонажей ИИ корпоративного уровня для оптимизации ручных действий.

Более умные и компактные модели

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

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

Перед тонкой настройкой рассмотрите следующие факторы:

  • Достаточно данных: Достаточно ли у вас данных для эффективного обучения модели?
  • Доступность оборудования: доступно ли необходимое оборудование для обучения и запуска модели?
  • Стратегии RAG: Можно ли решить вашу проблему, используя стратегии RAG с существующими API LLM?
  • Время вывода на рынок: как быстро вам нужно, чтобы услуга была введена в эксплуатацию?
  • Вы можете объединить API от разных поставщиков услуг для создания единого продукта. Эти модели отличаются высоким качеством и постоянно обновляются для соответствия новейшим стандартам. Тщательное исследование может помочь вам определить наиболее подходящие модели для ваших конкретных потребностей.

Процесс тонкой настройки

Кредиты изображений — блог

Теперь, когда мы понимаем, что такое тонкая настройка и ее применение, давайте рассмотрим различные типы и как каждый из них функционирует. Существует три популярных подхода к тонкой настройке больших языковых моделей (LLM), основанных на методологиях обучения:

  1. Контролируемое обучение — в этом подходе модель приобретает новые концепции, обучаясь на парах ввода-вывода. Такие методы, как тонкая настройка инструкций, являются примером этого метода, где мы учим модель давать точные ответы на конкретные инструкции.
    Представьте себе класс, где студент учится писать эссе. Изначально студент пишет эссе на разные темы, но его работа не идеальна. Учитель просматривает эссе, дает подробную обратную связь и предлагает улучшения. Со временем студент пересматривает свои эссе на основе этой обратной связи и становится лучшим писателем.
    В контролируемой тонкой настройке для больших языковых моделей (LLM) модель начинается с общих знаний, а затем «обучается» с помощью аналогичного процесса: она обучается на конкретных примерах с правильными выходными данными и обратной связью для повышения ее производительности при выполнении определенных задач, во многом подобно тому, как студент совершенствует свои навыки письма.
  2. Самостоятельное обучение — эта мощная методология используется при настройке языковой модели, чтобы помочь модели понять нюансы данных для языкового моделирования. Она использует внутреннюю структуру данных для генерации контрольных сигналов, устраняя необходимость в вручную маркированных данных.
    Представьте себе класс, где ученики получают неполные или зашифрованные заметки и должны самостоятельно вывести недостающие части. Этот сценарий параллелен самостоятельным обучением в ИИ. Так же, как ученики используют контекст и собственные знания для заполнения пробелов, самостоятельная модель учится, предсказывая скрытые части данных и совершенствуя свое понимание с помощью этих предсказаний. Она представляет собой способ обучения на основе самих данных, не требуя явных меток или прямых ответов. Некоторые популярные стратегии — это маскированное языковое моделирование (BERT), авторегрессивное языковое моделирование (GPT), контрастное обучение (SimCLR), прогнозирование следующего предложения (BERT) и моделирование языка перестановок ( XLNet ) среди многих других, и часто используются в сочетании.
  3. Обучение с подкреплением — Обучение с подкреплением (RL) для языковых моделей включает в себя их обучение давать лучшие ответы с помощью системы вознаграждений, которая оценивает их результаты. Модель генерирует ответы на основе подсказок и получает положительные вознаграждения за качественные ответы и штрафы за плохие. Благодаря этой обратной связи модель корректирует свои параметры для улучшения своей производительности с течением времени. Шаблон, используемый для максимизации вознаграждений (в идеале), называется политикой, и различные стратегии оптимизации политики помогают RL достигать результатов, более близких к человеческим результатам.
    Представьте себе ученика в классе, который учится решать математические задачи. Каждый раз, когда ученик правильно решает задачу, учитель дает ему золотую звезду в качестве награды, поощряя дальнейшие усилия и совершенствование. Иногда учитель также дает конструктивную обратную связь об ошибках, помогая ученику скорректировать свой подход. Со временем ученик узнает, какие стратегии приносят больше золотых звезд и меньше ошибок.
    В этой аналогии золотые звезды и обратная связь представляют собой награды и штрафы в обучении с подкреплением, направляя ученика к изучению и оптимизации своих навыков решения проблем путем проб и ошибок. Строгость наказаний может варьироваться в зависимости от политики учителя. Цель состоит в том, чтобы определить правильную стратегию, которая позволяет достичь наилучших результатов.

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

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

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

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

We also need to determine the number of parameters necessary for fine-tuning the model. The primary concern will be the computational resources required for both tuning and inference, as costs can escalate quickly. Additionally, we should consider the specific task and the type of data we want the base model to adapt to. There are three different strategies involved: full parameter retraining, Parameter-Efficient Fine-Tuning (PEFT), and transfer learning. In this discussion, we will focus on various PEFT strategies for fine-tuning the model on consumer GPUs.

Это только ключевые соображения, а также стратегии, такие как выбор подхода сверху вниз или снизу вверх, обучение на отдельных слоях или их пакетирование и т. д. Таким образом, ключевые соображения вместе с соответствующим выбором модуля тонкой настройки дадут нам правильную базовую линию для работы. Поскольку тонкая настройка — это океан сам по себе, давайте сосредоточимся на меньшем подмножестве (чаще всего упоминаемом) для части реализации, которая будет эффективной вертикальной тонкой настройкой параметров. Вы можете обратиться к предыдущей статье , чтобы получить представление о различных форматах квантованных моделей, которые можно увидеть на HuggingFace .

PEFT для тонкой настройки

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

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

Замораживая большинство параметров, продолжая использовать остаточные связи и применяя соответствующие методы регуляризации, эти модели сохраняют свои предыдущие знания, тем самым избегая катастрофического забывания . Такие методы, как GaLore, сделали возможной тонкую настройку больших моделей, таких как Llama-3, на персональных компьютерах, что делает продвинутое языковое моделирование более доступным.

Давайте рассмотрим несколько методик PEFT, отметив, что они не являются взаимоисключающими.

Методы эффективной тонкой настройки параметров

(Таксономия методов тонкой настройки с эффективными параметрами) Источник изображения: Масштабирование с уменьшением масштаба к увеличению: руководство по тонкой настройке с эффективными параметрами (ArXiv)

Как и на изображении выше, методы PEFT классифицируются по 3 широким категориям, а именно: на основе добавления (добавление новых обучаемых параметров), на основе выбора (выбор подмножества параметров из базовой модели) и на основе репараметризации (имеющие альтернативное представление). В этой статье мы рассмотрим только примеры фрагментов кода для каждого процесса. Вы можете найти все реализации PEFT для HuggingFace Transformer в их официальной документации .

Адаптеры

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

Источник изображения: Эффективное с точки зрения параметров трансферное обучение для обработки естественного языка (ArXiv)

Если полностью связанные слои будут уменьшать масштаб измерений в одном, а затем изменять их обратно до входного измерения в следующем, как это уменьшит пространство признаков? Например, предположим, что первый полностью связанный слой уменьшает 256-мерный вход до 16 измерений, а второй слой возвращает его обратно к 256 измерениям. Это дает в общей сложности 256 x 16 + 16 x 256 = 8192 весовых параметра. Для сравнения, один полностью связанный слой, который отображает 256-мерный вход в 256-мерный выход, будет иметь 256 x 256 = 65536 параметров. При настройке адаптера только адаптеры, нормы слоев и конечный заголовок обучаются на данных нисходящего потока, что делает настройку более быстрой и эффективной. Этот метод доказал свою успешность на основе следующего наблюдения: модель BERT, обученная с помощью метода адаптера, достигает производительности моделирования, сопоставимой с полностью настроенной моделью BERT, при этом требуя обучения только 3,6% параметров. Простой блок адаптера выглядит следующим образом.

import torch 
import torch.nn as nn 

class  AdapterBlock (nn.Module): 
    def  __init__ ( self, input_dim, adapter_dim= 64 ): 
        super (AdapterBlock, self).__init__() 
        self.down_proj = nn.Linear(input_dim, adapter_dim) 
        self.activation = nn.ReLU() 
        self.up_proj = nn.Linear(adapter_dim, input_dim) 

    def  forward ( self, x ): 
        # Применить блок адаптера 
        return x + self.up_proj(self.activation(self.down_proj(x)))

Существует еще один уникальный адаптер под названием Llama-Adapter , который имеет уникальную архитектуру адаптера, специально разработанную для превращения Llama в модель, выполняющую инструкции.

Быстрая настройка

Настройка подсказок — это снова аддитивный метод, использующий силу мягких подсказок (динамическое обновление подсказок с использованием обратной связи Loss) вместо явных статических подсказок человека/жестких подсказок. Этот метод PEFT направлен на достижение улучшенной производительности модели только с помощью входных данных вместо изменения весов модели. Если это так, то почему бы не использовать проектирование подсказок? Проектирование подсказок требует больших усилий для разработки идеальной подсказки, и существует проблема длины контекстного окна. Даже если подсказки работают в тестовых сценариях, они могут не работать в других сценариях, поскольку существует множество способов задать тот же вопрос.

Источник изображения: Сила масштабирования для эффективной по параметрам быстрой настройки (ArXiv)

Как видно на изображении выше, мы добавляем дополнительные обучаемые токены (того же размера, что и входной вектор) к входным векторам встраивания. Они не являются фиксированными точками в пространстве встраивания и, следовательно, могут принимать представление любого слова. Цель состоит в том, чтобы непрерывно находить наилучшее представление этих обучаемых токенов для руководства завершением вывода модели. Мы можем достичь этого в пределах 20 токенов (за пределами этого значения достигается лишь незначительный прирост) для задач классификации в соответствии с базовой статьей. Как видно выше, вместо работы с 11B параметрами мы работаем только с 20K параметрами, связанными с подсказками к задачам. Этот метод имеет природу черного ящика, поскольку он может принимать любое представление в пространстве встраивания и его трудно контролировать. При анализе ближайшего соседа было обнаружено, что эти токены принимают семантическое представление слова, что означает, что этот метод нельзя использовать для узкоспециализированных задач. Во-вторых, как видно из исследовательских наблюдений, этот метод оказывается эффективным по мере увеличения размера модели, но не так эффективен для меньших моделей. Ниже представлен простой блок настройки подсказок.

Источник изображения: Сила масштабирования для эффективной по параметрам быстрой настройки (ArXiv)
import torch 
import torch.nn as nn 

class  PromptTuningBlock (nn.Module): 
    def  __init__ ( self, input_dim, prompt_length, hidden_dim, output_dim ): 
        super (PromptTuningBlock, self).__init__() 
        self.prompt_length = prompt_length 
        self.prompt_embeddings = nn.Parameter(torch.randn(prompt_length, input_dim)) 
        self.input_embedding = nn.EmbeddingBag(input_dim, hidden_dim) 
        # Простой линейный слой для вывода
         self.fc = nn.Linear(hidden_dim + prompt_length * input_dim, output_dim) 

    def  forward ( self, input_ids ): 
        # Получить вложения ввода
         input_embeds = self.input_embedding(input_ids) 
        # Объединить вложения подсказок
         combined_embeds = torch.cat([input_embeds, self.prompt_embeddings.mean(dim= 0 ).unsqueeze( 0 )], dim= 1 ) 
        # Проходим через линейный слой
         output = self.fc(combined_embeds)

Настройка префикса

Это улучшенный вариант настройки подсказок, где мы добавляем мягкие подсказки к каждому блоку преобразователя (перед позиционным кодированием) вместо одних только вложений входов. Таким образом, префиксный токен становится единственным обучаемым параметром по слоям и оказывает лучшее влияние на выходные данные. Чем это отличается от настройки подсказок? Настройка подсказок улучшает несколько слоев модели, добавляя префикс, специфичный для задачи, к последовательности входов, что требует больше параметров для тонкой настройки. Напротив, настройка подсказок фокусируется исключительно на настройке вложений входных подсказок, что приводит к меньшему количеству обновленных параметров и потенциально большей эффективности параметров, хотя это может ограничить адаптивность к целевой задаче. Хотя настройка подсказок может обеспечить лучшую производительность из-за большего набора параметров, она также может потребовать больше вычислительных ресурсов и увеличить риск переобучения. Можно с уверенностью предположить, что настройка подсказок, хотя и более эффективна, может работать не так хорошо, как настройка префиксов из-за меньшего количества тонких параметров. Простой блок настройки префиксов выглядит так, как показано ниже.

Источник изображения: Prefix-Tuning: Оптимизация непрерывных подсказок для генерации (ArXiv)
import torch 
import torch.nn as nn 

class  PrefixTuningBlock (nn.Module): 
    def  __init__ ( self, num_prefix_tokens, hidden_size, num_layers ): 
        super (PrefixTuningBlock, self).__init__() 
        self.prefix_tokens = nn.Parameter(torch.randn(num_prefix_tokens, hidden_size)) 
        self.transformer_layers = nn.ModuleList([nn.TransformerEncoderLayer(d_model=hidden_size, nhead= 8 , dropout= 0.1 ) for _ in  range (num_layers)]) 

    def  forward ( self, input_ids ): 
        # Создаем тензор префиксных токенов
         prefix_tokens = self.prefix_tokens.unsqueeze( 0 ).expand(input_ids.size( 0 ), - 1 , - 1 ) 
        # Объединить input_ids и prefix_tokens
         input_ids = torch.cat([prefix_tokens, input_ids], dim= 1 ) 
        # Пропустить объединенный ввод через слои трансформатора
         output = input_ids 
        for layer in self.transformer_layers: 
            output = layer(output) 
        return output

Низкоранговая адаптация больших языковых моделей ( семейство LoRA)

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

Вместо того, чтобы добавлять новые параметры в модель, мы фокусируемся на этом альтернативном представлении. Общее мнение заключается в том, чтобы установить ранг r пропорциональным объему обучающих данных и размеру модели, чтобы смягчить проблемы переобучения и эффективно управлять бюджетами модели. Также было замечено, что LoRA меньше учится и меньше забывает, что и ожидалось.

Давайте разберем разложение на примере.

Источник изображения: статья Себастьяна Рашки «Параметрически эффективная тонкая настройка LLM с помощью LoRA»

Assume we have 2 matrices A and B with 100 and 500 parameters. Therefore total number of parameters in ΔW is AXB = 100X500 = 50,000. Now let’s assume a rank of 5. Now the new weight matrices WA and WB become 100X5 = 500 and 500X5 = 2,500. The new ΔW = WA + WB = 500+2500 = 3000 parameters, which is a 94% decrease. A sample LoRA block looks like the one mentioned below.

import torch 
import torch.nn as nn 
import math 

class  LoRA (nn.Module): 
    def  __init__ ( self, input_dim, output_dim, rank= 8 , alpha= 1.0 ): 
        super ().__init__() 
        self.input_dim = input_dim 
        self.output_dim = output_dim 
        self.rank = rank 
        self.alpha = alpha 
        # Создаем матрицы весов LoRA
         self.W_A = nn.Parameter(torch.empty(input_dim, rank)) 
        self.W_B = nn.Parameter(torch.empty(rank, output_dim)) 
        # Инициализируем веса LoRA
         nn.init.kaiming_uniform_(self.W_A, a=math.sqrt( 5 )) 
        nn.init.zeros_(self.W_B) 

    def  forward ( self, x, W ): 
        h = x @ W 
        # Применяем LoRA
         h += self.alpha * x @ (self.W_A @ self.W_B) 
        вернуть h
Источник изображения: Блог Винии Джейн ( В подходе QLoRA именно веса исходной модели квантуются с точностью 4 бита. Новые добавленные веса LoRA не квантуются; они сохраняют более высокую точность и настраиваются в процессе обучения.)

Существуют различные разновидности LoRA, такие как DoRA, QLoRA (популярная стратегия смешанной точности), LoHA и т. д. Некоторые популярные из них вы можете найти в этой статье , а реализации трансформаторов — в документации HuggingFace .

Введенный адаптер путем ингибирования и усиления внутренних активаций (IA3)

This is another additive method involving three phases, addition of vectors, rescaling (inhibit/ amplify) and tuning on downstream data. The three added vectors are Key rescaling vector (This vector is multiplied with the keys in the self-attention layer), Value rescaling vector(This vector is multiplied with the values in the self-attention and encoder-decoder attention layers) and Intermediate activation rescaling vector(This vector is multiplied with the intermediate activations in the position-wise feed-forward network). The learned vectors are then used to rescale the corresponding elements in the model. This rescaling can either inhibit (reduce) or amplify (increase) the activations, depending on the values in the learned vectors. Finally, the model is finetuned on a downstream task. The learned vectors are updated during the fine-tuning process to optimize the model’s performance. The model was proposed as a better alternative to few-shot prompting strategies (In-context learning).

Источник изображения: Тонкая настройка с малым количеством параметров лучше и дешевле, чем контекстное обучение (ArXiv)

Orthogonal Finetuning via Butterfly Factorization (BOFT)

This is another reparameterization strategy where we perform orthogonal transformation of the weight matrices using butterfly factorizationLet us understand butterfly factorization. The goal is to represent a given weight matrix as a product of 2 matrices, namely a diagonal matrix and a permutation matrix as shown in the below image.

Image Source: Author

Вводя фактор ортогональности между градиентами потерь тонкой настройки и потерь до обучения, мы сохраняем структурное ограничение. Как указано в концептуальном руководстве HuggingFace , это помогает сохранять гиперсферическую энергию неизменной во время тонкой настройки. Энергию можно рассматривать как расстояние точки от начала координат на гиперсфере. Поддержание гиперсферической энергии во время тонкой настройки гарантирует, что изученные представления остаются близкими к своим исходным положениям, что снижает риск забывания ранее изученной информации. Также это разреженное представление помогает в лучшем обобщении модели. Как говорит автор, « Структура бабочки служит плавной интерполяцией между различными гиперпараметрами номеров блоков в OFT, делая ортогональную структуру тонкой настройки более гибкой и, что еще важнее, более эффективной по параметрам ». Этот подход в основном обучается и тестируется на моделях изображений и может быть предпочтительным для моделей «текст-изображение».

Источник изображения: Эффективная по параметрам ортогональная тонкая настройка с помощью факторизации по методу бабочки

Другие популярные альтернативы LoRA — это совместное использование одних и тех же матриц низкого ранга по слоям и инициализация слоев адаптера с главными сингулярными значениями и сингулярными векторами весов исходной модели. Это постоянно искомая проблема, поскольку основная цель — подгонка и вычисление моделей на локальном оборудовании, таком как смартфоны и ПК (мобильные чипы).

LlamaFactory (fine-tuning framework)

Давайте настроим предварительно обученную модель Llama, используя стратегию PEFT для изучения запросов Docker. LlamaFactory — это унифицированная структура для тонкой настройки всех больших языковых моделей (LLM) с набором передовых эффективных методов обучения. Мы изучим пользовательский интерфейс (UI) — хотя это также можно сделать через интерфейс командной строки (CLI) — включая то, как добавлять новые модели и наборы данных из Hugging Face, глоссарий терминов тонкой настройки и процесс экспорта настроенной модели.

Установка

Установка может быть выполнена по этим инструкциям репозитория GitHub . Рекомендуется создавать определенные инструменты, подобные этому, в отдельной виртуальной среде.

Image Source: Author

Давайте рассмотрим различные поля на изображении выше.

Lang — устанавливает язык пользовательского интерфейса. В настоящее время поддерживаются английский, русский, китайский и корейский языки.

Имя модели — задает базовую модель для тонкой настройки. Она уже поддерживает все популярные модели. Что делать, если нам нужно добавить пользовательские модели? Добавьте свою модель в шаблоны моделей, присутствующие внутри src/llamafactory/extras/constants.py , в соответствующий реестр моделей, как показано на изображении ниже. Источником загрузки также может быть локальный каталог, содержащий всю информацию о моделях.

Источник изображения: Автор (добавление модели Mistral-Small-Instruct из HuggingFace)

Путь модели — путь для загрузки модели.

Метод тонкой настройки — поддерживает методы полной, замороженной и LoRA настройки. Это подходы полной тонкой настройки, трансферного обучения и настройки PEFT.

Путь контрольной точки — После того, как мы настроим модель, вся информация о модели будет отмечена контрольной точкой (например, метаинформация основных атрибутов настроенной модели, которая впоследствии может быть загружена и использована для задач с данными). Это будет отображаться только тогда, когда доступен настроенный вариант выбранной модели (обученный через LlamaFactory или локальный путь к каталогу, обновленный в шаблоне LlamaFactory)

Расширенные конфигурации — Поскольку локальное оборудование может не справиться с настройкой и полной или половинной точностью, нам нужно квантовать модель (узнать больше здесь ), чтобы сделать ее работоспособной на нашем ПК. Все параметры квантования можно настроить на этой вкладке.

  • Бит квантования (QLoRA) — Поддерживаются 2 варианта: 4 бита и 8 бит. Это количество бит, выделенных для представления веса модели, поэтому ниже точность, ниже информация, хранимая, поэтому ниже точность. Это в теории, но существуют методы квантования, такие как GGUF и bitsandbytes, которые помогают сохранить большую часть вывода модели даже при 4-битной точности, что позволяет настраивать и запускать модели на ЦП.
  • Метод квантования — Метод, используемый для квантования. Более подробную статью о квантовании можно найти в моей предыдущей статье . Поддерживаются методы полуквадратичного квантования (hqq), eetq и bitsandbytes. Bitsandbytes стал самым известным инструментом/подходом для квантования моделей до 4 и 8 бит. Вы можете узнать больше о нем из документации HuggingFace .
  • Prompt Template — There are plenty of readymade templates available. We can register a new template by adding one in src/ llamafactory/ data /template.py under _register_template section as shown in the fig below.
Источник изображения: Автор (добавьте новую подсказку с новым методом _register_template )
  • Масштабирование RoPE — Масштабирование RoPE включает в себя настройку параметров Rotary Position Embedding (RoPE) для улучшения экстраполяционных возможностей больших языковых моделей (LLM) за пределами их исходной длины контекста обучения. Этот метод позволяет LLM эффективно управлять более длинными текстовыми последовательностями, чем те, которые встречаются во время обучения, изменяя базовое значение в расчетах RoPE. Благодаря тонкой настройке RoPE с меньшим или большим базовым значением модель может лучше захватывать позиционную информацию в расширенных контекстах, в конечном итоге улучшая свою производительность при выполнении задач, включающих длинные тексты. Динамический NTK и линейный — это две поддерживаемые LlamaFactory стратегии экстраполяции. Узнайте больше о масштабировании RoPE из этой статьи .
  • Booster — Как следует из названия, это методы, разработанные для ускорения процессов обучения и вывода LLM. В настоящее время поддерживаются ядра flash attention 2, unsloth и liger (ядра, разработанные на языке triton). Подробнее об этом можно прочитать в ресурсах.
Источник изображения: Автор

Давайте рассмотрим основные стратегии обучения и гиперпараметры, упомянутые на изображении выше, для точной настройки LLM.

Stage — Доступно несколько вариантов, включая контролируемую настройку, предварительную подготовку и стратегии обучения с подкреплением. Кодовую базу для каждой стратегии можно найти в src/llamafactory/train в соответствующих папках. Позвольте мне коротко рассказать о каждой стратегии.

  • Контролируемая тонкая настройка — использует тренер последовательности-последовательности. Вы можете найти концептуальный обзор здесь и список параметров для тонкой настройки здесь .
  • Моделирование вознаграждения — обзор можно найти в этом видео , а список параметров для тонкой настройки можно найти здесь .
  • Оптимизация проксимальной политики — Вы можете прочитать о PPO из курса RL в HuggingFace . Это базовая стратегия RL, которая приходит на ум, использующая политики для постепенного улучшения производительности модели.
  • Оптимизация прямых предпочтений — это эффективная стратегия, которая заменяет отдельную модель вознаграждения функцией потери кросс-энтропии, тем самым минимизируя часть обучения с подкреплением, следовательно, связанные вычисления и время. Вы можете узнать о тренерах HunggingFace DPO здесь .
  • Оптимизация Канемана-Тверски — это устраняет парные предпочтения для ответов в наборе данных, как в двух предыдущих шагах. Вместо этого мы работаем над двоичной меткой (True или False) для управления моделью. Вы можете узнать о тренере KTO из документации HuggingFace .
  • Предварительное обучение — Вы можете найти разницу между предварительным обучением, контролируемой тонкой настройкой и обучением с подкреплением из этого краткого руководства . Цель предварительного обучения — заставить модель изучить все нюансы данных без каких-либо явных инструкций.

Data dir — Путь к папке, в которой хранятся ваши обучающие данные/шаблоны данных.

Набор данных — HuggingFace уже ссылается на несколько наборов данных для различных моделей. Для добавления пользовательских наборов данных мы можем изменить шаблон набора данных, присутствующий в data/dataset_info.json, как показано на изображении ниже.

Источник изображения: Автор (добавление пользовательских наборов данных, может быть URL-адресом HF или любым локальным или облачным местом назначения)

Гиперпараметры

Скорость обучения — помогает решить, насколько корректируются веса модели во время каждой итерации обучения. По сути, он контролирует размер шага, предпринимаемого в процессе оптимизации. Чем ниже значение === тем медленнее обучение.

Эпохи — Эпоха относится к одному полному проходу по всему набору обучающих данных. Количество эпох определяет, сколько времени модель считывает все данные. Больше эпох === переобучение. Используйте стратегии, такие как ранние остановки, для мониторинга производительности модели с набором проверки перед переходом к следующей эпохе.

Максимальная норма градиента — Отсечение градиента — это метод, используемый для предотвращения чрезмерного увеличения градиентов во время обучения. Значения нормы служат пороговыми значениями для процесса отсечения. Больше значение нормы === чаще отсечение => медленнее обучение.

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

Тип вычисления — определяет, следует ли использовать смешанную точность во время обучения. Некоторые стратегии квантования основаны на идее, что сохранение наиболее эффективного набора весов с фактической точностью и квантование на относительно менее эффективных весах может дать производительность, более близкую к исходной. Вот ссылка на WikiPedia на bf16 . LlamaFactory поддерживает форматы bf16(mixed), fp32, fp16 и pure bf_16.

Длина отсечки — максимальная длина токена для ввода (зависит от модели).

Размер партии — количество образцов, обрабатываемых за один раз.

Накопление градиента — Количество подпакетов для отделения от базового обучающего пакета. Это необходимо для обучения моделей на потребительских графических процессорах с небольшим объемом памяти и вычислений.

Размер валидности — процент данных, используемых для проверки.

Планировщик LR — Планировщик скорости обучения используется для динамической регулировки скорости обучения во время каждой итерации.

Дополнительные конфигурации

Источник изображения: Автор (дополнительная общая конфигурация в LlamaFactory)

Шаги регистрации — количество итераций для регистрации каждый раз (если 5, то регистрация каждые 5 шагов)

Сохранение шагов — Количество шагов между двумя контрольными точками определяет частоту сохранения контрольных точек. Большее число означает, что контрольные точки сохраняются реже, а меньшее число означает, что контрольные точки сохраняются чаще. Это помогает в сценариях, где процесс обучения прерывается.

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

NEFTune Alpha — NEFTune добавляет шум к входным вложениям языковой модели, внося случайность в процесс обучения. Вы можете узнать больше в документации HuggingFace . Применение NEFTune к хорошо распределенным наборам данных может добавить лишь незначительные выгоды (иногда вообще ничего).

Оптимизатор — как следует из названия, он используется для оптимизации моделей с целью получения наименьшего значения функции потерь. Он делает это путем итеративной корректировки параметров модели (весов и смещений) для поиска наилучшего возможного набора значений, который минимизирует ошибку между прогнозами модели и истинными значениями. Список поддерживаемых оптимизаторов: adamw_torch, adamw_8bit или adafactor . Вы можете узнать больше в документации PyToch .

Pack sequences — Packing combines sequences of different lengths into a single tensor, eliminating unnecessary padding. PyTorch allows us to pack the sequence, internally packed sequence is a tuple of two lists. One contains the elements of sequences and the other contains the batch size at each step.

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

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

Изменение размера внедрений токенов — изменение размера словаря токенизатора и слоев внедрения для размещения новых сгенерированных токенов.

Включить s² внимание — Вы можете узнать о LongLoRA здесь . Переключение короткого внимания было бы похоже на разбиение учебника на более мелкие главы или разделы. Вы бы сосредоточились на понимании каждой главы по отдельности, не пытаясь запомнить каждую связь между ними сразу.

Включить внешний регистратор — можно активировать мониторинг тензорборда для процесса обучения. По умолчанию вы можете отслеживать тренировочные действия, используя нижнюю секцию из пользовательского интерфейса LlamaFactory или cli.

Конкретные конфигурации

Источник изображения: Автор (Конфигурации, зависящие от этапа)

Заморозка конфигураций настройки

Обучаемые слои — количество скрытых слоев для обучения, как в описании.

Обучаемые и дополнительные модули — Мы можем указать модули LLM для обучения, если указано как ‘all’, то обучается все. Соответствующий код можно найти в src/llamafactory/model/adapter.py . Поддерживаемые модули можно найти в функции named_parameters() для PreTrained transformers.

Источник изображения: Автор (обучаемые модули (скрытые модули) и дополнительные модули (нескрытые модули))

Конфигурации RLHF

Значение бета — гиперпараметр для управления балансом между обратной связью человека и сигналом вознаграждения. Если значение бета высокое, модель отдает приоритет обратной связи человека, а низкое значение бета больше фокусируется на структуре вознаграждения.

Ftx gamma — обозначает дисконтный фактор в обучении с подкреплением. Он определяет, как будущие вознаграждения оцениваются по сравнению с немедленными вознаграждениями. Гамма, близкая к 1, означает, что будущие вознаграждения ценятся высоко, в то время как гамма, близкая к 0, отдает приоритет немедленным вознаграждениям.

Тип потерь — Функция потерь. Список поддерживаемых типов: сигмоид, шарнир, IPO, KTO_pair, ORPO и SimPO.

Модель вознаграждения — путь к модели вознаграждения.

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

Конфигурации GaLore ( проекция градиента низкого ранга)

Это стратегия обучения низкого ранга с эффективным использованием памяти, которая позволяет проводить обучение по всем параметрам, но более эффективна с точки зрения памяти, чем обычные методы адаптации низкого ранга, такие как LoRA. Это первый метод, который позволяет предварительно обучить модель llama-2-7B на 28 ГБ VRAM без использования параллелизма модели, контрольных точек или выгрузки.

GaLore Rank — более высокий ранг требует больше памяти и большей точности, и наоборот.

Интервал обновления — Частота обновлений может существенно повлиять на производительность GaLore. Если обновления слишком частые, экономия памяти может быть ограничена. Если обновления слишком редкие, аппроксимация может устареть и ухудшить производительность модели.

Galore Scale — Larger the scaling factor higher the updates.

BAdam configurations

Это полнопараметрическая оптимизация на коммерческих графических процессорах. Авторы смогли точно настроить Llama 2–7b и Llama 3–8B, используя один RTX3090 с правилом обновления Адама и смешанной точностью обучения. Это использует технику, называемую оптимизацией координат блоков , которая делит параметры модели на более мелкие блоки и итеративно обновляет каждый блок, сохраняя другие фиксированными, что значительно сокращает объем памяти, необходимый для обучения, при этом сохраняя хорошую производительность, как показано ниже.

Источник изображения: репозиторий BAdam GitHub

Модель BAdam — Мы можем сделать оптимизатор BAdam либо послойно (импортирован класс BlockOptimizer), либо по отношениям (импортирован класс BlockOptimizerRatio). Для работы послойного обучения требуется установка DeepSpeed .

Коэффициент обновления — коэффициент для разреженной маски.

Режим переключения — режим переключения между различными блоками.

Источник изображения: BAdam GitHub

Интервал переключения — количество шагов оптимизации перед переключением на следующий блок.

You can follow along this video tutorial for finetuning using LlamaFactory.

Заключение

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

Transitioning into practical implementation, we delved into the LlamaFactory tool, which simplifies the fine-tuning process. By examining various parameters and hyperparameters, we highlighted how choices like learning rate, batch size, and dropout can significantly influence model performance. This practical insight equips you with the knowledge to tailor your fine-tuning efforts effectively.

Hope this overview enhances your understanding of the LLM fine-tuning landscape and empowers you to implement these strategies successfully.

Ресурсы

  1. Современные подходы к обработке естественного языка, LMU Мюнхен, брошюра семинара
  2. Глубокое обучение с подкреплением, OpenAI, Книга
  3. Эффективная точная настройка параметров, Виния Джайн, Примечания для начинающих
  4. Блог AI Себастьяна Рашки, Себастьян Рашка, блог

Источник:
https://pub.towardsai.net/llm-finetuning-strategies-f1e2e8d91b30

Оцените статью
( Пока оценок нет )

Добавить комментарий