← Усі статті

Математика машинного навчання: від ціни квартири до уваги

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

Математика машинного навчання: від ціни квартири до уваги
Зміст

На столі три оголошення. Квартира 30 квадратних метрів коштує 3,0 мільйона, 50 метрів — 4,2, 70 метрів — 5,4. Треба прикинути четверту, не кличучи оцінювача.

Далі ці оголошення тягнуться крізь усю статтю. Площа і ціна — дані. Правило «ціна метра помножити на площу і додати надбавку» — функція, яка з площі робить відповідь. Ціна метра і надбавка — параметри, два числа, які можна крутити. Промах у мільйонах — функція втрат. Фраза «трохи підняти ціну метра» або «трохи опустити» — градієнт. Оголошення з іншого району, якого не було під час налаштування, — новий приклад. Математика машинного навчання — не полиця формул. Це спосіб записати квартиру числами, виставити числа правила, виміряти промах і перевірити, чи тримається ціна на оголошеннях, яких під час налаштування не було.

Ключові висновки

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

Одна пряма не малює вигин. Лінійний шар уміє зважити ознаки. Вигин, розвилка і «так чи ні» з’являються, коли шари складаються і між ними стоїть нелінійна функція.

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

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

Та сама математика сидить у класифікаторі, згортці, рекурсії й увазі. Міняється форма правила: вікно пікселів, пам’ять попереднього кроку або зважене середнє за змістом.

Навчити модель — це підібрати ціну метра

Три речі часто називають одним словом «нейромережа», хоча для цих оголошень це різні предмети.

Алгоритм — порядок дій без підлаштування під ці три квартири. «Помнож площу на п’ять сотих і додай мільйон» — уже готове правило: числа виставлені наперед, ваші оголошення їх не рухають.

Математична модель — форма правила з порожніми числами. Для ціни за площею форма така: ціна = вага × площа + зсув. Вага — це ціна метра, зсув — надбавка. Їх ще немає, є лише місця, куди їх поставлять.

Навчена модель — та сама форма, але числа вже виставлені. Вага 0,06 і зсув 1,2 влучають у три оголошення без промаху: 0,06 × 30 + 1,2 = 3,0; для 50 метрів виходить 4,2; для 70 — 5,4. «Навчити» тут означає підібрати ці два числа.

Якщо виставити вагу 0,05 і зсув 1,0, передбачення стануть 2,5, 3,5 і 4,5. Промахи: 0,5, 0,7 і 0,9 мільйона. Середній квадрат промаху — 0,52. Квадрат потрібен не для краси: великий промах важить більше за дрібний, і знак «дешевше чи дорожче» не скорочується при додаванні. Нульова помилка при вазі 0,06 говорить лише про ці три картки. Четверта квартира з ремонтом, поверхом і районом у правило не входила.

Зв’язка одна й та сама на будь-якій кількості оголошень. Дані — картки. Параметри — числа правила. Функція рахує ціну. Функція втрат каже, наскільки ціна не та. Навчання рухає числа в бік меншого промаху. Перевірка на відкладених оголошеннях відповідає, чи не запам’ятали ви лише ці три картки.

areas = [30, 50, 70]
prices = [3.0, 4.2, 5.4]

def predict(area, weight, bias):
    return weight * area + bias

def mean_squared_error(weight, bias):
    errors = [
        predict(area, weight, bias) - price
        for area, price in zip(areas, prices)
    ]
    return sum(error * error for error in errors) / len(errors)

print(round(mean_squared_error(0.05, 1.0), 2))  # 0.52
print(mean_squared_error(0.06, 1.2))            # 0.0

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

Які числа треба впізнавати дорогою

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

Змінна — ім’я числа, яке може змінитися: площа, вага, помилка. Функція забирає аргументи і віддає число. Ціна від площі — функція. Аргумент — те, що ви кладете всередину, а не те, що функція «думає».

Відсотки, степені й логарифми з’являються раніше, ніж здається. Ймовірність 0,01 — один шанс зі ста. Степінь ростить або гасить число повторним множенням. Логарифм потім покарає впевнену помилку сильніше за боязку: мінус логарифм від 0,1 більший, ніж від 0,9. Поки досить знати, що логарифм великий, коли аргумент близько до нуля.

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

