Entropy
Вышеупомянутая формула является определением энтропии Шеннона, но вам может показаться неприятным смотреть на эту формулу Давайте приведем пример.
Предположим, есть четыре человека, каждый с равной вероятностью выигрыша (все), мы вычисляем энтропию этого распределения
a = torch.full([4], 1/4.) # tensor([0.2500, 0.2500, 0.2500, 0.2500])
print("Entropy:", -(a*torch.log2(a)).sum()) # Entropy: tensor(2.)
Чем выше энтропия, тем стабильнее представитель, тем меньше неожиданностей.
Допустим, осталось еще четыре человека, но вероятность выигрыша в лотерею стала 0,1, 0,1, 0,1, 0,7.Сколько становится Энтропия в это время?
a = torch.tensor([0.1, 0.1, 0.1, 0.7])
print("Entropy:", -(a*torch.log2(a)).sum()) # Entropy: tensor(1.3568)
Мы рассчитываем, что энтропия в этом случае становится меньше, что можно понимать как, предполагая, что в случае такого распределения вероятностей, сообщающего вам, что вы выиграли в лотерею, ваша степень удивления будет больше, чем степень удивления при одинаковая вероятность выиграть в лотерею
Наконец, предположим, что вероятность выигрыша в лотерею становится равной 0,001, 0,001, 0,001, 0,997. Чему равна энтропия в этот момент?
a = torch.tensor([0.001, 0.001, 0.001, 0.997])
print("Entropy:", -(a*torch.log2(a)).sum()) # Entropy: tensor(0.0342)
Энтропия в этом случае меньше, что указывает на то, что при таком распределении вероятности неожиданность вашего выигрыша особенно велика.
Cross Entropy
вычислить распределениеЭнтропия, которую мы обычно используемПредставлять. Чтобы вычислить Cross Entorpy для двух распределений, мы обычно используемПредставлять,Формула расчета
в,СейчасРасхождение Кульбака – Лейблера, китайский перевод - относительная энтропия или информационная дивергенция, и его формула
Простое понимание состоит в том, что если P и Q нарисованы как функции, то чем меньше они перекрываются, тем меньше они перекрываются.больше, если два изображения функций почти полностью совпадают,. если, то перекрестная энтропия равна энтропии
Для задачи классификации полученное значение pred представляет собой кодировку 0-1, то есть [0 0...1...0...0], очевидно, что энтропия этого pred,так как, то это пред и настоящая кодировкаПерекрестная энтропия между
Это означает, что когда мы идем на оптимизациюиКогда используется перекрестная энтропия, если это кодировка 0-1, это эквивалентно прямой оптимизации.иKL-дивергенция, и, как упоминалось ранее,иРасхождение KL является мерой перекрытия двух распределений.Когда расхождение KL близко к 0,истановится все ближе и ближе, и это именно то, что мы хотим оптимизировать
Давайте возьмем пример, чтобы проиллюстрироватьЭто цель, которую нам нужно оптимизировать Предположим, есть проблема классификации 5 (можно представить как пять животных), реальное значение,Предполагаемая стоимость,но
Предположим, что после раунда обновления параметра прогнозируемое значение изменилось,но
Перекрестная энтропия снизилась примерно на 0,8.Если MSE используется в качестве потерь, она упадет только примерно на 0,3–0,4, поэтому давайте поймем это с точки зрения восприятия, используя градиентный спуск с перекрестной энтропией быстрее.
import torch
import torch.nn.functional as F
x = torch.randn(1, 784) # [1, 784]
w = torch.randn(10, 784) # [10, 784]
logits = x@w.t() # [1, 10]
pred = F.softmax(logits, dim=1)
pred_log = torch.log(pred)
'''
注意下面cross_entropy和nll_loss传入参数的区别
'''
print(F.cross_entropy(logits, torch.tensor([3])))
# cross_entropy()函数已经把softmax和log打包在一起了,所以必须传一个原生的值logits
print(F.nll_loss(pred_log, torch.tensor([3])))
# null_loss()函数传入的参数需要经过softmax和log