Масштабировать значение потери в соответствии с "плохостью" в кафе

Я хочу масштабировать значение потерь каждого изображения на основе того, насколько близко / далеко находится "текущий прогноз" к "правильной метке" во время тренировки. Например, если верной меткой является "кошка" и сеть считает ее "собакой", штраф (убыток) должен быть меньше, чем в случае, если сеть считает ее "машиной".

То, что я делаю, заключается в следующем:

1- Я определил матрицу расстояния между метками,
2 - передать эту матрицу как основание "softmaxWithLoss" слой,
3 - умножьте каждое log(prob) на это значение, чтобы масштабировать потери в соответствии с forward_cpu

Однако я не знаю, что мне делать в backward_cpu часть. Я понимаю, что градиент (bottom_diff) должен быть изменен, но не совсем уверен, как включить значение масштаба здесь. По математике я должен масштабировать градиент по шкале (потому что это всего лишь шкала), но не знаю как.

Кроме того, похоже, что в caffe есть loosLayer "InfoGainLoss" это делает очень похожую работу, если я не ошибаюсь, однако обратная часть этого слоя немного сбивает с толку:

bottom_diff[i * dim + j] = scale * infogain_mat[label * dim + j] / prob;

Я не уверен почему infogain_mat[] делится на prob а не умножать на! Если я использую матрицу идентичности для infogain_mat разве это не должно действовать как потеря softmax как вперед, так и назад?

Буду очень признателен, если кто-нибудь даст мне несколько советов.

1 ответ

Вы правы, наблюдая, что масштабирование, которое вы делаете для log(prob) это именно то, что "InfogainLoss" слой делает (Вы можете прочитать больше об этом здесь и здесь).

Что касается производной (back-prop): потери, рассчитанные этим слоем, равны

L = - sum_j infogain_mat[label * dim + j] * log( prob(j) )

Если вы дифференцируете это выражение по отношению к prob(j) (которая является входной переменной для этого слоя), вы заметите, что производная от log(x) является 1/x вот почему вы видите, что

dL/dprob(j) = - infogain_mat[label * dim + j] / prob(j) 

Теперь, почему вы не видите подобное выражение в опоре "SoftmaxWithLoss" слой?
ну, как следует из названия этого уровня, на самом деле это комбинация двух уровней: softmax, которая вычисляет вероятности классов по выходам классификаторов и уровень потерь в журнале поверх него. Объединение этих двух слоев позволяет более надежно оценивать градиенты.
Работая немного с "InfogainLoss" слой я заметил, что иногда prob(j) может иметь очень маленькое значение, приводящее к нестабильной оценке градиентов.

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

введите описание изображения здесь

PS,
Обратите внимание, что если вы собираетесь использовать потерю информации для взвешивания, вы должны кормить H (infogain_mat) с метками сходства, а не расстояния.

Обновить:
Недавно я реализовал это надежное вычисление градиента и создал этот запрос на извлечение. Этот PR был объединен с основным филиалом в апреле 2017 года.

Другие вопросы по тегам