Автор: Шамиль Мамедов Редактура: Илья Бакалец
Представьте, что вы пытаетесь предсказать поведение сложной системы, такой как погода, финансовый рынок или робот. В идеальном мире у вас был бы доступ ко всей необходимой информации (ко всем скрытым состояниям/переменным) для точного моделирования системы. Однако на практике у нас зачастую нет доступа к полному состоянию (sate), а есть только к частичным наблюдениям (partial observations). Последние могут быть подмножеством состояний или некоторой нелинейной функцией состояний. Это представляет собой проблему для алгоритмов машинного обучения, которые зависят от состояний.
В этом посте мы рассмотрим несколько методов для обучения динамике сложных систем на основе частичных наблюдений. Мы обсудим, почему эта проблема важна и почему она актуальна для реальных задач (например, предсказания погоды, цен на акции или поведения роботов). После прочтения у вас не будет трудностей с пониманием проблем, связанных с обучением динамики системы на основе частичных наблюдений, и методов, которые сейчас используются для решения этой проблемы.
Конкретно в робототехнике динамические модели нужны, например, для обучения с подкреплением на основе модели (model-based reinforcement learning (RL)), которая эффективнее в использовании выборки (sample efficient) по сравнению с model-free RL [1]. В model-free RL стратегия (policy) или функция ценности (value function) в неявной форме содержат динамическую модель робота [2].
Рис. 1. Пример сложной динамической системы
Предположим, что перед нами стоит задача обучения модели для предсказания поведения робота (как показано на рисунке 1). Скрытое состояние робота $x_k$ — вектор положений и скоростей шарниров робота. Однако пусть нам доступными данными будут положения некоторых ключевых точек $y$, измеренных на камеру во время движения робота. По сути нам необходимо аппроксимировать исходную динамику робота $F$ некоторой функцией $\hat F$. Но поскольку мы имеем дело с частичными наблюдениями, задача моделирования изрядно усложняется.
Рассмотрим проблему поподробнее и начнем с определения истинной нелинейной дискретной динамики. Она может быть описана следующим разностным уравнением:
$$ x_{k+1} = F\big(x_k, u_k, \theta_{r}\big) $$
где $x_k=x(t_k)$ — вектор состояний системы в момент времени; $t_k$, $u_k$ — вектор внешних входов, а $\theta_r$ — вектор истинных параметров системы. Пусть $y_k$ будет вектором зашумленных наблюдений системы:
$$ y_k = H\big(x_k\big) + \nu_k $$
где $H(x_k)$ — функция, которая отображает состояния $x_k$ в наблюдения, а $\nu_k$ — шум.
На основе этих зашумленных наблюдений мы хотим обучить модель вида $\hat z_{k+1} = \hat F(\hat z_k, u_k, \theta_a)$, которая смогла бы максимально точно аппроксимировать исходную динамику, где $\hat F$ — приближение исходного отображения $F$, а $\theta_a$ — параметры приближенного отображения. Если мы знаем размерность вектора исходных состояний $x$ — мы можем выбрать такую же размерность для $z$. Если мы не знаем размерность вектора или хотим найти более низкоразмерное приближение отображения $F$ — мы можем выбрать произвольную размерность $z$. На практике мы хотим наименьшую размерность, при которой модель смогла бы точно предсказывать наблюдения $y$ для быстрого инференса и, в случае робота, для быстрого управления движением. А еще нам надо аппроксимировать функцию отображений скрытых состояний в наблюдения $H$ некоторой функцией $\hat H$.
Для простоты давайте воспользуемся рекуррентными нейронными сетями (RNN) с целью аппроксимации динамики. На рисунке 2 схематически показан принцип работы "ванильной" RNN, где каждый ромб представляет RNN-блок. Тезисно: RNN принимает на вход $u_k$ и состояние $\hat z_k$ и выдает следующее состояние $\hat z_{k+1}$. Говоря математическим языком, динамика RNN распространяется таким образом:
$$ \hat z_{k+1} = \tanh(W_{\hat z} \hat z_k + W_u u_k + b) $$
Рис. 2. Принцип работы RNN
Итак, нас интересует обучение моделей, которые могут точно предсказывать поведение сложной динамической системы по частичным наблюдениям. Если говорить точнее, наша модель должна безошибочно предсказывать последующие $N$ состояний системы, $\hat z_{k+1}$ , $\hat z_{k+2}$, $\dots$, $\hat z_{k+N+1}$ на основе частичных наблюдений и последовательности внешних входов $U$. В сущности, решение проблемы сводится к поиску начального состояния $\hat z_k$, которое будет использоваться RNN для распространения динамики и функции. Функция отобразит скрытые состояния в наблюдения. А теперь давайте рассмотрим несколько методов, которые так или иначе использовались для решения этой проблемы.
Один из распространенных подходов в машинном обучении для решения таких задач — автоэнкодеры. Здесь наш входной вектор признаков $h_k$ для энкодера — последовательность пар наблюдений и внешних входов. Для простоты давайте выберем $h_k = \left(y_k; u_k\right)$. Энкодер — многослойный перцептрон (MLP), который берет векторы $h_k, h_{k+1}, \dots, h_{k+N+1}$ и возвращает скрытые состояния $z_k, z_{k+1},\dots, z_{k+N+1}$ (как показано на рисунке 3). Начиная с первого скрытого состояния $z_k$ и используя последовательность внешних входов $U = [u_k\ u_{k+1} \dots u_{k+N}]$, RNN распространяет динамику и возвращает последовательность состояний $\hat{z}{k+1},\ \hat{z}{k+2},\ \dots,\ \hat{z}{k+N}$. Декодер — еще один MLP, который аппроксимирует $H$, то есть берет состояния $z_k, \dots, z{k+N+1}$, предсказанные энкодером, и состояния, предсказанные RNN $\hat z_{k+1}, \dots, \hat z_{k+N+1}$, и отображает их в последовательность пар наблюдение-внешний-вход $\bar h_k = (y_k, u_k)$, $\bar h_{k+1} = (\bar{y}{k+1}, u{k+1}), \dots , \bar h_{k+N+1} = (\bar{y}{k+N+1}, u{k+N+1})$ и $\hat h_{k+1} = (\hat{y}{k+1}, u{k+1}), \dots , \hat h_{k+N+1} = (\hat{y}{k+N+1}, u{k+N+1})$ соответственно*.* Для визуальной привлекательности $\hat h$ на рисунке 3 не показаны.
Рис. 3. Использование автоэнкодера для восстановления скрытых состояний системы