Открытый исследовательский проект

NES
PLAYER

Два исследовательских трека: честное обучение по пикселям и звуку — и планирование на точной динамике самого эмулятора, открыто привилегированное. Агент честного трека видит экран и слышит звук — ровно то же, что человек. Узнаёт объекты по движению, читает счётчики прямо с картинки, строит модель мира и планирует. Память эмулятора для игры закрыта: только пиксели и звук.

ЗАГРУЗКА NES PLAYER...
ВИДЕО .......... OK
ЗВУК ........... OK
ТРЕКЕР ......... OK
МОДЕЛЬ МИРА .... OK

ПЕРВОЕ ЗНАКОМСТВО:
CASTLEVANIA .... 700 ОЧКОВ
СЛУЧАЙНЫЙ ...... 0 ОЧКОВ

ГОТОВ_
700очков на игре, которую агент видит впервые; случайный агент — ноль
371/384парных сидов за планировщиком: четыре игры, один планировщик, ноль тюнинга
16.5 МБвся модель целиком: зрение, слух и решение
3 ОСmacOS, Linux и Windows через WSL2 — обучение и игра на обычном ноутбуке
Главный принцип

Никакой телеметрии. Только то, что видно и слышно.

Память эмулятора закрыта для политики и служит лишь эталоном при проверке гипотез. Проверяется это тестом, а не обещанием: одни и те же кадры с подменённой телеметрией обязаны давать тот же след действий. До того как тест появился, совпадало 48.9%; теперь 100%. Смерть агент видит по экрану — 12 из 12 без ложных срабатываний на 34 200 кадрах, — объекты выделяет по движению, звуковые события по спектру.

ВИДЕО + ЗВУК
ОБЪЕКТЫ + СОБЫТИЯ
МОДЕЛЬ МИРА
ПЛАНЕР
ГЕЙМПАД
Замеренные результаты

Что проверено числом

Всё получено на этом проекте и воспроизводится скриптами из scripts/experiments/. Отрицательные результаты приведены наравне с положительными.

ZERO-SHOTHONEST · ПИКСЕЛИ + ЗВУК

Первое знакомство с игрой

Castlevania, которой не было ни в одном обучении. Инстинкты — 700 очков, случайный агент и перенесённая нейросеть — ноль. Очки агент прочитал с экрана сам, сверка с памятью эмулятора: 700 = 700.

ПЕРЕНОСHONEST · ПИКСЕЛИ + ЗВУК

Few-shot на невиданных играх

Три эпизода на новой игре против обучения с нуля: Gradius 0.707 → 0.787, Battletoads 0.594 → 0.671. На Balloon Fight перенос вредит (−3.5 п.п.) — записано как есть.

ПЛАНЕРPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

С точной динамикой планировщик проходит уровень

Если модель мира заменить самим эмулятором — перематывать консоль сейв-стейтами и смотреть, чем кончится каждый из шести планов, — Mario проходит 1-1 в 20 прогонах из 32 против нуля у реактивной политики. Медиана прогресса 7117 против 787, смертей вдвое меньше. Это не потолок, а лучшая измеренная рука: длиннее хвост, поиск на два шага и оракул, продолжающий сам себя, не проверены.

ЦЕННОСТЬPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

План нельзя оценивать одним будущим

Продолжение играет стохастическая политика, поэтому одна прокрутка даёт случившееся будущее, а не ценность: два замера одного и того же плана расходились на 22 px при разбросе между разными планами 21 px. Усреднение четырёх продолжений подняло медиану планировщика 3121 → 7117 и прохождения 12/32 → 20/32, не меняя ни одного кандидата. Это самая крупная методическая ошибка проекта из найденных.

ПОИСКPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Шум оценки переворачивает знак у поиска