Сума і середнє описують купу чисел одним. Для списку 2, 4, 4, 4, 5, 5, 7, 9 середнє — 5. Розкид можна рахувати двома способами. Якщо описуєте саме цей список, ділите суму квадратів відхилень на 8 і отримуєте стандартне відхилення 2. Якщо список — пачка з довшого списку і ви хочете прикинути довгий список, ділите на 7 і отримуєте близько 2,14. Відстань між двома об’єктами — довжина відрізка між їхніми числами. Дві квартири з площами 30 і 70 «далеко» на 40 метрів; якщо ознак кілька, відстань рахують одразу по всіх осях.

Похідна — швидкість, з якою промах змінюється, коли ви трохи крутите ціну метра. Додатна: промах зростає, ціну метра варто опустити. Біля нуля: невеликий рух ціни метра майже не змінює промах.

Ймовірність — не «модель сумнівається по-людськи», а число від 0 до 1, яким ви описуєте частку наслідків. Випадкова величина — величина, яка при повторенні досліду стрибає за розподілом, а не виписує одне й те саме число.

Наперед корисно спокійно читати функцію, середнє, графік і фразу «трохи змінити аргумент». Логарифм, частинні похідні й теорему Баєса можна добирати в тому розділі, де вони вперше потрібні задачі. Відкладати їх «на потім після всієї книжки» не треба: вони короткі, якщо поруч приклад.

values = [2, 4, 4, 4, 5, 5, 7, 9]
mean = sum(values) / len(values)
spread = (sum((value - mean) ** 2 for value in values) / len(values)) ** 0.5
distance = abs(70 - 30)
print(mean, spread, distance)  # 5.0  2.0  40

Об’єкт стає рядком чисел, шар — множенням

Нейромережа не бачить квартиру, літеру і кадр. Вона бачить рядок чисел. Площа, поверх і «чи є балкон» — уже вектор ознак: (50, 4, 1). Кілька таких рядків складаються в матрицю, пакет рядків — у тензор. Ім’я «тензор» не додає магії: це масив, у якого домовилися про порядок осей.

Скалярний добуток — зважити ознаки і скласти. Ознаки (1, 2) і ваги (0,5, −0,1) дають 0,5 × 1 + (−0,1) × 2 = 0,3. Так один вихід рахує зважену суму входу. Матриця ваг робить це одразу для кількох виходів. Лінійне перетворення повертає, розтягує і зсуває хмару точок; само по собі воно не загинає пряму в дугу.

Сіра картинка — матриця яскравостей. Кольорова — тензор з віссю каналів. Текст після розбиття на шматки — послідовність цілих номерів, а потім рядки дійсних векторів. Пакет із восьми картинок додає ще одну вісь. Плутанина розмірів — найчастіша поломка: ви множите рядок на рядок іншої довжини. В уроці про картинку як тензор це видно на кропі тексту: пікселі вже числа, до згортки ще далеко.

Лінійний шар записують так: y = Wx + b. Тут x — вхідний вектор, W — матриця ваг, b — зсув, y — вихід. Зсув потрібен, щоб нульовий вхід не мусив давати нульовий вихід: квартира нульової площі в нашій формулі все одно коштувала б 1,2, якби така існувала. Це не ринкова істина, це властивість форми.

Візьміть вхід (1, 2), матрицю з рядами (0,5, −0,1) і (0,2, 0,3), зсув (0,1, −0,2). Перший вихід: 0,5 × 1 + (−0,1) × 2 + 0,1 = 0,4. Другий: 0,2 × 1 + 0,3 × 2 − 0,2 = 0,6. Той самий шар у PyTorch — об’єкт torch.nn.Linear. Ваги лежать у матриці форми «вихід на вхід», і результат збігається, якщо скопіювати ті самі числа.

import torch

x = torch.tensor([1.0, 2.0])
layer = torch.nn.Linear(2, 2)
with torch.no_grad():
    layer.weight.copy_(torch.tensor([[0.5, -0.1], [0.2, 0.3]]))
    layer.bias.copy_(torch.tensor([0.1, -0.2]))
print(layer(x))  # tensor([0.4000, 0.6000])

Каркас, у якому живуть такі шари, — окрема розмова: PyTorch, TensorFlow і JAX відрізняються записом шару в коді, не таблицею множення.

Пряма лінія не малює вигин

