Как выбрать потерю кросс-энтропии в TensorFlow?

84

Проблемы классификации, такие как логистическая регрессия или полиномиальная логистическая регрессия, оптимизируют кросс-энтропийную потерю. Обычно слой кросс-энтропии следует за слоем 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? .

Максим
источник
1
Также у нас есть tf.losses.log_loss, на самом деле это только для бинарной кроссентропии. Также github.com/tensorflow/tensorflow/issues/2462
mrgloom

Ответы:

140

Предварительные факты

  • В функциональном смысле сигмоид является частным случаем функции softmax , когда количество классов равно 2. Оба они выполняют одну и ту же операцию: преобразуют логиты (см. Ниже) в вероятности.

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

  • Логит (также называется оценкой) представляет собой сырое немасштабированное значение , связанное с классом , перед вычислением вероятности. С точки зрения архитектуры нейронной сети это означает, что логит является выходом плотного (полностью связного) слоя.

    Именование Tensorflow немного странно: все функции ниже принимают логиты, а не вероятности , и сами применяют преобразование (что просто более эффективно).

Семейство сигмовидных функций

Как было сказано ранее, sigmoidфункция потерь предназначена для двоичной классификации. Но функции тензорного потока являются более общими и позволяют выполнять классификацию с несколькими метками, когда классы независимы. Другими словами, сразу tf.nn.sigmoid_cross_entropy_with_logitsрешает N двоичные классификации.

Этикетки должны быть закодированы в горячем режиме или могут содержать вероятности мягких классов.

tf.losses.sigmoid_cross_entropyКроме того, позволяет установить вес в партии , т.е. сделать некоторые примеры более важными, чем другие. tf.nn.weighted_cross_entropy_with_logitsпозволяет устанавливать веса классов (помните, что классификация бинарная), т.е. делать положительные ошибки больше, чем отрицательные. Это полезно, когда данные обучения несбалансированы.

Семейство функций Softmax

Эти функции потерь следует использовать для полиномиальной взаимоисключающей классификации, то есть для выбора одной из 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

Семья с разреженными функциями

Как и обычные softmax, указанные выше, эти функции потерь следует использовать для полиномиальной взаимоисключающей классификации, то есть для выбора одной из Nклассов. Разница заключается в кодировке меток: классы указываются как целые числа (индекс класса), а не как горячие векторы. Очевидно, что это не позволяет использовать мягкие классы, но это может сэкономить некоторую память, когда существуют тысячи или миллионы классов. Однако обратите внимание, что logitsаргумент должен по-прежнему содержать логиты для каждого класса, поэтому он потребляет как минимум [batch_size, classes]память.

Как и выше, у tf.lossesверсии есть weightsаргумент, который позволяет устанавливать веса в пакете.

Семейство выборочных функций softmax

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

Аргументы weightsи biasesопределяют отдельный полностью связанный уровень, который используется для вычисления логитов для выбранной выборки.

Как и выше, labelsне кодируются одним горячим способом, но имеют форму [batch_size, num_true].

Выборочные функции подходят только для обучения. Во время тестирования рекомендуется использовать стандартные softmaxпотери (либо разреженные, либо горячие), чтобы получить фактическое распределение.

Другая альтернатива потерь - tf.nn.nce_lossэто оценка контрастности шума (если вам интересно, см. Это очень подробное обсуждение ). Я включил эту функцию в семейство softmax, потому что NCE гарантирует приближение к softmax в пределе.

Максим
источник
Могу я попросить разъяснений относительно перекрестной энтропии сигмовидной формы (sigCE)? Если он сразу решает Nзадачи двоичной классификации N = prod(output.shape), например shape = [batch, examples, channels]; N = (batch * examples * channels)? Если tf.lossesожидать "логитов" (выход сети), должен ли я также возвращать вероятности для простоты использования? не могли бы вы взглянуть на stackoverflow.com/questions/53612973/…
SumNeuron 05
5

Однако для версии 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)
Shivid
источник