Поиск CEM по словарю макродействий на грязной оценке теряет 2041 px, на чистой приобретает 2168 — тот же поиск, те же сиды. Лучшее из 38 зашумлённых оценок это самый удачливый бросок, а не лучший план. Оговорка: сравнение меняет и шум, и политику продолжения, поэтому проклятие оптимизатора здесь не изолировано, а лишь совместимо с данными.

БАТАРЕЯPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Настоящее, каким мы его умеем описывать, не решает выбор

Семь входов — от двух скаляров до точной геометрии уровня, спрайтов, истории действий и вероятностей самой политики — обучены одинаково и проверены на уровне, которого не видели. Все захватывают одни и те же ~20% per-decision выигрыша планировщика; богатые входы улучшают выбор только среди почти-ничьих. Полезный остаток оказался доступен только через симуляции будущего.

ЭКОНОМИКАPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Половина симуляций — 86% выигрыша

Единственный рычаг, сработавший без обучения: оракул с двумя розыгрышами вместо четырёх держит 86% преимущества при 54% вычислений (медиана 5116 против 7117, 16 прохождений против 20). Кривая компьют↔прогресс измерена в трёх точках, и второй дополнительный пакет симуляций вдвое дороже первого за единицу прогресса.

ШУМОВОЙ ПОЛPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Переход 2→4 розыгрыша не разрешается 32 сидами

Адаптивное правило — эскалация там, где два розыгрыша нестабильны по победителю и пер-точечному шуму — офлайн держит 94% экономии за 69% цены с порогами, замороженными на чужих уровнях, но онлайн дважды показало ноль при +29% вычислений. Перемер на общих случайных числах (каждый розыгрыш сидируется состоянием решения, армы байт-идентичны до первого настоящего расхождения) вскрыл причину: даже «эскалировать всегда против никогда» даёт +254 [−919, +1441] — весь отрезок между фиксированными бюджетами внутри шума. Тонкая экономика меряется только офлайн на сохранённых матрицах.

ПЕРЕНОСPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Четыре игры, один планировщик, ноль тюнинга

Тот же оракул с теми же шестью шаблонами на всех сухопутных уровнях SMB и трёх новых играх: 2-1…6-1 дают +509…+2483, Contra (J) +2270, Contra (U) +2134, Super C +1210 — каждый интервал чисто над нулём, 371 из 384 парных сидов за планировщиком. На Contra политика инертна (ноль на всех сидах), а оракул уходит на девять экранов: B+RIGHT означает «бежать» у Марио и «наступать с огнём» у Contra. У Super C позиции не было в карте вообще — адрес камеры найден сканом RAM за минуты, и метод открывает библиотеку сайдскроллеров по несколько минут на игру.

СВЯЗКИPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Длинные планы токсичны; три связки чинят почти всё

Контроль, которого не хватало двухшаговому поиску: те же пять поведений, растянутые до монолитных 96 кадров, рушат планировщик — −1849 [−2937, −698] к 48-кадровому чемпиону, смертей вдвое. Открытый «run» на 96 кадров — коммит, который ничто не спасёт. Три рукописные пары («разбежаться→прыгнуть», «отойти→прыгнуть») возвращают +1563 [+529, +2564] и равны полному поиску по 25 парам при трети цены — но 48-кадровый горизонт с перепланированием каждые 16 кадров так и остаётся несущим локальным оптимумом.

УРОВЕНЬ ПРОЙДЕНPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Contra: первый уровень с включения, 12 из 32

Тот же планировщик, 32 парных сида, 7000 кадров. До финальной стены доходят 23 из 32, уровень проходят 12 — по счётчику уровня игры, а не по метрике, и одно прохождение проверено по кадрам: взрывы пушек и сенсора, заставка, карточка «AREA 2». Что для этого понадобилось: огонь тапом, а не удержанием (считано со скана консоли), пять композиций таймингов прыжка из выбора двухшагового поиска (обрыв перед стеной plain проходил 5/32, с ними 22/32) и урон стены из таблицы объектов игры — по типу, а не по адресу. Первое заявление о «попаданиях» было ошибкой и снято до этого.

БАЗАPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Contra, второй уровень: первая комната — 17 из 32

Этап без скролла. Шесть целей подряд давали 0/8, и все они работали как задумано; дело оказалось в члене, который молча возвращал ноль — героя теряли, когда он поворачивался к двери, а появление следующего сенсора считалось потерей. Разбор оценок по решениям нашёл это за десять минут. С двумя заметками из мануала («уничтожь сенсор», «дверь в середине») и без единого подобранного числа комната открывается в 17 из 32 прогонов со случайной фазой врагов (ДИ 36–69 %). Один переход проверен по кадрам. Это одна комната, не этап: в следующей солдат снова встаёт в угол.

ПЕРЕДАЧАHONEST · ПИКСЕЛИ + ЗВУКPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Клон, обученный на прохождениях, впервые играет в Contra

Дистилляция выбора планировщика провалилась в пяти ролях — это измерено и остаётся в силе. Но когда планировщик начал проходить первый уровень, появились данные, которых раньше не существовало: двенадцать доигранных до конца прогонов. Клон обучен на них тем же рецептом, что и прежний, — изменились только данные. Играя только по пикселям и звуку, без планировщика и перемоток, он идёт с медианы 0 до 1952 на 32 сидах, разница +1719 [+1516, +1895], 32 победы из 32; бежит по мосту, прыгает через воду, стреляет. Двенадцать обучающих сидов входили в тридцать два оценочных, поэтому отдельно: на двадцати невиданных — медиана 1996 и +1722 [+1475, +1923], 20 из 20. Оговорки: знание принадлежит учителю, а до учителя далеко — тот проходит уровень в 12 случаях из 32, клон ни в одном. И точность снова ничего не предсказала: играющий клон обходит базовый уровень большинства на 5.5 пункта, а неподвижный обходил свой на 56. Первое объяснение — «дело в новых командах, включая диагональ» — проверено абляцией и снято: клон, обученный на тех же прохождениях с убранными диагоналями, играет так же (−181 [−569, +208]). Несёт выигрыш покрытие состояний и структура удачных траекторий, а не словарь. Установлено это пока для одной игры и двенадцати демонстраций.

ЦЕНА ДЕМОНСТРАЦИИHONEST · ПИКСЕЛИ + ЗВУК

Пятьдесят девять прохождений стоят столько же, сколько шесть

Планировщик отыграл ещё восемьдесят прогонов и дал 59 прохождений; клоны, обученные на вложенных подмножествах 6, 12, 24 и 59, неразличимы: −182 [−415, +34] между концами лестницы. Весь путь от нуля до ~1900 покупает первая горстка, следующие полсотни не покупают ничего.

Ретракция 10 сентября. Первая версия этой карточки называла −83 [−247, +71]. Те числа были получены на схлопнутых данных: cp -R каталог/ куда/ на macOS копирует содержимое каталога, поэтому эпизоды перезаписали друг друга и каждая ступень училась на одном эпизоде. Вывод при перепроверке устоял, измерение — нет.

ПЕРЕУЧИВАНИЕHONEST · ПИКСЕЛИ + ЗВУК

Вторая и третья эпохи покупают дисперсию, а не умение

Следующий шаг напрашивался сам: записывать демонстрации там, где клон ломается. Планировщик перехватывал управление у вставшего клона, спасения уходили в обучение. На одном обучении смесь дала +278 пикселей, на трёх — −240. Разгадка нашлась, когда каждая эпоха обучения стала играть отдельно: среднее по шести обучениям от эпох не растёт (1736 → 1753 → 1507), а разброс между обучениями растёт вчетверо — с 340 пикселей после первой эпохи до 1527 после третьей. Клон, дававший 1885 после одной эпохи, к третьей был доучен до 563, пока функция потерь спокойно падала.

