кочан Пълно ръководство за фина настройка на големи езикови модели - Unite.AI
Свържете се с нас

Изкуствен интелект

Пълно ръководство за фина настройка на големи езикови модели

mm
Обновено on

Големи езикови модели (LLM) като GPT-4, LaMDA, PaLM и други завладяха света със забележителната си способност да разбират и генерират човешки текст по широк набор от теми. Тези модели са предварително обучени върху масивни масиви от данни, включващи милиарди думи от интернет, книги и други източници.

Тази фаза на предварително обучение напълва моделите с обширни общи познания относно езика, темите, способностите за разсъждение и дори някои пристрастия, присъстващи в данните за обучение. Въпреки невероятната им широта обаче, на тези предварително обучени LLM липсва специализиран опит за конкретни области или задачи.

Това е мястото, където идва фината настройка – процесът на адаптиране на предварително обучен LLM за превъзходство в конкретно приложение или случай на употреба. Чрез по-нататъшно обучение на модела върху по-малък, специфичен за задачата набор от данни, можем да настроим неговите възможности, за да се приведе в съответствие с нюансите и изискванията на този домейн.

Фината настройка е аналогична на прехвърлянето на широкообхватните познания на високообразован общ специалист за изработване на експерт по предмет, специализиран в определена област. В това ръководство ще проучим какво, защо и как при фината настройка на LLM.

Фина настройка на големи езикови модели

Фина настройка на големи езикови модели

Какво е фина настройка?

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

Докато предварителното обучение улавя широко езиково разбиране от огромен и разнообразен текстов корпус, фината настройка специализира тази обща компетентност. Това е все едно да вземете човек от Ренесанса и да го оформите в експерт в индустрията.

Теглата на предварително обучения модел, които кодират неговите общи познания, се използват като отправна точка или инициализация за процеса на фина настройка. След това моделът се обучава допълнително, но този път върху примери, пряко свързани с крайното приложение.

Чрез излагане на модела на това специализирано разпространение на данни и съответно настройване на параметрите на модела, ние правим LLM по-точен и ефективен за целевия случай на употреба, като същевременно се възползваме от широките предварително обучени възможности като основа.

Защо Fine-Tune LLM?

Има няколко ключови причини, поради които може да искате да настроите фино голям езиков модел:

  1. Персонализиране на домейна: Всяка област, от правото през медицината до софтуерното инженерство, има свои собствени нюансирани езикови конвенции, жаргон и контекст. Фината настройка ви позволява да персонализирате общ модел, за да разберете и създадете текст, съобразен с конкретния домейн.
  2. Специализация на задачите: LLM могат да бъдат фино настроени за различни задачи за обработка на естествен език като обобщаване на текст, машинен превод, отговаряне на въпроси и т.н. Тази специализация повишава производителността на целевата задача.
  3. Съответствие с данните: Силно регулирани отрасли като здравеопазването и финансите имат строги изисквания за поверителност на данните. Фината настройка позволява обучение на LLM на собствени организационни данни, като същевременно защитава чувствителна информация.
  4. Ограничени етикетирани данни: Получаването на големи етикетирани набори от данни за тренировъчни модели от нулата може да бъде предизвикателство. Фината настройка позволява постигане на силно изпълнение на задачите от ограничени контролирани примери чрез използване на възможностите на предварително обучения модел.
  5. Актуализиране на модела: Тъй като нови данни стават достъпни с течение на времето в домейн, можете да прецизирате моделите допълнително, за да включите най-новите знания и възможности.
  6. Смекчаване на пристрастията: LLM могат да разберат обществени пристрастия от обширни данни преди обучението. Фината настройка на подбраните набори от данни може да помогне за намаляване и коригиране на тези нежелани отклонения.

По същество фината настройка преодолява празнината между общ, широк модел и фокусираните изисквания на специализирано приложение. Той подобрява точността, безопасността и уместността на изходните данни на модела за целеви случаи на употреба.

