Масштабировать значение потери в соответствии с "плохостью" в кафе
Я хочу масштабировать значение потерь каждого изображения на основе того, насколько близко / далеко находится "текущий прогноз" к "правильной метке" во время тренировки. Например, если верной меткой является "кошка" и сеть считает ее "собакой", штраф (убыток) должен быть меньше, чем в случае, если сеть считает ее "машиной".
То, что я делаю, заключается в следующем:
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 года.