Автор: Шамиль Мамедов Редактура: Илья Бакалец

Представьте, что вы пытаетесь предсказать поведение сложной системы, такой как погода, финансовый рынок или робот. В идеальном мире у вас был бы доступ ко всей необходимой информации (ко всем скрытым состояниям/переменным) для точного моделирования системы. Однако на практике у нас зачастую нет доступа к полному состоянию (sate), а есть только к частичным наблюдениям (partial observations). Последние могут быть подмножеством состояний или некоторой нелинейной функцией состояний. Это представляет собой проблему для алгоритмов машинного обучения, которые зависят от состояний.

В этом посте мы рассмотрим несколько методов для обучения динамике сложных систем на основе частичных наблюдений. Мы обсудим, почему эта проблема важна и почему она актуальна для реальных задач (например, предсказания погоды, цен на акции или поведения роботов). После прочтения у вас не будет трудностей с пониманием проблем, связанных с обучением динамики системы на основе частичных наблюдений, и методов, которые сейчас используются для решения этой проблемы.

Конкретно в робототехнике динамические модели нужны, например, для обучения с подкреплением на основе модели (model-based reinforcement learning (RL)), которая эффективнее в использовании выборки (sample efficient) по сравнению с model-free RL [1]. В model-free RL стратегия (policy) или функция ценности (value function) в неявной форме содержат динамическую модель робота [2].

Постановка задачи

Рис. 1. Пример сложной динамической системы

Рис. 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

Рис. 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. Использование автоэнкодера для восстановления скрытых состояний системы

Рис. 3. Использование автоэнкодера для восстановления скрытых состояний системы