Складіть два лінійні шари без проміжної розвилки — знову отримаєте лінійний шар. Дві поправки «помножити і додати» поспіль лишаються однією такою поправкою. Тому між шарами ставлять функцію, яка вміє зрізати, притискати або плавно гасити.

ReLU залишає додатне число і обнуляє від’ємне. На входах −2, −0,5, 0, 0,5, 2 вона дає 0, 0, 0, 0,5, 2. Мертва зона ліворуч — плата за простоту: поки сума до активації від’ємна, ця гілка не передає градієнт.

Сигмоїда sigmoid притискає будь-яке число до проміжку від 0 до 1. Ті самі входи дають приблизно 0,119, 0,378, 0,5, 0,622, 0,881. Зручно, коли вихід хочеться читати як частку. На краях вона майже пласка: міняти вагу там майже марно.

Гіперболічний тангенс tanh схожий, але проміжок від −1 до 1: приблизно −0,964, −0,462, 0, 0,462, 0,964. Нуль лишається нулем, великі входи прилипають до країв.

GELU гладша за ReLU: від’ємні числа не рубаються в нуль, а сильно зменшуються. На тих самих входах наближення дає приблизно −0,045, −0,154, 0, 0,346, 1,955. Сучасні мовні блоки часто беруть саме її не тому, що вона «розумніша», а тому, що гладкий зріз стійкіший на глибокому стосі шарів.

softmax перетворює сирі оцінки на частки, які складаються в одиницю. Оцінки 2,0, 1,0 і 0,1 стають приблизно 0,659, 0,242 і 0,099. Це ще не істина про світ. Це спосіб розкласти перевагу оцінок на конкурентів так, щоб сума була 1.

Однієї лінійної операції мало, коли межа між класами вигнута або коли відповідь залежить від поєднання, а не від окремої ознаки. «Велика площа і перший поверх» — не сума двох незалежних надбавок, якщо перший поверх псує саме велику квартиру. Складена функція — шар, потім зріз, потім шар — збирає такі поєднання. Глибина тут не прикраса: кожен зріз додає злам, якого попередня пряма намалювати не могла.

Накресліть чотири активації на одній осі від −2 до 2. Око одразу бачить, де функція мовчить, де ріже і де ще чує малу зміну ваги.

Похідна показує, в який бік крутити

Поверніться до ямки на графіку промаху. Для круглої картинки візьмімо одне число w і помилку L(w) = (w − 3)². Мінімум у точці 3, там помилка нуль. Це не ціна метра 0,06 з оголошень: та сама ідея на ямці, де дно видно одразу. Похідна дорівнює 2(w − 3). Ліворуч від трійки вона від’ємна: помилка спадає, коли число зростає. Праворуч — додатна: помилка спадає, коли число зменшується. Градієнт — ця похідна, зібрана по всіх числах одразу. Він показує напрямок найшвидшого зростання помилки. Щоб зменшувати промах, йдуть проти нього.

Крок записують так: θ(t+1) = θ(t) − η · ∇L(θ(t)). θ — усі числа правила разом, η — швидкість навчання, величина кроку. Старт у нулі, швидкість 0,1. Помилка 9, градієнт −6, нове число 0,6. Далі воно йде 1,08, потім 1,46, 1,77, 2,02, 2,21, 2,37. Помилка за ці кроки падає з 9 до приблизно 0,40. До трійки ще є шлях: крок сталий, ямка звужується, і хвіст наближення довгий.

Надто великий крок перестрибує ямку і може піти вгору. Надто дрібний повзе, поки не скінчиться терпець або дані. Локальний мінімум — ямка, яка не найглибша на всьому графіку, але з неї малий крок не вибирається. Плато — місце, де градієнт майже нуль, хоча промах іще великий: невеликий рух числа майже не каже, куди йти. На практиці дивляться не лише на кінцеве число, а на те, чи падає помилка і чи не скаче вона через край.

Картинка цього розділу — точки (w, L) за кроками. Вони мають сповзати в ямку, а не малювати пилку.

Промах треба провести назад по шарах

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

Маленька мережа, усі числа назовні. Вхід x = 1, ціль — 0. Перший шар: z = 0,5 × x − 0,2 = 0,3. Зріз ReLU залишає 0,3. Другий шар: y = 0,8 × 0,3 + 0,1 = 0,34. Помилка — квадрат промаху: (0,34 − 0)² = 0,1156.

