Это проект для создания агента с регулируемым поведением на основе обучения с подкреплением (RL), разработанный в рамках дипломной работы в НГУ (2024-2025 гг). Основной целью проекта является разработка агента с динамически изменяемой сложностью, работающего в среде Doom с использованием древообразной модели. Проект опирается на подходы из работы "Adaptive Incentive Design with Multi-Agent Meta-Gradient Reinforcement Learning", а также использует методы IEM-PPO, описанные в исследовании "Proximal Policy Optimization via Enhanced Exploration Efficiency".
Агент обучается в симулированной среде Doom с доступом к различным параметрам состояния, таким как здоровье и патроны, что позволяет ему адаптироваться и принимать решения на основе текущих условий. Для реализации проекта используются:
- DoomITH — форк VizDoom для создания RL-среды.
- ForwardNetwork — сеть на основе ResNet34 для обработки изображений среды.
- PolicyNetwork — трансформер для генерации политики.
- ValueNetwork — трансформер для оценки ценности состояний.
- IEM-PPO — усовершенствованный метод оптимизации для эффективного обучения.
Проект разрабатывается с перспективой создания клиент-серверной системы с графическим интерфейсом на основе Flask и Kafka.
- DoomITH: Форк библиотеки VizDoom, используемой для создания среды RL.
- IEM-PPO: Алгоритм оптимизации PPO с улучшенной эффективностью исследования среды.
- ForwardNetwork: Модель ResNet34 для обработки изображений из среды.
- PolicyNetwork: Трансформер, отвечающий за генерацию действий на основе текущих состояний.
- ValueNetwork: Трансформер для оценки ценности состояний.
- Flask + Kafka: Используются для реализации клиент-серверного интерфейса и распределенной системы.
Клонируйте репозиторий и перейдите в него:
git clone https://github.com/dolganin/bachelor_degree.git
cd bachelor_degree
Соберите контейнер для фронтенда и сервера
docker-compose up --build -d
Установите необходимые пакеты
sudo apt-get upgrade
sudo apt install g++ gcc
sudo apt install cmake make
sudo apt install libsdl2-dev
sudo apt install libboost-all-dev
Проект имеет следующую структуру:
base/ # Базовые модули
configs/ # Конфигурационные файлы (YAML)
main.py # Основной файл запуска
create_kafka_topic.sh # Скрипт для создания Kafka-топика
ppo_with_curiosity/ # Модули PPO с реализацией любопытства
requirements.txt # Файл зависимостей проекта
runs/ # Директория для сохранения экспериментов
scenarios/ # Doom сценарии для RL среды
server_consumer/ # Модуль для работы с серверной частью
start_services.sh # Скрипт запуска вспомогательных сервисов
utilities/ # Утилиты и вспомогательные скрипты
weights/ # Директория для хранения весов моделей
Основной файл для запуска проекта — main.py
. Он принимает следующие аргументы:
-y, --yaml
: Путь к YAML файлу конфигурации (по умолчаниюppobase_config.yaml
).-r, --runname
: Название папки для сохранения запуска (если не указано, используется имя по умолчанию).-w, --weights
: Путь к весам модели (например,weights/my_model.pt
). Если не указано, будет использоваться путь по умолчанию.-d, --debug
: Включение режима отладки.-t, --test
: Включение тестового режима (только для тестирования модели).--timer
: Время ожидания в секундах (по умолчанию 5).
Пример команды для запуска с указанием всех аргументов:
python main.py --yaml ppobase_config.yaml --runname experiment_1 --weights model_weights --debug --test --timer 10
Конфигурационные параметры Параметры проекта задаются в YAML-файле конфигурации (например, ppobase_config.yaml). Этот файл определяет структуру и гиперпараметры модели, включая архитектуру и параметры IEM-PPO. Образец файла:
learning_parameters:
learning_rate: 0.003 # Скорость обучения модели
discount_factor: 0.96 # Коэффициент дисконтирования будущих наград
train_epochs: 100 # Количество эпох для обучения
replay_memory_size: 5000 # Размер буфера для хранения опыта
batch_size: 128 # Размер батча для оптимизатора
test_episodes_per_epoch: 1000 # Количество эпизодов для тестирования на каждой эпохе
frame_repeat: 96 # Количество кадров, повторяемых для каждого действия
learning_steps_per_epoch: 5000 # Количество шагов обучения за каждую эпоху
weight_decay: 0.007 # Коэффициент регуляризации весов
hidden_dim: 512 # Размерность скрытого слоя нейронной сети
evaluate_every: 4 # Частота оценки модели (через каждые N эпох)
window_size: 100 # Размер окна для усреднения метрик
channels: 3 # Количество каналов во входных данных
ppo_parameters:
clip_param: 0.2 # Параметр обрезки для PPO
lambda_intrinsic: 0.1 # Коэффициент для внутреннего вознаграждения
entropy_coef: 0.1 # Коэффициент энтропии для исследования
clip_epsiolon: 0.2 # Порог обрезки для значений, чтобы избежать больших скачков
embedding_dim: 120 # Размерность эмбеддингов в модели
num_heads: 8 # Количество голов в многоголовой механизме внимания
num_layers: 6 # Число слоев в трансформер-блоке
mlp_dim: 256 # Размерность слоя MLP в трансформере
patch_size: 10 # Размер патча для разделения входных данных
dropout_rate: 0.1 # Вероятность dropout для регуляризации
ex_loss: 0.0 # Дополнительный коэффициент потерь (если есть специфичные потери)
env_parameters:
resolution: [120, 130] # Размер экрана (высота и ширина)
doom_cfg_path: "defend_the_line.cfg" # Путь к файлу конфигурации Doomlearning_parameters: