У попередній темі ми розібрали зворотне поширення до останнього множення й побачили, чим воно закінчується: градієнт на вході в мережу — це добуток локальних похідних уздовж усього шляху. Backprop чесно перемножує те, що йому дали. А що саме йому дають, вирішують дві речі, яких у градієнті немає: функція активації в кожному вузлі й числа, з яких мережа стартує.
Це не налаштування «за смаком». Різниця між множником 0.25 і множником 1.0 на кожному шарі — це різниця між мережею, яка вчиться за пів хвилини, і мережею, якій потрібні тисячі років. Ми зараз порахуємо це буквально. Друга половина теми — ініціалізація — виглядає ще дрібнішою, і саме тому її найчастіше проґавлюють: мережа з неправильним стартом не падає з помилкою, вона просто мовчки не вчиться.
Наскрізний приклад лишається той самий, що в темах 08 і 32: дошка оголошень про вживані телефони, дві ознаки (вік акаунта продавця й відхилення ціни від типової для цієї моделі) і питання «чи шахрайське це оголошення». Усі числа в лекції пораховані саме на ній, і зошит теми друкує їх до останнього знака.
01 / НавіщоДві ручки поза градієнтом
Перше питання — навіщо активація взагалі потрібна. Відповідь доведена в темі 31 у чотири рядки, і повторювати доведення тут немає сенсу. Висновок такий: два лінійні шари поспіль — це матриця, помножена на матрицю, тобто знову одна матриця. Сто лінійних шарів згортаються в один. Мережа без нелінійності не має глибини взагалі: скільки б параметрів у ній не було, вона рахує рівно те, що рахує одна пряма. Активація — єдине, що робить стос шарів чимось більшим за суму шарів.
Але з цього не випливає, що годиться будь-яка нелінійна функція. Активація стоїть у
двох потоках одночасно. Уперед крізь неї тече значення, і тут важлива форма
функції. Назад крізь неї тече градієнт, і тут важлива вже не сама функція, а її
похідна: у зворотному проході провина нейрона множиться на f′(z). Форму бачать
усі, похідну — майже ніхто. А вирішує саме вона.
02 / КласикаСигмоїда й tanh: 0.25 проти 1.0
Історично першою прижилась сигмоїда (sigmoid, логістична функція). Вона плавно тисне будь-яке число у проміжок від нуля до одиниці:
Похідна тут гарна тим, що виражається через саму функцію: якщо прямий прохід уже
порахував a = σ(z), то похідна коштує одне множення, a·(1 − a).
Тепер найважливіше число всієї теми. Добуток a(1 − a) для a з
проміжку (0, 1) максимальний рівно посередині, при a = 0.5, і дорівнює
0.25. Це не «зазвичай», це стеля: похідна сигмоїди ніде не
перевищує чверті. На краях вона падає до нуля — при z = 5 вона вже 0.0066.
tanh — та сама крива, розтягнута вдвічі й опущена в нуль:
tanh(z) = 2σ(2z) − 1. Її вихід лежить у проміжку від −1 до 1, а похідна
дорівнює 1 − tanh²(z) і в нулі досягає одиниці. Той самий
розтяг, що зробив вихід симетричним, підняв стелю похідної вчетверо. Плюс до цього вихід
tanh центрований навколо нуля, тоді як сигмоїда завжди додатна — а це означає, що всі ваги
одного нейрона отримують градієнт однакового знаку й оптимізація йде зигзагом.
Порівняй обидві криві з їхніми похідними. Пунктир на нижньому графіку — рівень 0.25:
Інтерактив 1 · Активація та її похідна поруч
Угорі — сама функція, унизу — її похідна. Повзунок ставить точку z, у якій усе рахується.
Порухай повзунок у нуль при вибраній сигмоїді: похідна 0.2500, крізь десять шарів проходить 9.5·10−7. Це найкращий можливий випадок — усі десять шарів працюють рівно в оптимальній точці. Перемкни на tanh: у нулі похідна 1.0000, крізь десять шарів проходить одиниця. Різниця між чвертю й одиницею на одному шарі здається дрібною. На десяти вона стає мільйонною.
03 / ЗатуханняЗатухання градієнта з числами
Тепер порахуймо це чесно. Із теми 32 ми знаємо, як провина переходить із шару на шар:
На кожному переході відбуваються дві дії: множення на матрицю ваг і множення на похідну
активації. Ваги можна підібрати так, щоб множення на матрицю приблизно зберігало довжину
вектора (як саме — розділ 09). Тоді весь баланс лишається за похідною. Пройти від виходу
до першого шару з L шарів означає помножитись на f′ рівно
L разів:
Один мільйонний. Градієнт, що приходить до першого шару, у мільйон разів слабший за той, що вийшов із функції втрат. Оцінка груба: вона припускає, що множення на матрицю ваг довжину вектора не змінює, а реальна матриця то трохи стискає вектор, то трохи розтягує. Але саме тому нижче й стоїть інтерактив із справжнім зворотним проходом: там виміряний множник тримається в межах від 0.22 до 0.26 при будь-якій глибині. Формула не бреше.
Прочитати «в мільйон разів слабший» легко, відчути — ні. Тому переведімо в кроки навчання.
Крок градієнтного спуску зсуває вагу на η·∂L/∂w. Якщо останньому шару
достатньо тисячі кроків, щоб дійти куди треба, то першому шару з утричі меншим... не втричі.
Порахуймо точно: першому шару треба стільки ж кроків, поділених на множник затухання.
| глибина L | 0.25L−1 | кроків першому шару | при 1 мс на крок |
|---|---|---|---|
| 2 | 2.5·10−1 | 4 000 | 4 секунди |
| 5 | 3.9·10−3 | 256 000 | 4 хвилини |
| 10 | 3.8·10−6 | 262 000 000 | 3 доби |
| 15 | 3.7·10−9 | 2.7·1011 | 8.5 року |
| 20 | 3.6·10−12 | 2.7·1014 | 8 700 років |
Читається таблиця так: «останній шар навчився за тисячу кроків; щоб перший шар зрушив на стільки ж, потрібно ось стільки». На двох шарах різниця непомітна. На десяти замість секунди виходять три доби. На двадцяти — вісім тисяч років, тобто ніколи. Перші шари глибокої сигмоїдної мережі не вчаться повільно — вони не вчаться: до кінця навчання вони так і стоять із випадковими вагами, з яких стартували.
Це і є затухання градієнта (vanishing gradient) — та сама межа, яку тема 32 назвала головним обмеженням глибоких мереж. Тепер у неї є ціна в добах.
Нижче — не оцінка, а справжній зворотний прохід крізь L шарів по 24 нейрони.
Стовпчики показують норму провини ‖δ‖ на кожному шарі; шкала логарифмічна,
одна велика поділка — множник 10 000.
Інтерактив 2 · Куди дівається градієнт по дорозі до першого шару
Справжній зворотний прохід крізь L шарів. Праворуч — вихід мережі, ліворуч — вхід.
Чому взагалі можна казати про «множник на шар», якщо на переході стоїть ще й матриця ваг? Тому що її підбирають саме так, щоб вона нічого не змінювала за модулем — про це розділ 09. Множення на добре відмасштабовану матрицю в середньому зберігає довжину вектора, тож увесь бюджет затухання лишається за похідною активації. Варто ваги зробити більшими — і додасться вибух градієнта; меншими — затухання прискориться. Дві половини цієї теми працюють на одну й ту саму величину.
Зверни увагу на tanh. Його стеля — одиниця, і здається, що затухання йому не загрожує. Насправді одиницю похідна tanh дає лише в нулі, а типовий нейрон працює не в нулі: виміряний множник тримається біля 0.9, і на двадцяти шарах до першого шару доходить приблизно пʼята частина того, що вийшло з останнього. Втрата помітна, але вона в пʼять разів, а не в мільйон. Стеля рятує від нуля, але не гарантує одиниці — саме тому tanh терпимий у неглибоких мережах і ненадійний у справді глибоких.
04 / ReLUReLU: похідна дорівнює одиниці
Тепер найпростіша функція в цій лекції. ReLU (rectified linear unit, випрямляч) просто обрізає все відʼємне:
Похідна на додатній півосі дорівнює рівно одиниці — не «близько
одиниці в найкращій точці», а одиниці скрізь, де z > 0. Помножити на
одиницю двадцять разів — це помножити на одиницю. Ланцюг із розділу 03 перестає гаснути:
градієнт, що вийшов із функції втрат, доходить до першого шару майже без утрат. У
інтерактиві 2 перемкни активацію на ReLU й покрути глибину — стовпчики більше не падають.
Друга властивість не менш важлива, хоч і прозаїчна: ReLU не рахує експоненту. Сигмоїда
й tanh на кожен нейрон вимагають exp, ReLU — одного порівняння з нулем. На
мережі в мільярд нейронів це різниця в годинах машинного часу.
Третя властивість найтонша. ReLU не насичується згори: скільки б не був z,
похідна лишається одиницею. У сигмоїди й tanh нейрон, який «занадто впевнений», перестає
вчитись — його похідна впала до нуля. У ReLU впевненість не карається. Саме тому в
2010-х глибокі мережі раптом почали навчатись, і не через нову математику: змінили одну
функцію в кожному вузлі. Так само в
темі 30 сходинка робила перцептрон непридатним
для градієнтного навчання — її похідна нульова всюди, ланцюг обривався на першій же ланці.
ReLU — це та сама сходинка, у якої правий шматок нахилили під сорок пʼять градусів, і
цього виявилось досить.
05 / СмертьМертвий ReLU
У ReLU є зворотний бік, і він жорсткіший, ніж здається з опису. Похідна на відʼємній
півосі дорівнює нулю. Якщо нейрон опинився в стані z < 0 на всіх
обʼєктах навчальної вибірки, назад крізь нього не проходить нічого. Градієнт по його вагах
дорівнює нулю. Ваги не змінюються. Наступного кроку ситуація та сама. І наступного.
Це не тимчасове гальмування, як у сигмоїди, а замкнене коло: нейрон не оновлюється, бо не отримує градієнта, і не отримує градієнта, бо не оновлюється. Вийти з нього мережа не може ніколи. Нейрон помер — він назавжди перетворився на константу нуль і просто займає памʼять.
Схема 1 · Як помирає нейрон ReLU
Ліворуч — живий нейрон, праворуч — той самий після завеликого кроку. Точки — обʼєкти навчальної вибірки.
Убиває нейрони завелика швидкість навчання. Один крок із великим η здатен
зсунути ваги так далеко, що весь нейрон вилітає в відʼємну зону. Порахуймо на нашій дошці
оголошень. Мережа 2 → 64 → 1 з ReLU, ініціалізація He, 300 епох повного градієнтного
спуску, і єдине, що ми міняємо, — швидкість навчання:
| крок η | мертвих нейронів | частка шару | втрата | точність |
|---|---|---|---|---|
| 0.1 | 0 з 64 | 0 % | 0.263 | 0.915 |
| 1 | 0 з 64 | 0 % | 0.223 | 0.929 |
| 5 | 17 з 64 | 27 % | 0.221 | 0.924 |
| 10 | 35 з 64 | 55 % | 0.238 | 0.924 |
| 20 | 38 з 64 | 59 % | 0.423 | 0.870 |
| 50 | 61 з 64 | 95 % | 0.541 | 0.865 |
| 100 | 64 з 64 | 100 % | 4.513 | 0.837 |
Таблицю варто читати повільно, бо в ній є пастка. При η = 5 сімнадцять
нейронів із шістдесяти чотирьох уже мертві — а метрики чудові, точність 0.924. Мережа
працює на решті сорока семи й нічого не підозрює. Ти б цього не помітив. При
η = 10 мертва вже більшість шару, і точність усе ще 0.924: шістдесятичотирьох
нейронів для цієї задачі просто забагато, тому втрата половини непомітна. І тільки в
останньому рядку катастрофа стає видимою — усі 64 нейрони мертві, мережа видає константу,
і точність 0.837 дорівнює рівно частці чесних оголошень у вибірці. Модель не навчилась
нічому, вона вгадує більшість.
max(z) по всіх обʼєктах не перевищує нуля.
Зроби це хоч раз після навчання — у практиці теми ми саме так і рахували.06 / РодинаLeaky ReLU, ELU, GELU
Усі наступні функції лікують одну й ту саму хворобу — нульову похідну ліворуч від нуля. Ідея в кожної одна: не давати похідній стати рівно нулем.
Leaky ReLU замість нуля лишає ліворуч невеликий нахил:
max(αz, z) з α близько 0.01. Похідна ліворуч дорівнює 0.01 —
мало, але не нуль, і замкнене коло розривається: нейрон, який зайшов у відʼємну зону,
отримує тонкий струмочок градієнта й може повернутись. Ціна — нульова, обчислень стільки ж.
ELU (exponential linear unit) робить те саме плавно:
z праворуч і ez − 1 ліворуч. Функція
неперервна разом із похідною, а вихід при великих відʼємних z прямує до −1,
тобто середнє активацій зміщується ближче до нуля. Мінус один: ліворуч знову зʼявляється
експонента з її ціною.
GELU (gaussian error linear unit) множить вхід на ймовірність того,
що стандартна нормальна величина менша за z: GELU(z) = z·Φ(z).
Виходить майже ReLU, але з мʼяким переходом і невеликим провалом нижче нуля. Її похідна
доходить до 1.129 при z = 1.41 і приймає відʼємні значення
на проміжку від −2 до 0 — тобто там сигнал не просто слабшає, а міняє знак. Саме GELU
стоїть у трансформерах, і в інтерактиві 1 її варто покрутити окремо: це єдина з шести
функцій, у якої похідна більша за одиницю.
Таблиця 1 · Шість активацій одним поглядом
Максимум похідної — це стеля множника, з яким градієнт проходить крізь один шар.
| функція | формула | похідна | максимум похідної | коли брати |
|---|---|---|---|---|
| sigmoid | 1 / (1 + e−z) | a·(1 − a) | 0.25 | лише на виході бінарної класифікації |
| tanh | 2σ(2z) − 1 | 1 − a² | 1.00 | неглибокі мережі, рекурентні шари |
| ReLU | max(0, z) | 1 або 0 | 1.00 | вибір за замовчуванням для прихованих шарів |
| Leaky ReLU | max(0.01z, z) | 1 або 0.01 | 1.00 | коли ReLU помирає, а крок зменшувати не хочеться |
| ELU | z або ez − 1 | 1 або ez | 1.00 | коли важлива гладкість і нульове середнє |
| GELU | z·Φ(z) | Φ(z) + z·φ(z) | 1.129 | трансформери й великі мовні моделі |
07 / ВихідЩо ставити на вихід
Тут ховається найчастіша помилка новачків, і причина в тому, що правила для прихованих шарів і для виходу — протилежні. У прихованих шарах активацію обирають за похідною: щоб градієнт проходив. На виході її обирають за формою: щоб число на виході означало те, що треба задачі. Похідна там уже не критична, бо це остання ланка ланцюга, і множитись багато разів вона не буде.
Таблиця 2 · Вихідний шар під задачу
Активація виходу, функція втрат і те, як читати відповідь.
| задача | нейронів на виході | активація | втрата | як читати |
|---|---|---|---|---|
| Бінарна класифікація | 1 | сигмоїда | бінарна крос-ентропія | ймовірність класу 1 |
| Багатокласова, класи взаємовиключні | K | softmax | категорійна крос-ентропія | розподіл: сума по класах дорівнює 1 |
| Багато міток одночасно | K | сигмоїда на кожному окремо | сума бінарних крос-ентропій | K незалежних ймовірностей |
| Регресія | 1 | жодної | MSE або MAE | саме число |
Softmax — це узагальнення сигмоїди на K класів. Він бере
K чисел, підносить кожне в експоненту й ділить на суму всіх:
softmax(z)ₖ = ezₖ / Σⱼ ezⱼ.
Результат — набір додатних чисел, що сумуються в одиницю, тобто справжній розподіл
імовірностей. Головне слово тут — сумуються: підняти ймовірність одного класу
можна лише опустивши інші. Для задачі «одна правильна відповідь із десяти» це саме те, що
треба. Для задачі «які з десяти тегів підходять цій статті» це шкода: теги не змагаються.
Окреме питання — чому сигмоїда, яку ми щойно вигнали з прихованих шарів за похідну 0.25, спокійно живе на виході. Причина в тому, що там вона не множиться багато разів, а ще й скорочується: у парі з крос-ентропією її похідна зникає повністю, і градієнт виходу дорівнює простій різниці «прогноз мінус правда» — це виведено в темі 31. Стеля 0.25 шкодить тільки тоді, коли її підносять у степінь глибини.
А для регресії на виході не має стояти нічого. Ціна телефона — це число від нуля до нескінченності, а не ймовірність; будь-яка тиснуча функція обріже його зверху. Порожній вихідний шар — не забутий крок, а свідомий вибір. Виняток лише один: якщо відповідь за змістом не може бути відʼємною, іноді ставлять softplus. Але навіть тоді частіше вчать модель на логарифмі відповіді й лишають вихід лінійним.
08 / СиметріяЧому нулі не працюють
Друга половина теми. Мережа стартує з якихось чисел, і найприродніша ідея — почати з нулів. У лінійній регресії так і роблять, і все працює. У нейромережі це руйнує все.
Візьмімо мережу 2 → 2 → 1 з попередньої теми, обнулімо в ній усі девʼять параметрів
і зробімо один прохід на обʼєкті x = (1.0, −0.5) з правильною відповіддю
y = 1. Прихований шар рахує z = 0, активація дає
a = 0. Вихід теж нуль, сигмоїда перетворює його на ŷ = 0.5,
провина виходу δ⁽²⁾ = 0.5 − 1 = −0.5. А далі все розсипається:
Градієнт по вагах другого шару дорівнює нулю, бо активації першого шару нульові. Градієнт по вагах першого шару дорівнює нулю, бо ваги другого шару нульові. Оновиться рівно один параметр — зсув вихідного нейрона, бо в нього вхід завжди одиниця. Мережа скотиться до найкращої константи й застрягне на ній назавжди.
Ми перевірили це в зошиті на дошці оголошень: мережа 2 → 64 → 1 з нульовим стартом після 400 епох має всі ваги рівно нульові, втрату 0.4452 і точність 0.837. Число 0.4452 не випадкове — це ентропія розподілу міток, тобто втрата ідеальної константи. Та сама мережа з ініціалізацією He дає втрату 0.2211 і точність 0.929.
Тепер важливий нюанс, який відрізняє розуміння від зазубрювання. Нулі — це окремий, найгірший випадок ширшої проблеми. Припустімо, ми стартували не з нулів, а з однакових ваг: усі дорівнюють 0.5. Тепер градієнти не нульові — але обидва нейрони прихованого шару бачать той самий вхід із тими самими вагами, тому рахують те саме число, отримують ту саму провину й ту саму поправку.
Схема 2 · Симетрія, яку нічим не зламати
Один крок спуску на обʼєкті x = (1.0, −0.5), y = 1, η = 0.5. Ліворуч — однакові ваги, праворуч — нулі.
Це симетрія, і градієнтний спуск її не ламає: він однаково рухає однакові речі. Шар із тисячі однакових нейронів рахує рівно те саме, що один нейрон. Отже, вимога до ініціалізації перша й головна: ваги мають бути різними, причому випадковими — бо будь-який регулярний візерунок ризикує виявитись новою симетрією. Зсуви при цьому спокійно ставлять нулями: вони не творять симетрії, бо симетрію ламають уже самі ваги.
09 / МасштабXavier і He
Отже, випадкові. Лишилось питання — наскільки великі. І тут виявляється, що завеликі ваги псують справу не гірше за нулі, тільки з іншого боку.
Нехай нейрон приймає 100 входів, кожен зі стандартним відхиленням 1, а ваги ми взяли
з розподілу зі стандартним відхиленням 1. Зважена сума складається зі ста доданків, тож її
стандартне відхилення дорівнює 10. Типовий нейрон працює в точці |z| ≈ 10,
де сигмоїда давно насичена: у нашому розрахунку 69 % обʼєктів дають |z| > 4,
а середня похідна падає до 0.039 замість 0.207 при добре підібраному
масштабі. Мережа з великих ваг починає навчання вже в стані затухання — вона стартує
з насичення. А в мережі з ReLU великі ваги дають дзеркальну біду: активації ростуть від
шару до шару, і на десятому шарі числа виходять за межі того, що взагалі можна складати
без втрати точності.
Правильну відповідь дає одна вимога, і вона формулюється одним реченням: дисперсія виходу шару має дорівнювати дисперсії його входу. Тоді сигнал не гасне й не вибухає, скільки б шарів не було. Розпишімо, що з цього випливає.
Сума n_in незалежних доданків, кожен з яких — добуток ваги на вхід.
Дисперсії незалежних доданків додаються, тому попереду стоїть множник
n_in — кількість входів нейрона.
Це ініціалізація Xavier (вона ж Glorot). Ваги беруть із нормального
розподілу із середнім нуль і дисперсією 1/n_in. Чим ширший шар, тим
менші стартові ваги — і це логічно: більше доданків у сумі, менший внесок кожного.
ReLU обнуляє все відʼємне, а це рівно половина значень симетричного розподілу. Після неї середній квадрат активації вдвічі менший, ніж був до неї. Щоб компенсувати втрачену половину, дисперсію ваг беруть удвічі більшою. Це ініціалізація He, і двійка в ній — це саме та половина сигналу, яку зʼїдає ReLU.
Двійка — місце, де найлегше помилитись і найважче помітити помилку. Xavier виводили для симетричних активацій на кшталт tanh, які нічого не обнуляють. Якщо взяти Xavier під ReLU, дисперсія множитиметься на 0.5 щошару: на десяти шарах сигнал ослабне приблизно в тисячу разів. Не катастрофа, як у випадку малих ваг, але й не «однаково». Перевір це сам:
Інтерактив 3 · Пʼять способів почати — три різні долі
Дисперсія активацій на десяти шарах по 64 нейрони з ReLU. Вертикальна шкала логарифмічна: одна поділка — множник 105.
Останній рядок інтерактиву варто прочитати уважно. Частка нулів тримається біля 50 % для всіх ненульових способів ініціалізації — і це не залежить від масштабу ваг узагалі, бо множення на число не змінює знак. Саме ця стала половина й перетворюється на двійку в формулі He. А ініціалізація нулями дає 100 % нулів на всіх шарах: мережа мертва ще до першого кроку навчання.
PyTorch і Keras ініціалізують лінійні шари за замовчуванням
чимось із родини Xavier/He. Знати формули треба не щоб їх набирати, а щоб розуміти два
випадки: коли ти пишеш шар власноруч і коли мережа з чужого репозиторію не вчиться, а
причина — невідповідність ініціалізації й активації.10 / ДаліКуди далі
Підсумок теми — пʼять рядків:
- активація потрібна не для краси: без неї стос шарів згортається в одну пряму;
- вирішує похідна, а не форма: стеля 0.25 у сигмоїди означає множник 10−6 на десяти шарах, стеля 1.0 у ReLU не означає нічого;
- ReLU має ціну — нейрон, що зайшов у відʼємну зону на всій вибірці, мертвий назавжди; завеликий крок убиває половину шару непомітно для метрик;
- вихідний шар живе за іншим правилом: сигмоїда для бінарної задачі, softmax для взаємовиключних класів, нічого для регресії;
- ініціалізація має бути випадковою й правильного масштабу: нулі не ламають симетрію, великі ваги насичують, Xavier тримає дисперсію для tanh, He — для ReLU.
Далі курс іде двома продовженнями, і обидва спираються саме на цю тему. Тема про оптимізатори бере градієнт, який ми щойно навчились доводити до першого шару, і питає, що з ним робити: чистий крок, момент, адаптивна швидкість, Adam. Там зʼясується, що адаптивні методи частково лікують і залишкове затухання, бо нормують крок на власну історію градієнта — але лише частково, і саме тому активація лишається важливішою за оптимізатор. Тема про регуляризацію зайде з іншого боку: dropout, weight decay і нормалізація по батчу. Остання прямо продовжує розділ 09 — вона робить те саме вирівнювання дисперсії, тільки не один раз на старті, а на кожному кроці навчання, і саме тому мережі з нею значно менш чутливі до ініціалізації.
А головний висновок теми варто сформулювати ширше за нейромережі. Двічі в цій лекції ми
бачили один і той самий сюжет: величина, яка множиться сама на себе багато разів, або гасне
до нуля, або вибухає, і третього не дано — рівно одиниця досягається тільки навмисним
проєктуванням. Похідна активації множиться L разів у зворотному проході.
Дисперсія активацій множиться L разів у прямому. Обидві половини теми — про
те, як утримати добуток біля одиниці. Побачивши цю схему один раз, ти впізнаватимеш її
у всьому глибокому навчанні: у залишкових зʼєднаннях, у нормалізаціях, у трюках із
масштабуванням уваги.
practice.ipynb ти намалюєш усі шість
активацій разом із похідними, зміряєш норму градієнта на кожному з десяти шарів для сигмоїди,
tanh і ReLU (затухання буде видно таблицею), порахуєш мертві нейрони при семи різних кроках
навчання, порівняєш пʼять ініціалізацій за дисперсією активацій по шарах і нарешті навчиш
ту саму мережу двічі — з нулів і з He. Перша не зрушить із місця жодною вагою.Далі в темі
Теорію прочитано. Тепер закріпи її на практиці.