Головна / Статті

Від прогнозування наступного токену до функціонального коду: як ШІ генерують Python

Токени, softmax, температура, механізм самоуваги та шари з передачею сигналу по ланцюзу пояснюються по порядку, із прикладом поетапної сортування та жорсткими обмеженнями, які випливають з прогнозування.

Видавець: REACTAPP.TOP9 хв читання1998 слів

Джерела: How LLMs Actually Work: From Predicting the Next Word to Writing Code.

Інструменти на кшталт ChatGPT та Copilot пишуть функції, виправляють помилки та пояснюють алгоритми, і може здатися, що відбувається щось більше, ніж просто доповнення тексту. Ментальна модель починається з основи: прогнозування токенів, увага, а також причина, чому механізм, який завершує речення, водночас створює коректний код на Python.

Одне запитання, яке ставлять знову та знову

Чи то хайку, маркетинговий лист чи алгоритм сортування, мовна модель постійно відповідає на одне й те саме запитання: з урахуванням усього, що було побачено досі, який токен є найімовірнішим наступним?

Не існує семантичного розуміння у традиційному розумінні, а також немає етапу, коли модель вирішує написати функцію перед тим, як вивести слово def. Вона прогнозує символ за символом. За допомогою мільярдів параметрів та тексту для навчання, який налічує сотні мільярдів токенів, ці прогнози в кінцевому підсумку нагадують міркування.

Що таке токен

