Nano Hash - криптовалюты, майнинг, программирование

Как правильно использовать кросс-энтропийную потерю и Softmax для классификации?

Я хочу обучить классификатор с несколькими классами с помощью Pytorch.

После официального документа Pytorch показано, как использовать nn.CrossEntropyLoss() после последнего слоя введите nn.Linear(84, 10).

Однако я помню, что именно этим занимается Softmax.

Это сбивает меня с толку.


  1. Как наилучшим образом обучить стандартную классификационную сеть?
  2. Если в сети есть последний линейный слой, как определить вероятности для каждого класса?
  3. Если в сети есть последний слой softmax, как обучить сеть (какие потери и как)?

Я нашел эта ветка на форуме Pytorch, которая, вероятно, отвечает на все эти вопросы, но я не смог скомпилировать ее в рабочий и читаемый код Pytorch.


Мои предполагаемые ответы:

  1. Например, говорится в документе.
  2. Возведение в степень выходов линейного слоя, которые на самом деле являются логитами (логарифмическими вероятностями).
  3. Я не понимаю.

Ответы:


1

Я думаю, что важно понимать 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
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..