Перейти к содержанию

Обучение DSAC: Boeing 747 — ступенчатое воздействие

Этот производственный скрипт обучает агента DSAC для управления по ступенчатому воздействию продольной динамикой Boeing 747. Используется подход curriculum learning для постепенного увеличения сложности задачи.

Обзор

Аспект Описание
Задача Отработка ступенчатого воздействия (угол тангажа θ)
Среда ImprovedB747VecEnvTorch (векторизованная, GPU-ускорение)
Парадигма обучения Многоэтапное curriculum learning
Сохранение Лучший чекпоинт по результатам оценки

Зачем curriculum learning?

Управление по ступенчатому воздействию со строгими метриками качества (малое перерегулирование, быстрое установление) создаёт разреженный ландшафт наград. Прямое обучение на целевой задаче часто не работает, потому что:

  1. Агент учится завершать эпизод раньше, чтобы не накапливать отрицательные награды
  2. Большие разрывы в наградах дестабилизируют обучение критика
  3. Агент никогда не видит успешных траекторий для обучения

Curriculum решает эти проблемы:

  1. Этап 0 (Bootstrap): Обучение с наградой tracking — плотная, гладкая обратная связь
  2. Этап 1a: Переключение на step_response с ослабленными порогами (20% перерегулирование, 5% полоса установления)
  3. Этап 1b: Ужесточение порогов до целевых значений (5% перерегулирование, 1% полоса)
  4. Этап 2: Удаление бонусов за завершение/ранний выход для робастности

Запуск

python example/reinforcement_learning/deep_rl/train_dsac_b747_step_response.py

Мониторинг обучения через TensorBoard:

tensorboard --logdir runs

Структура скрипта

train_dsac_b747_step_response.py
├── load_dsac_checkpoint()     # Возобновление с предыдущего запуска
├── find_latest_metrics()      # Автопоиск лучшего чекпоинта
├── make_reference()           # Генерация ступенчатого сигнала
├── eval_one_episode()         # Оценка одного эпизода
├── save_eval_best()           # Управление чекпоинтами
└── main()                     # Curriculum обучения

Ключевые гиперпараметры

Векторизованная среда

env_train = ImprovedB747VecEnvTorch(
    num_envs=128,              # Параллельные среды
    dt=0.1,                    # Шаг времени (с)
    tn=20.0,                   # Длительность эпизода (с)
    auto_reset=True,           # Авто-сброс при завершении
    include_reference_in_obs=True,  # Задание видимо агенту
    reward_mode="tracking",    # Начальный режим (переключается позже)
    step_randomization={       # Рандомизация домена
        "amplitude_deg_range": (-5.0, 5.0),
        "step_time_sec_range": (1, 15),
    },
)

Агент DSAC

agent = DSAC(
    env_train,
    batch_size=256,
    memory_capacity=1_000_000,
    learning_starts=100_000,   # Большой буфер перед обучением
    updates_per_step=4,        # Несколько шагов градиента на шаг среды
    lr=4.4e-4,
    gamma=0.995,               # Высокий дисконт для длинных эпизодов
    tau=0.005,
    num_quantiles=8,           # Квантили IQN
    embedding_dim=64,
    hidden_layers=[64, 64],
    automatic_entropy_tuning=True,
    reward_clip=50.0,          # Обрезка больших штрафов
)

Этапы curriculum

Этап 0: Bootstrap с наградой tracking

env_train.reward_mode = "tracking"
agent.train_vector(total_steps=10_000, ...)

Зачем: Плотный сигнал награды помогает агенту освоить базовое управление до столкновения с разреженными метриками step_response.

Этап 1a: Ослабленный step response

env_train.reward_mode = "step_response"
env_train.overshoot_limit_ratio = 0.2   # Допустимо 20%
env_train.settle_band_ratio = 0.05      # 5% полоса
env_train.w_overshoot = 50.0            # Мягкий штраф

Зачем: Постепенный переход к целевой задаче без перегрузки агента штрафами.

Этап 1b: Полный step response

env_train.overshoot_limit_ratio = 0.05  # Допустимо 5%
env_train.settle_band_ratio = 0.01      # 1% полоса
env_train.w_overshoot = 300.0           # Сильный штраф

Зачем: Финальная сложность задачи со строгими требованиями качества.

Этап 2: Удаление формирования

env_train.completion_bonus = 0.0
env_train.early_termination_penalty_per_step = 0.0

Зачем: Проверка, что политика работает без искусственных наград формирования.

Предотвращение «хаков» раннего завершения

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

  1. Бонус за завершение: +5.0 за выживание до конца эпизода
  2. Штраф за ранний выход: -1.0 за каждый оставшийся шаг
  3. Обрезка наград: Ограничение экстремальных штрафов для стабилизации
completion_bonus = 5.0
early_term_penalty_per_step = 1.0
agent.reward_clip = 20.0

Чекпоинты

Скрипт поддерживает две директории чекпоинтов:

  1. best_checkpoints/: Лучший во время обучения (по скользящей награде)
  2. best_eval/: Лучший на фиксированном эпизоде оценки
# После каждого этапа
m = eval_one_episode(agent, env_eval_step)
if m["return_sum"] > eval_best:
    save_eval_best(agent, eval_best_dir, metrics=m)

Возобновление обучения

Скрипт автоматически находит и возобновляет с последнего чекпоинта best_eval:

resume_metrics = find_latest_metrics(Path("runs"))
if resume_checkpoint_dir is not None:
    agent = load_dsac_checkpoint(resume_checkpoint_dir, env_train, device=device)

Советы

GPU-ускорение

Установите device="cuda" для значительного ускорения. Векторизованная среда работает на GPU.

Сброс буфера воспроизведения

При переключении с tracking на step_response буфер сбрасывается, чтобы не смешивать несовместимые масштабы наград.

Использование памяти

При memory_capacity=1_000_000 и num_envs=128 ожидайте ~4-8 ГБ памяти GPU.

См. также