2016-08-11 8 views
0

Для университетского проекта я хочу обучить (имитируемого) робота, чтобы ударить по мячу с учетом положения и скорости. Первое, что нужно попробовать - это градиенты политики: у меня есть параметрический генератор траекторий. Для каждой тренировочной позиции я кормирую позицию через свою сеть, отправляю траекторию на тренажер и получаю награду. Теперь я могу использовать это как потерю, образец градиента, его подачу и обновление весов моей сети, чтобы в следующий раз это улучшилось.Несимметричная потеря в Keras/TensorFlow

Таким образом, цель состоит в том, чтобы изучить отображение с позиции на весы траектории. При использовании всех звездных графических библиотек, таких как Theano и Tensorflow (или Keras), у меня есть проблема, что я не знаю, как на самом деле моделировать эту систему. Сначала я хочу иметь стандартные полностью подключенные слои, тогда выход - мои весы траектории. Но как я могу рассчитать потерю, чтобы использовать backprop?

В пользовательской функции потери я бы проигнорировал/не указал истинные метки, запустил симулятор и вернул потери, которые он дает. Но из того, что я прочитал, вам нужно вернуть функцию Theano/Tensorflow, которая является символической. Моя потеря довольно сложная, поэтому я не хочу переместить ее из симулятора в сеть. Как я могу это реализовать? Тогда проблема заключается в том, чтобы отличить эту потерю, поскольку мне может потребоваться выборка для получения этого градиента.

+1

В TensorFlow вы можете подавать любой тензор. Это означает, что вы можете создать сеть с фиктивной потерей сверху, а затем использовать 'feed_dict', чтобы заменить фиктивную потерю с помощью вычисленных извне потерь/направления –

ответ

0

У меня была аналогичная проблема некоторое время назад.

Была функция потерь, которая в значительной степени основывалась на оптимизированном коде C и сторонних библиотеках. Портировать это на тензорный поток не удалось.

Но мы все же хотели подготовить график тензорного потока для создания сигналов рулевого управления от текущей настройки.

Вот IPython ноутбук, который объясняет, как смешивать численные и аналитические производные https://nbviewer.jupyter.org/gist/lhk/5943fa09922693a0fbbbf8dc9d1b05c0

Вот более подробное описание идеи позади него:

Подготовка графика является проблемой оптимизации, поэтому вам определенно понадобится производная от потери. Задача состоит в том, чтобы смешивать аналитическое производное в тензорном потоке и числовую производную от вашей потери.

Вам нужно эту конфигурацию

  • вход I
  • выход P
  • Graph G карты я P, P = G (I)
  • добавить константу той же формы, как и Р, P = C * G (I)
  • Потеря функции L

Обучение tensorflow график работы с backp ropagation. Для каждого параметр X в графе, следующая производная вычисляется

дл/дЙ = дл/дР * дР/дЕ

Второй часть, что, Д.П./йХ приходит бесплатно, просто настройки график тензорного потока. Но нам все еще нужна производная от потери.

Теперь есть трюк.

Мы хотим, чтобы тензорный поток обновлял X на основе правильного градиента dL/dP * dP/dX , но мы не можем вычислить tenorflow для вычисления dL/dP, потому что это не график тензорного потока.

мы будем использовать вместо P ~ = P * C,

производных что дР ~/дМ = дР/дМ * C

Так что, если мы устанавливаем C в дл/Д.П., мы получаем правильный градиент.

Нам просто нужно оценить C с числовым градиентом.

Это алгоритм:

  • настроить свой график, умножить выходной с постоянной С
  • подачи 1 для константы, вычислить прямой проход, получить предсказание Р
  • вычислить потери при Р
  • вычислить численную производную Р
  • кормить числовую производными как C, вычислить обратную передачу, обновлять параметры