Глава 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 Изменение скорости подачи наполнителя

Истинная динамика (неизвестна агенту):

$$T_{t+1} = \left(1 - \frac{\Delta t}{\tau_T}\right)T_t + \frac{\Delta t}{\tau_T} K_T u_T + \underbrace{0.03 \cdot f_t \cdot u_T}_{\text{перекрёстная связь}} + \epsilon_T$$

$$f_{t+1} = \left(1 - \frac{\Delta t}{\tau_f}\right)f_t + \frac{\Delta t}{\tau_f} K_f \cdot \underbrace{u_{f,t-2}}_{\text{задержка}} + \epsilon_f$$

$$v_{t+1} = 0.75 - 0.45\,T_{t+1} + 0.38\,f_{t+1} + 0.12\,f_{t+1}(1-T_{t+1}) + \epsilon_v$$

$$d_{t+1} = 0.55 + 0.25\,f_{t+1} - 0.10\,T_{t+1} + \epsilon_d \quad \text{(плотность, алгебраически от $T$ и $f$)}$$

$$L_{t+1} = L_t + \Delta t\left(\underbrace{0.4\,u_{f}}_{\text{приток}} - \underbrace{0.35\,L_t - 0.05\,u_{T,t}}_{\text{отток}}\right) + \epsilon_L$$

Параметры: $\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)$ в зависимости вязкости

Это представляет разрыв между инженерными знаниями из первых принципов и реальностью.

Функция награды целит в температуру, долю наполнителя и стабильность уровня:

$$r(s, a) = -2(T - T^*)^2 - 2(f - f^*)^2 - 0.5(L - L^*)^2 - 0.05\|a\|^2$$

с уставными значениями $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)

$$\text{DA}_x = \frac{1}{T}\sum_{t=1}^T \mathbf{1}\!\left[\Delta x_t \cdot (x^* - x_{t-1}) \geq 0\right]$$

DA измеряет, двигалась ли управляемая переменная в сторону своего уставного значения на каждом шаге, независимо от расстояния. Политика, всегда двигающаяся в правильном направлении, но медленно, имеет DA = 1.0. Политика, систематически толкающая переменные в неправильную сторону, имеет DA < 0.5 (хуже случайного).

DA часто более информативна, чем RMSE в промышленных условиях: - Медленную политику с DA ≈ 1.0 можно ускорить, настроив масштабирование действий - Быстрая политика с DA ≈ 0.4 требует фундаментального переобучения - Операторы могут визуально верифицировать DA по трендовым графикам без численного анализа

RMSE и частота нарушений ограничений

RMSE от уставного значения вычисляется по каждой переменной:

$$\text{RMSE}_x = \sqrt{\frac{1}{T}\sum_t (x_t - x^*)^2}$$

Частота нарушений ограничений — доля временны́х шагов, на которых хотя бы одна переменная состояния выходит за жёсткие границы. Тяжесть измеряет среднюю величину нарушения при условии возникновения нарушения:

$$\text{severity} = \frac{\sum_t \max(0,\, g(s_t))}{\sum_t \mathbf{1}[g(s_t) > 0]}$$

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 уже используются физически обоснованные штрафы за ограничения и жёсткие границы: политика обучается избегать областей, где ограничения нарушаются. Это даёт ожидаемое соблюдение ограничений — нарушения редки, но не гарантированно равны нулю.

Для более высокой уверенности в промышленности релевантны два направления:

Ни тот ни другой подход не отменяют калибровку ограничений выше; они добавляют второй уровень проверок при внедрении.

Детекция дрейфа

Сдвиг распределения — главная причина деградации офлайн политики: текущее распределение состояний (и возможно наград) уходит от обучающего. Износ оборудования, изменение состава сырья, сезонность или новые режимы работы могут это вызывать. У политики нет механизма детекции — его нужно добавить.

Простые сигналы дрейфа:

Что делать при детекции дрейфа: снижать доверие к RL-политике. Варианты: (1) переключиться на резервную политику (ниже); (2) масштабировать действие RL (смешивать с безопасным базовым); (3) запустить проверку человеком или алерт; (4) запланировать переобучение на исторических и свежих данных внедрения. В дорожной карте главы 13 рекомендуется переобучать, когда доля наблюдений вне обучающего распределения превышает примерно 5–10%.

Резервная офлайн RL политика (Fallback)

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

Выбор fallback:

Логика переключения (пример):

  1. На каждом шаге: вычислять показатель дрейфа и (при наличии) неопределённость ансамбля.
  2. Если показатель дрейфа и неопределённость ниже порогов: использовать основную политику (например, CQL+Physics или HybridMOReL).
  3. Иначе: использовать резервную политику (BC или ПИД).
  4. Опционально: при наблюдённом нарушении ограничения принудительно использовать fallback следующие $K$ шагов или до возврата в безопасную область.

Так система использует лучшую политику, когда распределение совпадает с обучающим, и автоматически откатывается к безопасной офлайн или классической политике, когда нет. Вместе с периодическим переобучением (глава 13) детекция дрейфа и fallback делают офлайн RL применимым в промышленности, где процесс эволюционирует, а безопасность не подлежит обсуждению.


Итог

Эта глава перевела инструменты из глав 1–9 в реалистичный промышленный pipeline. Процесс нанесения покрытия ввёл два вызова, отсутствующих в игрушечной среде: интегрирующую переменную уровня и транспортную задержку в динамике наполнителя. Оба потребовали инженерных знаний — в физической модели или в спецификации ограничений.

Сравнение четырёх алгоритмов выявляет чёткую иерархию:

Алгоритм На чём строится Сильная сторона Слабость
BC Имитация данных Простой, интерпретируемый Накопительная ошибка; без физики
CQL Консервативные Q-значения Лучшее OOD-обобщение Нет механизма ограничений
CQL+Physics CQL + штраф Наименьшая частота нарушений Только реальные данные
HybridMOReL Модельный + гибридный Лучшая награда и DA Чуть выше частота нарушений

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

Глава 11 переходит к интерпретируемости: как с помощью SHAP исследовать Q-функцию, политику и модель динамики обученного агента, чтобы оператор понимал — а аудитор мог подтвердить — почему агент выбрал то или иное действие.


Ссылки