Основи машинного навчання — градієнтний спуск, зворотне поширення та нейронні мережі з нуля

Кожна нейронна мережа — це просто композиція матричних множень і нелінійностей, натренована градієнтним спуском. Ця стаття розкриває математику — SGD, momentum, Adam, ланцюгове правило зворотного поширення, перехресну ентропію softmax — і пов'язує кожне поняття з інтерактивною симуляцією.

1. Градієнтний спуск

Машинне навчання зводиться до однієї універсальної задачі: знайти вектор параметрів θ, який мінімізує скалярну функцію втрат L(θ). Градієнтний спуск робить це, повторно роблячи крок у напрямку найшвидшого спадання:

SGD та його варіанти

Звичайний SGD: θ ← θ − η · ∇L(θ)

Momentum (метод важкої кульки):
  v ← β v − η · ∇L(θ)
  θ ← θ + v

Adam (адаптивні моменти):
  m ← β₁ m + (1−β₁) g   (момент 1-го порядку)
  v ← β₂ v + (1−β₂) g²  (момент 2-го порядку)
  θ ← θ − η · m̂ / (√v̂ + ε)

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

2. Зворотне поширення — застосування ланцюгового правила

Зворотне поширення — це не що інше, як ланцюгове правило диференціювання, систематично застосоване до обчислювального графа. Для втрати L = f(g(x)):

Ланцюгове правило — прямий і зворотний прохід

Прямий прохід: z¹ = W¹x + b¹, a¹ = σ(z¹), z² = W²a¹ + b², ŷ = softmax(z²)
Втрата: L = −Σ yᵢ log ŷᵢ (перехресна ентропія)

Зворотний прохід: ∂L/∂W² = (∂L/∂ŷ)(∂ŷ/∂z²)(∂z²/∂W²) = (ŷ − y)ᵀ · a¹
∂L/∂W¹ = (W²ᵀ δ²) ⊙ σ′(z¹) · xᵀ  (де δ² = ŷ − y)

Ключова ідея: градієнти течуть назад через кожен шар, кожного разу множачись на локальний якобіан. З активацією ReLU (σ′ = 0 або 1) градієнт або проходить без змін, або обнуляється — це водночас джерело ефективності та причина патології "згасання ReLU" (dying ReLU).

// Мінімальне зворотне поширення для двошарової мережі (псевдокод JavaScript)
function backward(x, y, W1, W2, b1, b2) {
  // Прямий прохід
  const z1 = matMul(W1, x).add(b1);
  const a1 = relu(z1);
  const z2 = matMul(W2, a1).add(b2);
  const yHat = softmax(z2);

  // Градієнт вихідного шару (softmax + перехресна ентропія спрощуються гарно)
  const dz2 = yHat.sub(y);                    // (C × 1)
  const dW2 = matMul(dz2, a1.T);             // (C × H)

  // Градієнт прихованого шару
  const da1 = matMul(W2.T, dz2);             // (H × 1)
  const dz1 = da1.mul(reluGrad(z1));         // поелементна похідна ReLU′
  const dW1 = matMul(dz1, x.T);             // (H × D)

  return { dW1, dW2, db1: dz1, db2: dz2 };
}

3. Інтуїція згорткових шарів

Згортковий шар ковзає невеликим ядром (наприклад, 3×3) по вхідних даних. Кожна позиція дає одне скалярне значення шляхом обчислення скалярного добутку між вагами ядра та локальним рецептивним полем. Це спільне використання параметрів — повторне застосування того самого ядра в кожній позиції — надає згортковим мережам (CNN) інваріантність до зсуву і різко зменшує кількість параметрів порівняно з повнозв'язними альтернативами.

4. Навчання з підкріпленням та еволюція

Алгоритми одним поглядом

Стохастичний градієнтний спуск Оптимізатор Adam Зворотне поширення Ланцюгове правило Softmax перехресна ентропія ReLU / Tanh Згорткові шари Q-навчання Градієнт політики Генетичний алгоритм Карта Кохонена Нечистота Джині CART

Чому ReLU працює краще за сигмоїду? Сигмоїда насичується на рівнях 0 і 1 — градієнти зникають для великих активацій (проблема "згасаючого градієнта"). ReLU лінійна для додатних входів, тож градієнти проходять без зменшення. Варіанти на кшталт Leaky ReLU (нахил 0.01 для x < 0) та GELU (гаусова лінійна одиниця похибки, що використовується в трансформерах) вирішують проблему "згасання ReLU", коли нейрони назавжди видають нуль.