Что я должен использовать в качестве целевого вектора, когда я использую BinaryCrossentropy (from_logits = True) в tenorflow.keras - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть классификация по нескольким меткам, в которой каждая цель представляет собой вектор единиц и нулей , а не взаимоисключающие (для ясности, моя цель что-то вроде [0, 1, 0, 0, 1, 1, ... ]).

Насколько я понимаю, пока:

  • Я должен использовать двоичную функцию кросс-энтропии. (как объяснено в этом ответе )

  • Кроме того, я понял, что tf.keras.losses.BinaryCrossentropy() является оберткой вокруг тензорного потока sigmoid_cross_entropy_with_logits. Это можно использовать с from_logits True или False. (как объяснено в этом вопросе )

  • Так как sigmoid_cross_entropy_with_logits выполняет сам сигмоид, он ожидает, что вход находится в диапазоне [-inf, + inf] ,

  • tf.keras.losses.BinaryCrossentropy(), когда сеть реализует сигмовидную активацию последнего слоя, должна использоваться с from_logits=False. Затем он выведет сигмовидную функцию и передаст вывод в sigmoid_cross_entropy_with_logits, который снова выполнит сигмоидную функцию. Это, однако, может вызвать числовые проблемы из-за асимптот функции сигмоида / lo git.

  • Чтобы улучшить числовую стабильность, мы можем избежать последнего сигмовидного слоя и использовать tf.keras.losses.BinaryCrossentropy(from_logits=False)

Вопрос:

Если мы используем tf.keras.losses.BinaryCrossentropy(from_logits=False), какую цель мне следует использовать? Нужно ли менять цель для вектора с одним горячим током?

Полагаю, мне следует применить сигмовидную активацию к выходу сети во время вывода. Есть ли способ добавить сигмовидный слой, активный только в режиме вывода, а не в режиме обучения?

1 Ответ

0 голосов
/ 15 апреля 2020

Во-первых, позвольте мне сделать несколько замечаний о числовой стабильности:

Как упоминалось в разделе комментариев, числовая нестабильность в случае использования from_logits=False возникает из преобразования значений вероятности обратно в логиты, что включает операция отсечения (как обсуждалось в этого вопроса и его ответа ). Однако, насколько мне известно, это НЕ создает серьезных проблем для практических приложений .

Другими словами, если вас не интересует точность генерируемые значения вероятности с чувствительностью около [-1e-7, 1e-7] (или связанная с этим проблема сходимости, наблюдаемая в ваших экспериментах), тогда вам не стоит слишком беспокоиться; просто используйте сигмоидальную и двоичную кросс-энтропию, как и раньше, то есть model.compile(loss='binary_crossentropy', ...), и она будет работать нормально.

В общем, если вы действительно заинтересованы в численной стабильности, вы можете выбрать самый безопасный путь и использовать from_logits=True без использования какой-либо функции активации на последнем слое модели.


Теперь, чтобы ответить на исходный вопрос, истинные метки или целевые значения (т. Е. y_true) должны быть по-прежнему только нулями или единицы при использовании BinaryCrossentropy(from_logits=True). Скорее, это y_pred (то есть выход модели), который не должен быть распределением вероятности в этом случае (т.е. сигмоидальная функция не должна использоваться на последнем слое, если from_logits=True).

...