Глава 10: Промышленные применения
«Разрыв между рабочим результатом на эталонной задаче и рабочим промышленным внедрением — это не разрыв в алгоритмах, а разрыв в понимании данных.»
От эталонов к промышленности
Предыдущие девять глав (главы 1–9) выстроили полный инструментарий: поведенческое клонирование, CQL, IQL, MOPO, MOReL, физическое формирование награды, гибридные динамические модели и Лагранжиан. Каждый алгоритм проверялся на ThermalProcessEnv — простой, чистой, трёхпеременной игрушечной среде, спроектированной так, чтобы алгоритмические идеи были наглядными.
Реальные промышленные процессы отличаются от этой среды по всем значимым параметрам.
Больше переменных, сильнее связи. В реальном процессе нанесения покрытий десятки датчиков. Даже в упрощённой модели есть температура, доля наполнителя, вязкость, объёмная плотность и уровень в буферном баке — пять переменных с физическими зависимостями между всеми ними. Уровень — интегрирующее состояние, которое дрейфует без активного управления; вязкость — нелинейная функция температуры и наполнителя, которую агент не может наблюдать независимо от своих действий.
Неравномерное покрытие данных. Промышленные логи — не данные случайного исследования. Процесс 60% времени работает вблизи рабочей точки, периодически совершает плановые изменения уставных значений и иногда испытывает возмущения. Датасет плотный вблизи номинального режима и разреженный везде остальное. Агент, хорошо работающий в плотной зоне и плохо — в разреженной, бесполезен на практике.
Запаздывание и задержки. В модели уравнение наполнителя использует $u_{f,t-2}$: действие по потоку в момент $t$ влияет на долю наполнителя в момент $t+2$ (двухшаговая транспортная задержка при $\Delta t = 1$). Чистая модель первого порядка, игнорирующая эту задержку, даёт систематические ошибки предсказания при изменении скорости подачи.
Жёсткие физические ограничения. Операционные лимиты — не предпочтения, а паспортные характеристики оборудования, регуляторные требования или границы безопасности. Политика, нарушающая границы вязкости, может вызвать кавитацию насоса. Политика, допускающая переполнение буферного бака, расходует материал и запускает автоматическое отключение.
В этой главе разбирается полный кейс на анонимизированном пятипеременном процессе нанесения покрытия. Цель — не ввести новые алгоритмы (всё использованное здесь разработано в главах 1–9), а показать, как они компонуются в реалистичной постановке и какие промышленно-специфичные решения возникают на пути.
📄 Полный код:
chapter10.py
Процесс нанесения покрытия
Среда
CoatingProcessEnv моделирует непрерывную термическую линию нанесения покрытия с пятью переменными состояния и двумя управляющими входами.
Состояние $s \in \mathbb{R}^5$ (все нормированы к $[0,1]$):
| Индекс | Переменная | Физический смысл |
|---|---|---|
| $s_0$ | temperature |
Температура процесса в зоне нанесения |
| $s_1$ | filler_fraction |
Доля наполнителя в смеси |
| $s_2$ | viscosity |
Вязкость смеси — нелинейная функция $T$ и наполнителя |
| $s_3$ | density |
Объёмная плотность материала |
| $s_4$ | level |
Уровень в буферном баке — интегрирующая динамика |
Действия $a \in [-1,1]^2$:
| Индекс | Действие | Эффект |
|---|---|---|
| $a_0$ | heat_input |
Изменение уставного значения нагревателя |
| $a_1$ | flow_input |
Изменение скорости подачи наполнителя |
Истинная динамика (неизвестна агенту):
Параметры: $\tau_T = 12$, $K_T = 0.85$, $\tau_f = 8$, $K_f = 0.90$, $\Delta t = 1$. В коде управляющие входы: $a[0]$ (нагрев, $u_{T,t}$), $a[1]$ (поток, $u_f$).
Три вещи намеренно скрыты от физической модели агента: 1. Член перекрёстной связи $0.03 f_t u_T$ в уравнении температуры 2. Двухшаговая транспортная задержка в уравнении наполнителя 3. Квадратичный член $0.12 f(1-T)$ в зависимости вязкости
Это представляет разрыв между инженерными знаниями из первых принципов и реальностью.
Функция награды целит в температуру, долю наполнителя и стабильность уровня:
с уставными значениями $T^*=0.60$, $f^*=0.50$, $L^*=0.50$.
Жёсткие ограничения (нарушение = необратимый ущерб оборудованию или аварийная остановка):
| Переменная | Нижняя граница | Верхняя граница |
|---|---|---|
| temperature | 0.35 | 0.85 |
| filler fraction | 0.20 | 0.75 |
| viscosity | 0.10 | 0.90 |
| density | 0.30 | 0.80 |
| level | 0.15 | 0.85 |
class CoatingProcessEnv:
STATE_DIM = 5
ACTION_DIM = 2
T_TARGET = 0.60
F_TARGET = 0.50
LEVEL_TARGET = 0.50
BOUNDS = [
(0.35, 0.85), # temperature
(0.20, 0.75), # filler_fraction
(0.10, 0.90), # viscosity
(0.30, 0.80), # density
(0.15, 0.85), # level
]
TAU_T, TAU_F = 12.0, 8.0
K_T, K_F = 0.85, 0.90
DT = 1.0
Почему переменная уровня — самая сложная
Первые четыре переменные состояния саморегулируются: если нагреватель отключить, температура в конечном счёте вернётся к окружающей. Переменная уровня интегрирует: у неё нет естественного уставного значения. Предоставленная сама себе, она дрейфует в направлении дисбаланса потоков. Управление интегрирующим состоянием требует от агента предсказания знака и величины собственного долгосрочного эффекта — именно то, с чем Offline RL испытывает трудности при разреженных данных вблизи граничных ограничений.
Это не надуманная трудность. Буферные баки, промежуточные силосы и накопительные ёмкости — интегрирующие элементы практически в каждом непрерывном производственном процессе.
Датасет: операционные режимы
Промышленные данные распределены неравномерно. collect_industrial_dataset симулирует три режима, характерных для реальных исторических логов:
Нормальная работа (60% эпизодов): процесс работает вблизи уставных значений. Политика поведения — пропорциональный регулятор с умеренным исследовательским шумом. Это основной массив данных — область, где все алгоритмы покажут приемлемые результаты.
Переходы к новой уставной точке (25%): эпизоды начинаются вдали от номинальной точки. Более высокий шум, смещённые начальные состояния. Эти переходы проверяют способность агента вернуть процесс к уставному значению, а не просто поддерживать его.
Возмущения (15%): необычные начальные условия — в частности, возмущения уровня, когда буферный бак начинается намного ниже нормы. Именно в этих эпизодах наиболее вероятны нарушения ограничений и наиболее ценна физическая модель.
dataset = collect_industrial_dataset(
n_episodes=400,
episode_len=100,
noise_scale=0.30,
regime_split=(0.60, 0.25, 0.15),
)
Такое распределение создаёт характерный промышленный дисбаланс: обученные агенты будут редко сталкиваться со сценариями возмущений при оценке, но должны правильно их обрабатывать. Агент, обученный только на данных нормальной работы, будет систематически недообучен для 15% ситуаций, которые важнее всего.
Оценка: промышленные метрики
Стандартные RL-метрики — суммарная награда, нормированная оценка — недостаточны для промышленной оценки. IndustrialEvaluator вычисляет пять метрик, значимых на практике.
Направленная точность (DA)
DA измеряет, двигалась ли управляемая переменная в сторону своего уставного значения на каждом шаге, независимо от расстояния. Политика, всегда двигающаяся в правильном направлении, но медленно, имеет DA = 1.0. Политика, систематически толкающая переменные в неправильную сторону, имеет DA < 0.5 (хуже случайного).
DA часто более информативна, чем RMSE в промышленных условиях: - Медленную политику с DA ≈ 1.0 можно ускорить, настроив масштабирование действий - Быстрая политика с DA ≈ 0.4 требует фундаментального переобучения - Операторы могут визуально верифицировать DA по трендовым графикам без численного анализа
RMSE и частота нарушений ограничений
RMSE от уставного значения вычисляется по каждой переменной:
Частота нарушений ограничений — доля временны́х шагов, на которых хотя бы одна переменная состояния выходит за жёсткие границы. Тяжесть измеряет среднюю величину нарушения при условии возникновения нарушения:
class IndustrialEvaluator:
"""
Вычисляет: reward_mean, reward_std, T_rmse, f_rmse, level_rmse,
da_T, da_f, da_mean, constraint_viol_rate,
constraint_viol_severity
"""
def evaluate(self, agent) -> Dict[str, float]:
for ep in range(self.n_episodes):
obs = self.env.reset(seed=8000 + ep)
while not done:
prev_T, prev_f = obs[env.STATE_T_IDX], obs[env.STATE_F_IDX]
s_t = torch.FloatTensor(
(obs - self.s_mean) / self.s_std).unsqueeze(0)
act = agent.policy.act(s_t, deterministic=True)
obs, r, done, info = self.env.step(act)
# Направленная точность
da_T = 1.0 if (obs[env.STATE_T_IDX]-prev_T)*(env.T_TARGET-prev_T) >= 0 else 0.0
da_f = 1.0 if (obs[env.STATE_F_IDX]-prev_f)*(env.F_TARGET-prev_f) >= 0 else 0.0
# Отслеживание ограничений
viol = info['constraint_violation'] # сумма превышений границ
Физическая модель
Известная физика для процесса нанесения покрытия закодирована в coating_physics_fn. Она реализует отклики первого порядка и баланс масс в точности, но не включает перекрёстную связь, транспортную задержку и нелинейность вязкости:
def coating_physics_fn(state: torch.Tensor,
action: torch.Tensor) -> torch.Tensor:
T, f, L = state[:, 0], state[:, 1], state[:, 4]
heat_in = action[:, 0] * 0.5 + 0.5
flow_in = action[:, 1] * 0.5 + 0.5
T_new = (1 - DT/TAU_T) * T + (DT/TAU_T) * K_T * heat_in
f_new = (1 - DT/TAU_F) * f + (DT/TAU_F) * K_F * flow_in
# Линеаризованная вязкость (истинная — нелинейная)
v_new = (0.75 - 0.45*T_new + 0.38*f_new).clamp(0.0, 1.0)
d_new = (0.55 + 0.25*f_new - 0.10*T_new).clamp(0.0, 1.0)
# Баланс масс — хорошее приближение истинной динамики уровня
inflow = flow_in * 0.4
outflow = L * 0.35 - 0.05 * heat_in # больше тепла → меньше отток (по истинной динамике)
L_new = (L + DT * (inflow - outflow)).clamp(0.0, 1.0)
return torch.stack([T_new, f_new, v_new, d_new, L_new], dim=1)
Перед обучением гибридного ансамбля необходимо запустить diagnose_physics_coverage, чтобы убедиться в ценности физической модели:
ensemble.diagnose_physics_coverage(norm_dataset)
# Ожидаемый вывод:
# Покрытие физической модели (доля объяснённой дисперсии):
# измерение 0 (temperature): 91.3% ██████████████████░░
# измерение 1 (filler_fraction): 83.7% ████████████████░░░░
# измерение 2 (viscosity): 64.2% ████████████░░░░░░░░
# измерение 3 (density): 79.8% ████████████████░░░░
# измерение 4 (level): 93.1% ██████████████████░░
# В среднем: 82.4%
Среднее покрытие выше 80% означает, что остаточной сети нужно выучить поправку с 20%-амплитудой — примерно в четыре раза меньшей ёмкости, чем у чистой чёрноящичной модели при той же точности предсказания.
Алгоритм 1: Поведенческое клонирование
BC — это базовый уровень: напрямую клонировать политику поведения. Режим отказа на промышленных данных предсказуем — накопительная ошибка в ходе переходов уставных значений и возмущений, когда агент встречает состояния, которых не видел при обучении.
bc = CQLBCAgent(STATE_DIM, ACTION_DIM, device=device)
train_bc(bc, loader, n_epochs=60)
DA у BC будет высоким в эпизодах нормальной работы (политика поведения была компетентным пропорциональным регулятором) и низким при восстановлении после возмущений. Нарушения ограничений редки при нормальной работе и часты при возмущениях — именно в сценариях, для которых BC был наименее обучен.
Алгоритм 2: CQL
CQL (глава 4) добавляет консерватизм через штраф за значения Q вне распределения. На промышленных данных он стабильно превосходит BC в сценариях возмущений, поскольку пессимистическая Q-функция предотвращает выбор действий, которые выглядят хорошо под обученным Q, но редки в датасете.
cql = CQLAgent(STATE_DIM, ACTION_DIM, alpha_cql=1.0, device=device)
train_cql_agent(cql, loader, n_epochs=80)
Оставшаяся слабость CQL: у него нет механизма избегания физически несогласованных действий. Уставное значение, которое Q-функция CQL оценивает высоко, всё равно может нарушать баланс масс или толкать уровень к граничному ограничению.
Алгоритм 3: CQL + физическое формирование награды
PhysicsInformedCQL оборачивает CQLAgent с PhysicsRewardWrapper (глава 9). Изменение обучающего цикла — ровно одна строка: заменить пакетную награду r на r - penalty перед вызовом CQLAgent.update.
constraints, lambdas = make_coating_constraints(dataset, device)
class PhysicsInformedCQL:
def update(self, batch):
s, a, r, s2, d = [x.to(self.device) for x in batch]
with torch.no_grad():
penalty = sum(
lam * g(s, a, s2)
for g, lam in zip(self.constraints, self.lambdas)
)
return self.cql.update((s, a, r - penalty, s2, d))
lambdas калибруются через calibrate_lambda по эвристике из главы 9 (Часть I, «Выбор $\lambda$»): $\lambda$ устанавливается так, чтобы типичное нарушение физики стоило около 10% среднего дохода за эпизод.
Три ограничения активны: 1. Операционные границы — все пять переменных состояния в жёстких лимитах 2. Согласованность первого порядка для температуры — $|T_{t+1} - T^{phys}_{t+1}| \leq 0.04$ 3. Согласованность первого порядка для наполнителя — аналогично
Ограничения согласованности не наказывают агента за выбор необычных уставных значений — они наказывают динамическую модель за предсказание физически невозможных переходов, что косвенно ограничивает политику оставаться в областях, где динамика предсказуема.
Алгоритм 4: HybridMOReL
HybridMOReL объединяет модельно-основанный подход из главы 8 с гибридной динамической моделью из главы 9. Структура — двухфазный обучающий цикл.
Фаза 1 — Обучение динамики:
hm = HybridMOReL(
state_dim = STATE_DIM,
action_dim = ACTION_DIM,
physics_fn = coating_physics_fn,
n_ensemble = 4,
hidden_dim = 128,
halt_thresh = 0.15,
)
hm.train_dynamics(norm_dataset, n_epochs=30)
# Вывод:
# Диагностика физического покрытия: 82.4% — сильное
# Обучение гибридного ансамбля: 4 модели × 30 эпох
# ✓ HybridEnsemble установлен в MOReL
После обучения гибридный ансамбль устанавливается в агент MOReL заменой morel_agent.ensemble. Генератор развёрток MOReL (generate_synthetic_data) продолжает вызывать ensemble.predict_with_uncertainty — он не знает и не заботится о том, чёрноящичный ансамбль или гибридный.
Фаза 2 — Обучение политики через MOReL:
train_morel(
agent = hm.morel_agent,
dataset = norm_dataset,
env = env, # реальная среда только для оценки
n_outer_iters = 15,
sac_steps_per_iter = 300,
)
Конструкция P-MDP в MOReL применяет штраф HALT всякий раз, когда неопределённость ансамбля превышает halt_thresh. С гибридным ансамблем оценки неопределённости лучше откалиброваны: в OOD-областях, где у остаточной сети нет обучающих данных, физический член сохраняет физически обоснованное предсказание вместо произвольного. Это сокращает число ложных событий HALT, вызванных чистым чёрноящичным ансамблем, выдающим бессмысленные предсказания в физически достижимых, но малоданных состояниях.
Результаты
Запуск полного бенчмарка:
results = run_industrial_benchmark(
device = 'cpu',
n_train_ep = 400,
n_bc_epochs = 60,
n_cql_epochs = 80,
n_morel_iters= 15,
n_eval_ep = 20,
)
Типичный вывод (точные числа зависят от случайного зерна):
══════════════════════════════════════════════════════════════════
ГЛАВА 7 — РЕЗУЛЬТАТЫ ПРОМЫШЛЕННОГО БЕНЧМАРКА
══════════════════════════════════════════════════════════════════
Метрика BC CQL CQL+Phys HybridMOReL
──────────────────────────────────────────────────────────────────
Reward (mean) -18.4 -14.2 -13.8 ▶ -12.1
DA (mean) 61.3% 71.8% 73.4% ▶ 79.2%
DA temperature 64.1% 73.5% 75.1% ▶ 81.3%
DA filler 58.4% 70.1% 71.6% ▶ 77.1%
T RMSE 0.0921 0.0712 0.0698 ▶ 0.0581
f RMSE 0.1043 0.0834 0.0811 ▶ 0.0693
Level RMSE 0.0874 0.0748 0.0701 ▶ 0.0612
Violation rate 4.2% 2.8% ▶ 1.1% 1.9%
══════════════════════════════════════════════════════════════════
Интерпретация результатов
BC работает удовлетворительно при нормальной работе, но отказывает при возмущениях. DA чуть выше 60% — лучше случайного, но ниже промышленного порога в 80%. Нарушения ограничений возникают потому, что BC никогда не видел переменную уровня вблизи её границ в ходе обучения.
CQL улучшает все метрики. Консерватизм Q-функции предотвращает худшие ошибки экстраполяции. Но частота нарушений остаётся 2.8% — у CQL нет механизма специфического избегания граничных ограничений.
CQL+Physics снижает нарушения до 1.1% — наименьший показатель среди безмодельных методов. Штраф в награде делает приближение к граничным ограничениям явно дорогостоящим в ходе обучения. DA улучшается умеренно — физические ограничения действуют как форма неявной регуляризации, удерживающей политику в физически осмысленных областях.
HybridMOReL достигает наилучшей награды и наивысшего DA. Модельно-основанные развёртки дают политике более разнообразный обучающий опыт, чем один реальный датасет. Гибридный ансамбль делает эти развёртки физически согласованными. Частота нарушений (1.9%) чуть выше, чем у CQL+Physics, поскольку MOReL фокусируется на максимизации награды в P-MDP без явного штрафа за ограничения.
Комплементарная структура
Результаты показывают комплементарную структуру, которую важно понять.
CQL+Physics — минимизатор нарушений: явно штрафует приближение к ограничениям и достигает наименьшей частоты нарушений. Но использует только реальные данные — синтетического опыта ноль.
HybridMOReL — максимизатор производительности: модельно-основанные развёртки толкают политику к более высокой награде и DA, но без явных штрафов за ограничения частота нарушений чуть выше.
В реальном внедрении естественная комбинация — HybridMOReL + физическое формирование награды: использовать гибридную модель для разнообразных синтетических развёрток И применять штраф за ограничения ко всем наградам (реальным и синтетическим). Это однострочное изменение в train_hybrid_morel_agent — передать PhysicsRewardWrapper в генератор развёрток. Глава 9 показала именно это.
Инженерные решения
Работа с этим кейсом выявляет несколько решений, которые не появляются в статьях по эталонным задачам.
Проблема транспортной задержки
Уравнение наполнителя имеет двухшаговую задержку: входное воздействие агента в момент $t$ влияет на долю наполнителя в момент $t+2$, а не $t+1$. Физическая модель игнорирует эту задержку — предсказывает немедленный отклик первого порядка.
Это означает, что остаточная нейросеть гибридного ансамбля должна выучить эффект задержки из данных. При достаточном количестве переходов это возможно. Признак несоответствия задержки — систематический остаток, положительный когда flow_input недавно увеличился и отрицательный когда уменьшился. Если diagnose_physics_coverage показывает низкое покрытие для измерения наполнителя (ниже 60%), вероятная причина — немоделированная задержка.
Решение явное: дополнить состояние последними $k$ значениями flow_input и позволить физической модели их учитывать. Инженерные знания, необходимые — только приближённая длина задержки; точное значение выучивается из остатка.
Калибровка ограничений
make_coating_constraints использует calibrate_lambda для ограничения операционных границ и устанавливает $\lambda = 2.0$ вручную для ограничений согласованности первого порядка. Ручные значения — разумные отправные точки, которые стоит верифицировать:
# Проверить частоту нарушений ограничений на обучающем датасете
for g, lam in zip(constraints, lambdas):
violations = g(s_train, a_train, s2_train)
print(f" λ={lam:.2f} | нарушения: {(violations > 0).float().mean():.1%} "
f"| средняя величина: {violations.mean():.5f}")
Если ограничение нарушается более чем на 20% обучающих переходов, либо допуск слишком жёсткий, либо физическая модель неточна для этой переменной. В обоих случаях увеличение допуска или ослабление ручного $\lambda$ лучше, чем ужесточение ограничения — ограничение, срабатывающее слишком часто, становится вторым сигналом награды, а не физической коррекцией.
Нормировка 5-мерного состояния
Пять переменных с разными физическими масштабами и дисперсиями требуют нормировки по каждому измерению. Предоставленная функция normalize_dataset нормирует состояния к нулевому среднему и единичной дисперсии по каждому измерению. Награда масштабируется по стандартному отклонению, но не центрируется — награда структурно неположительна (сумма отрицательных квадратов ошибок), поэтому ноль — осмысленная «идеальная» отметка; при переменной длине эпизодов и флагах done постоянное смещение накапливается по-разному.
Безопасный RL, детекция дрейфа и резервная политика
Внедрение офлайн RL политики в производство — не разовое событие. Процесс со временем меняется; политика обучена на фиксированном датасете и не умеет адаптироваться. В этом разделе — три промышленные практики, которые закрывают этот разрыв: безопасный RL (ограничения и safety critics), детекция дрейфа (когда не доверять политике) и резервная политика (fallback) (что делать в этом случае).
Безопасный RL при внедрении
В главах 9 и 10 уже используются физически обоснованные штрафы за ограничения и жёсткие границы: политика обучается избегать областей, где ограничения нарушаются. Это даёт ожидаемое соблюдение ограничений — нарушения редки, но не гарантированно равны нулю.
Для более высокой уверенности в промышленности релевантны два направления:
- Safety critics (см. главу 13): обучают отдельную safety Q-функцию, оценивающую риск будущего нарушения ограничений. Политика затем ограничивается так, чтобы сохранять это safety-значение выше порога (например, Conservative Safety Critics, CVPO). Это даёт вероятностные сертификаты безопасности, а не эвристические штрафы.
- Маскирование действий / безопасные множества: на каждом шаге перед применением действия RL проверять, не приближает ли оно состояние к границе ограничения. Если предсказанное следующее состояние (по физической или гибридной модели) нарушает границу, заменить действие безопасной альтернативой: например, ограничить консервативным множеством или переключиться на ПИД, который только подводит к уставке без агрессивных шагов. Особенно полезно, когда основная политика модельная (HybridMOReL): тот же ансамбль, что генерирует rollout’ы, может предсказывать $s'$ и помечать небезопасные действия.
Ни тот ни другой подход не отменяют калибровку ограничений выше; они добавляют второй уровень проверок при внедрении.
Детекция дрейфа
Сдвиг распределения — главная причина деградации офлайн политики: текущее распределение состояний (и возможно наград) уходит от обучающего. Износ оборудования, изменение состава сырья, сезонность или новые режимы работы могут это вызывать. У политики нет механизма детекции — его нужно добавить.
Простые сигналы дрейфа:
- Статистики состояний: отслеживать среднее и ковариацию состояния (или низкоразмерного представления) по скользящему окну (например, последние 24 часа). Сравнивать с теми же статистиками по обучающему датасету. Если текущее среднее сдвинулось на несколько стандартных отклонений или расстояние Махаланобиса до обучающего распределения превышает порог — помечать дрейф.
- Плотность / OOD-оценка: обучить модель плотности (например, гауссовская смесь, normalizing flow или ядерная оценка) на обучающих состояниях. В рантайме вычислять лог-плотность текущего состояния (или короткой траектории). Если оценка падает ниже выбранного квантиля обучающих оценок — считать ситуацию вне распределения.
- Разброс ансамбля: при использовании ансамбля динамики (например, HybridMOReL) высокая дисперсия предсказания означает эпистемическую неопределённость — модель не видела похожих состояний. Использовать ту же логику
halt_thresh: при неопределённости выше порога считать состояние «ушедшим» относительно того, на чём обучалась модель.
Что делать при детекции дрейфа: снижать доверие к RL-политике. Варианты: (1) переключиться на резервную политику (ниже); (2) масштабировать действие RL (смешивать с безопасным базовым); (3) запустить проверку человеком или алерт; (4) запланировать переобучение на исторических и свежих данных внедрения. В дорожной карте главы 13 рекомендуется переобучать, когда доля наблюдений вне обучающего распределения превышает примерно 5–10%.
Резервная офлайн RL политика (Fallback)
Резервная политика (fallback) — безопасный вариант по умолчанию, когда основная RL-политика считается ненадёжной: после детекции дрейфа, при предсказанном или наблюдённом нарушении ограничения или при неопределённости выше порога.
Выбор fallback:
- Поведенческое клонирование (BC) на том же датасете — естественный выбор: остаётся близко к историческому поведению и реже даёт экстремальные действия. Слабость — накопление ошибки в OOD-состояниях; но если fallback используется только когда состояние уже помечено как OOD или неопределённое, консерватизм BC часто приемлем.
- ПИД или правило-based контроллер: ручной ПИД, подводящий к уставке, или небольшой набор правил безопасности (например, «если уровень > 0.8 — уменьшить поток») даёт интерпретируемое, предсказуемое поведение. Он не улучшает поведенческую политику, но избегает катастрофической экстраполяции RL.
- Консервативная офлайн RL: политика, обученная с сильной консервативностью (например, CQL с большим $\alpha$ или IQL с узким фильтром преимуществ), может служить fallback: меньшая награда, чем у основной политики, но безопаснее при её ненадёжности.
Логика переключения (пример):
- На каждом шаге: вычислять показатель дрейфа и (при наличии) неопределённость ансамбля.
- Если показатель дрейфа и неопределённость ниже порогов: использовать основную политику (например, CQL+Physics или HybridMOReL).
- Иначе: использовать резервную политику (BC или ПИД).
- Опционально: при наблюдённом нарушении ограничения принудительно использовать fallback следующие $K$ шагов или до возврата в безопасную область.
Так система использует лучшую политику, когда распределение совпадает с обучающим, и автоматически откатывается к безопасной офлайн или классической политике, когда нет. Вместе с периодическим переобучением (глава 13) детекция дрейфа и fallback делают офлайн RL применимым в промышленности, где процесс эволюционирует, а безопасность не подлежит обсуждению.
Итог
Эта глава перевела инструменты из глав 1–9 в реалистичный промышленный pipeline. Процесс нанесения покрытия ввёл два вызова, отсутствующих в игрушечной среде: интегрирующую переменную уровня и транспортную задержку в динамике наполнителя. Оба потребовали инженерных знаний — в физической модели или в спецификации ограничений.
Сравнение четырёх алгоритмов выявляет чёткую иерархию:
| Алгоритм | На чём строится | Сильная сторона | Слабость |
|---|---|---|---|
| BC | Имитация данных | Простой, интерпретируемый | Накопительная ошибка; без физики |
| CQL | Консервативные Q-значения | Лучшее OOD-обобщение | Нет механизма ограничений |
| CQL+Physics | CQL + штраф | Наименьшая частота нарушений | Только реальные данные |
| HybridMOReL | Модельный + гибридный | Лучшая награда и DA | Чуть выше частота нарушений |
Практическая рекомендация для промышленного внедрения: начинайте с CQL+Physics (низкая частота нарушений, просто конфигурировать, не нужна динамическая модель), и если производительность по награде недостаточна, добавляйте гибридный ансамбль как источник разнообразного синтетического опыта.
Глава 11 переходит к интерпретируемости: как с помощью SHAP исследовать Q-функцию, политику и модель динамики обученного агента, чтобы оператор понимал — а аудитор мог подтвердить — почему агент выбрал то или иное действие.
Ссылки
- Все ссылки из глав 1–9 применимы к использованным здесь алгоритмам.
- Åström, K.J., & Wittenmark, B. (2013). Computer-Controlled Systems. Dover. (ПИД-регулятор, модели первого порядка)
- Seborg, D.E., Edgar, T.F., Mellichamp, D.A., & Doyle, F.J. (2016). Process Dynamics and Control. Wiley. (промышленное управление процессами, транспортная задержка)
- Rawlings, J.B., Mayne, D.Q., & Diehl, M. (2017). Model Predictive Control. Nob Hill. (MPC как контекст сравнения)