Навчання з підкріпленням · Керування
📅 Липень 2026 ⏱ ≈ 12 хв читання 🎯 Просунутий рівень · Останнє оновлення: 9 липня 2026 р.

Q-навчання у безперервному просторі станів: від таблиць пошуку до Deep Q-Networks

Класичне Q-навчання зберігає одне число для кожної пари (стан, дія) у таблиці — чудово для сітки 5×5, але безнадійно для маятника на візку (класичний тестовий стенд керування: жердина, яку потрібно втримати вертикально на рухомому візку) з 4-вимірним неперервним станом чи роботизованої руки з неперервними кутами суглобів. Рішення — замінити таблицю апроксиматором функції, а історія того, як цю ідею змусили надійно працювати, — це історія Deep Q-Networks.

Коротко: Стаття пояснює, чому класичне Q-навчання, яке зберігає значення в таблиці, не працює для неперервних станів (наприклад, позиції чи швидкості), і як заміна таблиці апроксиматором функції вирішує цю проблему. Розглянуто tile coding, лінійну апроксимацію функцій, Deep Q-Networks, а також буфер відтворення досвіду та цільову мережу, що стабілізують навчання DQN.

Чому табличне Q-навчання ламається

Класичне оновлення Q-навчання уточнює таблицю Q(s, a) у напрямку спостережуваної винагороди плюс найкраще досяжне майбутнє значення:

Q(s, a) ← Q(s, a) + α [ r + γ·max_a' Q(s', a') − Q(s, a) ]
α = темп навчання, γ = коефіцієнт дисконтування, s' = наступний стан

Це вимагає відвідування кожної пари (s, a) багато разів, щоб отримати точну оцінку. Коли стан неперервний — позиція, швидкість, кут суглоба — станів нескінченно багато, тож жоден стан ніколи не відвідується двічі, і таблиця ніколи не може збігтись. Гірше того, таблиця дає нульову генералізацію: навчання про стан (1.001, 0.5) нічого не каже про майже ідентичний стан (1.002, 0.5).

Tile coding: дешева дискретизація простору

Класичне дешеве рішення — tile coding: накласти кілька зсунутих сіток («тайлінгів») на неперервний простір станів. Кожен тайлінг активує рівно один тайл на стан, а вектор ознак стану — це конкатенація one-hot індикаторів тайлів усіх тайлінгів. Близькі стани поділяють більшість активних тайлів, що дає грубу, але ефективну генералізацію безкоштовно.

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

Лінійна апроксимація функції

Маючи вектор ознак φ(s, a) з tile coding (або будь-який ручний базис), Q апроксимується лінійною комбінацією ваг:

Q(s, a; w) = wᵀφ(s, a)
w ← w + α [ r + γ·max_a' Q(s', a'; w) − Q(s, a; w) ] · φ(s, a)
Градієнт лінійної функції — це просто сам вектор ознак

Це те саме правило TD-помилки, що й у табличному Q-навчанні, лише застосоване до ваг замість комірок таблиці — і це було найсучаснішим підходом до неперервного керування (з tile coding, RBF або базисами Фур'є) десятиліттями до глибокого навчання.

Deep Q-Networks: нейронна Q-функція

Deep Q-Networks (Mnih et al., 2015) замінюють вручну сконструйований вектор ознак нейронною мережею Q(s, a; θ), яка навчається власних ознак наскрізно з сирого вхідного стану (пікселі, кути суглобів тощо). TD-помилка стає функцією квадратичних втрат, мінімізованою градієнтним спуском:

L(θ) = E[ ( r + γ·max_a' Q(s', a'; θ⁻) − Q(s, a; θ) )² ]
θ⁻ = параметри цільової мережі, зафіксовані на багато кроків (див. нижче)

У принципі це «просто» Q-навчання з градієнтним спуском замість правила оновлення для кожної ваги. На практиці ж підключення нейронної мережі напряму до наївного циклу Q-навчання розходиться майже одразу — знадобилося два інженерні трюки, щоб зробити це стабільним.

Буфери відтворення та цільові мережі

ПроблемаРішенняЧому це працює
Корельовані даніБуфер повторного відтворення досвідуСемплувати випадкові минулі переходи замість послідовних, руйнуючи часову кореляцію, що порушує припущення i.i.d. позаду SGD
Рухома цільОкрема цільова мережа θ⁻Заморозити цільове значення на тисячі кроків, щоб мережа не переслідувала ціль, що зсувається щооновлення
Зміщення переоцінкиDouble DQNОбирати найкращу дію онлайн-мережею, оцінювати її цінність цільовою мережею — відокремлює вибір від оцінки
Варіативність масштабу винагородиОбрізання / нормалізація винагородиУтримує градієнти в узгодженому діапазоні для середовищ з дуже різними масштабами винагород

Без буфера відтворення та цільової мережі Q-функція ганяється за власним хвостом: кожен крок градієнта змінює саму ціль бутстрепу, і вся система може осцилювати або розходитись замість того, щоб збігатись.

Мінімальне оновлення DQN на JavaScript

function dqnUpdate(onlineNet, targetNet, batch, gamma = 0.99) {
  let loss = 0;
  for (const { s, a, r, sNext, done } of batch) {
    const qValues = onlineNet.forward(s);
    const qNextTarget = done ? 0 : Math.max(...targetNet.forward(sNext));
    const tdTarget = r + gamma * qNextTarget;
    const tdError = tdTarget - qValues[a];

    loss += tdError * tdError;
    onlineNet.backwardStep(s, a, tdError); // крок градієнта лише для Q(s,a)
  }

  // Періодично копіювати (жорстко або з Polyak-усередненням) online → target
  if (onlineNet.step % 1000 === 0) targetNet.copyFrom(onlineNet);
  return loss / batch.length;
}
Дослідження середовища: Q-навчанню з неперервними станами все одно потрібне явне дослідження, найчастіше ε-жадібне (випадкова дія з ймовірністю ε, що спадає протягом навчання) — сама нейронна мережа не дає дослідження безкоштовно.

Де застосовується Q-навчання з неперервними станами

🤖 Дослідити навчання з підкріпленням наживо

Спостерігайте, як агент навчається політики методом проб, помилок і винагород — від табличних Q-таблиць до апроксимації функцій

Відкрити симуляцію →