Машинне навчання · Блок 7 · Тема 31

Шар за шаром

Нейронна мережа — це не мозок і не магія. Це той самий обчислювальний граф, що й лінійна регресія, тільки складений сам із себе багато разів. Розберімо його до гвинтика.

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

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

01 / МістокВід одного нейрона до мережі

У темі 30 ми розібрали окремий нейрон до гвинтика. Він робить рівно дві дії: рахує зважену суму z = w·x + b, а потім пропускає її крізь активацію a = f(z). Там же ми побачили, що той самий граф стає лінійною регресією, логістичною регресією або перцептроном залежно від того, яку функцію поставити у вузол: ваги на ребрах не змінюються, змінюється лише табличка на вузлі. Геометрія теж звідти: рівність w·x + b = 0 задає межу, вектор w до неї перпендикулярний, а зсув b відсуває її від початку координат на −b/‖w‖.

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

Тема 31 починається там, де 30 закінчилась: нейронів багато, вони складені в шари — і з цього виростає все інше.

02 / КартаЩо поглиблює кожна тема блоку

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

Схема · Карта блоку 7: мережа і теми, що її поглиблюють

Ліворуч — мережа та один крок її навчання. Праворуч — тема, що розбирає кожну частину детально.

Як читати: усе, що ліворуч, розібрано в цій темі рівно настільки, щоб конструкція трималася купи. Праворуч — куди йти по деталі: 30 · 33 · 32 · 34 · 35.

03 / ДоказЧому без нелінійності глибина безглузда

Ось найважливіше твердження всієї лекції, і воно доводиться в три рядки. Припустімо, ми взяли два шари нейронів і забули поставити активацію — залишили f(z) = z. Перший шар рахує:

крок 1 · записуємо два шари
h = W1x + b1     ŷ = W2h + b2

Тут W₁ і W₂ — матриці ваг, b₁ і b₂ — вектори зсувів, h — вектор виходів прихованого шару.

крок 2 · підставляємо перше в друге
ŷ = W2(W1x + b1) + b2
крок 3 · розкриваємо дужки й групуємо
ŷ = (W2W1)x + (W2b1 + b2) = W̃x + b̃

Добуток двох матриць — це знову матриця. Сума векторів — знову вектор. Отже, два лінійні шари дали рівно те саме, що дав би один лінійний шар з вагами W̃ = W₂W₁ і зсувом b̃ = W₂b₁ + b₂.

крок 4 · індукція на будь-яку глибину
W̃ = WLWL−1…W1

Те саме міркування застосовуємо до трьох шарів, чотирьох, ста. Скільки б лінійних шарів ми не склали, композиція згортається в один лінійний шар. ∎

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

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

04 / ШариШари й пряме поширення

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

Архітектура будь-якої мережі прямого поширення складається з трьох типів шарів:

Записувати обчислення по одному нейрону незручно, тому все записують матрицями. Нехай a⁽⁰⁾ = x — вхід. Тоді для кожного шару l = 1…L:

