Я тренирую нейронную сеть, чтобы классифицировать набор объектов в n-классы. Каждый объект может принадлежать нескольким классам одновременно (несколько классов, несколько меток).
Я читал, что для многоклассовых задач обычно рекомендуется использовать softmax и категориальную кросс-энтропию в качестве функции потерь вместо mse, и я более или менее понимаю, почему.
Для моей проблемы мультимаркировки не имеет смысла использовать softmax, конечно, поскольку вероятность каждого класса должна быть независимой от другой. Итак, мой последний слой - просто сигмовидные единицы, которые раздавливают свои входные данные в диапазоне вероятностей 0..1 для каждого класса.
Теперь я не уверен, какую функцию потерь я должен использовать для этого. Глядя на определение категориальной кроссентропии, я полагаю, что она не будет хорошо применяться к этой проблеме, поскольку она будет учитывать только выход нейронов, который должен быть 1, и игнорирует другие.
Бинарная кросс-энтропия звучит так, как будто она подходит лучше, но я вижу только упоминание о проблемах бинарной классификации с одним выходным нейроном.
Я использую Python и Keras для обучения в случае, если это имеет значение.
Ответы:
Если вы используете keras, просто поместите сигмоиды на выходной слой, а binary_crossentropy на функцию стоимости.
Если вы используете tenorflow, то можете использовать sigmoid_cross_entropy_with_logits . Но для моего случая эта функция прямой потери не сходилась. Таким образом, я в конечном итоге использовал явную потерю сигмоидальной перекрестной энтропии . Вы можете сделать свой собственный, как в этом примере(y⋅ln(sigmoid(logits))+(1−y)⋅ln(1−sigmoid(logits)))
Сигмоид, в отличие от softmax, не дает распределения вероятностей вокруг качестве выходных данных, но независимых вероятностей.nclasses
Если в среднем какой-либо строке назначается меньше меток, то вы можете использовать softmax_cross_entropy_with_logits, потому что с этой потерей, хотя классы являются взаимоисключающими, их вероятности не должны быть. Все, что требуется, - это то, что каждая строка меток является допустимым распределением вероятности. Если это не так, вычисление градиента будет неверным.
источник
ОБНОВЛЕНИЕ (18/04/18): Старый ответ все еще оказался полезным для моей модели. Хитрость заключается в том, чтобы моделировать функцию разделения и распределения по отдельности, используя, таким образом, силу softmax.
Считайте, что ваш вектор наблюдения содержит меток. (1, если образец i содержит метку m, 0 в противном случае). Таким образом, цель состоит в том, чтобы смоделировать матрицу для каждого образца. Следовательно, модель оценивает . Рассмотрим расширение чтобы получить два свойства:y m yim=δim F(yi,xi)=−logP(yi|xi) yim=Z⋅P(ym)
Тогда это вопрос моделирования двух по отдельности. Функция распределения лучше всего моделируется со слоем softmax , а функция разделения может моделироваться линейной единицей (на практике я ограничил ее как . Более сложное моделирование, такое как единица Пуассона, вероятно, будет работать лучше). Затем вы можете применить распределенную потерю (KL для распределения и MSE для раздела) или попробовать следующую потерю для их продукта.max(0.01,output)
На практике выбор оптимизатора также имеет огромное значение. Мой опыт работы с подходом факторизации заключается в том, что он лучше всего работает под Adadelta (Adagrad у меня не работает, пока не пробовал RMSprop, производительность SGD зависит от параметров).
Побочный комментарий к сигмовидной кишке: я, конечно, попробовал сигмоидную + кроссентропию, и это не сработало. Модель склонна прогнозировать только и не смогла уловить изменение функции распределения. (ака, это как-то весьма полезно для моделирования раздела и может быть математическая причина)Z
ОБНОВЛЕНИЕ : (Случайная мысль) Кажется, использование процесса Дирихле позволит включить некоторые из предшествующих по количеству меток?
ОБНОВЛЕНИЕ : Экспериментально, измененная дивергенция KL все еще склонна давать вывод мультикласса, а не вывод нескольких меток.
(Старый ответ)
Мой опыт с сигмоидальной перекрестной энтропией был не очень приятным. На данный момент я использую модифицированную KL-дивергенцию. Принимает форму
Они называются псевдораспределениями за ненормализованность. Таким образом, вы можете иметь если у вас есть 2 метки для конкретного образца.∑xP(x)=2
Керас импелментация
источник
adam
был намного лучше, чемrmsprop
Я еще не использовал керас. Взяв, например, кофе, вы можете использовать его
SigmoidCrossEntropyLossLayer
для решения нескольких задач.источник
На самом деле в tenorsflow вы все еще можете использовать
sigmoid_cross_entropy_mean
функцию расчета потерь в мульти-лейбле, я очень подтверждаю этоисточник
Я новичок здесь, но я постараюсь дать ему шанс с этим вопросом. Я искал то же самое, что и вы, и, наконец, я нашел очень хороший учебник по классификации мультиклассов keras @ http://machinelearningmastery.com/multi-class-classification-tutorial-keras-deep-learning-library/ .
Автор этого руководства использует функцию категориальной кросс-энтропийной потери, а также существует другая ветка, которая может помочь вам найти решение @ здесь .
источник