Залізне правило теми. Щоразу, коли ти змінюєш формули зворотного проходу — додаєш активацію, шар, регуляризацію, — ти зобовʼязаний прогнати чисельну перевірку градієнта заново. Без неї жоден рівень не зараховується.
рівень 1Рівень 1 — База
Дослідь швидкість навчання й ширину мережі.
- Візьми мережу з практики й навчи її з кроками
0.01, 0.1, 1.0, 5.0, 30.0. Побудуй усі криві втрат на одному графіку в логарифмічній шкалі. - Навчи мережу з
прихованих_нейронів= 1, 2, 3, 4, 8 і для кожної намалюй межу рішень.
Зроблено, якщо: - на графіку кроків видно три різні режими: «не встигає», «робоче плато», «пилка або вибух», і кожен підписаний конкретним значенням $\eta$; - названо мінімальну кількість нейронів, при якій межа замикається навколо внутрішнього кола, і показано картинку «на один нейрон менше» для порівняння; - одним реченням пояснено, чому один нейрон принципово не може розвʼязати цю задачу.
рівень 2Рівень 2 — Плюс
Додай ReLU і порівняй її з tanh чесно.
- Розшир
прямий_прохідізворотний_прохідтретім режимом"relu": активаціяnp.maximum(0, z), похідна(z > 0). Зверни увагу: для похідної тепер потрібенZ1, а неA1— подумай чому. - Прогони чисельну перевірку градієнта для ReLU. Вона має дати похибку того ж порядку, що й для tanh.
- Порівняй швидкість збіжності tanh і ReLU на одному графіку втрат.
- Порахуй, скільки нейронів «померло» після навчання — тобто для скількох
нейронів
Z1 <= 0на всіх навчальних обʼєктах.
Зроблено, якщо:
- перевірка градієнта для ReLU проходить, і відносна похибка виписана в зошиті;
- на графіку видно, яка активація збігається швидше при однаковому кроці;
- названо кількість мертвих нейронів при $\eta = 1$ і при $\eta = 10$, і сказано,
чому більший крок їх убиває;
- пояснено, чому для похідної ReLU треба саме Z1, а для похідної tanh вистачає A1.
рівень 3Рівень 3 — Виклик
Перепиши мережу на довільну кількість шарів і відтвори затухання градієнта.
- Заміни чотири окремі змінні (
W1, b1, W2, b2) на списки матриць і зсувів, щоб архітектура задавалась списком розмірів, наприклад[2, 6, 6, 6, 1]. Прямий прохід стає циклом уперед, зворотний — циклом назад. - Перевір градієнт чисельно на мережах із трьома й чотирма прихованими шарами.
- Побудуй мережу з 12 прихованих шарів по 6 нейронів, зроби один прямий і один
зворотний прохід і намалюй норму градієнта на кожному шарі в логарифмічній шкалі —
окремо для
sigmoid,tanhіrelu.
Зроблено, якщо: - чисельна перевірка проходить для обох глибин (виписані обидві похибки); - побудовано графік «норма градієнта на шарі» з трьома лініями та підписаними осями; - на графік нанесено теоретичну оцінку $0.25^{L-l}$ для сигмоїди, і показано, що реальні значення лягають на неї; - виписано число: у скільки разів ослаб градієнт на першому шарі порівняно з останнім для кожної з трьох активацій.
Підказки
- Похідна tanh рахується з самого значення функції: $\tanh'(z) = 1 - \tanh^2(z)$,
тому достатньо
A1. Похідна ReLU залежить від знака входу, аA1уже втратила інформацію про те, наскільки від'ємним бувz. - Якщо чисельна перевірка для ReLU дає велику похибку — перевір, чи не потрапила якась вага рівно в точку $z = 0$. Там похідної не існує, і центральна різниця чесно про це повідомляє. Зсунь ініціалізацію іншим зерном.
- Крок $h = 10^{-5}$ — робочий компроміс. Менший крок погіршує результат:
у чисельнику віднімаються майже однакові числа, і похибка округлення
float64починає рости швидше, ніж падає похибка апроксимації. - Для затухання градієнта норму зручно брати від градієнта ваг шару:
np.linalg.norm(градієнти_шару). Щоб порівняння було чесним, ініціалізуй усі шари однаково й дивись на відношення до останнього шару, а не на абсолют. - Мережу з багатьма шарами зручно зберігати як список словників:
[{"W": ..., "b": ...}, ...]. Тоді зворотний цикл — це простоfor шар in reversed(...).