маскирующие вероятности перед вычислением кросс-энтропии в тензорном потоке

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

(1) генерировать логиты вероятности для всех возможных действий

(2) вычислить softmax по этим логитам

3) маскировать действия, недопустимые в этом состоянии (путем умножения на вектор из нулей и единиц), что обнуляет часть вероятностей

(4) перенормировать вероятности действительных действий

(5) выборка из этого распределения

Это прекрасно работает для генерации действий. Однако я сталкиваюсь с проблемами, когда мне нужно рассчитать обновление градиента политики. Обычно делают следующее:

tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=A)

где логиты — это логиты вероятности, а А — выборочное действие. Но, поскольку я выполняю эту маскировку/перенормировку после выполнения softmax, приведенный выше фрагмент кода не является правильной перекрестной энтропией в моем случае. Мне интересно, есть ли изящный способ справиться с этой ситуацией. Насколько я понимаю, всегда следует использовать кросс-энтропийные вычисления тензорного потока для численной стабильности, однако я не уверен, как правильно включить эту маскировку/перенормировку.


person John H    schedule 19.03.2018    source источник
comment
Это может быть ответ stackoverflow.com/a/53024956/230462. Исходный код находится здесь github.com/shehzaadzd/ МИНЕРВА/blob/   -  person jonperl    schedule 01.11.2018