z(l) = W(l)a(l−1) + b(l)      a(l) = f(z(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 епох.

точність
параметрів
Ключовий дослід: з лінійною активацією межа лишається прямою і при 1 нейроні, і при 24 — точність не змінюється ні на відсоток. Варто перемкнути на ReLU чи tanh — і та сама мережа тієї ж ширини починає гнути межу як завгодно.

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:

L = −[ y·log ŷ + (1 − y)·log(1 − ŷ) ]

Формула виглядає хитро, але в ній лише два випадки. Якщо y = 1, другий доданок зникає й лишається −log ŷ: угадав упевнено (ŷ = 0.99) — втрата 0.01, угадав невпевнено (ŷ = 0.5) — втрата 0.69, помилився впевнено (ŷ = 0.01) — втрата 4.6. Якщо y = 0, усе дзеркально. Крос-ентропія карає впевнену помилку необмежено: при ŷ → 0 і y = 1 втрата прямує до нескінченності.

Але справжня причина, чому беруть саме її, ховається в похідній. Порахуймо градієнт по z — входу останнього нейрона, де ŷ = σ(z):

крок 1 · похідна втрати по виходу
∂L/∂ŷ = −y/ŷ + (1 − y)/(1 − ŷ) = (ŷ − y) / [ŷ(1 − ŷ)]
крок 2 · похідна сигмоїди
∂ŷ/∂z = σ(z)·(1 − σ(z)) = ŷ(1 − ŷ)
крок 3 · ланцюгове правило — і диво скорочення
∂L/∂z = (ŷ − y)/[ŷ(1 − ŷ)] · ŷ(1 − ŷ) = ŷ − y

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

Порівняймо це з MSE на тому самому виході. Там ∂L/∂z = (ŷ − y)·ŷ(1 − ŷ), і множник ŷ(1 − ŷ) все псує: якщо модель упевнено помилилась (ŷ = 0.999 при y = 0), цей множник дорівнює 0.001, тобто градієнт майже нульовий. Модель груба помилилась — і саме тому не хоче виправлятись. Крос-ентропія знімає цю проблему точним скороченням.

Для багатьох класів. Замість сигмоїди на виході ставлять softmax, а замість бінарної крос-ентропії — категорійну: L = −Σ yₖ log ŷₖ. Скорочення працює так само: ∂L/∂zₖ = ŷₖ − yₖ. Це не збіг, а властивість пари «експоненційне сімейство + правдоподібність».

08 / BackpropЗворотне поширення: анонс

Мережа є, число втрати є. Тепер треба похідна втрати по кожній вазі, а їх можуть бути мільйони. Наївний спосіб — поворухнути кожну вагу окремо й подивитись, як зміниться втрата — вимагав би мільйона прямих проходів на один крок навчання. Зворотне поширення дає всі похідні одразу, за час одного додаткового проходу. Фокус у ланцюговому правилі: похідна композиції — це добуток похідних, а кожен множник у цьому добутку локальний, тобто залежить лише від того, що відбувається в одному вузлі. Тому обчислення складається у прохід назад по графу, де кожен вузол отримує від свого нащадка число «наскільки я впливаю на втрату» і передає предкам своє. Це число має власне імʼя — дельта: похідна втрати по передактиваційному значенню z нейрона. Дельту останнього шару ми щойно порахували в розділі 07, вона дорівнює ŷ − y.

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

09 / СпускСпуск по неопуклій поверхні

Градієнт порахований — далі все просто, і точнісінько так само, як у лінійній регресії:

W := W − η · ∂L/∂W

Крок η (learning rate) — найважливіший гіперпараметр нейромереж. Замалий: навчання триватиме вічність, і ти зупиниш його на півдорозі, вирішивши, що модель погана. Завеликий: оновлення перестрибує мінімум, втрати починають стрибати або вибухають у нескінченність. Робочий діапазон зазвичай ширший, ніж здається, але його межі різкі.

Інтерактив 2 · Навчання в динаміці: епохи й крок

Ліворуч — межа рішень на обраній епосі. Праворуч — крива втрат від початку навчання.

втрата
точність
Спробуй: постав η = 0.01 — за 300 епох межа ледь відірветься від прямої. Постав η = 30 — крива втрат перетвориться на пилку або злетить угору. Між цими краями є широке робоче плато.

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

Поверхня втрат нейромережі опуклою не є навіть близько. Вона має:

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

Інтерактив 3 · Ті самі дані, різні початкові ваги

Мережа 2 → 6 → 1 на спіралі, 500 епох. Змінюється лише зерно ініціалізації.

втрата
точність
Висновок: стовпчики праворуч — підсумкова точність для всіх дванадцяти зерен: від 83.1 % до 100 %. Майже сімнадцять відсоткових пунктів розкиду при абсолютно однакових даних і коді — це не баг, це властивість неопуклої задачі.
Що з цим роблять на практиці. По-перше, ініціалізують ваги не абияк, а за схемами He і Glorot — вони підбирають дисперсію стартових ваг так, щоб сигнал не згасав і не вибухав із глибиною. По-друге, використовують не чистий спуск, а моменти й адаптивні кроки: SGD з моментом, RMSProp, Adam. По-третє, беруть градієнт не по всій вибірці, а по випадковому міні-батчу — шум від такої вибірковості несподівано корисний: він допомагає вискочити з дрібних ям і сідел.

10 / ТеоремаУніверсальна апроксимація і три застереження

Ми бачили в інтерактиві 1, що з ростом ширини межа стає гнучкішою. Наскільки далеко це заходить? Відповідає теорема про універсальну апроксимацію (Цибенко, 1989; Горнік, 1991):

Формулювання. Нехай g — неперервна функція на замкненій обмеженій множині, а f — неполіноміальна неперервна активація. Тоді для будь-якого ε > 0 існує мережа з одним прихованим шаром скінченної ширини, яка наближає g усюди на цій множині з похибкою, меншою за ε.

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

Застереження 1: існування не означає можливість знайти

Теорема стверджує, що потрібний набір ваг існує десь у просторі параметрів. Вона не дає жодного алгоритму, як його знайти, і не обіцяє, що градієнтний спуск туди дійде. А ми щойно бачили в інтерактиві 3, що спуск на неопуклій поверхні регулярно застрягає далеко від найкращого розвʼязку. Між «розвʼязок існує» і «ми його отримали» лежить уся практика глибокого навчання.

Застереження 2: ширина може знадобитись астрономічна

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

Застереження 3: теорема нічого не каже про узагальнення

Наближення гарантується на тій множині, де ми міряємо. Здатність точно відтворити залежність не означає здатності правильно відповісти на нових даних. Більше того: та сама гнучкість, яка дозволяє наблизити будь-яку функцію, дозволяє наблизити й будь-який шум. Мережу можна навчити ідеально запамʼятати вибірку з випадковими мітками — і це доведено експериментально. Теорема — про виразність, а машинне навчання — про узагальнення. Це різні речі, і друга не випливає з першої.

11 / МежаПеренавчання й регуляризація

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

У наборі нижче лише 30 навчальних точок, шість із них навмисне розмічені неправильно (обведені бурштиновим). Тестова вибірка — 600 чистих точок із того самого розподілу, модель їх ніколи не бачить:

Інтерактив 4 · Перенавчання на малій вибірці

30 навчальних точок, 6 із них із перевернутою міткою. Праворуч — точність train проти test.

точність train
точність test
Що видно: при 1–6 нейронах межа плавна, помилкові точки просто ігноруються. Після 12–16 навчальна точність доходить до 100 % — мережа обхопила кожен викид окремим острівцем, і тестова точність від цього падає. Увімкни weight decay і подивись, як острівці розсмоктуються.

Проти цього є чотири прийоми, і в реальному проєкті зазвичай працюють усі разом. Спад ваг (weight decay, він же L2) додає до втрати штраф L + λ·Σw²: кожен крок трохи стягує кожну вагу до нуля, а менші ваги означають менш різкі перепади виходу — тобто менше острівців. Це рівно та сама ідея, що й Ridge у лінійній регресії, і саме її вмикає прапорець в інтерактиві вище. Dropout на кожному кроці навчання тимчасово вимикає випадкові нейрони, тож жоден із них не може розраховувати на конкретного сусіда, і мережа змушена будувати надлишкові представлення. Рання зупинка — найдешевший прийом: стежимо за втратою на валідаційній вибірці й зупиняємось у момент, коли вона почала зростати, тоді як навчальна ще спадає. Більше даних (а якщо їх не додати — аугментація: повороти, відображення, заміна синонімів) — найнадійніша регуляризація з усіх. Як ці чотири поводяться поодинці й у парах, чому спад ваг не завжди дорівнює L2, що робить із перенавчанням пакетна нормалізація і що з чим варто поєднувати — розбирає тема 35.

12 / ДаліКуди рухатись далі

Усе, що ми розібрали, — це мережа прямого поширення (feed-forward, вона ж багатошаровий перцептрон). Вона нічого не знає про структуру даних: для неї вхід — просто вектор чисел. Якщо подати їй зображення, вона однаково поставиться до сусідніх пікселів і до пікселів із протилежних кутів.

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

архітектураяку структуру враховуєде застосовують
CNNлокальність і трансляційна симетрія: та сама ознака шукається в кожній точці зображеннязір, сегментація, детекція
RNN / LSTMпослідовність: стан переноситься з кроку на крокчасові ряди, мова (історично)
Transformerувага: кожен елемент сам вирішує, на які інші дивитисьмова, зір, звук, майже все
GNNграф: вузли й ребра з довільною топологієюмолекули, соцмережі, рекомендації
GAN / дифузійніпородження нових даних із розподілугенерація зображень і звуку

Але всередині кожної з них — те саме, що ми щойно розібрали. Трансформер складається з шарів уваги та звичайних повнозвʼязних шарів; він навчається крос-ентропією, градієнтом, порахованим зворотним поширенням, і кроком η. Змінюється спосіб зʼєднати нейрони — не спосіб їх навчати.

Тому підсумок лекції короткий і його варто запамʼятати саме в такому вигляді:

Далі в практиці. У practice.ipynb ти реалізуєш двошарову мережу на чистому NumPy — прямий прохід, крос-ентропію та зворотне поширення вручну, — доведеш assert-ом, що без активації два шари дорівнюють одному, побачиш на числах розкид від зерна ініціалізації й звіриш результат із готовою реалізацією зі scikit-learn на тих самих даних. Чисельна перевірка градієнта живе в практиці теми 32, разом із рештою розбору backprop.

Далі в темі

Теорію прочитано. Тепер закріпи її на практиці.