Как выбрать кросс-энтропия потерь в 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 именование немного странно:все функции ниже принимают логиты, не вероятности, и применить сами преобразования (что просто более эффективно).

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

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

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

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

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

эти функции потерь должны использоваться для мультиномиальных взаимоисключающих классификация, т. е. выберите один из 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 происходит как в логитах, так и в метках (здесь обсуждение почему это может быть полезно).

семейство разреженных функций

как обычные 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)