Похідна помилки за виходом дорівнює 2 × 0,34 = 0,68. За вагою другого шару: 0,68 × 0,3 = 0,204. За його зсувом: 0,68. За прихованим числом: 0,68 × 0,8 = 0,544. Зріз праворуч від нуля пропускає градієнт як є, ліворуч обнулив би. Вхід дорівнює 1, тому вага і зсув першого шару отримують ту саму 0,544.

Автоматичне диференціювання в PyTorch рахує те саме, якщо позначити числа як величини, від яких потрібен градієнт, і викликати зворотний прохід. Розбіжність у третьому знаку — привід перевірити формулу, а не «магію каркаса». Ручний розрахунок на двох шарах потрібен один раз: далі мережа глибша, а зміст той самий. Промах у відповіді доходить до першого числа добутком множників. Якщо множники дорогою менші за одиницю і їх багато, сигнал згасає. Якщо більші за одиницю і їх багато — роздувається. Звідси обережність до глибини, ініціалізації і зрізів, які на краях замовкають.

import torch

w1 = torch.tensor(0.5, requires_grad=True)
b1 = torch.tensor(-0.2, requires_grad=True)
w2 = torch.tensor(0.8, requires_grad=True)
b2 = torch.tensor(0.1, requires_grad=True)
hidden = torch.relu(w1 * 1.0 + b1)
output = w2 * hidden + b2
loss = (output - 0.0) ** 2
loss.backward()
print(round(w2.grad.item(), 3))  # 0.204
print(round(w1.grad.item(), 3))  # 0.544

Вибірка — не весь світ, і не всяка помилка однакова

Три квартири — не ринок. Це коротка пачка карток. Випадкова величина описує, як число стрибає від досліду до досліду. Розподіл каже, які стрибки часті. Середнє і дисперсія стискають розподіл у центр і ширину. Умовна ймовірність — частка при вже відомому факті: ціна за даної площі, а не ціна «взагалі».

Теорема Баєса переставляє умову. Хвороба трапляється в 1 людини зі 100. Тест ловить її в 99 випадках зі 100 і хибно спрацьовує у 5 здорових зі 100. Позитивний тест усе ще частіше про здорового: ймовірність хвороби за позитивного тесту близько 0,17, а не 0,99. Модель, яка видає частку, легко сплутати з частотою у світі. Баєс нагадує, що рідкісний клас і чутливий тест не дають автоматичної впевненості.

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

Зміщення вибірки — перекіс карток. Якщо всі оголошення з одного району, вага «метр коштує шість сотих мільйона» не мусить пережити інший район. Репрезентативність — наскільки пачка схожа на район, звідки прийдуть нові оголошення. Перенавчання — правило, яке запам’ятало сьогоднішні картки, включно з випадковою дивністю. Недонавчання — надто груба форма: одна пряма там, де потрібен вигин. Якість на навчальних картках не обіцяє якості на нових. Тому приклади ділять: на одній частині рухають числа, на іншій дивляться, чи не виросла помилка. Спосіб розрізу сам впливає на оцінку. Випадковий розріз одного району бадьорий і некорисний, якщо нові оголошення прийдуть з іншого.

Функція втрат вирішує, який промах дорогий. Середній квадрат, MSE, сильно штрафує викид: одна квартира за 20 мільйонів тягне пряму на себе. Середній модуль, MAE, рахує всі промахи рівніше і спокійніше зносить рідкісну божевільну ціну. Для відповіді «так чи ні» беруть двійкову перехресну ентропію: вона дивиться на частку, віддану правильній відповіді. Для кількох класів — ту саму ідею по всіх класах одразу. Мінус логарифм частки правильного класу на оцінках 2,0, 1,0 і 0,1 дорівнює приблизно 0,42, якщо правильний перший клас. Якби частки були рівні, штраф був би близько 1,10. Впевнена помилка, коли майже вся маса пішла не туди, дає ще більший логарифм.

Одна й та сама архітектура з різними втратами розходиться на даних із викидом. Квадрат женеться за викидом, модуль тримає основну масу. Мінімальна помилка на навчальних картках і далі не обіцяє нових оголошень: втрату обрано під навчальні картки.

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

Один прохід: ціна, промах, поправка

Повний цикл збирає попередні частини в один прохід.

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

