Вы просто получаете целевое значение, соответствующее действию, которое существует в наблюдении 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
, а затем существует вектор того же размера, который получен в качестве целевого значения. Потеря - это квадрат их различий.
Когда вы вычисляете значение убытка, вы также выполняете только задний ход для существующего действия, а градиент от другого действия равен нулю. Таким образом, вам нужно только вознаграждение за существующее действие.