Я думаю, что важно понимать softmax и кросс-энтропию, по крайней мере, с практической точки зрения. Как только вы разберетесь с этими двумя концепциями, должно быть ясно, как их можно правильно использовать в контексте машинного обучения.
Кросс-энтропия H (p, q)
Кросс-энтропия - это функция, сравнивающая два распределения вероятностей. С практической точки зрения, вероятно, не стоит вдаваться в формальную мотивацию кросс-энтропии, хотя, если вам интересно, я бы порекомендовал Элементы теории информации Кавера и Томаса в качестве вводного текста. Эта концепция вводится довольно рано (я думаю, глава 2). Это вводный текст, который я использовал в аспирантуре, и я подумал, что он очень хорошо поработал (при условии, что у меня тоже был замечательный преподаватель).
Ключевым моментом, на который следует обратить внимание, является то, что кросс-энтропия - это функция, которая принимает в качестве входных данных два распределения вероятностей: q и p и возвращает значение, которое является минимальным, когда q и p равны. q представляет собой оценочное распределение, а p представляет истинное распределение.
В контексте классификации ML мы знаем фактическую метку обучающих данных, поэтому истинное / целевое распределение p имеет вероятность 1 для истинной метки и 0 в другом месте, то есть p является горячим вектором.
С другой стороны, оценочное распределение (выход модели) q, как правило, содержит некоторую неопределенность, поэтому вероятность любого класса в q будет между 0 и 1. Обучая систему минимизации перекрестной энтропии, мы сообщаем системе что мы хотим, чтобы расчетное распределение было как можно ближе к истинному. Следовательно, наиболее вероятным, по мнению вашей модели, является класс, соответствующий наивысшему значению q.
Софтмакс
Опять же, есть несколько сложных статистических способов интерпретации softmax, которые мы не будем здесь обсуждать. Ключевым моментом с практической точки зрения является то, что softmax - это функция, которая принимает список неограниченных значений в качестве входных данных и выводит допустимую функцию массы вероятности с сохранением относительного порядка. Важно подчеркнуть второй момент, касающийся относительного порядка. Это означает, что максимальный элемент на входе softmax соответствует максимальному элементу на выходе softmax.
Рассмотрим активированную модель softmax, обученную минимизировать перекрестную энтропию. В этом случае до softmax цель модели - получить максимально возможное значение для правильной метки и минимально возможное значение для неправильной метки.
CrossEntropyLoss в PyTorch
Определение CrossEntropyLoss в PyTorch: комбинация softmax и кросс-энтропии. Конкретно
CrossEntropyLoss (x, y): = H (one_hot (y), softmax (x))
Обратите внимание, что one_hot - это функция, которая принимает индекс y и разворачивает его в один горячий вектор.
Точно так же вы можете сформулировать CrossEntropyLoss как комбинацию LogSoftmax и отрицательная потеря логарифмической вероятности (например, NLLLoss в PyTorch)
LogSoftmax (x): = ln (softmax (x))
CrossEntropyLoss (x, y): = NLLLoss (LogSoftmax (x), y)
Из-за возведения в степень в softmax есть некоторые вычислительные приемы, которые делают прямое использование CrossEntropyLoss более стабильным (более точным, с меньшей вероятностью получить NaN), чем его поэтапное вычисление.
Заключение
На основании приведенного выше обсуждения ответы на ваши вопросы таковы:
1. Как наилучшим образом обучить стандартную классификационную сеть?
Как говорится в документе.
2. Если в сети есть последний линейный слой, как определить вероятности для каждого класса?
Примените softmax к выходу сети, чтобы вывести вероятности для каждого класса. Если цель состоит в том, чтобы просто найти класс относительного упорядочения или наивысшего класса вероятности, просто примените argsort или argmax к выходным данным напрямую (поскольку softmax поддерживает относительный порядок).
3. Если в сети есть последний слой softmax, как обучить сеть (какие потери и как)?
Как правило, вы не хотите обучать сеть, которая выводит softmaxed выходы из соображений стабильности, упомянутых выше.
Тем не менее, если вам по какой-то причине это абсолютно необходимо, вы должны взять журнал выходных данных и предоставить их NLLLoss.
criterion = nn.NLLLoss()
...
x = model(data) # assuming the output of the model is softmax activated
loss = criterion(torch.log(x), y)
что математически эквивалентно использованию CrossEntropyLoss с моделью, которая не использует активацию softmax.
criterion = nn.CrossEntropyLoss()
...
x = model(data) # assuming the output of the model is NOT softmax activated
loss = criterion(x, y)
22.12.2020