Multiclass Sigmoid для комплектации ДХО - PullRequest
0 голосов
/ 27 августа 2018

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

В частности, как заменить две последние строки этого кода и чем:

logits = tf.layers.dense(hidden, n_outputs)
outputs = tf.nn.sigmoid(logits) 

action = tf.squeeze(tf.multinomial(logits, num_samples=1), axis=-1)
y = tf.one_hot(action, n_outputs)

Спасибо

1 Ответ

0 голосов
/ 27 августа 2018

Если вы конвертируете из softmax в сигмовидную функцию, это обычно означает, что вы конвертируете из задачи множественной классификации в задачу двоичной классификации.

Пример мульти-классификации: ешьте лапшу, ешьте рыбу, ешьте мясо, не ешьте Пример бинарной классификации: есть, не есть

В случае мультиклассификации ваш код использует функцию tf.multinomial для выбора 1 действия с учетом вероятностей журнала вашими логитами. Когда вы преобразовали его в двоичный регистр, это значительно упростило проблему. Но это также полностью меняет структуру вашей проблемы.

Вы можете просто использовать для вывода сигмоида:

if outputs < 0.5:
    action = 0
else:
    action = 1

где действие no, если выходное значение не равно 0.5, и yes, если выходное значение больше 0,5.

То, что ранее делал ваш код, заключалось в том, что для двоичной классификации он будет выводить вектор из 2 элементов вместо одного скаляра. И вектор будет иметь вероятность действия «да» и «нет», например:

выход = [P (нет), P (да)]

и ваш tf.one_hot преобразует действие, выбранное с помощью tf.multinomial, в один горячий вектор. Поэтому, если выбрано yes, это будет выглядеть так:

y = [0, 1]

Когда вы меняете его на сигмовидную, вы получаете скаляр 0 или 1, говоря, что действие - да или нет.

...