Епоха — повний прохід навчальними оголошеннями. Батч — пачка, за якою рахують один градієнт: не весь район одразу, а кілька карток. Ітерація — один такий крок. Стохастичний градієнтний спуск бере малу пачку, тому напрямок шумний, зате крок дешевий. Імпульс (momentum) додає інерцію: поправка не сіпається від кожної дивної картки. Adam тримає окремі швидкості по числах і підлаштовує крок. AdamW окремо згасає самі ваги, щоб регуляризація не плуталася з цим підлаштуванням. Для першої прямої вистачає звичайного кроку проти градієнта. Імена оптимізаторів потрібні, коли чисел багато і вони різного масштабу.

Ініціалізація задає числа до першого проходу. Нулі в усіх вагах роблять симетричні нейрони близнюками: градієнт їх не розрізняє. Надто великі стартові числа на сигмоїді їдуть у плаский край. Нормалізація приводить пачку до стійкого масштабу, щоб наступний шар не отримував то шепіт, то крик. Регуляризація — штраф за надто великі числа правила: згасання ваг, випадкове занулення частини зв’язків (dropout), рання зупинка, коли перевірочна помилка пішла вгору, а навчальна ще падає.

Навчання розходиться, коли крок надто великий або втрати пораховані в незручному масштабі. Воно завмирає, коли градієнт помер у пласкому зрізі, дані не несуть сигналу або числа вперлися в регуляризатор. Високорівнева обгортка на кшталт Trainer ховає цей прохід. Корисний мінімум — побачити його без обгортки.

На синтетичних цінах із площею, поділеною на десять, істинний нахил близько 0,6 і зсув близько 1,2, плюс невеликий шум. Старт із нуля і швидкість 0,02. Перша втрата — порядку 18: передбачення нульове, ціни живі. Через кілька сотень кроків втрата падає до сотих, нахил підходить до 0,6, а зсув наздоганяє повільніше. Ознаку не відняли від середнього, тому ціна метра і надбавка живуть у різних масштабах. Це не поломка оптимізатора. Це геометрія правила. Фіксуйте зерно генератора, записуйте швидкість і число кроків, інакше «у мене зійшлося» не можна повторити.

Каркаси відрізняються тим, як цей прохід записаний у коді. Порівняння двох записів — у PyTorch і TensorFlow.

Метрики, вікно пікселів і пам’ять кроку

Коли відповідь — не ціна, а мітка, пряма стає межею. Логістична регресія — лінійний рахунок плюс сигмоїда: по один бік порога клас «так». Кілька класів — кілька рахунків і softmax. Межа лінійного шару пряма або пласка. Вигнута межа вимагає зрізів, про які йшлося вище.

Матриця помилок розкладає промахи. Десять знімків: шість котів і чотири собаки. Модель правильно назвала п’ятьох котів і трьох собак, одного кота записала собакою, одну собаку — котом. Частка правильних — 0,8. Точність за котом — 5 із 6 спрацювань, повнота — 5 із 6 справжніх котів. F1 зводить точність і повноту в одне число; тут воно близько 0,83. Якщо називати котом усе підряд, частка правильних падає до 0,6, повнота за котом стає 1, а точність — 0,6. Одна цифра «частка правильних» цього розлучення не показує. На рідкісній хворобі та сама пастка, що й у тесті з попереднього розділу.

Для рамки навколо об’єкта дивляться перетин над об’єднанням, IoU. Два квадрати 2×2, зсунуті на одиницю, перетинаються за площею 2 при об’єднанні 6: IoU дорівнює одній третині. Середня точність за порогами і класами, mAP, збирає такі влучання в одну зведення для детекції. Впевненість моделі — частка після softmax, і її корисно звіряти з частотою правоти, а не вірити вивісці.

Згортка — те саме множення, але вікно їде по картинці. Ядро 2×2 з числами (1, 0; 0, 1) на картинці

1 2 3
0 1 2
1 0 1

дає чотири відгуки: 2, 4, 0, 2. Ядро шукає місцевий візерунок, а не зважує всі пікселі одним вектором. Карта ознак — новий «знімок» відгуків. Розміри виходу залежать від розміру вікна, кроку і доповнення країв. Класифікатор кадру, детектор і розпізнавання цифр відрізняються головою мережі й метрикою, не таблицею множення. Практичний вхід у кадр як у числа — серія CNN і CRNN з нуля і огляд зору на PyTorch і TensorFlow.

