Установка целевых значений для Deep Q-Learning - PullRequest
2 голосов
/ 25 октября 2019

Для стандартного Q-Learning в сочетании с нейронной сетью все более или менее просто. Один сохраняет (s, a, r, s ') во время взаимодействия с окружающей средой и использует

target = Qnew(s,a) = (1 - alpha) * Qold(s,a) + alpha * ( r + gamma * max_{a’} Qold(s’, a’) )

в качестве целевых значений для приближения нейронной сети Q-функции. Таким образом, вход ANN равен (s, a) , а выход - скаляр Qnew (s, a) . Глубокие Q-Learning документы / учебные пособия меняют структуру Q-функции. Вместо предоставления единого Q-значения для пары (s, a) теперь оно должно предоставлять Q-значения всех возможных действий для состояния s , поэтому оно равно Q (s) вместо Q (s, a) .

Наступает моя проблема. База данных, заполненная (s, a, r, s ') для определенного состояния s , не содержит вознаграждения за все действия. Только для некоторых, может быть, только одно действие. Итак, как настроить целевые значения для сети Q(s) = [Q(a_1), …. , Q(a_n) ], не имея всех наград за состояние s в базе данных? Я видел разные функции потерь / целевые значения, но все они содержат награду.

Как видите;Я озадачен. Кто-то мне помогает? В Интернете много учебников, но этот шаг в целом плохо описан и еще менее мотивирован, глядя на теорию ...

1 Ответ

2 голосов
/ 25 октября 2019

Вы просто получаете целевое значение, соответствующее действию, которое существует в наблюдении s,a,r,s'. В основном вы получаете целевое значение для всех действий, а затем выбираете максимальное из них, как вы написали сами: max_{a'} Qold(s', a'). Затем он добавляется к r (s, a), и результатом является целевое значение. Например, предположим, что у вас есть 10 действий, а наблюдение - (s_0, a=5, r(s_0,a=5)=123, s_1). Тогда целевое значение равно r(s_0,a=5)+ \gamma* \max_{a'} Q_target(s_1,a'). Например, с tensorflow это может быть что-то вроде:

Q_Action = tf.reduce_sum(tf.multiply(Q_values,tf.one_hot(action,output_dim)), axis = 1) # dim: [batchSize , ]

, в котором Q_values имеет размер batchSize, output_dim. Таким образом, на выходе получается вектор размером batchSize, а затем существует вектор того же размера, который получен в качестве целевого значения. Потеря - это квадрат их различий.

Когда вы вычисляете значение убытка, вы также выполняете только задний ход для существующего действия, а градиент от другого действия равен нулю. Таким образом, вам нужно только вознаграждение за существующее действие.

...