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

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


person Maxim    schedule 31.10.2017    source источник
comment
Также у нас есть tf.losses.log_loss, на самом деле это только для бинарной кроссентропии. Также github.com/tensorflow/tensorflow/issues/2462   -  person mrgloom    schedule 28.10.2018


Ответы (3)


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

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

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

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

    Именование 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 позволяет устанавливать веса пакета, то есть делать одни примеры более важными, чем другие. Насколько мне известно, в тензорном потоке 1.3 нет встроенного способа установки весов классов.

[UPD] В tensorflow 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 в пределе.

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

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

Хотя замечательно, что принятый ответ содержит гораздо больше информации, чем запрошенный, я чувствовал, что использование нескольких общих правил большого пальца сделает ответ более компактным и интуитивно понятным:

  • Есть только одна реальная функция потерь. Это кросс-энтропия (CE). Для особого случая двоичной классификации эта потеря называется двоичный CE (обратите внимание, что формула не изменяется), а для небинарной или многоклассовые ситуации, то же самое называется категориальный CE (CCE). Разреженные функции являются частным случаем категориального CE, где ожидаемые значения не закодированы в горячем режиме, а являются целыми числами.
  • У нас есть формула softmax, которая является активацией для многоклассового сценария. Для двоичного сценария той же формуле дается специальное имя - сигмоид активация.
  • Поскольку при работе с логарифмическими функциями иногда возникают числовые нестабильности (для экстремальных значений), TF рекомендует объединить уровень активации и уровень потерь в одну функцию. Эта комбинированная функция численно более стабильна. TF предоставляет эти комбинированные функции, и они имеют суффикс _with_logits.

Итак, давайте теперь подойдем к некоторым ситуациям. Скажем, существует простая проблема бинарной классификации - присутствует кошка на изображении или нет? Какой есть выбор функции активации и потери? Это будет сигмовидная активация и (бинарный) CE. Таким образом, можно использовать sigmoid_cross_entropy или более предпочтительно sigmoid_cross_entropy_with_logits. Последняя объединяет функцию активации и потери и должна быть численно стабильной.

Как насчет мультиклассовой классификации? Допустим, мы хотим знать, присутствует ли на изображении кошка, собака или осел. Какой есть выбор функции активации и потери? Это будет активация softmax и (категорический) CE. Таким образом, можно использовать softmax_cross_entropy или более предпочтительно softmax_cross_entropy_with_logits. Мы предполагаем, что ожидаемое значение закодировано в горячем режиме (100 или 010 или 001). Если (по какой-то странной причине) это не так и ожидаемое значение является целым числом (либо 1, либо 2, либо 3), вы можете использовать «разреженные» аналоги вышеуказанных функций.

Возможен и третий случай. У нас может быть классификация с несколькими ярлыками. Таким образом, на одном изображении могут быть собака и кошка. Как мы с этим справимся? Хитрость здесь в том, чтобы рассматривать эту ситуацию как множественные проблемы бинарной классификации - в основном кошка или не кошка / собака, или без собаки и осла, или без осла. Определите потери для каждой из трех (двоичных классификаций), а затем сложите их. По сути, это сводится к использованию потери sigmoid_cross_entropy_with_logits.

Это отвечает на 3 конкретных вопроса, которые вы задали. Все, что необходимо, - это перечисленные выше функции. Вы можете игнорировать семейство tf.contrib, которое устарело и не должно использоваться.

person Allohvk    schedule 15.03.2021