Vierna & Ding
Vierna Vierna
Привет, Дин. Я тут подумала, как нам разработать систему, которая будет играть в новую пошаговую стратегию лучше, чем люди. Какие у тебя мысли по архитектуре?
Ding Ding
Конечно. Начни с модульной структуры: базовый движок, отвечающий за ходы и переходы состояний, слой на основе правил для тактических решений и слой машинного обучения сверху, который учится на игровых сессиях. Представление состояния сделай компактным, чтобы сеть политики быстро обучалась, возможно, с использованием графовых нейронных сетей для отслеживания позиций юнитов. Используй иерархический планировщик: стратегию высокого уровня выбирает политика, а действия низкого уровня уточняются поисковым деревом. Так ты получишь что-то вроде человеческой интуиции, но с преимуществом в производительности. Держи модули независимыми, чтобы потом можно было легко заменить алгоритм обучения.
Vierna Vierna
Звучит неплохо, но ты всё равно слишком много свободы даёшь нижнему слою. Нужно ограничить представление состояния до вектора фиксированного размера — никаких больше графовых сверток, которые взрывают память. Иерархическому планировщику нужна чёткая функция потерь, иначе, если политика продолжает выбирать "по-человечески" ходы, прогресс затормозится. Сделай высокоуровневую стратегию дискретным набором макро-целей с жёсткими ограничениями, а дальше пусть поиск сделает всю основную работу. И не забудь сравнить результаты с чисто правительственной базовой линией на раннем этапе — любое отклонение должно быть измеримым, а не основанным на догадках.
Ding Ding
Да, фиксированный вектор – решение элегантнее, только не потеряй ощущение пространства. Чтобы компенсировать потери, смешай процент побед с штрафом за слишком близкое копирование поведения человека. Определи стратегические цели в зависимости от фазы игры — наступление, оборона, экспансия — и зафиксируй ограничения. Не забывай запускать базовые тесты, чтобы каждая правка была подкреплена конкретными показателями. Если хочешь, могу набросать примерный пайплайн, чтобы всё это связать.
Vierna Vierna
Ладно, давай пропишем. Шаг первый – определяем вектор фиксированного размера: кодируем количество юнитов, запасы ресурсов и 5x5 карту угроз, преобразованную в одномерный массив. Второй шаг – нейронная сеть политики выдает одну из трех глобальных целей на каждый этап; обучаем её с функцией потерь, равной минус логарифм вероятности выигрыша, плюс лямбда, умноженная на сходство с человеческим поведением. Третий шаг – детерминированный поиск по дереву (minimax с альфа-бета) выполняется для низкоуровневых действий в течение 200 миллисекунд на ход, ограниченный глобальной целью. Четвертый шаг – непрерывный буфер воспроизведения, который питает как нейронную сеть политики, так и сеть оценки. Создай отдельного бота, основанного на правилах, для регрессионного тестирования. Это основа – подкручивай лямбду и глубину поиска по своему усмотрению. Если пришлешь мне черновик, я укажу на недочеты.
Ding Ding
Вот черновой вариант, скопируй в файл и подправь. StateVector = {unit_counts, resource_levels, heatmap_5x5_flat} PolicyNetwork(inputs=StateVector) → {macro_goal: attack, defend, expand} Loss = –log(win_rate) + λ * human_similarity LowLevelSearch: minimax(alpha-beta) с ограничением по времени в 200 миллисекунд, отфильтрован в соответствии с макро-целями. ReplayBuffer: непрерывно сохраняет (StateVector, macro_goal, actions, reward, next_state) ValueNetwork: предсказывает ожидаемый win_rate на основе StateVector. BaselineBot: набор вручную созданных правил для регрессионного тестирования. Просто подставь точные размеры и гиперпараметры, а потом поиграй с λ и глубиной поиска. Скажи, если что-то покажется нелогичным или чего-то не хватает.
Vierna Vierna
Мне нравится эта структура, но ей не хватает нескольких важных деталей. Во-первых, нужно определить конкретные размеры вектора состояния – скажем, 20 типов сущностей, 5 контейнеров ресурсов и тепловая карта из 25 ячеек, то есть всего 50 чисел. Дальше, реши, какую сеть будет использовать для политики: два скрытых слоя по 128 нейронов, ReLU, выход softmax для трех целей. Выбери оптимизатор – Adam с learning rate 1e-3, weight decay 1e-5, размер пакета 256 и 10 тысяч шагов на эпоху. λ нужно будет настроить, начни с 0.1 и смотри на показатель сходства с человеком. Для поиска задай minimax ограничению глубины, а не просто 200 миллисекунд, и включи таблицу транспозиций. И, еще, буфер воспроизведения должен использовать приоритетную выборку, чтобы не воспроизводить устаревшие состояния. И последнее: базового бота нужно будет проверить на архиве, где играют люди, чтобы убедиться, что он действительно репрезентативный. Подставь это все, и мы сможем начать обучение.
Ding Ding
Вот как это выглядит в коде: Вектор состояния: 20 типов юнитов + 5 контейнеров ресурсов + тепловая карта из 25 ячеек = 50 чисел с плавающей запятой. Сеть политик: вход 50 → 128 → 128 → 3 softmax. Оптимизатор: Adam, скорость обучения = 0,001, затухание весов = 1e-5, размер пакета = 256, 10 000 шагов на эпоху. Функция потерь λ: сначала 0,1, отслеживать сходство с человеком в отдельном метре. Минимакс: ограниченная глубина (возможно, 4–6 ходов), ограничение по времени 200 мс, использовать таблицу транспозиций. Буфер повторного воспроизведения: приоритетное повторное воспроизведение опыта, сначала выбирать опыт с наибольшей ошибкой TD. Базовый бот: игра против архива игр человека, вычислять процент побед и сходство ходов для проверки. Вот конкретная версия – скажи, что еще нужно доработать.
Vierna Vierna
Выглядит хорошо, но есть несколько моментов: не забудь про четкий план экспериментов для политики – например, эпсилон-жадность или температурное уменьшение – чтобы избежать преждевременной сходимости. И обязательно логируй распределение ошибки временной разницы; если она скачет, то, возможно, твоя приоритетная повторная проигрывание смещена. Для базового бота убедись, что у тебя сбалансированный набор игр с людьми – с разными уровнями мастерства – иначе сравнение win-rate будет искажено. И, в завершение, добавь проверку здравого смысла: каждые 100 тысяч шагов запускай короткий эпизод самообучения и вычисляй win-rate против базового бота; если он падает, значит, что-то не так. Это должно улучшить процесс.