Проблемы классификации, такие как логистическая регрессия или полиномиальная логистическая регрессия, оптимизируют кросс-энтропийную потерю. Обычно слой кросс-энтропии следует за слоем softmax , который производит распределение вероятностей.
В тензорном потоке есть как минимум дюжина различных функций кросс-энтропийных потерь :
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
?
Связанное (более ориентированное на математику) обсуждение: в чем разница между всеми этими потерями кросс-энтропии в Keras и TensorFlow? .
tf.losses.log_loss
, на самом деле это только для бинарной кроссентропии. Также github.com/tensorflow/tensorflow/issues/2462Ответы:
Предварительные факты
В функциональном смысле сигмоид является частным случаем функции softmax , когда количество классов равно 2. Оба они выполняют одну и ту же операцию: преобразуют логиты (см. Ниже) в вероятности.
В простой двоичной классификации между ними нет большой разницы, однако в случае полиномиальной классификации сигмоид позволяет работать с неисключительными метками (также известными как мульти-метки ), а softmax имеет дело с эксклюзивными классами (см. Ниже).
Логит (также называется оценкой) представляет собой сырое немасштабированное значение , связанное с классом , перед вычислением вероятности. С точки зрения архитектуры нейронной сети это означает, что логит является выходом плотного (полностью связного) слоя.
Именование 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
функция потерь предназначена для двоичной классификации. Но функции тензорного потока являются более общими и позволяют выполнять классификацию с несколькими метками, когда классы независимы. Другими словами, сразуtf.nn.sigmoid_cross_entropy_with_logits
решаетN
двоичные классификации.Этикетки должны быть закодированы в горячем режиме или могут содержать вероятности мягких классов.
tf.losses.sigmoid_cross_entropy
Кроме того, позволяет установить вес в партии , т.е. сделать некоторые примеры более важными, чем другие.tf.nn.weighted_cross_entropy_with_logits
позволяет устанавливать веса классов (помните, что классификация бинарная), т.е. делать положительные ошибки больше, чем отрицательные. Это полезно, когда данные обучения несбалансированы.Семейство функций 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] В тензорном потоке 1.5 была представлена
v2
версия, и исходная потеря устарела. Единственное различие между ними состоит в том, что в более новой версии обратное распространение происходит как в логитах, так и в метках ( вот обсуждение, почему это может быть полезно).softmax_cross_entropy_with_logits
Семья с разреженными функциями
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
версии естьweights
аргумент, который позволяет устанавливать веса в пакете.Семейство выборочных функций softmax
tf.nn.sampled_softmax_loss
tf.contrib.nn.rank_sampled_softmax_loss
tf.nn.nce_loss
Эти функции предоставляют еще одну альтернативу работе с огромным количеством классов. Вместо вычисления и сравнения точного распределения вероятностей они вычисляют оценку потерь на основе случайной выборки.
Аргументы
weights
иbiases
определяют отдельный полностью связанный уровень, который используется для вычисления логитов для выбранной выборки.Как и выше,
labels
не кодируются одним горячим способом, но имеют форму[batch_size, num_true]
.Выборочные функции подходят только для обучения. Во время тестирования рекомендуется использовать стандартные
softmax
потери (либо разреженные, либо горячие), чтобы получить фактическое распределение.Другая альтернатива потерь -
tf.nn.nce_loss
это оценка контрастности шума (если вам интересно, см. Это очень подробное обсуждение ). Я включил эту функцию в семейство softmax, потому что NCE гарантирует приближение к softmax в пределе.источник
N
задачи двоичной классификацииN = prod(output.shape)
, напримерshape = [batch, examples, channels]; N = (batch * examples * channels)
? Еслиtf.losses
ожидать "логитов" (выход сети), должен ли я также возвращать вероятности для простоты использования? не могли бы вы взглянуть на stackoverflow.com/questions/53612973/…Однако для версии 1.5
softmax_cross_entropy_with_logits_v2
необходимо использовать вместо этого, используя его аргумент сargument key=...
, напримерsoftmax_cross_entropy_with_logits_v2(_sentinel=None, labels=y, logits=my_prediction, dim=-1, name=None)
источник