Фина настройка на големи езикови модели

Фина настройка на големи езикови модели

Предоставената диаграма очертава процеса на внедряване и използване на големи езикови модели (LLM), специално за корпоративни приложения. Първоначално предварително обучен модел като T5 се захранва със структурирани и неструктурирани фирмени данни, които могат да бъдат в различни формати като CSV или JSON. Тези данни се подлагат на контролирани, неконтролирани или процеси на фина настройка на трансфера, повишавайки уместността на модела спрямо специфичните нужди на компанията.

След като моделът е фино настроен с данните на компанията, неговите тегла се актуализират съответно. След това обученият модел преминава през допълнителни цикли на обучение, като непрекъснато подобрява отговорите си с течение на времето с нови фирмени данни. Процесът е итеративен и динамичен, с обучение на модела и преквалификация, за да се адаптира към развиващите се модели на данни.

Резултатът от този обучен модел – токени и вграждания, представляващи думи – след това се внедрява за различни корпоративни приложения. Тези приложения могат да варират от чатботове до здравеопазване, всяко от които изисква моделът да разбира и отговаря на специфични за индустрията заявки. Във финансите приложенията включват откриване на измами и анализ на заплахи; в здравеопазването моделите могат да помогнат при запитвания на пациенти и диагностика.

Капацитетът на обучения модел да обработва и отговаря на нови фирмени данни във времето гарантира, че неговата полезност е устойчива и расте. В резултат на това корпоративните потребители могат да взаимодействат с модела чрез приложения, като задават въпроси и получават информирани отговори, които отразяват обучението на модела и фината настройка на специфични за домейна данни.

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

Подходи за фина настройка

Има две основни стратегии, когато става въпрос за фина настройка на големи езикови модели:

1) Пълна фина настройка на модела

При подхода за пълна фина настройка всички параметри (тегла и отклонения) на предварително обучения модел се актуализират по време на втората фаза на обучение. Моделът е изложен на специфичния за задачата етикетиран набор от данни и стандартният процес на обучение оптимизира целия модел за това разпространение на данни.

Това позволява на модела да прави по-изчерпателни корекции и да се адаптира холистично към целевата задача или домейн. Пълната фина настройка обаче има някои недостатъци:

  • Изисква значителни изчислителни ресурси и време за обучение, подобно на фазата преди обучението.
  • Изискванията за съхранение са високи, тъй като трябва да поддържате отделно фино настроено копие на модела за всяка задача.
  • Съществува риск от „катастрофално забравяне“, при което фината настройка кара модела да загуби някои общи способности, научени по време на предварителното обучение.

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

2) Ефективни методи за фина настройка

За да преодолеят изчислителните предизвикателства на пълната фина настройка, изследователите са разработили ефективни стратегии, които актуализират само малка част от параметрите на модела по време на фина настройка. Тези параметрично ефективни техники постигат баланс между специализация и намаляване на изискванията за ресурси.

Някои популярни ефективни методи за фина настройка включват:

Префикс-Настройка: Тук се въвеждат и обучават малък брой специфични за задачата вектори или „префикси“, за да обуславят вниманието на предварително обучения модел за целевата задача. Само тези префикси се актуализират по време на фина настройка.

LoRA (адаптация от нисък ранг): LoRA инжектира обучаеми матрици от нисък ранг във всеки слой на предварително обучения модел по време на фина настройка. Тези малки корекции на ранг спомагат за специализирането на модела с много по-малко параметри, които могат да се обучават, отколкото пълната фина настройка.

Разбира се, мога да дам подробно обяснение на LoRA (адаптация с нисък ранг) заедно с математическата формулировка и примерите за код. LoRA е популярна параметър-ефективна техника за фина настройка (PEFT), която придоби значителна популярност в областта на адаптирането на големи езикови модели (LLM).

Какво е LoRA?

