平均符号熵的计算公式_交叉熵(Cross Entropy)从原理到代码解读
- 原理部分:要想搞懂交叉熵需要先清楚一些概念,順序如下:==1.自信息量—>2.信息熵
(熵)—>3.相對(duì)熵(KL散度)—>4.交叉熵==
1.自信息量隨機(jī)事件發(fā)生概率對(duì)數(shù)的負(fù)值為該隨機(jī)事件的自信息量,記作。設(shè)的發(fā)生概率為,則其自信息為:
當(dāng),即隨機(jī)事件,不發(fā)生時(shí),定義為無限大;當(dāng),即隨機(jī)事件為確定事件必然發(fā)生時(shí),;對(duì)于,非負(fù)。
對(duì)數(shù)的底決定自信息量的單位。如果以2為底,信息量單位為比特(bit)(信息論中常用);如果以e為底數(shù),取自然對(duì)數(shù)單位為奈特(nat);如果以10為底,單位為迪特(det)。
舉個(gè)例子:
- ?冬季某天哈爾濱將下雪,這句話的發(fā)生概率很大(不確定性很小),所以信息量就小。
- ?夏季某天吐魯番將下雪,這句話的發(fā)生概率很小(不確定性很大),所以信息量就大。
2.信息熵設(shè)隨機(jī)變量取值于出現(xiàn)的概率為,那么所有可能事件的自信息量的加權(quán)平均,定義為隨機(jī)變量X的信息熵(簡稱熵),記為。即:
- ?
特例:在隨機(jī)變量服從二項(xiàng)分布(0-1分布)時(shí),只有兩種可能性,一個(gè)概率是另一個(gè)概率是,所以信息熵可以簡化為:
3.相對(duì)熵相對(duì)熵也是KL散度(Kullback-Leibler divergence),對(duì)于同一個(gè)隨機(jī)變量由兩個(gè)獨(dú)立的概率分布和,這時(shí)就可以用KL散度來衡量這兩個(gè)分布的差異。
在深度學(xué)習(xí)中通常表示樣本的真實(shí)分布,表示對(duì)樣本的預(yù)測(cè)分布。計(jì)算公式:
值越小,表示兩個(gè)分布就越接近。
4.交叉熵有了對(duì)前面概念的鋪墊,就很容易理解交叉熵的含義了。
交叉熵=信息熵+相對(duì)熵
為什么這么定義呢,先看相對(duì)熵,我們對(duì)相對(duì)熵計(jì)算公式展開得:
可以看出相對(duì)熵展開后的第一項(xiàng)正好是信息熵的負(fù)值。這樣信息熵加上相對(duì)熵就得到了交叉熵:
在深度學(xué)習(xí)中,我們需要評(píng)估真實(shí)值與預(yù)測(cè)值的差距。正由于相對(duì)熵展開后的第一項(xiàng)由訓(xùn)練數(shù)據(jù)決定且不變,因此在優(yōu)化過程中為了簡便,我們讓其與信息熵相加,這樣一來就可以只考慮相對(duì)熵的后一項(xiàng),并將其命名為了交叉熵。
- Pytorch代碼部分:原理整明白了,接下來我們看一下在pytorch中,交叉熵?fù)p失的代碼,參數(shù)設(shè)置大家參考文檔就好。
class torch.nn.CrossEntropyLoss( weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')pytorch中對(duì)交叉熵公式描述如下:
- 接下來我們重點(diǎn)看看這個(gè)公式 推理過程。
假設(shè)一個(gè)三分類問題,預(yù)測(cè)值為,真實(shí)類別值為 ?。交叉熵公式為:
交叉熵公式中計(jì)算的都是概率值,所有這里需要先對(duì)預(yù)測(cè)值做softmax操作,然后對(duì)真實(shí)值做one-hot編碼。對(duì)進(jìn)行one-hot編碼得到:。真實(shí)值是確定的,所以的概率為零,的概率也為零,的概率為1。
到這里將上面結(jié)果再與官方文檔對(duì)比,轉(zhuǎn)換一下符號(hào)就完全一致了,就是我們的,就是。
- 代碼實(shí)現(xiàn)一個(gè)例子:
import torchimport torch.nn as nnimport numpy as nptorch.manual_seed(2020)y = torch.empty(1, dtype=torch.long).random_(3)y_ = torch.randn(1,3,requires_grad=True)loss = nn.CrossEntropyLoss()L = loss(y_, y)print('真實(shí)值為:', y)print('預(yù)測(cè)值為:', y_)print('Pytorch計(jì)算的損失值為:', L)# 手動(dòng)計(jì)算驗(yàn)證:ynew = y.numpy()y_new = y_.detach().numpy()[0]num_class = y_new[ynew]L_new = -num_class + np.log(np.sum(list(map(np.exp, y_new))))print('手動(dòng)計(jì)算的損失值為:', L_new)輸出結(jié)果:真實(shí)值為:tensor([2])預(yù)測(cè)值為:tensor([[ 1.2566, -1.9265, -0.0638]], requires_grad=True)Pytorch計(jì)算的損失值為:tensor(1.5893, grad_fn=)手動(dòng)計(jì)算的損失值為:[1.589269]代碼顯示兩個(gè)方式計(jì)算的損失相等,驗(yàn)證了我們的推理過程是正確的。
總結(jié)
以上是生活随笔為你收集整理的平均符号熵的计算公式_交叉熵(Cross Entropy)从原理到代码解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wincc vbs mysql_Winc
- 下一篇: 文本文件 java_简单的用java实现