Как выбрать кросс-энтропия потерь в tensorflow?
проблемы классификации, такие как логистическая регрессия или полиномиальной логистическая регрессия, оптимизация a кросс-энтропии потеря. Обычно слой кросс-энтропии следует за softmax слой, который производит распределение вероятности.
в tensorflow, есть не менее дюжина различных потерь кросс-энтропии функции:
tf.losses.softmax_cross_entropy
tf.losses.sparse_softmax_cross_entropy
tf.losses.sigmoid_cross_entropy
tf.contrib.losses.softmax_cross_entropy
tf.contrib.losses.sigmoid_cross_entropy
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sigmoid_cross_entropy_with_logits
- ...
, которые работают только для двоичной классификации и которые подходят для различных классов задач?
Когда вы должны использовать sigmoid
вместо softmax
?
Как sparse
функции, отличные от других, и почему это только softmax
?
связанные (более ориентированные на математику) обсуждения:кросс-энтропии джунглей.
2 ответов
предварительные факты
-
в функциональном смысле сигмоид является частичным случаем функции softmax, когда число классов равно 2. Оба они выполняют одну и ту же операцию: преобразуют логиты (см. ниже) в вероятности.
в простой двоичной классификации нет большой разницы между этими двумя, однако в случае мультиномиальной классификации сигмоид позволяет иметь дело с неисключительными этикетками (a.к. a. мульти-метки), в то время как softmax сделок с эксклюзивными классами (см. ниже).
-
A logit (также называется оценка) является необработанное значение, связанное с классом, перед вычислением вероятности. С точки зрения архитектуры нейронной сети это означает, что логит является выходом плотного (полностью связанного) слоя.
TensorFlow именование немного странно:все функции ниже принимают логиты, не вероятности, и применить сами преобразования (что просто более эффективно).
семейство Сигмовидных функций
tf.nn.sigmoid_cross_entropy_with_logits
tf.nn.weighted_cross_entropy_with_logits
tf.losses.sigmoid_cross_entropy
-
tf.contrib.losses.sigmoid_cross_entropy
(рекомендуется)
как уже говорилось ранее, sigmoid
функция потерь предназначена для двоичной классификации.
Но функции tensorflow более общие и позволяют делать
классификация с несколькими метками, когда классы независимы.
Другими словами,tf.nn.sigmoid_cross_entropy_with_logits
разрешает N
бинарные классификации сразу.
метки должны быть однократно закодированы или могут содержать мягкие вероятности классов.
tf.losses.sigmoid_cross_entropy
кроме того, позволяет установить в пакете весом,
сделать некоторые примеры более важными, чем другие.
tf.nn.weighted_cross_entropy_with_logits
позволяет установить гирей класс
(помните, что классификация binary), т. е. делать положительные ошибки больше, чем
отрицательные ошибки. Это полезно, когда данные обучения несбалансированы.
семейство функций Softmax
-
tf.nn.softmax_cross_entropy_with_logits
(УСТАРЕЛО В 1.5) tf.nn.softmax_cross_entropy_with_logits_v2
tf.losses.softmax_cross_entropy
-
tf.contrib.losses.softmax_cross_entropy
(рекомендуется)
эти функции потерь должны использоваться для мультиномиальных взаимоисключающих классификация,
т. е. выберите один из N
классы. Также применимо, когда N = 2
.
метки должны быть закодированы одним горячим или могут содержать мягкие вероятности классов: конкретный пример может принадлежать классу A с вероятностью 50% и классу B с 50% вероятностью. Заметьте, что строго говоря это не означает, что он принадлежит к обоим классам, но можно интерпретировать вероятности этого пути.
как и в sigmoid
семья tf.losses.softmax_cross_entropy
позволяет
установить в пакете весом, т. е. сделать некоторые примеры более важными, чем другие.
Насколько я знаю, с tensorflow 1.3 нет встроенного способа установить гирей класс.
[UPD] в tensorflow 1.5, v2
версия был представлен и оригинал softmax_cross_entropy_with_logits
потеря устарела. Единственное различие между ними заключается в том, что в более новой версии backpropagation происходит как в логитах, так и в метках (здесь обсуждение почему это может быть полезно).
семейство разреженных функций
tf.nn.sparse_softmax_cross_entropy_with_logits
tf.losses.sparse_softmax_cross_entropy
-
tf.contrib.losses.sparse_softmax_cross_entropy
(рекомендуется)
как обычные softmax
выше, эти функции потерь должны быть использованы для
мультиномиальная взаимоисключающая классификация, т. е. выберите один из N
классы.
Разница заключается в кодировке меток: классы указывается как целые числа (индекс класса),
не один-горячие векторы. Очевидно, что это не позволяет мягкие классы, но это
можете сэкономить память, когда есть тысячи или миллионы классов.
Однако, обратите внимание, что logits
аргумент должен по-прежнему содержать логиты для каждого класса,
таким образом, он потребляет по крайней мере [batch_size, classes]
память.
как и выше, tf.losses
версии
для версии 1.5, , используя его аргумент с argument key=...
следующие>
softmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y,\
logits = my_prediction, dim=-1, name=None)