#neural-network #tensorflow #cross-entropy
#нейронная сеть #tensorflow #перекрестная энтропия
Вопрос:
В Tensorflow у меня есть сеть классификаторов и несбалансированные учебные классы. По разным причинам я не могу использовать передискретизацию для компенсации несбалансированных данных. Поэтому я вынужден компенсировать дисбаланс другими способами, в частности, умножая логиты на веса, основанные на количестве примеров в каждом классе. Я знаю, что это не предпочтительный подход, но повторная выборка не вариант. Моя операция по потере обучения tf.nn.softmax_cross_entropy_with_logits
(я мог бы также попробовать tf.nn.sparse_softmax_cross_entropy_with_logits
). Документы Tensorflow включают следующее в описание этих операций:
ПРЕДУПРЕЖДЕНИЕ: эта операция ожидает немасштабированные логиты, поскольку для повышения эффективности она выполняет softmax для логитов внутри. Не вызывайте эту операцию с выводом softmax, так как это приведет к неправильным результатам.
Мой вопрос: относится ли приведенное выше предупреждение только к масштабированию, выполняемому softmax, или это означает, что любое масштабирование логитов любого типа запрещено? Если последнее, то вызывает ли мое масштабирование логитов с перебалансировкой классов ошибочные результаты?
Спасибо,
Рон
Комментарии:
1. Интересно, нашли ли вы решение, которое работает для вас? Я сталкиваюсь с аналогичной проблемой, и мне интересно, как другим удалось справиться с этим?
2. Я попытался умножить перекрестную энтропию для каждого примера на вес истинного класса для примера, с сомнительными результатами. Я прибегнул к повторной выборке данных.
Ответ №1:
Предупреждение просто информирует вас tf.nn.softmax_cross_entropy_with_logits
о том, что softmax
перед вычислением перекрестной энтропии будет применено a к входным логитам. Это предупреждение, похоже, действительно позволяет избежать двойного применения 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
перед вычислением перекрестной энтропии.