🧠 Машинне навчання · Глибоке навчання
📅 Березень 2026 ⏱ ≈ 9 хв читання 🟡 Середній · Останнє оновлення: 23 червня 2026 р.

Як навчаються нейронні мережі

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

Архітектура: шари та ваги

Нейронна мережа складається з шарів нейронів. Кожне з'єднання між нейронами має вагу (число, зазвичай від −1 до 1), а кожен нейрон має зсув (bias). Навчання повністю зводиться до пошуку правильних значень для цих чисел.

x₁
x₂
x₃
Вхідний
h₁
h₂
h₃
h₄
Прихований
ŷ₁
ŷ₂
Вихідний

Мережа з nin входами та nh прихованими нейронами має матрицю ваг W розмірності [nh × nin] для першого шару та вектор зсувів b розмірності [nh]. Другий шар має власну матрицю ваг та зсуви.

Типова невелика мережа для класифікації зображень (MNIST, 28×28 пікселів) з одним прихованим шаром зі 128 нейронів має 784×128 + 128 + 128×10 + 10 = 101 770 ваг. GPT-4 має, за оцінками, 1,8 трильйона.

Прямий прохід: обчислення прогнозу

Щоб зробити прогноз, ви пропускаєте дані через мережу зліва направо. Для одного прихованого шару обчислення таке:

h = activate( W₁ · x + b₁ )
ŷ = W₂ · h + b₂

Де · — це множення матриці на вектор. У Python/NumPy це буквально записується так:

import numpy as np # Один прямий прохід (один зразок, batch_size=1) h = relu(W1 @ x + b1) # розмірність: [n_hidden] y_hat = W2 @ h + b2 # розмірність: [n_out]

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

Функції активації

Без функції активації будь-який стек лінійних шарів еквівалентний одному лінійному шару — незалежно від глибини. Ви могли б згорнути всю мережу в одне множення матриць.

Функції активації вносять нелінійність, що дозволяє мережі апроксимувати будь-яку функцію, а не лише лінійні.

ReLU (Rectified Linear Unit)

ReLU(x) = max(0, x)

Найпоширеніша. Просто видає 0 для від'ємних входів та x для додатних. Дуже швидка в обчисленні й не страждає від затухання градієнтів у неглибоких та середніх мережах.

Сигмоїда

σ(x) = 1 / (1 + e−x)

Стискає вихід до (0, 1). Використовується у вихідному шарі для бінарної класифікації (ймовірність того, що відповідь — «так»).

Softmax

softmax(xᵢ) = exᵢ / Σⱼ exⱼ

Як сигмоїда, але для кількох класів. Перетворює логіти на розподіл ймовірностей, сума якого дорівнює 1. Використовується у вихідному шарі для багатокласової класифікації.

Функції втрат: вимірювання похибки

Функція втрат (або функція вартості) вимірює, наскільки помилковим є прогноз. Навчання полягає в мінімізації цього числа.

Середньоквадратична похибка (MSE) — для регресії

L = (1/N) × Σ (yᵢ − ŷᵢ)²

Середній квадрат різниці між передбаченими та фактичними значеннями. Піднесення до квадрата суворіше штрафує великі похибки.

Перехресна ентропія — для класифікації

L = −Σ yᵢ × log(ŷᵢ)

Вимірює різницю між передбаченим розподілом ймовірностей та істинним. Якщо мережа впевнена на 99% і має рацію, втрати → 0. Якщо впевнена на 99% і помиляється, втрати → ∞.

Чому не використовувати просто точність? Точність не є диференційовною — зміна ваги на крихітну величину зазвичай взагалі не змінює точності (ви або отримуєте правильну відповідь, або ні). Функції втрат, як-от перехресна ентропія, змінюються плавно з кожним крихітним коригуванням ваги, а саме це й потрібно градієнтному спуску.

Зворотне поширення: ланцюгове правило

Зворотне поширення обчислює, наскільки кожна вага вплинула на втрати — тобто градієнт ∂L/∂wᵢⱼ для кожної ваги. Це робиться ефективно за допомогою ланцюгового правила з математичного аналізу.

Ланцюгове правило стверджує: якщо y залежить від u, а u залежить від x, то:

∂y/∂x = (∂y/∂u) × (∂u/∂x)

Для мережі з шарами L₁ → L₂ → L₃ → Втрати ми обчислюємо градієнти, рухаючись назад:

  1. Обчислюємо ∂Loss/∂L₃ (градієнт втрат щодо виходу)
  2. Множимо на ∂L₃/∂L₂ (за ланцюговим правилом через ваги шару 3)
  3. Множимо на ∂L₂/∂L₁ (ланцюгове правило через шар 2)
  4. Продовжуємо до кожної ваги в мережі

Сучасні бібліотеки, як-от PyTorch, використовують автоматичне диференціювання (autograd) — граф обчислень відстежується під час прямого проходу, а градієнти обчислюються точно шляхом його обходу у зворотному напрямку. Вам ніколи не доводиться писати ланцюгове правило вручну.

# Крок навчання в PyTorch optimizer.zero_grad() # очистити старі градієнти y_hat = model(x) # прямий прохід loss = criterion(y_hat, y) # обчислити втрати loss.backward() # зворотне поширення: обчислити всі ∂L/∂w optimizer.step() # оновити ваги

Градієнтний спуск та оптимізатори

Коли ми маємо градієнт ∂L/∂w для кожної ваги, ми трохи зсуваємо ваги в напрямку, що зменшує втрати:

w ← w − η × ∂L/∂w

Де η (ета) — це швидкість навчання — наскільки великий крок ми робимо. Завеликий: проскакує мінімум. Замалий: триває вічно.

SGD → Adam → AdamW

Повний цикл навчання

for epoch in range(NUM_EPOCHS): for x_batch, y_batch in dataloader: # 1. Прямий прохід predictions = model(x_batch) # 2. Обчислити втрати loss = loss_fn(predictions, y_batch) # 3. Зворотний прохід (обчислити градієнти) optimizer.zero_grad() loss.backward() # 4. Оновити ваги optimizer.step() # 5. Оцінити на валідаційному наборі val_loss = evaluate(model, val_loader) print(f"Epoch {epoch}: train={loss:.4f} val={val_loss:.4f}")

Один прохід через всі навчальні дані називається епохою. Мережі зазвичай навчаються 10–100 епох. Кожна епоха використовує весь набір даних малими випадковими пакетами (градієнтний спуск за міні-пакетами) для ефективності.

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

Спробуйте самі

🧠 Відкрити «Нейронна мережа» →

Джерела