Галоўная / Артыкулы

Ад прадказання токена да выканання інструкцый: файнцюнінг GPT-мадэлі

Як папярэдне навучаная GPT вучыцца выконваць інструкцыі: фарматаванне запісаў, зрух метак, маскі запаўнення, цыкл навучання, межы ацэнкі і крок да пераваг DPO.

Выдавец: REACTAPP.TOP9 хв чытання2112 слоў

Крыніцы: From Next-Token Prediction to ChatGPT <> Build an LLM From Scratch [6]

Прадзялежна падготавка ужо дае модэлю мовы можлівасць пісаць. Але ёй не хапае розумення таго, калі сам ужоць хочаць чаго-небудзь. Налаштаванне па інструкціях запэўняе гэта. Калі даты двум модэлям аднаковы запіт, напрыклад, паспяшыць ўсё па-проста дзесятагодзецу пра рэкурэнцію, то разлік будзе явны. Базовы модэль часта проста павтарае запіт і пераходзіць да стандартнага, з кніжкі, апісання курсаў па інформатыцы. Ён зовсім не адпавядае, а толькі працягвае тэкст. Налаштаваны модэль жа прыносіць візуальны абраз: касета, у якой знаходзіцца меньшая касета, а ў якой — ўжо меньшая, пры чым рэкурэнція апісваецца як проблема, якая постаўляе сабе все меньшыя версіі, пакуль найменшая з іх становіцца простай для рашэння.

У сутнасці обе мадэлі выконваюць адно і тое ж — прагнозуюць наступны токен, пры тым як іх працяванне суперш чыжы. Продукты для чату робяць выконанне інструкцыйяў нейтральным, чым маскуюць гэтыя разлікі. На запытанні даёмаць адпаведныя адпаведзі, запытанні на код генеруюць код, а статысы пішуцца. Нічога з гэтага не даецца безкоштовна проста чытанням велікіх кантэнтав. Прадзейнаванне вучыць кашто-і болей фундаментальнага: які токен, вярогодна, будзе наступным, калі вжыць у ўвазе ўсё, што ўжо было? У гэм няма нічога, што бы паводзілася на тое, што запытка корыстніка павінна быць выконана. Самэ гэтыя разлікі і ёсць тэмай гэтага абарону.

Этап 1: прадзейнаванне вучыць завершэнне, а не павінаваленне

Задача прадзейнавання — гэта проста прагноза наступнага токена. Ля самой сабе гэта дастатнька, каб запам’ятаць граматыку, факты, сінтаксіс коду, стылі пісьма і нават дзеякі неспадзявана складныя патэрны, але выконанне інструкцыйяў не ў тым чысле. Падаюце базовай модэлі такі запыт:

Explain why the sky appears blue.

і гэта можа продавацца далей:

Explain why the sky appears blue.
The following questions are commonly asked in introductory physics...

Гэта не паводзяны модэль. Ён выканае самэе тое, кары то патрабавал прадзячэнне – адноце паэкранны тэкст. Бажаная дзеязнае падобнае да гэтаго:

The sky appears blue because Earth's atmosphere scatters
shorter wavelengths of sunlight more strongly than longer
wavelengths...

Адміністрацыйны модэль застаецца тым жа, але адказчыкаванне разлічнае. Запыт ператвараецца на такі:

What text probably comes next?

до гэтага:

When the text looks like an instruction,
what kind of continuation should I produce?

Навчанне мадэлі адаптавацыі да адказу на тыя другія запытанні — гэта сама сутнасць настройкі мадэлі па інструкцыях.

Этап 2: фарматаванне дадзэнняў інструкцыяў

Самы прымітны спосаб навучання мадэлі выконванню інструкцыяў — гэта паказаць яй багато інструкцыяў у парах з правільнымі адказамі, і все ўсё так проста. Запіс трэнавання можа выглядаць так:

example = {
    "instruction": "Convert the following sentence to passive voice.",
    "input": "The developer fixed the bug.",
    "output": "The bug was fixed by the developer."
}

Трансформатор не можа прыняць слоўнікі Python, таму рэкорд спачатку серыялізуецца у звычны тэкст, прыблізна так:

Below is an instruction that describes a task.

### Instruction:
Convert the following sentence to passive voice.

### Input:
The developer fixed the bug.

### Response:
The bug was fixed by the developer.

Фарматаванне мае значэнне, таму што мадэль парадоксальна бачыць той самы шаблон:

instruction
    ↓
optional context
    ↓
response

Корачэй кажучы, кожны запіс стае фарматаваным тэкстам, пасля — токэнамі, а потым — допанымі пакетамі, і гэтыя пакеты вялікая прыцэльная наладка ўжо падготавленага модэлю GPT.

Відобразэнне токэнаў

Пасля токэнаізацыі прыклад ператвараецца на спіс ID, прыблізна такі:

[21106, 318, 281, 12064, ... 4435, 257, 3126, ...]

Этыя ідэнтыфікатары токэнаў складаюць последоўнасць трэнавання. Для аутарэгрэсіўнага модэлю атрыбуты ўсё проста — гэта последоўнасць, якая сустрэлена на адну пазіцыю:

Tokens:
[A, B, C, D, E]

Input:
[A, B, C, D]

Labels:
[B, C, D, E]

Такім чынам, налагоджэнне інструкцый не прыносіць ніякіх новых цэлей навучэння. Мадэль як і раней працоўвае з прыкладкамі, якія яна мусіць праўдапрацаваць. Зменяецца толькі распад тэкста, які яе прасябліваюць праўдапрацаваць. Уместо пераважна звычных дакументаў яна цяпер знову і знову бачыць гэтыя даны:

instruction → useful response

Гэта ўсходнія ідэя.

Падпіс трэба обрабатваць спецыяльна

Прыклады для навчання разніцацца па дужыні, але пакеты трэбуюць тэнзораў з суміснымі фарматамі. Возьмім два прыклады:

Example 1:
[10, 20, 30, 40]

Example 2:
[11, 21]

Іх можна запаўніць:

Example 1:
[10, 20, 30, 40]

Example 2:
[11, 21, PAD, PAD]

Токены падынгу не ўтвараюць значамых цэлей. Мадэль не павінна атрымваць награду за ўчыцце гэтага:

PAD → PAD → PAD → PAD

Таму гэтыя пазіцыі зазвычай заменяюцца значэннем «ігнораваць»:

ignore_index = -100

Функцыя падабрання крос-ентропія ў PyTorch працюе, ігнаруючы іх. Канцэптуальна:

loss = cross_entropy(
    logits.reshape(-1, vocab_size),
    targets.reshape(-1),
    ignore_index=-100,
)

Дзеянні дэталей мае значэнне. Без маскавання частка сігнала для навчання траціруецца на артфакты, які ствараюцца пад агрэгаванні дадзеных, а не на самай мове.

Этап 3: доўнейка параметраў паховання

Сам цыкл навчання тут не ўскладнены, адколі оптымізацыя модэлю для наступнага токэна ужо ўжо знаёмая. Гэта, што мае значэнне, — гэта прыклады, якія падаюць у гэты цыкл. У спрошчаным варыянце:

for batch in train_loader:
    optimizer.zero_grad()

    input_ids = batch[:, :-1]
    targets = batch[:, 1:]

    logits = model(input_ids)

    loss = cross_entropy(
        logits.flatten(0, 1),
        targets.flatten(),
        ignore_index=-100,
    )

    loss.backward()
    optimizer.step()

У тым кодзе няма нічога, што бы сказала ў такім стылі:

model.learn_to_be_helpful()

Парадакс выклікаецца з дадзэнняў. Падазроўцам, тыясчы прыкладоў выглядаюць так:

### Instruction:
Summarize this paragraph.

### Response:
<clear concise summary>

Абнаўленні градыянта пастаюць мадэль да таго, каб яя даўала адпаведзі з такім фарматам пасля запытак такога фармату. Падазроўваю, што іншыя прыклады выглядаюць так:

### Instruction:
Write Python code that reverses a string.

### Response:
def reverse_string(s):
    return s[::-1]

Ён выучаець іншую супарабоўку межа патэрнам адказаў і прыдатным продажчыкам. Якшто аднацца да рэвэлю, тонкай наладзе адказаў няма ніч такога чародзяскага: кантэкст абоўсюды пры прыкладзенні прыкладоў быў спецыяльна зменены. Раней:

The CPU cache is...

Пасля фарматавання інструкцыі:

### Instruction:
Explain CPU caching to a beginner.

### Response:
A CPU cache is...

Не была запроваджана такая мета-мета-цель, як «розумеўце корыстувачаў». У замене распад навчальных тэкстаў быў зменены так, каб корыстныя адпаведзі сталі статыстычна болей праблематычнымі продажчыкамі пасля інструкцыі. Саме гэта змена стварае новую поведзінку. У практычным прыкладзе загадзя навучаны мадэль GPT-2-medium праходзіць дапрацоўку пад парадкамі інструкцыі, генеруе адпаведзі і зберагае рэзультатныя мадэлі.

Этап 4: ацэнка стае некамфортной

Класыфікацыя запропанавала просты спосаб ацэнкі. Для выявлення спаму:

Prediction: SPAM
Label:      SPAM

Correct.

Выпанаванне інструкцыяў не дазволяе такіх прыемнасцей. Разглянем просьбу проста паспяшыць рэкурэнцію. Адна з можлівых адпаведзей:

Recursion is when a function solves a problem by calling
itself on a smaller version of the same problem.

Іншы:

Recursion is a technique where a problem is reduced into
smaller instances of itself until a stopping condition is reached.

Оба варыянты можаць быць правымі, і ні адны з іх не павінен адпаваць да слова-параджука слоўна. Чырвоныя гэта робіць тачнасць адпаведнасці практычна беспарацайной для адпаведзей з вільным фарматам.

Порэванне з параджукам

Адна з апцыяў — запростаць параджук:

{
    "instruction": "Explain recursion simply.",
    "reference": "Recursion solves a problem by repeatedly reducing it...",
    "model_response": "A recursive function calls itself..."
}

і параграфуеце створаны адказ з ім. Але сэроўніца — гэта не якосць, і мадэль можа даць выключна хорашы адказ на абсалютна іншыя словы. Гэта ведае да іншага падходу.

Запытайце іншы LLM пра ацэнку

Ацэнкаўшы прымее інструкцыю, базовы адказ і адказ, які трэба ацэніць:

Instruction:
Explain recursion simply.

Reference answer:
...

Model answer:
...

Rate the model answer from 0 to 100 based on correctness,
relevance, and clarity.

Местны юрыст можа выкарыстоўваць Ollama, што ўдобна, але гэта стварае новую проблему: сам юрыст являецца модэлем. Яго рэйтынг можа залежаць ад запіту для ацэнкі, выбору ацэнавальніка, парадку адпаведзей, ступеня дэталізавання, стылістычных праганаў і сабэтых памылак юрыста. Дзеякія прыклады паказваюць, як местны юрыст дае на дзівную ласкавую оцэнку слабым адпаведзям базовага модэля, што нагадвае, што цыфры, якія даюць LLM як юрысты, не ўсега адпавядаюць рэальнасці.

Маленькі праект можа складацца з трох гэтых слоёў:

1. Inspect representative outputs manually
2. Compare against reference answers where useful
3. Use an LLM judge for aggregate comparison

Ні адзін з іх не ўсёвыпадкова ідэальны сам па сабе. Разам яны даюць болей чыстае адображэнне рэальнасці, чым адзін лік, які выдаваецца за правду.

Этап 5: сложнейшая проблема – прыямлівання

Налагоджэнне інструкцыяў паказвае модэлю, як выглядае разумны адпаведзенне. Цяпер парагляньме два адпаведзенні. Адпаведзенне А:

Recursion is when a function calls itself.

Адказ B:

Recursion is a technique where a function solves a problem
by calling itself on a smaller version of that problem.
The process stops when it reaches a base case.

Оба варыянты ўзятыя пад уваҞо, ал можа быць выбраны B. Сігнал для трэніравання больш не ёсць такім:

correct vs incorrect

Гэта такое:

chosen vs rejected

Запіс прыярынкі можа выглядаць так:

{
    "prompt": "Explain recursion simply.",
    "chosen": """
    Recursion solves a problem by repeatedly reducing it
    until reaching a base case.
    """,
    "rejected": """
    Recursion is when recursion happens recursively.
    """
}

Гэта іншы тып нагляду. Уместо таго, каб сказаць «цэта адпаведна на адпаведна сітуацыю», тут кажуць «з-поміж гэтых двух адпаведных рашэнняў, выберыце гэтае». Тут прыходзяць у прыменэнне такія тэхнікі, як оптымізацыя прымусовага выбору (DPO). У загальных рысах:

Prompt
   ↓
Chosen response ─────┐
                     ├── preference objective
Rejected response ───┘
                     ↓
               model update

