Предварительные факты
В функциональном смысле сигмоид является частным случаем функции 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 в пределе.
tf.losses.log_loss
, на самом деле это только для бинарной кроссентропии. Также github.com/tensorflow/tensorflow/issues/2462