Обучение DSAC: Boeing 747 — слежение за синусоидой¶
Этот скрипт обучает агента DSAC для непрерывного слежения за синусоидальным сигналом угла тангажа Boeing 747. В отличие от ступенчатого воздействия, слежение требует плавного, непрерывного управления для отслеживания изменяющегося во времени задания.
Обзор¶
| Аспект | Описание |
|---|---|
| Задача | Слежение за синусоидой (θ следует за ±1° на 0.05 Гц) |
| Среда | ImprovedB747VecEnvTorch (векторизованная, GPU-ускорение) |
| Парадигма обучения | Многоэтапный curriculum по амплитуде |
| Задание | Фиксированная синусоида: ±1°, f=0.05 Гц, T=20с |
Почему слежение за синусоидой?¶
Слежение за синусоидой проверяет способность агента:
- Следовать за динамическим заданием — не просто установиться на константу
- Выдавать плавное управление — рывки вызывают фазовое запаздывание
- Обрабатывать смену направления — требует упреждающего управления
- Поддерживать точность — малая амплитуда требует тонкого управления
Запуск¶
Скрипт показывает предпросмотр задающего сигнала и ждёт закрытия окна перед началом обучения.
Мониторинг обучения:
Структура скрипта¶
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: Тонкая настройка без исследования¶
Зачем: Убираем остаточный шум исследования для точного слежения.
Режим награды tracking¶
Режим награды tracking даёт плотную обратную связь на каждом шаге:
Где: - \(θ_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), так как среда уже штрафует скорость управления. Включите при появлении рывков.
См. также¶
- Алгоритм DSAC — архитектура и гиперпараметры
- Обучение DSAC (ступенчатое воздействие) — альтернативная задача
- Оценка DSAC — визуализация обученного агента
- Типы сигналов — доступные задающие сигналы