DPO заслуговае на адзінаковы падход, таму яго механізмы не ўключаюцца ў гэтыя дыскусіі. Корыстныя лінкі стосуюцца загальнага прыгароджэння:

Pretraining
    ↓
learn language patterns

------------------------------

Instruction fine-tuning
    ↓
learn instruction → response behavior

------------------------------

Preference tuning
    ↓
learn which acceptable responses we prefer

Стварэнне набораў дадзеных па прыямошчынях за дапамою Llama 3.1 праз Ollama і рэалізацыя методу DPO з нуля — гэта тэмы на пазнейшы час. Існуе адна парадка: тое, што DPO доступна як дапаможны матэрыял, не значыць, што гэта правы наступны крок для кожнага модэлю чы набора дадзеных. Дзеякія експерыменты паказваюць меры яго рэзультатаў, і гэта самэ тое скептыцызм, які варта прыймаць пад час налагоджэння прыямошчыняў.

Што на самай працы змянілася

Выходны пункт быў загадзя натрэнаваны модэль, які ведаў, як продаваць тэкст. Трансфармер не быў заменены на архітэктуру спецыяльнага асістэнта. Прыклады, прыкладзеныя да проблемы наступнага токэна, змяніліся, чым створылася іншая прадзеянная мадэль. Калі модэль цяпер бачыць:

### Instruction:

Існуе чыразы, калі продажчык не ўжо ўзьязд з Інтэрнэту, а адказ. Калі сяглядаць на гэта так, то легча разумець прагрэсію:

Pretraining:
What token should come next?

Instruction tuning:
What does a good answer look like after an instruction?

Preference tuning:
Of several reasonable answers, which behavior should we prefer?

Архітэктура, оптымізатор і шчыльнасць навчання — усе гэта мае значэнне, але пад налаштаваннем па інструкцыях дадзеныя выплываюць у ўнікальную ролю, адколі яны вказываюць, якага паведамлення трэба наследаваць. Калі існуе калькі прыемных адпаведзей, правільны выхід больш не ёсць едынай мэтай. Пытанне ператвараецца ў тое, які з прыемных адпаведзей заслуговае на большую вагу, і самэ гэта ёсць тым варотам, якія ачынае DPO.

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

Супаўзяныя матэрыялы

  • Як Transformer працуе для прыгнутку на наступны токен: атэнцыя, рэзыдуалы і Softmax — простыя поясненні пра Transformer у стылі GPT, ад токенав і позыцыйных імбеддзінгав да каузальнай атэнцыі, слоёў з падачай наперад, лодзітов і Softmax.
  • Ад прыгнутку на наступны токен да рабочага коду: як LLM-ы генеруюць Python — поясненні токенав, Softmax, тэмпературы, самаатэнцыі і слоёў з падачай наперад у парадку, з прыкладам пасортавання па кроках і жорсткімі мерымі, якія вынікаюць з прыгнутка.
  • Практычныя прытамулы: Як насправды працуюць LLM: токены, трансфармэры і наступны токен — Дэталізаваны апৎвядчык практычных прытамулов: Як насправды працуюць LLM: токены, трансфармэры і наступны токен: контракты, перакрыцціі і шаблоны коду для команд, якія вікорыстоўваюць гэты падход.
  • Стратэгіі чанкавання для RAG у працэўнай суперблоке: фіксаваныя размеры, сэмантычнае чанкавання і чанкаванне па прынцыпу «род-дзеця» — Практычны апৎвядчык методаў чанкавання для RAG, ад фіксаваных размераў і рэкурсыўнага раздзелення да чанкавання па прынцыпу «род-дзеця», пропозыцый, пазнелегкага чанкавання, методаў RAPTOR, табелей, коду і стварэння крэйтарыў.
  • Рэкурзыўны модэль языка: што стварыла працоўныя трудзбы, што трэба перабудаваць — аналіз платформы для рэкурзыўных модэляў языка: шары ізоляцыі, брокеры, CDR, ліміты трэйсінгу ў прасторэ выкарыстоўвання, ліміты аднае хоста і прычыны, чаму самэй важлівай была стрыманасць.
  • Як працюе LLM: токены, атэнцыя і прыгадка наступнага токена — просты апіс архітэктуры LLM ад токенаў і эмбедынгаў праз атэнцыю, каузальную маскаванне і генераванне, а таксама прычыны, чаму трэніраванне і інферэнс разныя.