Рекурентний крок пам’ятає попередній крок. Прихований стан — число або вектор, який переноситься на наступний токен. Спростимо до одного числа: новий стан = tanh(0,5 × минуле + 1 × поточний вхід), старт із нуля, входи 1, 0, 1. Стани приблизно 0,762, потім 0,363, потім 0,828. Нуль на другому кроці не стирає пам’ять повністю: 0,363 — слід одиниці. LSTM і GRU додають ворота, які вирішують, що запам’ятати, що забути і що випустити. Без воріт довгий ланцюжок множників легко згасає або вибухає — той самий ефект, що на глибокому стосі шарів.

Зберіть згортку на матриці 3×3 руками, потім три кроки рекурсії на папері. Обидві вправи коротші за бібліотечний виклик, і обидві показують, де живуть параметри.

Увага — зважене середнє за змістом

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

Увага питає: на які інші шматки спертися, збираючи зміст поточного. Запит, ключ і значення — три матриці, зазвичай отримані з тих самих входів різними лінійними шарами. Запит — «що я шукаю», ключ — «чим я можу озватися», значення — «що я віддам, якщо озвуся».

Формула: Attention(Q, K, V) = softmax(QKᵀ / √dₖ) V. Скалярні добутки запитів і ключів — таблиця схожості. Ділення на корінь із розміру ключа не дає добуткам роздутися: без нього softmax прилипає до одного переможця і градієнт замовкає. softmax за рядком перетворює схожості на частки. Множення на значення збирає зважене середнє тих векторів, які озвалися.

Числа на двох шматках і розмірі 2. Запити — рядки (1, 0) і (0, 1). Ключі — (1, 0) і (1, 1). Значення — (1, 2) і (3, 4). Після ділення на √2 і softmax перший рядок ваг — 0,50 і 0,50, другий — приблизно 0,33 і 0,67. Виходи — (2, 3) і приблизно (2,34, 3,34). Першому шматку обидва значення рівно цікаві, другому ближчий другий ключ. Поміняйте вхідні вектори — частки поїдуть. У цьому весь дослід розділу.

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

Навчання мовної моделі найчастіше передбачає наступний шматок. Втрата — перехресна ентропія за правильним номером у словнику. Примусова подача правильного попереднього шматка на навчальному проході (teacher forcing) не дає ранній помилці відвести всю фразу: під час навчання моделі підказують попередній шматок. На генерації підказки немає, модель продовжує вже свій текст. Вікно контексту — скільки шматків входить в один прохід. Порівняння кожного з кожним коштує квадратично від довжини вікна: удвічі довший текст — приблизно вчетверо більша таблиця схожості.

Температура перед вибором наступного шматка розтягує або звужує частки. Нижче одиниці — частіше переможець. Вище — частіше хвіст. Це не нове навчене число, а спосіб читати вже пораховані оцінки.

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

Нові оголошення приходять після налаштування

Узагальнення — чи тримається ціна на оголошеннях, яких не було під час налаштування. Компроміс зміщення і розкиду говорить про дві різні псувані. Зміщення — надто жорстка форма, яка промахується навіть у середньому: одна пряма на вигнутому ринку. Розкид — форма така гнучка, що нова пачка карток переставляє числа до невпізнання. Проста модель бреше стійко. Надто багата запам’ятовує випадкові дивності.

Калібрування питає, чи збігається заявлена частка з частотою правоти. Дев’ять правильних із десяти там, де модель казала «0,9», — чесна вивіска. Шість із десяти за тієї самої вивіски — костюм упевненості. Дисбаланс класів робить частку правильних відповідей дешевою перемогою: завжди казати «здоровий» при п’яти хворих на сто людей дає 0,95 і нульову користь. Метрику рахують на відкладеній тестовій пачці, яку не чіпали ні при підборі чисел, ні при виборі швидкості.

Квантування зберігає числа грубіше. На трьох квартирах вага 0,06 і зсув 1,2 влучають у ціни. Округліть вагу до десятих — отримаєте 0,1 — і передбачення стануть 4,2, 6,2 і 8,2. Економія розрядів тут ламає правило, бо важлива ціна метра жила в сотих. У великій мережі багато ваг терплять округлення, деякі ні. Тому зменшення файла не пропорційне втраті якості: страждають окремі осі, не «модель узагалі». Чисельна стійкість — той самий сюжет у навчанні. Додавання величезного і крихітного числа в обмеженій точності губить крихітне. Звідси масштабування в увазі, акуратні втрати і формати на кшталт половинної точності на прискорювачі.

