Q-навчання у безперервному просторі станів: від таблиць пошуку до Deep Q-Networks
Класичне Q-навчання зберігає одне число для кожної пари (стан, дія) у таблиці — чудово для сітки 5×5, але безнадійно для маятника на візку (класичний тестовий стенд керування: жердина, яку потрібно втримати вертикально на рухомому візку) з 4-вимірним неперервним станом чи роботизованої руки з неперервними кутами суглобів. Рішення — замінити таблицю апроксиматором функції, а історія того, як цю ідею змусили надійно працювати, — це історія Deep Q-Networks.
Чому табличне Q-навчання ламається
Класичне оновлення Q-навчання уточнює таблицю 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 апроксимується лінійною комбінацією ваг:
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-помилка стає функцією квадратичних втрат, мінімізованою градієнтним спуском:
θ⁻ = параметри цільової мережі, зафіксовані на багато кроків (див. нижче)
У принципі це «просто» 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-навчання з неперервними станами
- Atari та відеоігри: оригінальний бенчмарк DQN — сирі пікселі кадрів як неперервний, високовимірний стан.
- Робототехнічне керування: кути суглобів та швидкості як неперервний стан, хоча неперервні дії зазвичай штовхають до методів actor-critic (DDPG, SAC).
- Симулятори автономного водіння: показники сенсорів і динаміка автомобіля як неперервний стан для політик утримання смуги руху та уникнення зіткнень.
- Рекомендаційні системи: ембеддінги користувача як неперервний стан, дискретний вибір елемента як дія.
- Розподіл ресурсів / планування: неперервні сигнали навантаження чи довжини черги, що керують дискретними рішеннями про розподіл.
🤖 Дослідити навчання з підкріпленням наживо
Спостерігайте, як агент навчається політики методом проб, помилок і винагород — від табличних Q-таблиць до апроксимації функцій