ОБНОВЛЕНИЕ (18/04/18): Старый ответ все еще оказался полезным для моей модели. Хитрость заключается в том, чтобы моделировать функцию разделения и распределения по отдельности, используя, таким образом, силу softmax.
Считайте, что ваш вектор наблюдения содержит меток. (1, если образец i содержит метку m, 0 в противном случае). Таким образом, цель состоит в том, чтобы смоделировать матрицу для каждого образца. Следовательно, модель оценивает . Рассмотрим расширение чтобы получить два свойства:ymyim=δimF(yi,xi)=−logP(yi|xi)yim=Z⋅P(ym)
- Функция распределения:∑mP(ym)=1
- Функция разделения: оценивает количество метокZ
Тогда это вопрос моделирования двух по отдельности. Функция распределения лучше всего моделируется со слоем softmax , а функция разделения может моделироваться линейной единицей (на практике я ограничил ее как . Более сложное моделирование, такое как единица Пуассона, вероятно, будет работать лучше). Затем вы можете применить распределенную потерю (KL для распределения и MSE для раздела) или попробовать следующую потерю для их продукта.max(0.01,output)
На практике выбор оптимизатора также имеет огромное значение. Мой опыт работы с подходом факторизации заключается в том, что он лучше всего работает под Adadelta (Adagrad у меня не работает, пока не пробовал RMSprop, производительность SGD зависит от параметров).
Побочный комментарий к сигмовидной кишке: я, конечно, попробовал сигмоидную + кроссентропию, и это не сработало. Модель склонна прогнозировать только и не смогла уловить изменение функции распределения. (ака, это как-то весьма полезно для моделирования раздела и может быть математическая причина)Z
ОБНОВЛЕНИЕ : (Случайная мысль) Кажется, использование процесса Дирихле позволит включить некоторые из предшествующих по количеству меток?
ОБНОВЛЕНИЕ : Экспериментально, измененная дивергенция KL все еще склонна давать вывод мультикласса, а не вывод нескольких меток.
(Старый ответ)
Мой опыт с сигмоидальной перекрестной энтропией был не очень приятным. На данный момент я использую модифицированную KL-дивергенцию. Принимает форму
Loss(P,Q)=∑x|P(x)−Q(x)|⋅∣∣∣logP(x)Q(x)∣∣∣=∑x∣∣∣(P(x)−Q(x))⋅logP(x)Q(x)∣∣∣
Где - это целевое псевдораспределение, а - это предсказанное псевдораспределение (но функция на самом деле симметрична, поэтому это не имеет значения)
P(x)Q(x)
Они называются псевдораспределениями за ненормализованность. Таким образом, вы можете иметь если у вас есть 2 метки для конкретного образца.∑xP(x)=2
Керас импелментация
def abs_KL_div(y_true, y_pred):
y_true = K.clip(y_true, K.epsilon(), None)
y_pred = K.clip(y_pred, K.epsilon(), None)
return K.sum( K.abs( (y_true- y_pred) * (K.log(y_true / y_pred))), axis=-1)