Локальний запуск упирається в пам’ять, пропускну здатність і те, чи влізає вікно контексту. Математика не скасовує корпус і диск. Вона пояснює, чому після округлення одна задача жива, а інша попливла. Залізо, на якому це рахують, розібране окремо: процесор, графічний прискорювач і сусідні чипи. Вивіз уже навченої мережі в інший виконавець — у нотатці про ONNX.

Наскрізний проєкт, який закриває статтю, короткий і відтворюваний.

  1. Синтетична вибірка цін із відомими нахилом, зсувом, шумом і фіксованим зерном.
  2. Лінійна модель на NumPy, без бібліотеки навчання.
  3. Середній квадрат своїми руками.
  4. Градієнт за вагою і зсувом своїми руками.
  5. Цикл кроків і графік втрати.
  6. Та сама задача мережею з двох шарів зі зрізом ReLU.
  7. Звірка градієнта з autograd.
  8. Помилка на відкладеній третині, якої цикл не бачив.
  9. Три швидкості кроку: дрібна, робоча, надто велика.
  10. Файл залежностей, команда запуску і таблиця: швидкість, кінцева втрата, помилка на відкладених.

Далі має сенс заглиблювати не «всю математику», а ту частину, яку ламає ваша задача.

Куди йде робота Що підняти насамперед
Регресія і класифікація Лінійна алгебра, вибірки, оптимізація
Згортки і детекція Вікна, розміри тензорів, IoU
Пам’ять послідовності Похідні за часом, ворота
Трансформери і мовні моделі Матриці, softmax, ентропія, градієнти
Довге навчання Крок, статистика пачок, стійкість рахунку
Стиснення і локальний запуск Округлення, масштаб осей, пам’ять

Часті питання

Чи потрібен повний університетський курс до першої моделі?

Ні. Для прямої за однією ознакою вистачає функції, середнього й ідеї кроку проти зростання помилки. Логарифм, Баєса і правило ланцюжка підключайте того вечора, коли без них не читається втрата або зворотний прохід.

Чим алгоритм відрізняється від навченої мережі?

Алгоритм уже містить числа і не рухає їх від ваших прикладів. Навчена мережа — обрана форма плюс числа, виставлені за помилкою на даних. Форма без підібраних чисел — ще не мережа, яка щось уміє на ваших оголошеннях.

Чому не можна просто перебрати всі значення ваг?

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

Навіщо квадрат у помилці, якщо можна взяти модуль?

Квадрат сильніше тягне модель до рідкісних величезних промахів і дає гладку похідну в нулі. Модуль спокійніший до викиду і менш гладкий у нулі. Вибір — про те, який промах ви вважаєте дорогим, а не про «більш математичну» формулу.

Чому глибока мережа іноді гірша за коротку?

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

Що ламається в softmax, якщо прибрати ділення на корінь розміру?

Скалярні добутки ростуть із числом координат. Без ділення частки прилипають до одного шматка, решта отримує майже нуль, і ранні числа перестають чути помилку.

Частка правильних відповідей 0,95 — це добра модель?

Лише якщо класи не перекошені і ціна помилок порівнянна. П’ять хворих на сто людей і стала відповідь «здоровий» дають 0,95 при нульовій користі. Дивіться повноту за рідкісним класом і матрицю помилок.

Чи має сенс рахувати градієнт руками у 2026 році?

Один раз на двох шарах — так. Так з’являється право не вірити розбіжності з autograd і розуміти згасання. На повній мовній моделі ручний градієнт не пишуть: там той самий механізм, інші розміри.

Що почитати на сайті

Поруч із цією картою вже лежать практичні матеріали лабораторії і порівняння каркасів.

Висновок

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

Цього тижня зберіть три квартири у двадцять рядків, доведіть вагу до 0,06 і один раз проженіть зворотний прохід на мережі з двох шарів, звіривши чотири градієнти з PyTorch. Поки ці цифри не зійшлися, наступна архітектура буде набором імен.

Коментарі

Завантаження коментарів…