На одной эпохе, где прибор не шумит, спасения стоят +169 [−107, +445] по шести обучениям, в плюсе пять из шести. Ноль внутри, так что это зацепка, а не результат. Первые три сида сошлись на +221, +277, +239 — именно это согласие и делало результат убедительным; три свежих дали −355, +382, +252. Три совпавших числа — не подтверждение, а частое совпадение.

ЧТО ДЕРЖИТ ЧЕСТНЫЙ ТРЕКHONEST · ПИКСЕЛИ + ЗВУК

Не глубина сети, а подсказка, куда смотреть

Чтобы узнать цену представления, мы его вынули: политика, где от экрана к кнопкам ведёт один вес на пиксель на действие и больше ничего. Три руки, по шесть обучений, одна эпоха, те же 59 прохождений и те же 32 оценочных сида.

Пиксели напрямую — 985. Свёртка с выключенным attention — 1288. Свёртка с attention — 1641. Представление стоит +656 [+282, +1031], а attention-лосс — +353 [+180, +526] при шести победах из шести. Это первый результат в проекте, измеренный правильной единицей — обучением, а не оценочным сидом, — и её прошедший. Он же самый ровный из трёх: подсказка, куда смотреть, убирает и разброс между обучениями. Лосс добавили давно, померили один раз и больше не проверяли.

Линейную политику можно не зондировать, а посмотреть: её веса складываются обратно в картинку. И шестой подряд раз точность копирования не предсказала игру — рука без attention фитится лучше всех и играет хуже.

СКОЛЬКО ПОДСКАЗКИHONEST · ПИКСЕЛИ + ЗВУК

Кривая выходит на полку ровно там, где стояло умолчание

Вес attention никогда не выбирался измерением: 1.0 когда-то поставили, и он прижился. Четыре веса, по шесть обучений, те же демонстрации и те же 32 оценочных сида.

0 → 1288, 0.5 → 1493, 1.0 → 1641, 2.0 → 1636. Первая половина веса приносит +204 [+67, +342] при шести победах из шести; вторая от шума не отличима; удвоение сверх единицы не приносит ничего и вдвое расширяет разброс между обучениями, 138 против 309.

Тот же мотив, что и с числом эпох: если давить член сильнее, чем он хочет, среднее почти не меняется, а лотерея расширяется. Менять нечего — но теперь умолчание стоит на измерении, а не на наследстве. «Нечего менять» тоже результат, если альтернативой было продолжать не знать.

СКАНЫPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕTRAINING / AUDIT ONLY · RAM

Все низкоуровневые числовые входы Contra находятся автоматически

Кнопки и тап/удержание — каузальным сканом; шаблоны — из него; камера или 8-битный скролл — по согласию с картинкой; таблицы объектов с HP — стрельбой (HP считается вниз мелкими шагами, тип обнуляется одним куском); спрайты героя — по тому, какие движутся с кнопкой; счётчик секций — по затемнениям между комнатами в двух прогонах (один переход пропускает свободно бегущий таймер). Человеческим остался мануал: что уничтожать и где выход.

БЕЗ АДРЕСОВPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕTRAINING / AUDIT ONLY · RAM

Rush'n Attack: игра, в которой не прописано ничего

Позиция — из скана камеры (у игры только 8-битный скролл без старшего байта; кандидаты ранжируются по согласию с реальным сдвигом картинки), шаблоны — из каузального скана кнопок (нож по тапу, вперёд = RIGHT). Планировщик +145 px [+124, +166], 32 из 32 парных сидов, на смерть меньше на прогон. Цена игры: два скана по несколько минут и ноль человеческих минут в контуре.

ОТКАТPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Перемотка назад проигрывает композиции

Гипотеза «ошибка сделана раньше, чем видно за 144 кадра»: при обречённости всех кандидатов отматывать консоль на 16, 32, 64 кадра и перепланировать с растущим горизонтом. На обрыве Contra: plain 1/8, откат 0/8 и 0/8, откат с окном композиций 5/8, двухшаговый поиск везде 8/8 при той же цене. Спасители отката — стойки; провал был в наборе кандидатов, не в горизонте. Закрыто измерением.

