CrossEntropy|Вызов августовского обновления

алгоритм

Entropy

Entropy=iP(i)log1P(i)=iP(i)logP(i)\begin{aligned} \text{Entropy} &= \sum_i P(i)\log\frac{1}{P(i)} \\ &= -\sum_i P(i)\log P(i) \end{aligned}

Вышеупомянутая формула является определением энтропии Шеннона, но вам может показаться неприятным смотреть на эту формулу Давайте приведем пример.

Предположим, есть четыре человека, каждый с равной вероятностью выигрыша (все14\frac{1}{4}), мы вычисляем энтропию этого распределения

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

вычислить распределениеppЭнтропия, которую мы обычно используемH(p)H(p)Представлять. Чтобы вычислить Cross Entorpy для двух распределений, мы обычно используемH(p,q)H(p,q)Представлять,H(p,q)H(p,q)Формула расчета

H(p,q)=p(x)logq(x)=H(p)+DKL(pq)\begin{aligned} H(p,q)&= -\sum p(x) \log q(x) \\ &= H(p) + D_{KL}(p|q) \end{aligned}

вDKLD_{KL},СейчасРасхождение Кульбака – Лейблера, китайский перевод - относительная энтропия или информационная дивергенция, и его формула

DKL(PQ)=iP(i)lnQ(i)P(i)D_{KL}(P|Q) = -\sum_i P(i)\ln\frac{Q(i)}{P(i)}

Простое понимание состоит в том, что если P и Q нарисованы как функции, то чем меньше они перекрываются, тем меньше они перекрываются.DKLD_{KL}больше, если два изображения функций почти полностью совпадают,DKL0Д_{КЛ}≈0. еслиP=QP=Q, то перекрестная энтропия равна энтропии

Для задачи классификации полученное значение pred представляет собой кодировку 0-1, то есть [0 0...1...0...0], очевидно, что энтропия этого predH(p)=0H(p)=0,так как1log1=01\log1=0, то это пред и настоящая кодировкаqqПерекрестная энтропия между

H(p,q)=H(p)+DKL(pq)=DKL(pq)\begin{aligned} H(p,q)&= H(p) + D_{KL}(p|q) \\ &= D_{KL}(p|q) \end{aligned}

Это означает, что когда мы идем на оптимизациюppиqqКогда используется перекрестная энтропия, если это кодировка 0-1, это эквивалентно прямой оптимизации.ppиqqKL-дивергенция, и, как упоминалось ранее,ppиqqРасхождение KL является мерой перекрытия двух распределений.Когда расхождение KL близко к 0,ppиqqстановится все ближе и ближе, и это именно то, что мы хотим оптимизировать

Давайте возьмем пример, чтобы проиллюстрироватьH(p,q)H(p,q)Это цель, которую нам нужно оптимизировать Предположим, есть проблема классификации 5 (можно представить как пять животных), реальное значениеp=[1 0 0 0 0]p = [1\ 0\ 0\ 0\ 0],Предполагаемая стоимостьq=[0.4 0.3 0.05 0.05 0.2]q = [0.4\ 0.3\ 0.05\ 0.05\ 0.2],но

H(p,q)=ip(i)logq(i)=(1log0.4+0log0.3+0log0.05+0log0.05+0log0.2)=log0.40.916\begin{align} H(p,q)&= -\sum_i p(i)\log q(i) \\ &= -(1\log0.4 + 0\log0.3 + 0\log0.05 + 0\log0.05 + 0\log0.2) \\ &= -\log0.4 \\ &≈ 0.916 \end{выровнено}

Предположим, что после раунда обновления параметра прогнозируемое значение изменилосьq=[0.98 0.01 0 0 0.01]q = [0.98\ 0.01\ 0\ 0\ 0.01],но

H(p,q)=ip(i)logq(i)=(1log0.98+0log0.01+0log0+0log0+0log0.01)=log0.40.02\begin{align} H(p,q)&= -\sum_i p(i)\log q(i) \\ &= -(1\log0.98 + 0\log0.01 + 0\log0 + 0\ log0 + 0\log0.01) \\ &= -\log0.4 \\ &≈ 0.02 \end{выровнено}

Перекрестная энтропия снизилась примерно на 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