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

Обучение DSAC: Boeing 747 — слежение за синусоидой

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

Обзор

Аспект Описание
Задача Слежение за синусоидой (θ следует за ±1° на 0.05 Гц)
Среда ImprovedB747VecEnvTorch (векторизованная, GPU-ускорение)
Парадигма обучения Многоэтапный curriculum по амплитуде
Задание Фиксированная синусоида: ±1°, f=0.05 Гц, T=20с

Почему слежение за синусоидой?

Слежение за синусоидой проверяет способность агента:

  1. Следовать за динамическим заданием — не просто установиться на константу
  2. Выдавать плавное управление — рывки вызывают фазовое запаздывание
  3. Обрабатывать смену направления — требует упреждающего управления
  4. Поддерживать точность — малая амплитуда требует тонкого управления

Запуск

python example/reinforcement_learning/deep_rl/train_dsac_b747_tracking.py

Скрипт показывает предпросмотр задающего сигнала и ждёт закрытия окна перед началом обучения.

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

tensorboard --logdir runs

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

train_dsac_b747_tracking.py
├── load_dsac_checkpoint()     # Возобновление с предыдущего запуска
├── find_latest_metrics()      # Автопоиск лучшего чекпоинта
├── make_sine_reference()      # Генерация синусоидального задания
├── save_reference_plot()      # Сохранение PNG с заданием
├── show_reference_plot()      # Отображение задания (блокирующее)
├── eval_one_episode()         # Оценка одного эпизода
├── save_eval_best()           # Управление чекпоинтами
└── main()                     # Curriculum обучения

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

Задающий сигнал

dt = 0.1                    # Шаг времени (с)
tn = 20.0                   # Длительность эпизода (с) — 1 полный период
sine_amplitude_deg = 1.0    # Амплитуда ±1°
sine_frequency_hz = 0.05    # 0.05 Гц = период 20с

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

env_train = ImprovedB747VecEnvTorch(
    num_envs=128,
    dt=dt,
    tn=tn,
    include_reference_in_obs=True,
    reward_mode="tracking",
    step_randomization={
        "signal_type": "sine",
        "amplitude_deg_range": (-1.0, 1.0),
        "frequency_hz_range": (0.05, 0.05),  # Фиксированная частота
    },
)

Агент DSAC

agent = DSAC(
    env_train,
    batch_size=256,
    memory_capacity=500_000,
    learning_starts=256,       # Быстрый старт (tracking даёт плотную награду)
    updates_per_step=4,
    lr=4.4e-4,
    gamma=0.99,
    tau=0.005,
    num_quantiles=8,
    embedding_dim=64,
    hidden_layers=[64, 64],
    automatic_entropy_tuning=True,
    exploration_noise_std=0.0,  # Без дополнительного шума для слежения
    risk_distortion="neutral",
)

Этапы curriculum

Этап 1: Умеренная амплитуда

train_amp_stage1_deg = 1.0
env_train.step_rand.amplitude_deg_range = (-1.0, 1.0)
agent.train_vector(total_steps=20_000, ...)

Зачем: Начинаем с целевой амплитуды для освоения базового поведения слежения.

Этап 2: Согласованная амплитуда

train_amp_stage2_deg = 1.0
env_train.step_rand.amplitude_deg_range = (-1.0, 1.0)
agent.train_vector(total_steps=40_000, ...)

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

Этап 3: Тонкая настройка без исследования

agent.exploration_noise_std = 0.0
agent.train_vector(total_steps=20_000, ...)

Зачем: Убираем остаточный шум исследования для точного слежения.

Режим награды tracking

Режим награды tracking даёт плотную обратную связь на каждом шаге:

\[ r_t = -|θ_t - θ_{ref}| - λ_u |u_t| - λ_{du} |Δu_t| \]

Где: - \(θ_t\) — текущий угол тангажа - \(θ_{ref}\) — задание в момент t - \(u_t\) — управляющий сигнал (руль высоты) - \(Δu_t\) — скорость изменения управления (штраф за негладкость)

Этот плотный сигнал критичен для задач слежения, где задание постоянно меняется.

Отличия от обучения на ступенчатое воздействие

Аспект Ступенчатое воздействие Слежение за синусоидой
Задание Константа после скачка Непрерывно меняется
Режим награды step_response tracking
Фокус curriculum Перерегулирование/установление Фазовое запаздывание/амплитуда
Learning starts 100,000 (разреженно) 256 (плотно)
Memory capacity 1,000,000 500,000

Чекпоинты

Как и для ступенчатого воздействия — две директории:

  • best_checkpoints/: Скользящий лучший во время обучения
  • best_eval/: Лучший на фиксированной оценке синусоиды

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

Автоматическое возобновление с последнего best_eval/metrics.json:

resume_metrics = find_latest_metrics(Path("runs"))
# Ищет: runs/dsac_b747_sine_tracking_*/best_eval/metrics.json

Советы

Частота имеет значение

Частота 0.05 Гц (период 20с) достаточно низкая для динамики B747. Более высокие частоты требуют меньшего dt и могут превысить полосу пропускания актуатора.

Предпросмотр задания

Скрипт блокируется для показа задающего сигнала. Закройте окно matplotlib для продолжения обучения.

Оценка во время обучения

После каждого этапа скрипт оценивает на фиксированной синусоиде и сохраняет при улучшении. Следите за best_eval/metrics.json.

Регуляризация CAPS

Для слежения CAPS отключён (caps_lambda_smoothness=0.0), так как среда уже штрафует скорость управления. Включите при появлении рывков.

См. также