ЗВУКHONEST · ПИКСЕЛИ + ЗВУК

Слух даёт +7 п.п.

Абляция на четырёх сидах из четырёх: звук поверх видео повышает точность предсказания действий. Отдельно связь «звук ↔ кадр»: попадание 25.4% при случайных 1.6%.

ВНИМАНИЕHONEST · ПИКСЕЛИ + ЗВУК

Модель смотрит на объекты

Было 12.5% тепловой карты внутри рамок объектов — хуже случайного взгляда (13.8%). После обучения с подсказкой от трекера 21.5%, на мультиигровой базе 38.0%.

ПОИСКPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Возвращаться туда, куда дошёл

Агент за одну жизнь доходил до 650–720 из 3266 и умирал — остальная игра была территорией, где он не бывал ни разу. Go-Explore помнит достигнутые места и возвращается в них восстановлением состояния эмулятора. Шестьдесят итераций случайных нажатий увели фронтир на 2352, вдвое дальше обученной сети. Полный прогон прошёл 1-1 и 1-2 без смертей.

РАЗМЕТКАHONEST · ПИКСЕЛИ + ЗВУК

На врагов не прыгали в данных

Сеть умирала на первом гумбе, хотя враг был у неё во входе. Причина в разметке: в нашей записи прыжок при враге превышает собственный фон на +1.2 пункта (то есть никак), в экспертном прохождении — на +11.5. Клон честно воспроизвёл наше. Подмешивание эксперта подняло вероятность прыжка в момент контакта с 0.02 до 0.5 и вдвое сократило смерти на этом враге.

ФИЗИКАHONEST · ПИКСЕЛИ + ЗВУК

Застревал, потому что не мог удержать прыжок

Из 117 настоящих застреваний 90 пришлись на первую трубу 1-1 — до 1089 кадров на месте с нажатыми «бег и прыжок». Высота прыжка на NES это длительность удержания A, а политика переспрашивает себя каждый кадр и отпускает кнопку на взлёте. Удержание 32 кадра срезало застревания 114 → 33.

РЕЛЬЕФHONEST · ПИКСЕЛИ + ЗВУК

Яма — единственное смертельное, что не спрайт

Всё, что находит восприятие, движется. Дыра в полу не движется и спрайтом не является, поэтому её для агента не существовало — он входил в неё на бегу. Теперь колонка, низ которой того же цвета, что фон вверху экрана, считается дырой: работает и в небе, и в подземелье.

ОБЪЕКТЫTRAINING / AUDIT ONLY · RAM

Таблица спрайтов вместо догадок

Приставка каждый кадр пересылает видеочипу таблицу из 64 спрайтов. Это даёт точные координаты аппаратных спрайтов в любой игре NES без разметки — но не игровых объектов: объект может состоять из нескольких спрайтов, а препятствия фона (та самая яма) в таблицу не входят. Только для обучения: трекер по движению, которым агент играет, попадает в настоящий спрайт лишь в 31% случаев и пропускает 43% объектов.

ЧТЕНИЕHONEST · ПИКСЕЛИ + ЗВУК

Цифры без разметки

Агент выучивает цифры сам, из динамики счётчиков: у младшего разряда переходы образуют кольцо 0→9. Таймер читается с совпадением 95.8% и корреляцией 1.000.

Игры

Обученные модели

Единый конвейер: инстинкты собирают демонстрации headless, дальше клонирование поведения с подсказкой внимания. Ни одного TAS-мувика. Точность здесь мерит верность копии, а не качество игры — на Mario модель с 0.568 обыгрывает модель с 0.941, потому что старые данные предсказуемы ровно там, где они плохи.

