Tensorflow: масштабированные логиты с кросс-энтропией

В Tensorflow у меня есть сеть классификаторов и несбалансированные учебные классы. По разным причинам я не могу использовать повторную выборку для компенсации несбалансированных данных. Поэтому я вынужден компенсировать дисбаланс другими способами, в частности умножая логиты на веса в зависимости от количества примеров в каждом классе. Я знаю, что это не лучший подход, но повторная выборка не подходит. Моя тренировочная потеря - tf.nn.softmax_cross_entropy_with_logits (тоже могу попробовать tf.nn.sparse_softmax_cross_entropy_with_logits). Документация Tensorflow включает в описание этих операций следующее:

ПРЕДУПРЕЖДЕНИЕ. Эта операция ожидает немасштабированных логитов, поскольку для повышения эффективности она выполняет softmax для логитов внутри. Не вызывайте эту операцию с выводом softmax, так как она даст неверные результаты.

Мой вопрос: относится ли приведенное выше предупреждение только к масштабированию, выполняемому softmax, или это означает, что любое масштабирование логита любого типа запрещено? Если последнее, то вызывает ли мой логит-масштабирование с перебалансировкой классов ошибочные результаты?

Спасибо,

Рон


person Ron Cohen    schedule 30.09.2016    source источник
comment
Интересно, нашли ли вы решение, которое работает для вас? Я столкнулся с аналогичной проблемой, и мне интересно, как другим удалось с ней справиться?   -  person VS_FF    schedule 20.06.2017
comment
Я попытался умножить перекрестную энтропию для каждого примера на вес истинного класса для этого примера, но с сомнительными результатами. Я прибег к повторной выборке данных.   -  person Ron Cohen    schedule 25.06.2017


Ответы (1)


Предупреждение просто информирует вас, что tf.nn.softmax_cross_entropy_with_logits применит softmax к входным логитам перед вычислением кросс-энтропии. Это предупреждение действительно помогает избежать двойного применения softmax, поскольку результаты кросс-энтропии будут сильно отличаться.

Вот комментарий в соответствующем исходном коде. о функции, реализующей tf.nn.softmax_cross_entropy_with_logits:

// NOTE(touts): This duplicates some of the computations in softmax_op
// because we need the intermediate (logits -max(logits)) values to
// avoid a log(exp()) in the computation of the loss.

Как указано в предупреждении, эта реализация предназначена для повышения производительности с предостережением, что вы не должны помещать свой собственный слой softmax в качестве входных данных (что на практике несколько удобно).

Если принудительный softmax мешает вашим вычислениям, возможно, поможет другой API: tf.nn.sigmoid_cross_entropy_with_logits или, возможно, tf.nn.weighted_cross_entropy_with_logits .


Однако реализация, похоже, не указывает на то, что любое масштабирование повлияет на результат. Я предполагаю, что функция линейного масштабирования должна быть в порядке, если она сохраняет исходное перераспределение логитов. Но что бы ни применялось к входным логитам, tf.nn.softmax_cross_entropy_with_logits будет применять softmax перед вычислением кросс-энтропии.

person Eric Platon    schedule 30.09.2016