Точність є важливою перед початком прогнозування. Моделі працюють не з символами чи словами, а з токенами — підсловесними одиницями, створеними алгоритмом, таким як Byte Pair Encoding. Приблизно:

  • Звичайні слова зазвичай стають окремими токенами, наприклад "the", "def" та "return".
  • Рідкісні слова розділяються на частини, тож "unhappiness" стає ["un", "happiness"].
  • Символи коду часто є окремими токенами, наприклад "(", ":", "==" та "->".
  • Для GPT-4 один токен дорівнює приблизно 0,75 англійського слова, а в коді це ближче до 3–4 символів, оскільки код складається з односимвольних токенів, таких як : та (.

    У моделі також є словниковий запас — фіксований список відомих токенів, який зазвичай налічує від 50 000 до 100 000 елементів. На кожному кроці вона присвоює кожному елементу ймовірність та або обирає найімовірніший варіант, або бере значення з розподілу, причому вибір залежить від параметра температури.

    Цикл прогнозування

    Для послідовності „Кіт сидів на“ необхідно обчислити умовну ймовірність:

    P(next_token | "The", "cat", "sat", "on", "the")
    

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

    P(token_i) = exp(logit_i) / Σⱼ exp(logit_j)
    

    Під час жадібного декодування обирається токен із найвищою ймовірністю. Інакше токен вибирається пропорційно до розподілу, причому параметр temperature контролює ступінь розкиду:

    • temperature = 0 завжди обирає токен із найвищою ймовірністю, тож результат є детермінованим.
    • temperature = 1 дозволяє вибір з первинного розподілу, що робить результат більш різноманітним та креативним.
    • При значенні вище 1 розподіл стає більш плоским, і результат стає більш випадковим.
    • При значенні нижче 1 розподіл стає більш гострим, і результат стає більш консервативним.

    Ось чому один запит може призводити до різних відповідей під час різних виконань.

    Transformer

    Функція, яка перетворює послідовність токенів на розподіл наступних токенів, — це Transformer, а саме версія лише для декодування, що є основою проектів GPT, Llama, Mistral та Claude. Основний алгоритм роботи:

    Token IDs → Embedding layer → [Attention + FFN] × N layers → Linear head → Softmax → P(next token)
    

    Елементи у порядку:

    1. Шар вбудовування. Кожен цілочисельний ідентифікатор токена перетворюється на щільний вектор розміром d_model, наприклад 4096 у Llama-3 8B. Позиційні ембеддинги, або RoPE у сучасних моделях, додають інформацію про порядок.
    2. Шари Transformer, повторені N разів. Кожен з них містить багатоголову самоувагу, мережу з передаванням зсуву, нормалізацію шару, застосовану перед кожним підшаром у стилі „pre-norm“, та залишкові з’єднання.
    3. Лінійний блок та softmax. Кінцевий прихований стан відображається у вигляді логітів форми [|V|], а softmax генерує відповідну розподілу.

    Самоувага

    Самоувага дозволяє токену бачити інші токени в послідовності, щоб створити більш повне уявлення про себе. Саме це надає моделям Transformers переваги над RNN: кожен токен може отримати доступ до кожного іншого токена за один крок, без зменшення значення градієнта залежно від відстані.

    Якщо є n токенів, кожен з них проєктується трьома способами:

    Q = XWᴬ_Q    (Query: what am I looking for?)
    K = XWᴬ_K    (Key: what do I contain?)
    V = XWᴬ_V    (Value: what do I contribute?)
    

    Тут X — це вхідна матриця форми [n, d_model], а три матриці W — це навчені ваги. Оцінка між токеном i, який виступає у ролі запиту, та токеном j, який виступає у ролі ключа, є наступною:

    score(i, j) = qᵢ · kⱼᵀ / √dₖ
    

    Ділення на квадратний корінь ключового розміру запобігає занадто великому зростанню скалярних добутків, коли dₖ є великим, що могло б привести до того, що функція softmax опиниться в областях з дуже малими градієнтами. Повна формула обчислення є наступною:

    Attention(Q, K, V) = softmax(QKᵀ / √dₖ) · V
    

    У моделі, яка містить лише декодер, як-от GPT, увага є причинною або замаскованою: токен i може звертати увагу лише на позиції до i. Майбутні позиції отримують оцінку у вигляді негативної нескінченності перед обчисленням softmax, тому їхні ваги дорівнюють рівно нулю.

    Багатоголова увага виконує h незалежних функцій уваги паралельно, кожна з яких має меншу розмірність d_model / h, та об’єднує їхні результати:

    MultiHead(Q, K, V) = Concat(head₁, ..., headₕ) · W_O
    headᵢ = Attention(QWᵢ_Q, KWᵢ_K, VWᵢ_V)
    

    Різні механізми уваги опікуються різними взаємозв’язками. Один може слідувати синтаксичним залежностям, інший — когеренції, а ще інший — положенню в тексті.

    Мережа з передаванням сигналу вперед

    Після формування уваги представлення кожного токена проходить через мережу FFN для кожної позиції окремо:

    FFN(x) = max(0, xW₁ + b₁)W₂ + b₂
    

    Сучасні архітектури, такі як Llama та Mistral, використовують замість цього SwiGLU:

    FFN(x) = (SiLU(xW_gate) ⊙ xW_up) · W_down
    

    Більша частина запам’ятаної інформації моделі знаходиться у FFN. Він функціонує як сховище типу „ключ-значення“ для фактичних асоціацій. Механізм уваги передає інформацію між токенами, а FFN знаходить збережені факти та закономірності. У великих моделях ширина FFN становить приблизно чотири рази більше, ніж d_model. У Llama-3 70B значення d_model дорівнює 8192, а проміжний розмір — 28672, і саме там знаходиться більшість параметрів.

    Чому моделі можуть писати код

    Код — це послідовність токенів, така сама, як і природна мова. Для моделі функція Python не є чимось особливим — це просто послідовність токенів на кшталт def, sort, _list, (, arr, ), : тощо.

    Синтаксично коректний вихід є суто наслідком процесу навчання. Розгляньмо ці умовні ймовірності:

    P("(" | ..., "def", " quicksort") ≈ 1.0
    P(":" | ..., "def", " quicksort", "(", "arr", ")") ≈ 1.0
    P("return" | context inside function body) >> P("import" | same context)
    

    Вони мають різкий пік, оскільки модель бачила мільйони файлів Python, які всі дотримуються одних і тих самих правил. Граматика Python ніде не закодована жорстко в мережі — вона виникає зі статистики корпусу даних.

    Це також пояснює, чому моделі іноді пишуть код, який є ідеально сформованим, але логічно неправильним. Вони максимізують ймовірність наступного токена з урахуванням розподілу під час навчання. Вони не запускають код та не перевіряють його.

    Функція сортування, крок за кроком

    Припустимо, запит — «Напишіть функцію Python для сортування списку». Модель розглядає його як послідовність токенів та додає результат по одному токену за раз. Приблизно:

    • Крок 1, після запиту: def приблизно з імовірністю 0,91.
    • Крок 2, після def: sort приблизно з імовірністю 0,78.
    • Крок 3: _list або ( приблизно з імовірністю 0,65.
    • Крок 4: після sort( — arr або lst приблизно на рівні 0.71.
    • Кроки 5–7: ), потім :, потім новий рядок; кожен елемент приблизно на рівні 0.99.
    • Крок 8: відступ у чотири пробіли приблизно на рівні 0.97.

    На кроках 5–8 модель досягає певної впевненості щодо синтаксичних токенів. Це не означає розуміння Python — це просте заповнення шаблонів, навчене на корпусі, у якому всі визначення функцій виглядають однаково.

    Справжні вибори відбуваються раніше, на кроках 1–4, де обирається назва функції, назви параметрів та загальна структура. Ці вибори формуються під впливом змісту запиту через механізм уваги. Токен sort у запиті має високу вагу уваги під час генерації назви функції.

    Температура під час генерації коду

    Copilot та подібні інструменти зазвичай працюють при низькій температурі, близько 0,1–0,3, для обробки коду:

    • Синтаксичні токени мають бути майже детермінованими.
    • Часто існує лише одна правильна реалізація.
    • Вигадані API стають основною причиною невдач при високій температурі.

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

    Чому більші моделі поводяться інакше

    Модель об’ємом 7B та модель об’ємом 70B мають однакову архітектуру. Різниця полягає у масштабі: більше шарів, більший значення d_model та більше голів уваги. Проте більша модель демонструє якісні покращення, зокрема багатоетапне міркування, більш правильний код та емергентне навчання в межах контексту.

    У масштабному використанні модель опановує не лише поверхневу статистику токенів. Вона створює стислі представлення глибших закономірностей, таких як алгоритмічна структура, логічні залежності та обмеження типів. Модель об’ємом 70 мільярдів параметрів бачила достатню кількість коду з помилками разом із результатами тестів, що призвело до того, що вона неявно пов’язала певні закономірності з правильністю роботи коду. Це є емпіричною основою гіпотези про масштабування: продуктивність зростає за плавною кривою залежно від обчислювальних ресурсів, даних та параметрів, а якість коду розвивається так само надійно, як і будь-яка інша навичка.

    Обмеження, що випливають зі змісту проектування

    Знання механізму роботи моделі розкриває деякі суттєві обмеження:

    1. Виконання. Усередині моделі немає механізму виконання. Те, що вона генерує, схоже на результат правильного виконання, але насправді нічого не виконувалося.
    2. Гарантована точність. Прогноз максимізує ймовірність на основі навчального розподілу, а не логічну коректність.
    3. Справжня новизна. Алгоритм без статистичних аналогів у навчальних даних неможливо створити. Модель може поєднувати та адаптувати, але не створювати щось нове.
    4. Точне відтворення. Жодних таблиць пошуку немає. Увесь „пам’ятний“ простір розташований у вагах, тому іноді API, сигнатури функцій та версії бібліотек можуть бути неправильними.

    Жоден з цих фактів не є помилкою, яку потрібно виправити. Вони безпосередньо випливають з архітектури, і їх знання робить кожного кращим користувачем асистентів з програмування.

    Короткий огляд

    • Токен — це підрозділ слова, що дорівнює приблизно 0,75 англійського слова.
    • Прогнозування здійснюється за допомогою функції softmax над словниковим запасом на кожному кроці.
    • Самоувага дозволяє кожному токену звертати увагу на всі попередні токени за допомогою масштабованих добутків запиту та ключа.
    • Багатоголова увага виконує кілька таких процедур паралельно для виявлення різних зв’язків.
    • FFN виступає як пам’ять типу ключ-значення для фактичних асоціацій.
    • Генерація коду працює так само, як генерація тексту, причому синтаксис формується на основі статистики навчання.
    • Параметр температури визначає наскільки гострою є розподіл вибірки.
    • Жорсткі обмеження полягають у відсутності гарантованої експекуваності, правильності та справжньої новизни.

    Усі елементи цієї системи — від механізму уваги та FFN до залишків та норми шару — слугують одній меті: зробити умовну ймовірність наступного токена, враховуючи всі попередні токени, якомога точнішою. Решта є наслідком цього процесу.

    Пов’язана література

  • Практичні нотатки: Як насправді працюють LLM: токени, трансформери та наступний токен — Детальний огляд Практичних нотаток: Як насправді працюють LLM: токени, трансформери та наступний токен, включаючи шаблони контрактів, перевірки та фрагменти коду для команд, які впроваджують цю модель.
  • П’ятдесят років досліджень у сфері пошуку інформації, прихованих у вашому RAG-пайплайні — Функції розділення даних на частини, гібридний пошук, HyDE, переранжування та оцінка результатів мають своїх предків, що існують вже десятиліттями у галузі пошуку інформації. Огляд цих досліджень та їхніх обмежень.
  • Практичні нотатки: ZQ Intelligence: Orchestrator-Specialist Agents для фінансів — Детальний огляд Практичних нотаток: ZQ Intelligence: Orchestrator-Specialist Agents для фінансів: контракти, перевірки та місця для вставки коду для команд, які використовують цю схему.
  • Чому індійські мови коштують більше токенів у LLM та як виправити проблему з токенізаторами — Одне й те саме речення займає 5 токенів англійською та 34 тамільською. Дізнайтеся, як це спричиняється даними для навчання BPE, що таке перебалансування та зміна розміру словника, та як працює розширення словника.