ИГРА                 ТОЧНОСТЬ  СЛУЧАЙНО
Balloon Fight ...... 0.944     0.403
Contra ............. 0.943     0.377
Gradius ............ 0.872     0.449
Double Dragon ...... 0.864     0.318
Super Mario Bros. .. 0.708     0.717 *
Battletoads ........ 0.702     0.430
мультиигровая база . 0.944     0.377

* у Mario данные из TAS: оптимальный проход
  однообразен, потому и «случайно» так высоко_
Что не получается

Открытые задачи, честно

Показывать только победы — значит врать умолчанием.

ГЛАВНОЕPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Уровень проходит планировщик с эмулятором вместо модели

Планировщик, который перематывает консоль, проходит 1-1 в 20 прогонах из 32. Но его «модель мира» — сам эмулятор: он подглядывает в будущее, а не предсказывает его. Обученная оценка на тех же сидах даёт ноль. «Уровень пройден» — да, «агент научился его проходить» — ещё нет.

ОЦЕНКАPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Выучить выбор планировщика не удалось

Предрегистрированный эксперимент с заранее объявленным критерием и замороженными сидами: ученик, обученный имитировать выбор планировщика, проиграл политике −432 px (p=0.0005). Он выучил не решения учителя, а самый безопасный способ ошибаться — «стоять» в 34% решений против 5% у учителя.

ЦЕНА ОШИБКИPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Точный оценщик, ошибающийся в половине решений, бесполезен

Идеальную оценку портили равномерным шумом: при 20% ошибок остаётся треть преимущества, при 50% — +181 из +4590. Ориентир для половины выигрыша — не более 15.7% ошибок. Лучший наш классификатор ошибается в 42% случаев.

ИТОГ ПРОГРАММЫPRIVILEGED · ПЛАНИРОВЩИК НА ЭМУЛЯТОРЕ

Планировщик переносится; дистиллируется не выбор, а траектории

Ученик оценён в пяти ролях — оценщик ценности, выборщик из шести, бинарный gate, DAgger, аллокатор вычислений — и провалил все пять; эпизодическая память по месту проиграла политике шестой. Три механизма показаны порознь: реактивное представление не ранжирует между уровнями, накопление ошибки уводит в дешёвое поведение, а ошибочно выброшенного кандидата не вернуть. Работа переносится на распределение вычислительного бюджета самого планировщика. Дополнение 8 сентября: клонирование удачных траекторий — двенадцати прохождений первого уровня — даёт клону, играющему только по пикселям и звуку, медиану 1952 против нуля, впервые в этой игре. Провал касается выбора планировщика, а не его демонстраций.

ПОТОЛОКHONEST · ПИКСЕЛИ + ЗВУК

Копирование исчерпано

Копия с точностью 0.981 играет не лучше копии с 0.567. Клонирование ограничено тем, кого копируешь, и упёрлось в это.

КОМБИНАЦИИHONEST · ПИКСЕЛИ + ЗВУК

Складывать умения пока не выходит

Прыжок через яму, помощь инстинктов при застревании и обе вместе: −60, −85, −215 к дистанции. Способности сохранены переключателями и меряются сочетаниями, а не выбрасываются.

Масштаб

Проект в цифрах

403записанных эпизода — 6.8 часов игры
229тест, включая регрессию по хэшам кадра и звука
51 869ROM в индексе по контрольным суммам
8 000строк кода, Python 3.14
Контроллер NES: крестовина, SELECT, START, кнопки B и A NES PLAYER SELECT START B A
СОСТОЯНИЕ ПРОЕКТА

[v] Эмулятор headless, детерминизм, регрессия
[v] Синхронная запись видео, звука и кнопок
[v] Клонирование поведения со звуком
[v] Управляемый объект без чтения памяти
[v] Модель мира и планер
[v] Перенос между играми, строгий held-out
[v] Чтение экрана: цифры и подсказки меню
[ ] Дообучение прямо во время игры
[ ] Библиотека переносимых навыков

ДАЛЬШЕ: УЧИТЬСЯ НА ЧУЖИХ ЗАПИСЯХ_