Глава 9: Physics-Informed Offline RL
«Black-box модель, идеально описывающая данные внутри обучающего распределения, совершенно бесполезна, если за его пределами она предсказывает нарушение закона сохранения энергии.»
Зачем нужна физика?
В главах 4–8 мы рассматривали мир как black-box: на вход подаются состояние и действие, на выход приходит следующее состояние, а нейронные сети сами разбираются с остальным. Для задач-эталонов вроде MuJoCo это работает — данных достаточно, и никаких жёстких физических законов модель соблюдать не обязана.
Промышленные процессы устроены иначе — по трём причинам.
Данных мало и они узкие. Производственная линия намеренно работает в небольшой части своего теоретически допустимого операционного диапазона. Полугодовые логи нормальной работы могут почти не содержать примеров вблизи физических ограничений. Любая модель, делающая выводы об этих граничных зонах, занимается экстраполяцией без корректирующего сигнала.
Физические законы частично известны. Инженеры знают многое: закон сохранения массы и энергии, термодинамические соотношения, транспортные задержки, динамику первого порядка с измеренными постоянными времени. Эти знания несовершенны — реальные системы имеют неизмеренные возмущения, стареющее оборудование, вариацию состава, — но они далеко не нулевые.
Нарушение ограничений обходится дорого. Политика, нарушающая баланс масс, может задать невозможное уставное значение. Динамическая модель, предсказывающая снижение температуры при подводе тепла, породит управляющую политику, которая активно навредит процессу. В отличие от среды-симулятора, где плохое действие просто даёт низкую награду, нарушение физического ограничения может быть необратимым.
Physics-informed Offline RL использует известную структуру в трёх местах:
- Формирование награды — физические ограничения кодируются как штрафы в сигнале награды
- Гибридная динамическая модель — вместо black-box ансамбля используется модель, в точности соблюдающая известную физику и обучающая остаток (residual) по данным
- Оптимизация политики с ограничениями — жёсткие ограничения встраиваются в целевую функцию политики через двойственность Лагранжа
Каждый подход — это слой поверх алгоритмов из глав 4–8, а не их замена.
Часть I: Физика как формирование награды
Идея
Самый простой способ привнести физику в Offline RL: добавлять штраф к награде каждый раз, когда агент нарушает известное ограничение. Это не требует никаких изменений в самом RL-алгоритме — только модифицированная функция награды.
Для ограничения $g(s, a, s') \leq 0$ (большее значение = более серьёзное нарушение) определим штрафную награду:
$\max(0, \cdot)$ активирует штраф только при нарушении ограничения. Внутри допустимой области награда не меняется. $\lambda > 0$ регулирует, насколько дорогостоящими будут нарушения.
Это превращает исходную ограниченную MDP (CMDP) — максимизировать награду при соблюдении ограничений — в стандартную неограниченную MDP с модифицированной наградой, которую любой Offline RL-алгоритм может решить напрямую.
Зазор оптимальности
Между решением задачи со штрафом и решением исходной ограниченной задачи всегда существует зазор. Насколько он велик?
Теорема 6.1 (Зазор оптимальности). Пусть $\hat\pi_\lambda$ — оптимальная политика в штрафной MDP. Предположим, что ограничение удовлетворяет $\|g\|_\infty \leq C_{max}$, CMDP допустима, и $\hat\pi_\lambda$ является допустимой. Тогда:
Доказательство в Приложении 6.A.
Интерпретация. Зазор уменьшается при $\lambda \to \infty$ — но большое $\lambda$ делает награду подавляемой штрафным членом, смещая политику к максимальному соблюдению ограничений в ущерб исходной награде. Граница — это верхняя оценка потерь от использования штрафа вместо жёсткого ограничения.
Практическая калибровка: установите $\lambda$ так, чтобы типичное нарушение ограничения стоило примерно 20–30% от средней награды за эпизод.
def calibrate_lambda(dataset, constraint_fn, base_reward_fn,
target_gap_fraction=0.1, gamma=0.99, device='cpu'):
"""
Устанавливает λ так, чтобы зазор из Теоремы 6.1 ≤
target_gap_fraction * средний дисконтированный доход.
Из теоремы: зазор ≤ 2*C_max / ((1-γ)*λ)
=> λ = 2*C_max / ((1-γ) * target_gap)
"""
n = min(2000, len(dataset['states']))
s = torch.FloatTensor(dataset['states'][:n]).to(device)
a = torch.FloatTensor(dataset['actions'][:n]).to(device)
s2 = torch.FloatTensor(dataset['next_states'][:n]).to(device)
with torch.no_grad():
C_max = constraint_fn(s, a, s2).max().item()
mean_ret = base_reward_fn(s, a, s2).abs().mean().item() / (1 - gamma)
target_gap = target_gap_fraction * mean_ret
lam = 2.0 * C_max / max(target_gap, 1e-8)
print(f" C_max={C_max:.4f} | mean_return≈{mean_ret:.2f} "
f"| λ={lam:.4f} (зазор ≤ {target_gap_fraction:.0%} дохода)")
return lam
Типы физических ограничений
Законы сохранения. Для смесительного бака с притоком $q_{in}$, оттоком $q_{out}$, объёмом $V$:
где $\delta$ поглощает шум измерений и неизмеренные возмущения.
Монотонные зависимости. Если физическая переменная $x$ заведомо убывает со временем при нормальной работе:
Операционные границы. Жёсткие ограничения оборудования $x_i \in [x_i^{min}, x_i^{max}]$:
Реализация
📄 Полный код:
physics_informed.py
class PhysicsRewardWrapper:
"""
Оборачивает любую функцию награды штрафными членами на основе физики.
Каждое ограничение g(state, action, next_state) -> Tensor (batch,)
возвращает величину нарушения ≥ 0. Ноль = ограничение выполнено.
"""
def __init__(self, base_reward, constraints, lambdas):
assert len(constraints) == len(lambdas)
self.base_reward = base_reward
self.constraints = constraints
self.lambdas = lambdas
def __call__(self, state, action, next_state):
r = self.base_reward(state, action, next_state)
for g, lam in zip(self.constraints, self.lambdas):
r = r - lam * g(state, action, next_state)
return r
Пример — ограничение согласованности с динамикой первого порядка:
def first_order_constraint(state, action, next_state,
tau=10.0, K=0.8, dt=1.0, tol=0.05):
"""
Штраф за предсказания, несовместимые с динамикой первого порядка:
x_{t+1} ≈ x_t + dt/tau * (K*u_t - x_t)
"""
x = state[:, 0]
u = action[:, 0]
x_phys = x + (dt / tau) * (K * u - x)
return torch.clamp(torch.abs(next_state[:, 0] - x_phys) - tol, min=0.0)
Часть II: Гибридные динамические модели
Ограничение чисто black-box ансамблей
Ансамбль из главы 8 — чистая нейронная сеть. Неопределённость ансамбля защищает от эксплуатации OOD-областей, но у модели нет структурных причин соблюдать физику за пределами обучающего распределения. Её OOD-предсказания определяются тем, как обобщают веса сети, — а это может быть физически некорректным произвольным образом.
Предложение 6.2. Пусть $f_{phys}$ — известная физическая модель с ошибкой $\epsilon_{phys}$, а $\hat f_{res}$ — обученный остаток. Ошибка гибридной модели удовлетворяет:
где $\epsilon_{res}$ — ошибка обобщения остатка, которая меньше ошибки чистой black-box модели $\epsilon_{BB}$ на тех же данных, поскольку остаток имеет меньшую амплитуду и меньшую эффективную константу Липшица. В OOD-областях, где $\hat f_{res} \approx 0$, гибридная модель возвращается к $f_{phys}$ — физически осмысленному прогнозу по умолчанию.
Формальный вывод в Приложении 6.B.
Гибридное разложение
Гибридная модель разбивает предсказание на известную и неизвестную части:
Физическая функция $f_{phys}$ аналитична — нулевые параметры, вклад в предсказание бесплатный. Нейросетевой остаток $f_{NN}$ обучает то, что физика упускает: неучтённые возмущения, нелинейные поправки, зависящие от состава эффекты.
Вероятностная версия (drop-in замена для MOPO/MOReL):
Обучение минимизирует NLL наблюдаемого $s'$ — формально идентично NLL-потере ансамбля из главы 8, но сеть неявно обучается предсказывать $s' - f_{phys}(s,a)$. Физическая модель, объясняющая 80% дисперсии, оставляет остаток с 20%: нейронной сети нужно примерно в пять раз меньше ёмкости и данных для сходимости.
Реализация
class HybridDynamicsNet(nn.Module):
"""
Вероятностная гибридная динамика: физический прогноз + обученный остаток.
physics_fn: callable (state, action) -> next_state_physics
"""
def __init__(self, state_dim, action_dim, physics_fn, hidden_dim=128):
super().__init__()
self.physics_fn = physics_fn
inp = state_dim + action_dim
self.trunk = nn.Sequential(
nn.Linear(inp, hidden_dim), nn.SiLU(),
nn.Linear(hidden_dim, hidden_dim), nn.SiLU(),
)
self.mean_head = nn.Linear(hidden_dim, state_dim)
self.log_var_head = nn.Linear(hidden_dim, state_dim)
# Более жёсткие границы, чем у чистой black-box модели:
# остатки имеют меньшую амплитуду
self.min_log_var = nn.Parameter(-8.0 * torch.ones(state_dim))
self.max_log_var = nn.Parameter(-1.0 * torch.ones(state_dim))
def forward(self, state, action):
"""Возвращает (mean_next_state, log_var). Mean = физика + остаток."""
with torch.no_grad():
phys = self.physics_fn(state, action)
h = self.trunk(torch.cat([state, action], -1))
res = self.mean_head(h)
log_var = self.log_var_head(h)
log_var = self.max_log_var - F.softplus(self.max_log_var - log_var)
log_var = self.min_log_var + F.softplus(log_var - self.min_log_var)
return phys + res, log_var
def nll_loss(self, state, action, next_state):
mean, log_var = self.forward(state, action)
var = log_var.exp()
loss = 0.5 * (log_var + (next_state - mean).pow(2) / var)
loss = loss.sum(-1).mean()
loss = loss + 0.01 * (self.max_log_var.sum() - self.min_log_var.sum())
with torch.no_grad():
phys_mse = (next_state - self.physics_fn(state, action)).pow(2).mean()
return loss, {
'nll': loss.item(),
'residual_mse': (next_state - mean).pow(2).mean().item(),
'physics_mse': phys_mse.item(),
}
def make_first_order_physics(tau, K, dt=1.0):
"""
Физическая функция для процесса первого порядка: dx/dt = (K*u - x)/tau.
Дискретизация Эйлера: x_{t+1} = x_t + dt/tau * (K*u_t - x_t).
tau, K могут быть скалярами или 1D-тензорами длины state_dim.
"""
def physics_fn(state, action):
u = action[:, :state.shape[1]]
return state + (dt / tau) * (K * u - state)
return physics_fn
Гибридный ансамбль
Гибридный ансамбль — drop-in замена DynamicsEnsemble из главы 8: замените ProbabilisticDynamicsNet на HybridDynamicsNet. Оценка неопределённости, бутстрап-обучение и логика развёртки MOPO/MOReL остаются без изменений.
class HybridEnsemble:
"""
Ансамбль гибридных динамических моделей.
Неопределённость = разброс предсказаний остатка между членами ансамбля.
В OOD-областях физический член остаётся активным — среднее ансамбля
физически обосновано даже при неопределённом остатке.
"""
def diagnose_physics_coverage(self, dataset):
"""
Выводит, какую долю дисперсии физическая модель объясняет
по каждому измерению состояния.
> 85%: отлично — достаточно небольшой нейросети остатка.
< 50%: ⚠ пересмотрите physics_fn.
"""
n = min(1000, len(dataset['states']))
s = torch.FloatTensor(dataset['states'][:n]).to(self.device)
a = torch.FloatTensor(dataset['actions'][:n]).to(self.device)
s2 = torch.FloatTensor(dataset['next_states'][:n]).to(self.device)
with torch.no_grad():
phys = self.models[0].physics_fn(s, a)
res_var = (s2 - phys).var(0).cpu().numpy()
tot_var = s2.var(0).cpu().numpy()
coverage = 1.0 - res_var / (tot_var + 1e-8)
print("Покрытие физической модели (доля объяснённой дисперсии):")
for j, cov in enumerate(coverage):
bar = '█' * int(max(0,cov)*20) + '░' * int((1-max(0,cov))*20)
print(f" измерение {j}: {cov:6.1%} {bar}")
mc = coverage.mean()
print(f" В среднем : {mc:6.1%} "
+ ("✓ сильное покрытие" if mc > 0.85
else "⚠ рассмотрите доработку physics_fn" if mc < 0.5
else ""))
return coverage
Часть III: Оптимизация политики с ограничениями
Когда мягких штрафов недостаточно
Штрафы в награде (Часть I) — мягкие ограничения: политика предпочитает избегать нарушений, но может их допустить, если выгода от награды достаточно велика. Для большинства промышленных приложений мягкие ограничения в сочетании с границей KNOWN/UNKNOWN из MOReL (глава 8) обеспечивают достаточную безопасность.
Жёсткие ограничения нужны когда: - Нарушение ограничения физически необратимо - Регуляторное соответствие требует доказуемой гарантии, а не просто «обычно выполняется» - Граница ограничения точно известна и никогда не должна пересекаться
CMDP и двойственность Лагранжа
Задача — ограниченная MDP (CMDP): максимизировать $J(\pi)$ при $k$ ограничениях $J_{C_i}(\pi) \leq d_i$. Релаксация Лагранжа:
Теорема 6.3 (Сильная двойственность, Altman 1999). Для любой конечномерной CMDP с ограниченными наградами и штрафами:
Оптимальные множители удовлетворяют условиям дополняющей нежёсткости: $\lambda_i^*(J_{C_i}(\pi^*) - d_i) = 0$. Ограничение, выполняемое с запасом в оптимуме, имеет $\lambda_i^* = 0$.
Доказательство через LP-двойственность на occupancy measures — в Приложении 6.C.
Что это означает на практике. Решение неограниченной задачи минимакса по $(\pi, \lambda)$ даёт точный ограниченный оптимум. Множитель $\lambda_i$ действует как цена: растёт при нарушении ограничения и падает когда политика имеет запас по ограничению.
Алгоритм седловой точки для Offline RL
В офлайн-случае $J(\pi)$ и $J_{C_i}(\pi)$ оцениваются через обученные Q-функции. Обучение чередует шаги:
$\lambda_i$ растёт когда стоимость превышает бюджет — нарушение становится дороже.
class LagrangianPolicyOptimizer:
"""
Ограниченный Offline RL через обновления прямал-двойственной седловой точки.
Оборачивает любую политику CQL/IQL учётом ограничений через Лагранжа.
λ параметризован в log-пространстве для гарантии λ ≥ 0.
"""
def __init__(self, policy, Q_reward, Q_cost,
cost_threshold, lambda_lr=1e-3,
lambda_init=0.1, device='cpu'):
self.policy = policy
self.Q_reward = Q_reward
self.Q_cost = Q_cost
self.d = cost_threshold
self.log_lam = nn.Parameter(torch.tensor(float(np.log(lambda_init))))
self.lam_opt = optim.Adam([self.log_lam], lr=lambda_lr)
@property
def lam(self):
return self.log_lam.exp()
def policy_step(self, states, pi_opt):
"""Прямой шаг: максимизация J_Q - λ*(J_C - d)."""
actions, log_probs = self.policy.sample(states)
q_r = self.Q_reward(states, actions)
q_c = self.Q_cost(states, actions)
lagrangian = q_r - self.lam.detach() * (q_c - self.d)
pi_loss = -(lagrangian - 0.1 * log_probs).mean()
pi_opt.zero_grad(); pi_loss.backward(); pi_opt.step()
return {'lagrangian': lagrangian.mean().item(), 'lambda': self.lam.item()}
def dual_step(self, states, actions):
"""Двойственный шаг: подъём при нарушении — увеличиваем λ."""
with torch.no_grad():
q_c = self.Q_cost(states, actions)
cost_violation = q_c.mean() - self.d
dual_loss = -self.lam * cost_violation.detach()
self.lam_opt.zero_grad(); dual_loss.backward(); self.lam_opt.step()
return {'cost_violation': cost_violation.item(), 'lambda': self.lam.item()}
Часть IV: Когда физика помогает больше всего
Покрытие данными — главный фактор. Чем реже датасет покрывает операционный диапазон, тем больше пользы от физики. Если данные покрывают 20% возможных рабочих состояний, физика — единственный осмысленный приор для остальных 80%.
Точность физики определяет подход:
| Тип ограничения | Надёжность | Рекомендуемый метод |
|---|---|---|
| Сохранение массы/энергии | Точное | Жёсткое (Лагранжа) или мягкий штраф |
| Операционные лимиты оборудования | Точное | Мягкий штраф или проекция |
| Эмпирические корреляции (вязкость, конверсия) | Приближённое | Мягкий штраф, слабое λ |
| Постоянные времени первого порядка | Умеренное | Приор гибридной модели |
| Неизвестные возмущения | Н/Д | Только нейросеть остатка |
Практическая матрица решений:
Доступность физических знаний
Нет Частичная Высокая
┌──────────────────┬─────────────────┬──────────────────┐
Покрытие Редкое │ Pure BC │ Штраф в │ Гибридная мод. │
│ (Глава 1) │ награде+MOReL │ + MOReL │
данных Плотное │ CQL / IQL │ CQL + штраф │ Гибрид + CQL │
│ (Гл. 3–4) │ │ │
└──────────────────┴─────────────────┴──────────────────┘
D4RL-эталоны находятся внизу слева (плотные данные, нет физики). Промышленный Offline RL обычно — вверху справа.
Объединение трёх подходов
Три части этой главы хорошо сочетаются. Реалистичный pipeline physics-informed Offline RL может использовать:
- Гибридный ансамбль (Часть II) вместо black-box ансамбля в MOPO/MOReL
- Физическое формирование награды (Часть I) внутри синтетических развёрток
- Оптимизатор Лагранжа (Часть III) для жёстких лимитов безопасности при обучении политики
Каждый уровень нацелен на свой вид отказа: гибридная модель устраняет физически некорректную экстраполяцию динамики; формирование награды штрафует траектории, дрейфующие к физической недопустимости; Лагранжиан обеспечивает учёт ограничений, которые должны выполняться безусловно при развёртке.
Итог
| Подход | Что изменяет | Совместим с | Когда применять |
|---|---|---|---|
| Штраф в награде | Функция награды | Любой (CQL, IQL, MOPO, MOReL) | Физические границы известны |
| Гибридная динамика | Динамическая модель | MOPO, MOReL | Частичная физика; редкие данные |
| Ограничение Лагранжа | Целевая функция политики | Любой | Жёсткие ограничения; необратимые нарушения |
Physics-informed методы — это модульный слой, а не замена алгоритмов Offline RL. Штраф в награде встраивается в CQL без изменения алгоритма. Гибридный ансамбль заменяет только сеть динамики в MOPO — логика развёртки и SAC остаются неизменными. Лагранжиан оборачивает любой оптимизатор политики как модуль учёта ограничений через Лагранжа.
Глава 10 разбирает промышленный кейс, показывая, как эти части складываются вместе на практике.
Ссылки
- Altman, E. (1999). Constrained Markov Decision Processes. CRC Press.
- Banerjee, C., Nguyen, T., Fookes, C., & Raissi, M. (2023). A Survey on Physics Informed Reinforcement Learning. arXiv:2309.01909.
- Paternain, S., Calvo-Fullana, M., Chamon, L., & Ribeiro, A. (2022). Safe Policies for Factored MDPs. JMLR. arXiv:2106.09155.
- Raissi, M., Perdikaris, P., & Karniadakis, G. (2019). Physics-Informed Neural Networks. Journal of Computational Physics. arXiv:1711.10561.
- Lusch, B., Kutz, J.N., & Brunton, S.L. (2018). Deep Learning for Universal Linear Embeddings of Nonlinear Dynamics. Nature Communications.
- Levine, S. et al. (2020). Offline Reinforcement Learning: Tutorial, Review, and Perspectives. arXiv:2005.01643.
Приложение 6.A — Доказательство Теоремы 6.1 (Зазор оптимальности)
Обозначения. Пусть CMDP допустима с оптимальной политикой $\pi^*$. Пусть $\hat\pi_\lambda$ оптимальна в штрафной MDP с $\tilde r = r - \lambda\max(0,g)$. Обозначим нарушение ограничения $V_+(\pi) = \mathbb{E}_\pi[\sum_t \gamma^t \max(0, g(s_t,a_t))]/(1-\gamma) \geq 0$.
Доказательство. Так как $\hat\pi_\lambda$ оптимальна в штрафной MDP:
Так как $\pi^* \in \Pi_C$, имеем $g \leq 0$ вдоль её траекторий, поэтому $V_+(\pi^*) = 0$:
Перегруппировывая:
При конечном $\lambda$ точная допустимость $\hat\pi_\lambda$ не выполняется; модель получает малое положительное нарушение. Используя $\|g\|_\infty \leq C_{max}$:
Подставляя и используя двустороннюю оценку (см. Paternain et al., 2019, Prop. 1):
Приложение 6.B — Граница ошибки гибридной модели (Предложение 6.2)
Обозначения. Пусть $f^*$ — истинная динамика. Физическая модель имеет ошибку $\epsilon_{phys}(s,a) = f_{phys}(s,a) - f^*(s,a)$, нейросеть остатка — ошибку $\epsilon_{res}(s,a) = \hat f_{NN}(s,a) - (f^*(s,a) - f_{phys}(s,a))$.
Доказательство. По определению:
Беря нормы и математическое ожидание по тестовому распределению $\rho$:
Цель остатка $\delta^* = f^* - f_{phys}$ имеет меньшую эффективную вариацию везде, где $f_{phys}$ точна: $\text{Var}(\delta^*) < \text{Var}(f^*)$ когда $f_{phys}$ положительно коррелирует с $f^*$. По стандартной теории аппроксимации функций (ограничения Радемахера), ошибка обобщения масштабируется со сложностью класса функций цели. Поскольку $\delta^*$ лежит в классе меньшей сложности, чем $f^*$, имеем $\epsilon_{res} < \epsilon_{BB}$ при той же мощности модели и объёме обучающей выборки. В OOD-областях $\hat f_{NN} \to 0$, поэтому $f_{hybrid} \to f_{phys}$ — физически осмысленный fallback. $\square$
Приложение 6.C — Доказательство Теоремы 6.3 (Сильная двойственность)
Переформулировка через occupancy measures. Определим нормированную дисконтированную occupancy measure:
Множество допустимых occupancy measures — политоп, задаваемый потоковыми ограничениями Беллмана:
CMDP становится задачей LP: $\max_{d \in \mathcal{D}}\; \langle d, r \rangle$ при $\langle d, C_i \rangle \leq d_i$.
Двойственная LP. Вводя множители $\lambda \geq 0$ для ограничений по стоимости и $V(s)$ для потоковых ограничений, двойственная задача принимает вид неравенств Беллмана для модифицированной награды $r - \sum_i \lambda_i C_i$:
Сильная двойственность. Прямая LP допустима (по условию) и ограничена (награды и штрафы ограничены). По теореме о сильной двойственности LP (лемма Фаркаша–Минковского) прямой и двойственный оптимумы совпадают. Двойственные переменные $\lambda_i \geq 0$ — это в точности множители Лагранжа для ограничений по стоимости.
Дополняющая нежёсткость. В оптимуме $\lambda_i^* (\langle d^*, C_i \rangle - d_i) = 0$ для всех $i$. Это означает: $\lambda_i^* > 0$ только когда $i$-е ограничение активно ($J_{C_i}(\pi^*) = d_i$). Неактивные ограничения имеют $\lambda_i^* = 0$ и не влияют на оптимальную политику. $\square$