LoRA е метод за фина настройка, който въвежда малък брой обучаеми параметри към предварително обучения LLM, което позволява ефективно адаптиране към задачи надолу по веригата, като същевременно запазва по-голямата част от знанията на оригиналния модел. Вместо фина настройка на всички параметри на LLM, LoRA инжектира специфични за задачата матрици с нисък ранг в слоевете на модела, което позволява значително спестяване на изчисления и памет по време на процеса на фина настройка.

Математическа формулировка

LoRA (адаптация от нисък ранг) е метод за фина настройка за големи езикови модели (LLM), който въвежда актуализация от нисък ранг на тегловните матрици. За тегловна матрица 0∈, LoRA добавя матрица с нисък ранг с намлява , Където е рангът. Този подход значително намалява броя на подлежащите на обучение параметри, позволявайки ефективно адаптиране към задачи надолу по веригата с минимални изчислителни ресурси. Актуализираната матрица на теглото е дадена от .

Тази актуализация с нисък ранг може да се тълкува като модифициране на оригиналната матрица за тегло $W_{0}$ чрез добавяне на матрица с нисък ранг $BA$. Основното предимство на тази формула е, че вместо да актуализира всички $d \times k$ параметри в $W_{0}$, LoRA трябва само да оптимизира $r \times (d + k)$ параметри в $A$ и $B $, което значително намалява броя на обучаемите параметри.

Ето един пример в Python, използващ peft библиотека за прилагане на LoRA към предварително обучен LLM за класификация на текст:

</div>
<div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color="">from</span> transformers <span class="token" data-darkreader-inline-color="">import</span> AutoModelForSequenceClassification
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color="">from</span> peft <span class="token" data-darkreader-inline-color="">import</span> get_peft_model<span class="token" data-darkreader-inline-color="">,</span> LoraConfig<span class="token" data-darkreader-inline-color="">,</span> TaskType
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Load pre-trained model</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">model <span class="token" data-darkreader-inline-color="">=</span> AutoModelForSequenceClassification<span class="token" data-darkreader-inline-color="">.</span>from_pretrained<span class="token" data-darkreader-inline-color="">(</span><span class="token" data-darkreader-inline-color="">"bert-base-uncased"</span><span class="token" data-darkreader-inline-color="">,</span> num_labels<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">2</span><span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Define LoRA configuration</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">peft_config <span class="token" data-darkreader-inline-color="">=</span> LoraConfig<span class="token" data-darkreader-inline-color="">(</span>task_type<span class="token" data-darkreader-inline-color="">=</span>TaskType<span class="token" data-darkreader-inline-color="">.</span>SEQ_CLS<span class="token" data-darkreader-inline-color="">, </span>r<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">8</span><span class="token" data-darkreader-inline-color="">,</span>  <span class="token" data-darkreader-inline-color=""># Rank of the low-rank update</span>
lora_alpha<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">16</span><span class="token" data-darkreader-inline-color="">,</span></code><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Scaling factor for the low-rank update</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">    target_modules<span class="token" data-darkreader-inline-color="">=</span><span class="token" data-darkreader-inline-color="">[</span><span class="token" data-darkreader-inline-color="">"q_lin"</span><span class="token" data-darkreader-inline-color="">,</span> <span class="token" data-darkreader-inline-color="">"v_lin"</span><span class="token" data-darkreader-inline-color="">]</span><span class="token" data-darkreader-inline-color="">,</span>  <span class="token" data-darkreader-inline-color=""># Apply LoRA to the query and value layers</span>
<span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Create the LoRA-enabled model</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">model <span class="token" data-darkreader-inline-color="">=</span> get_peft_model<span class="token" data-darkreader-inline-color="">(</span>model<span class="token" data-darkreader-inline-color="">,</span> peft_config<span class="token" data-darkreader-inline-color="">)</span>
</code></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># Fine-tune the model with LoRA</span>
</code></div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""></div>
<div class="code-block__code !my-0 !rounded-t-lg !text-sm !leading-relaxed" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><code class="language-python" data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color=""><span class="token" data-darkreader-inline-color=""># ... (training code omitted for brevity)</span></code></div>
</div>
<div data-darkreader-inline-bgimage="" data-darkreader-inline-bgcolor="" data-darkreader-inline-color="">

