У першому семестрі ми довго й ретельно проводили пряму крізь хмару точок. Пряма має рівно два параметри, замкнену формулу розвʼязку й повну прозорість: подивився на коефіцієнт — зрозумів, що модель думає. Нейронна мережа має мільйони параметрів, не має замкненої формули і не пояснює нічого. Здавалося б, між ними прірва.
Прірви немає. Є один і той самий обчислювальний граф, у якому змінюється рівно одна річ — функція у вузлі. Ця тема показує мережу цілком: як з цієї єдиної зміни виростає все — і здатність описати будь-яку криву, і зворотне поширення помилки, і затухання градієнта, і перенавчання. Кожен із цих сюжетів має власну тему далі в блоці, тому тут ми проходимо їх швидко, а на розвилках ставимо вказівник, куди йти по деталі.
01 / МістокВід одного нейрона до мережі
У темі 30 ми розібрали окремий нейрон до
гвинтика. Він робить рівно дві дії: рахує зважену суму
z = w·x + b, а потім пропускає її крізь активацію
a = f(z). Там же ми побачили, що
той самий граф стає лінійною регресією,
логістичною регресією або перцептроном залежно від того, яку функцію поставити у вузол:
ваги на ребрах не змінюються, змінюється лише табличка на вузлі. Геометрія теж звідти:
рівність w·x + b = 0 задає межу, вектор w до неї перпендикулярний,
а зсув b відсуває її від початку координат на −b/‖w‖.
Одну деталь варто дістати окремо, бо далі вона знадобиться. Довжина вектора ваг
‖w‖ керує не напрямком межі, а різкістю переходу через неї.
Чим більша ‖w‖, тим швидше z набирає величину при віддаленні від
межі — і тим крутіше сигмоїда перемикається з нуля в одиницю. При малих вагах той самий
нейрон дає розмазаний схил на всю площину, при великих — майже сходинку. Навчання мережі
змінює обидві речі одразу: і куди дивиться кожна межа, і наскільки вона різка.
Тема 31 починається там, де 30 закінчилась: нейронів багато, вони складені в шари — і з цього виростає все інше.
02 / КартаЩо поглиблює кожна тема блоку
Ця тема — оглядова. Вона проходить мережу від входу до кроку навчання один раз і цілком, щоб конструкція була видна як ціле. Кожна її частина далі отримує власну тему, де є те, на що тут немає місця: числа, виведення, вимірювання. Ось карта — тримай її під рукою до кінця блоку.
Схема · Карта блоку 7: мережа і теми, що її поглиблюють
Ліворуч — мережа та один крок її навчання. Праворуч — тема, що розбирає кожну частину детально.
03 / ДоказЧому без нелінійності глибина безглузда
Ось найважливіше твердження всієї лекції, і воно доводиться в три рядки. Припустімо, ми
взяли два шари нейронів і забули поставити активацію — залишили f(z) = z.
Перший шар рахує:
Тут W₁ і W₂ — матриці ваг, b₁ і b₂ —
вектори зсувів, h — вектор виходів прихованого шару.
Добуток двох матриць — це знову матриця. Сума векторів — знову вектор. Отже,
два лінійні шари дали рівно те саме, що дав би один лінійний шар
з вагами W̃ = W₂W₁ і зсувом b̃ = W₂b₁ + b₂.
Те саме міркування застосовуємо до трьох шарів, чотирьох, ста. Скільки б лінійних шарів ми не склали, композиція згортається в один лінійний шар. ∎
Наслідок жорсткий: мережа без нелінійності не має глибини. Сто шарів по
тисячі нейронів кожен, десятки мільйонів параметрів — і вся ця конструкція здатна рахувати
рівно те, що рахує одна пряма. Гірше того: множина досяжних матриць W̃ може бути
вужчою, ніж у чесного одного шару, бо ранг добутку не перевищує рангу найвужчого
співмножника. Вузький прихований шар працює як пляшкове горло і лише зменшує виразність.
04 / ШариШари й пряме поширення
Тепер зберімо нейрони в конструкцію. Кладемо кілька нейронів поруч — вони приймають один і той самий вхід, але мають різні ваги, тому дивляться на дані під різними кутами. Це шар. Вихід шару подаємо на вхід наступному шару — і так далі.
Архітектура будь-якої мережі прямого поширення складається з трьох типів шарів:
- вхідний шар — просто самі ознаки, по вузлу на ознаку; ніяких обчислень;
- приховані шари — тут живуть нейрони з активаціями; їх може бути скільки завгодно, і саме вони творять усю магію;
- вихідний шар — формує відповідь: один нейрон із сигмоїдою для
бінарної класифікації,
Kнейронів із softmax дляKкласів, один лінійний нейрон для регресії.
Записувати обчислення по одному нейрону незручно, тому все записують матрицями. Нехай
a⁽⁰⁾ = x — вхід. Тоді для кожного шару l = 1…L:
Матриця W⁽ˡ⁾ має розмір n_l × n_{l−1}: рядок на кожен нейрон шару,
стовпець на кожен вхід. Функція f застосовується поелементно.
Прогін даних цим ланцюжком від x до ŷ = a⁽ᴸ⁾ називають
прямим поширенням (forward pass) — це і є все, що робить навчена мережа,
коли ти просиш у неї прогноз.
Порахуймо параметри для крихітної мережі 2 → 8 → 1: перший шар має 8·2 = 16
ваг плюс 8 зсувів, другий 1·8 = 8 ваг плюс 1 зсув. Разом 33 числа. Саме ці
33 числа й треба підібрати навчанням. Для порівняння: у GPT-класі моделей таких чисел
сотні мільярдів, але формула та сама.
А тепер найцікавіше — перевірмо доказ із попереднього розділу експериментально. Нижче жива мережа: два входи, один прихований шар, один вихід із сигмоїдою. Вона справді навчається у твоєму браузері градієнтним спуском, а фон показує її межу рішень. Постав активацію «лінійна» і покрути кількість нейронів від 1 до 24.
Інтерактив 1 · Межа рішень: ширина, активація, дані
Мережа 2 → H → 1 навчається просто зараз, повним градієнтним спуском, 500 епох.
05 / АктиваціїЯку функцію ставити у вузол
Нелінійність потрібна — це щойно доведено. Яка саме? Робочих варіантів три.
Сигмоїда стискає будь-яке число у відрізок (0, 1), тому її вихід читається
як ймовірність — і саме тому вона природно живе на виході бінарної класифікації.
tanh — та сама сигмоїда, розтягнута й центрована навколо нуля
(tanh(z) = 2σ(2z) − 1). ReLU, тобто max(0, z), —
найпростіша можлива нелінійність: обрізка знизу нулем, одна операція порівняння замість
експоненти. Четверта, сходинка перцептрона, для градієнтного навчання непридатна взагалі:
її похідна дорівнює нулю в кожній точці, де вона визначена, тож спуск не отримує жодного
сигналу про те, куди рухатись — тому перцептрони й навчали окремим правилом. Вибір між
трьома робочими вирішує не форма кривої, а похідна: саме на неї множиться
градієнт, коли тече назад крізь нейрон. Повна таблиця з шістьма функціями, їхніми похідними
й колонкою «коли брати», родина Leaky ReLU / ELU / GELU і питання, що ставити на вихід під
конкретну задачу, — у темі 33; там же
розібрано, як масштабувати стартові ваги під обрану активацію.
06 / ЗатуханняЗатухання градієнта
З цієї похідної випливає головна біда глибоких мереж. Щоб градієнт дійшов від функції
втрат до першого шару, він мусить пройти крізь усі проміжні шари, і на кожному
множиться на похідну активації. Похідна сигмоїди ніде не перевищує 0.25, тож груба
оцінка дає множник близько 0.25L на
L шарів — на десяти це вже приблизно мільйонна частка. Оцінка саме груба:
вона припускає, що множення на матрицю ваг довжину вектора не змінює, а реальна матриця то
трохи стискає її, то трохи розтягує, тому виміряний множник гуляє навколо 0.25 в обидва боки
й нерідко її перевищує. Порядок величини оцінка все ж угадує, і саме цей порядок тримав
напрямок на місці до 2010-х: верхні шари вчились, нижні стояли з майже випадковими вагами.
Дзеркальна біда теж можлива — якщо ваги великі, добуток вибухає, і оновлення відкидає модель
у нескінченність (вибух градієнта, з ним борються обрізанням норми). ReLU
знімає затухання тим, що на додатній півосі її похідна дорівнює рівно одиниці, але купує це
власною вадою: нейрон, у якого z < 0 на всіх прикладах, більше не отримує
градієнта й помирає назавжди. Виміряні числа, справжній зворотний прохід і
ціна затухання в добах навчання — у
темі 33, мертвий ReLU — там же,
розділ 05.
07 / ВтратиФункція втрат: крос-ентропія
Щоб мережа могла вчитись, потрібне число, яке каже, наскільки погано вона зараз працює.
Для регресії це знайома MSE. Для класифікації беруть крос-ентропію
(log loss). Для двох класів, де y ∈ {0, 1}, а ŷ ∈ (0, 1) — видана
мережею ймовірність класу 1:
Формула виглядає хитро, але в ній лише два випадки. Якщо y = 1, другий
доданок зникає й лишається −log ŷ: угадав упевнено (ŷ = 0.99) — втрата 0.01,
угадав невпевнено (ŷ = 0.5) — втрата 0.69, помилився впевнено (ŷ = 0.01) — втрата 4.6.
Якщо y = 0, усе дзеркально. Крос-ентропія карає впевнену помилку
необмежено: при ŷ → 0 і y = 1 втрата прямує до нескінченності.
Але справжня причина, чому беруть саме її, ховається в похідній. Порахуймо градієнт
по z — входу останнього нейрона, де ŷ = σ(z):
Знаменник і чисельник скорочуються повністю. Градієнт дорівнює звичайній різниці «прогноз мінус правильна відповідь» — жодних експонент, жодних насичень.
Порівняймо це з MSE на тому самому виході. Там ∂L/∂z = (ŷ − y)·ŷ(1 − ŷ),
і множник ŷ(1 − ŷ) все псує: якщо модель упевнено помилилась (ŷ = 0.999 при
y = 0), цей множник дорівнює 0.001, тобто градієнт майже нульовий. Модель груба помилилась —
і саме тому не хоче виправлятись. Крос-ентропія знімає цю проблему точним скороченням.
L = −Σ yₖ log ŷₖ. Скорочення
працює так само: ∂L/∂zₖ = ŷₖ − yₖ. Це не збіг, а властивість пари
«експоненційне сімейство + правдоподібність».08 / BackpropЗворотне поширення: анонс
Мережа є, число втрати є. Тепер треба похідна втрати по кожній вазі, а їх можуть
бути мільйони. Наївний спосіб — поворухнути кожну вагу окремо й подивитись, як зміниться
втрата — вимагав би мільйона прямих проходів на один крок навчання.
Зворотне поширення дає всі похідні одразу, за час одного додаткового
проходу. Фокус у ланцюговому правилі: похідна композиції — це добуток похідних, а кожен
множник у цьому добутку локальний, тобто залежить лише від того, що відбувається
в одному вузлі. Тому обчислення складається у прохід назад по графу, де кожен вузол отримує
від свого нащадка число «наскільки я впливаю на втрату» і передає предкам своє. Це число має
власне імʼя — дельта: похідна втрати по передактиваційному значенню
z нейрона. Дельту останнього шару ми щойно порахували в розділі 07,
вона дорівнює ŷ − y.
Далі — уся тема 32, і там це розібрано повільніше, ніж має сенс робити тут: прямий і зворотний прохід із числами на конкретній мережі, три формули backprop із покроковим виведенням, чому рахувати треба саме назад, а не вперед, і перевірка градієнта чисельним диференціюванням. Для нашої карти важливо запамʼятати одне: уперед графом течуть значення, назад — похідні, обидва потоки йдуть тими самими ребрами. Тому повний градієнт по всіх параметрах коштує приблизно стільки ж, скільки один прогноз, — незалежно від того, скільки цих параметрів, тисяча чи трильйон.
09 / СпускСпуск по неопуклій поверхні
Градієнт порахований — далі все просто, і точнісінько так само, як у лінійній регресії:
Крок η (learning rate) — найважливіший гіперпараметр нейромереж. Замалий:
навчання триватиме вічність, і ти зупиниш його на півдорозі, вирішивши, що модель погана.
Завеликий: оновлення перестрибує мінімум, втрати починають стрибати або вибухають у
нескінченність. Робочий діапазон зазвичай ширший, ніж здається, але його межі різкі.
Інтерактив 2 · Навчання в динаміці: епохи й крок
Ліворуч — межа рішень на обраній епосі. Праворуч — крива втрат від початку навчання.
Але є принципова різниця з лінійною регресією, і вона велика. Там поверхня втрат була опуклою — гладкою чашею з єдиним дном. Куди б ти не поставив початкову точку, спуск приходив у те саме місце, і це місце було глобальним мінімумом.
Поверхня втрат нейромережі опуклою не є навіть близько. Вона має:
- локальні мінімуми — ями, з яких градієнт не виводить, хоча десь поруч є глибша;
- сідлові точки — місця, де градієнт нульовий, але це не мінімум: в одних напрямках угору, в інших униз. У просторі великої розмірності їх набагато більше, ніж мінімумів, і саме вони, а не локальні ями, гальмують навчання найчастіше. Наскільки саме — виміряно в темі 34: на одному й тому самому сідлі чистому спуску треба 485 кроків, адаптивному оптимізатору — 5;
- плато — величезні плоскі області, де градієнт майже нульовий і модель тижнями «нічого не вчить»;
- симетрії — переставивши місцями два нейрони одного шару разом із їхніми вагами, отримаєш іншу точку простору параметрів із точно такою самою втратою. Мінімумів не один, їх експоненційно багато.
Практичний наслідок відчутний одразу: результат навчання залежить від початкових ваг. Той самий код, ті самі дані, той самий крок — інший seed генератора випадкових чисел, і точність інша. Перевір сам:
Інтерактив 3 · Ті самі дані, різні початкові ваги
Мережа 2 → 6 → 1 на спіралі, 500 епох. Змінюється лише зерно ініціалізації.
10 / ТеоремаУніверсальна апроксимація і три застереження
Ми бачили в інтерактиві 1, що з ростом ширини межа стає гнучкішою. Наскільки далеко це заходить? Відповідає теорема про універсальну апроксимацію (Цибенко, 1989; Горнік, 1991):
g — неперервна функція на замкненій
обмеженій множині, а f — неполіноміальна неперервна активація. Тоді для
будь-якого ε > 0 існує мережа з одним прихованим шаром
скінченної ширини, яка наближає g усюди на цій множині з похибкою, меншою
за ε.Звучить як вирок усій подальшій науці: одного шару досить, решта — деталі. На практиці з теореми не випливає майже нічого корисного, і важливо розуміти чому. Три застереження:
Застереження 1: існування не означає можливість знайти
Теорема стверджує, що потрібний набір ваг існує десь у просторі параметрів. Вона не дає жодного алгоритму, як його знайти, і не обіцяє, що градієнтний спуск туди дійде. А ми щойно бачили в інтерактиві 3, що спуск на неопуклій поверхні регулярно застрягає далеко від найкращого розвʼязку. Між «розвʼязок існує» і «ми його отримали» лежить уся практика глибокого навчання.
Застереження 2: ширина може знадобитись астрономічна
Теорема каже «скінченна ширина», але не каже яка. Для деяких функцій потрібна кількість
нейронів росте експоненційно з розмірністю входу. Класичний результат про глибину:
існують функції, які мережа глибини k представляє поліноміальною кількістю
нейронів, а мережа глибини k−1 — лише експоненційною. Глибина — це спосіб
перевикористовувати ознаки: другий шар будує комбінації з того, що вже знайшов
перший, замість того щоб будувати все з нуля. Саме тому глибокі мережі виграли, а не широкі.
Застереження 3: теорема нічого не каже про узагальнення
Наближення гарантується на тій множині, де ми міряємо. Здатність точно відтворити залежність не означає здатності правильно відповісти на нових даних. Більше того: та сама гнучкість, яка дозволяє наблизити будь-яку функцію, дозволяє наблизити й будь-який шум. Мережу можна навчити ідеально запамʼятати вибірку з випадковими мітками — і це доведено експериментально. Теорема — про виразність, а машинне навчання — про узагальнення. Це різні речі, і друга не випливає з першої.
11 / МежаПеренавчання й регуляризація
Отже, перейдімо до узагальнення. Нейромережа з достатньою кількістю параметрів здатна провести межу так, щоб кожна навчальна точка опинилась із правильного боку — включно з випадковими викидами й помилково розміченими прикладами. Візуально це впізнається миттєво: межа перестає бути плавною й починає обростати острівцями навколо окремих точок.
У наборі нижче лише 30 навчальних точок, шість із них навмисне розмічені неправильно (обведені бурштиновим). Тестова вибірка — 600 чистих точок із того самого розподілу, модель їх ніколи не бачить:
Інтерактив 4 · Перенавчання на малій вибірці
30 навчальних точок, 6 із них із перевернутою міткою. Праворуч — точність train проти test.
Проти цього є чотири прийоми, і в реальному проєкті зазвичай працюють усі разом.
Спад ваг (weight decay, він же L2) додає до втрати штраф
L + λ·Σw²: кожен крок трохи стягує кожну вагу до нуля, а менші ваги означають
менш різкі перепади виходу — тобто менше острівців. Це рівно та сама ідея, що й Ridge
у лінійній регресії, і саме її вмикає прапорець в інтерактиві вище.
Dropout на кожному кроці навчання тимчасово вимикає випадкові нейрони, тож
жоден із них не може розраховувати на конкретного сусіда, і мережа змушена будувати
надлишкові представлення. Рання зупинка — найдешевший прийом: стежимо за
втратою на валідаційній вибірці й зупиняємось у момент, коли вона почала зростати, тоді як
навчальна ще спадає. Більше даних (а якщо їх не додати — аугментація:
повороти, відображення, заміна синонімів) — найнадійніша регуляризація з усіх. Як ці
чотири поводяться поодинці й у парах, чому спад ваг не завжди дорівнює L2, що робить із
перенавчанням пакетна нормалізація і що з чим варто поєднувати — розбирає
тема 35.
12 / ДаліКуди рухатись далі
Усе, що ми розібрали, — це мережа прямого поширення (feed-forward, вона ж багатошаровий перцептрон). Вона нічого не знає про структуру даних: для неї вхід — просто вектор чисел. Якщо подати їй зображення, вона однаково поставиться до сусідніх пікселів і до пікселів із протилежних кутів.
Наступні архітектури виникли з ідеї вбудувати знання про структуру прямо в мережу:
| архітектура | яку структуру враховує | де застосовують |
|---|---|---|
| CNN | локальність і трансляційна симетрія: та сама ознака шукається в кожній точці зображення | зір, сегментація, детекція |
| RNN / LSTM | послідовність: стан переноситься з кроку на крок | часові ряди, мова (історично) |
| Transformer | увага: кожен елемент сам вирішує, на які інші дивитись | мова, зір, звук, майже все |
| GNN | граф: вузли й ребра з довільною топологією | молекули, соцмережі, рекомендації |
| GAN / дифузійні | породження нових даних із розподілу | генерація зображень і звуку |
Але всередині кожної з них — те саме, що ми щойно розібрали. Трансформер складається
з шарів уваги та звичайних повнозвʼязних шарів; він навчається крос-ентропією,
градієнтом, порахованим зворотним поширенням, і кроком η. Змінюється спосіб
зʼєднати нейрони — не спосіб їх навчати.
Тому підсумок лекції короткий і його варто запамʼятати саме в такому вигляді:
- нейрон = зважена сума + нелінійність; без другої частини глибина математично не існує;
- прямий прохід = ланцюжок множень на матриці з поелементною функцією між ними;
- втрата = число, яке міряє поганість; крос-ентропія дає найчистіший
градієнт
ŷ − y; - backprop = ланцюгове правило, застосоване назад по графу; коштує один додатковий прохід;
- навчання = багато маленьких кроків по неопуклій поверхні, де результат залежить від початкових ваг;
- узагальнення = окрема проблема, яку виразність мережі не розвʼязує, а погіршує.
practice.ipynb ти реалізуєш
двошарову мережу на чистому NumPy — прямий прохід, крос-ентропію та зворотне поширення
вручну, — доведеш assert-ом, що без активації два шари дорівнюють одному,
побачиш на числах розкид від зерна ініціалізації й звіриш результат із готовою реалізацією
зі scikit-learn на тих самих даних. Чисельна перевірка градієнта живе в
практиці теми 32, разом із рештою
розбору backprop.Далі в темі
Теорію прочитано. Тепер закріпи її на практиці.