В този пример зареждаме предварително обучен BERT модел за класификация на последователности и дефинираме LoRA конфигурация. The r параметърът указва ранга на актуализацията от нисък ранг и lora_alpha е коефициент на мащабиране за актуализацията. The target_modules параметърът показва кои слоеве на модела трябва да получат актуализации от нисък ранг. След като създадем модела с активиран LoRA, можем да продължим с процеса на фина настройка, като използваме стандартната процедура за обучение.

Адаптерни слоеве: Подобно на LoRA, но вместо актуализации от нисък ранг, тънки „адаптерни“ слоеве се вмъкват във всеки трансформаторен блок на предварително обучения модел. Само параметрите на тези няколко нови компактни слоя се обучават.

Бърза настройка: Този подход поддържа предварително обучения модел напълно замразен. Вместо това се въвеждат обучаеми „бързи“ вграждания като вход за активиране на предварително обучените знания на модела за целевата задача.

Тези ефективни методи могат да осигурят до 100 пъти намаляване на изчисленията в сравнение с пълната фина настройка, като същевременно постигат конкурентно представяне при много задачи. Те също така намаляват нуждите от съхранение, като избягват пълно дублиране на модели.

Въпреки това, тяхното представяне може да изостане от пълната фина настройка за задачи, които са значително различни от общия език или изискват по-холистична специализация.

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

Независимо от стратегията за фина настройка, цялостният процес за специализиране на LLM следва обща рамка:

  1. Подготовка на набор от данни: Ще трябва да получите или създадете етикетиран набор от данни, който картографира входовете (подканите) към желаните изходи за вашата целева задача. За задачи за генериране на текст, като обобщаване, това ще бъде входен текст към обобщени изходни двойки.
  2. Разделяне на набор от данни: Следвайки най-добрите практики, разделете своя етикетиран набор от данни на набори за обучение, валидиране и тестване. Това разделя данните за обучение на модел, настройка на хиперпараметри и крайна оценка.
  3. Хиперпараметрична настройка: Параметри като скорост на обучение, размер на партида и график за обучение трябва да бъдат настроени за най-ефективна фина настройка на вашите данни. Това обикновено включва малък набор за валидиране.
  4. Модел обучение: Използвайки настроените хиперпараметри, изпълнете процеса на оптимизиране на фина настройка на пълния набор за обучение, докато производителността на модела на набора за валидиране спре да се подобрява (ранно спиране).
  5. Оценка: Оценете производителността на фино настроения модел върху набора от изчерпани тестове, в идеалния случай включващ примери от реалния свят за целевия случай на употреба, за да оцените ефикасността в реалния свят.
  6. Внедряване и наблюдение: След като бъде задоволителен, фино настроеният модел може да бъде разгърнат за извод за нови входове. От решаващо значение е да се наблюдава неговата производителност и точност във времето за отклонение на концепцията.

Докато това очертава цялостния процес, много нюанси могат да повлияят на успеха на фината настройка за конкретен LLM или задача. Стратегии като обучение по учебна програма, многозадачна фина настройка и подсказване с няколко изстрела могат допълнително да повишат производителността.

Освен това ефективните методи за фина настройка включват допълнителни съображения. Например LoRA изисква техники като кондициониране на предварително обучените изходи на модела чрез комбиниращ слой. Бързата настройка се нуждае от внимателно проектирани подкани за активиране на правилните поведения.

Усъвършенствана фина настройка: Включване на човешка обратна връзка

Докато стандартната контролирана фина настройка с помощта на етикетирани набори от данни е ефективна, вълнуваща граница е обучението на LLM директно чрез човешки предпочитания и обратна връзка. Този подход на човек в цикъла използва техники от обучението за укрепване:

PPO (Оптимизация на проксималната политика): Тук LLM се третира като агент за обучение за укрепване, като неговите резултати са „действия“. Модел на възнаграждение е обучен да предсказва човешки оценки или качествени резултати за тези резултати. След това PPO оптимизира LLM, за да генерира резултати, максимизиращи резултатите на модела на възнаграждение.

RLHF (Обучение за подсилване от човешка обратна връзка): Това разширява PPO чрез директно включване на човешка обратна връзка в учебния процес. Вместо модел с фиксирано възнаграждение, наградите идват от итеративни човешки оценки на резултатите на LLM по време на фина настройка.

Въпреки че са интензивни от изчислителна гледна точка, тези методи позволяват формиране на поведението на LLM по-прецизно въз основа на желаните характеристики, оценени от хората, извън това, което може да бъде уловено в статичен набор от данни.

Компании като Anthropic използваха RLHF, за да вдъхнат своите езикови модели като Claude с подобрена истинност, етика и осведоменост за безопасността отвъд обикновената компетентност за изпълнение на задачи.

Потенциални рискове и ограничения

Въпреки че са изключително мощни, фината настройка на LLM не е лишена от рискове, които трябва да се управляват внимателно:

Усилване на отклонението: Ако данните за фина настройка съдържат обществени пристрастия около пол, раса, възраст или други атрибути, моделът може да разшири тези нежелани пристрастия. Курирането на представителни и непредубедени набори от данни е от решаващо значение.

Фактически дрифт: Дори след фина настройка на висококачествени данни, езиковите модели могат да „халюцинират“ неверни факти или резултати, несъвместими с примерите за обучение по време на по-дълги разговори или подкани. Може да са необходими методи за извличане на факти.

Предизвикателства пред скалируемостта: Пълната фина настройка на огромни модели като GPT-3 изисква огромни изчислителни ресурси, които може да са неосъществими за много организации. Ефективната фина настройка частично смекчава това, но има компромиси.

Катастрофално забравяне: По време на пълна фина настройка моделите могат да претърпят катастрофално забравяне, при което губят някои общи способности, научени по време на предварителното обучение. Може да е необходимо обучение с много задачи.

IP и рискове за поверителността: Собствени данни, използвани за фина настройка, могат да изтекат в публично публикувани изходи на езикови модели, което представлява риск. Диференциалната поверителност и техниките за намаляване на информационните опасности са активни области на изследване.

Като цяло, макар и изключително полезна, фината настройка е нюансиран процес, изискващ грижа за качеството на данните, съображения за идентичност, смекчаване на рисковете и балансиране на компромиси между производителност и ефективност въз основа на изискванията за използване.

Бъдещето: Персонализиране на езиков модел в мащаб

Гледайки напред, напредъкът в техниките за фина настройка и адаптиране на модела ще бъде от решаващо значение за отключване на пълния потенциал на големите езикови модели в различни приложения и домейни.

По-ефективни методи, позволяващи фина настройка дори на по-големи модели като PaLM с ограничени ресурси, биха могли да демократизират достъпа. Автоматизирането на тръбопроводите за създаване на набор от данни и бързото инженерство биха могли да рационализират специализацията.

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

В крайна сметка, тъй като LLMs стават все по-разпространени, способността да ги персонализирате и специализирате безпроблемно за всеки възможен случай на употреба ще бъде от решаващо значение. Стратегиите за фина настройка и свързаните с това адаптиране на модела са основни стъпки в реализирането на визията на големите езикови модели като гъвкави, безопасни и мощни AI асистенти, увеличаващи човешките способности във всяка област и начинание.

Прекарах последните пет години, потапяйки се в завладяващия свят на машинното обучение и дълбокото обучение. Моята страст и опит ме накараха да допринеса за над 50 различни проекта за софтуерно инженерство, със специален фокус върху AI/ML. Продължаващото ми любопитство също ме насочи към обработката на естествен език, област, която нямам търпение да проуча по-нататък.