日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习中的信息论——交叉熵

發(fā)布時(shí)間:2024/7/23 pytorch 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习中的信息论——交叉熵 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

信息量

可以說就信息量是在將信息量化。首先信息的相對多少是有切實(shí)體會(huì)的,有的人一句話能包含很多信息,有的人說了等于沒說。我們還可以直觀地感覺到信息的多少和概率是有關(guān)的,概率大的信息也相對低一些。為了量化信息,一個(gè)做法就是找到一個(gè)單位,比如說拋硬幣就是一個(gè)基本單位,或者說我們使用01編碼。先看等概率的情況,種類數(shù)越多,那么需要編碼的長度就越大,每個(gè)碼字(編碼的每一位)獨(dú)立分布,所以當(dāng)每個(gè)碼字的取值為時(shí),可以表示的種類為,所以。因?yàn)槭堑雀?#xff0c;所以概率和種類數(shù)目就是倒數(shù)的關(guān)系,。那么,不等概的情況呢,比如把骰子的2改為1,那么轉(zhuǎn)到1那一面的概率為,我們以“”轉(zhuǎn)到1的一面“”這件事件為單位對概率1重新劃分,因?yàn)楦怕士偤蜑?,那么所有的類的數(shù)目就是1/p。

現(xiàn)在我們知道信息量中l(wèi)og取2為底和概率取導(dǎo)數(shù)的真正含義了。那么熵是什么呢?既然信息量是衡量一件事的不確定程度,那么熵就是衡量一個(gè)系統(tǒng)的混亂程度。它綜合了所有可能發(fā)生類別的不確定性,其實(shí)就是信息量的期望。從編碼的角度,熵指的是對隨機(jī)變量編碼所需的最小比特?cái)?shù)。有一種編碼的種類就叫作熵編碼,屬于無損編碼。因?yàn)殪鼐褪瞧骄畔⒘?#xff0c;而信息量是以01編碼進(jìn)行量化的,那么為了不損失信息,我們最少也需要這么多的bit進(jìn)行編碼。同時(shí)可以看到,概率越小出現(xiàn)的符號,允許使用更長的編碼,這樣整體的編碼效率才更高。

交叉熵

對于兩個(gè)信源,分別求熵可以得到各自平均每個(gè)字符對應(yīng)的最小的編碼長度。那么如果兩個(gè)信源互換編碼方式呢?平均每個(gè)字符所需的最小bit位如何計(jì)算呢。從公式上看,變化就是取對數(shù)的對象換成了編碼對象的概率分布,而加權(quán)所使用的概率仍然是自己的概率。可以預(yù)見,互換編碼方式之后求出的“熵”會(huì)增大。因?yàn)閮蓚€(gè)位置的概率不統(tǒng)一,所以被稱作交叉熵。

交叉熵用于評估兩個(gè)分布的差異,常用于分類任務(wù)。而分類中常用的激活函數(shù)是softmax,我們看看在代碼上有什么需要注意的地方。https://blog.csdn.net/weixin_40476348/article/details/94570666

import torch import torch.nn.functional as F import torch.nn as nntorch.manual_seed(2019)output = torch.randn(2, 3) # 網(wǎng)絡(luò)輸出 target = torch.ones(2, dtype=torch.long).random_(3) # 真實(shí)標(biāo)簽 print('output:\n{}'.format(output)) print('target:\n{}\n'.format(target))# 第一步,對output進(jìn)行l(wèi)og_softmax運(yùn)算 log_softmax = F.log_softmax(output, dim=1) print('log_softmax:\n{}\n'.format(log_softmax)) # 第二步,將計(jì)算結(jié)果和target輸入nll_loss損失函數(shù)計(jì)算交叉熵 nll_loss = F.nll_loss(log_softmax, target) print('nll_loss:{}'.format(nll_loss))# 直接使用cross_entropy損失函數(shù)計(jì)算output與target的交叉熵 cross_entropy_loss = F.cross_entropy(output, target) print('cross_entropy_loss:{}'.format(cross_entropy_loss))# 實(shí)例化類 criterion = nn.CrossEntropyLoss() loss = criterion(output, target) print('loss:{}'.format(loss))""" output: tensor([[-0.1187, 0.2110, 0.7463],[-0.6136, -0.1186, 1.5565]]) target: tensor([2, 0])log_softmax: tensor([[-1.5614, -1.2317, -0.6964],[-2.4335, -1.9386, -0.2635]])nll_loss:1.564985990524292 cross_entropy_loss:1.564985990524292 loss:1.564985990524292 """

當(dāng)使用torch中的cross_entropy函數(shù)時(shí),輸入可以直接是全連接的輸出和標(biāo)簽值,而不需要添加softmax。原因是在cross_entropy內(nèi)部自動(dòng)計(jì)算softmax得到概率,并且最終輸出交叉熵。

按照公式,交叉熵的計(jì)算可以分為三步:先計(jì)算輸出的判決概率;再取對數(shù);再以先驗(yàn)概率加權(quán)求和,并取負(fù)號。第一步由torch.softmax完成(原理細(xì)節(jié)可以參考之前的博客);第二步就是簡單的取對數(shù):torch.log;第三步在torch有函數(shù)F.nll_loss。而第一第二步又可以合并為一步:torch.Logsoftmax()

注意n.softmax在計(jì)算概率的時(shí)候要指定好維度,從而保證不同互斥類別的概率之和為1.

KL散度,相對熵

剛才提到,熵的一個(gè)重要意義是編碼對應(yīng)的最短碼字。注意看公式值權(quán)重的概率和log中的概率是相對應(yīng)的。權(quán)重的概率表示先驗(yàn)的分布,當(dāng)log中概率變?yōu)閝,權(quán)重仍然為p時(shí),表示依靠舊的先驗(yàn)分布去cover另外一個(gè)未知的情況,那么這時(shí)再計(jì)算出的值肯定會(huì)比原來的最短碼長長。他們的差值就是相對熵,寫成公式為:

注意權(quán)重概率都是p,p對應(yīng)時(shí)更短,所以放在減號右邊,經(jīng)過變換,寫成比例關(guān)系時(shí)位于分子的位置。當(dāng)然是長的減短的,所以取值范圍就是0~正無窮。經(jīng)過恒等變換,就可以得到我們最常見的KL散度的表達(dá)式。這就經(jīng)常被用來衡量兩個(gè)信源,或者說兩個(gè)分布的差異性,因?yàn)椴町愒酱?#xff0c;編碼的適用性越差,編碼長度變化量也越大。需要注意的是該“距離”不具有對稱性。

既然KL散度可以衡量兩個(gè)分布的差異,而機(jī)器學(xué)習(xí)/深度學(xué)習(xí)的目的就是讓模型在訓(xùn)練集和測試集中得分的分布盡可能接近,所以KL散度就可以用來作損失函數(shù)。但為什么常見的是交叉熵呢?這是因?yàn)镵L散度的一部分是恒定不變的,所以交叉熵和相對熵其實(shí)是同等變化的。交叉熵作為損失函數(shù)還有一個(gè)好處是使用sigmoid函數(shù)在梯度下降時(shí)能避免均方誤差損失函數(shù)學(xué)習(xí)速率降低的問題,因?yàn)閷W(xué)習(xí)速率可以被輸出的誤差所控制。

再深究一點(diǎn),其實(shí)最小化交叉熵和最大似然估計(jì)也是等價(jià)的。因?yàn)樽畲笏迫坏哪康钠鋵?shí)是最小化取負(fù)對數(shù),取對數(shù)的目的是防止連乘過程中的溢出。這就造成了二者首先在格式上是相似的。最大似然是求取模型的參數(shù)分布,使得輸出的值是已知樣本的概率最大,本質(zhì)上也是讓二者的分布最接近。

在決策樹中,除了使用基于熵的信息增益,常見的還有基尼不純度。從名字上看,不純度和熵的混亂程度是類似的;實(shí)際上,二者確實(shí)也是類似的,基尼不純度其實(shí)是熵的近似值(log泰勒展開,忽略高階項(xiàng))。基于近似后得到的新公式,也可以有新的解釋:一個(gè)隨機(jī)事件變成它的對立事件的概率/分錯(cuò)的概率。

在網(wǎng)上的資料中提到,熵與基尼不純度還有一個(gè)區(qū)別是熵到達(dá)峰值的過程相對慢一些,并且由此造成熵對于混亂程度的判罰要重一些。這里我不太明白,基尼不純度是通過舍棄高階項(xiàng)來近似熵,所以基尼不純度是要比熵值低一些的,二者都是在等概時(shí)取最大值,所以二者的關(guān)系是熵的曲線段在不純度上方,二者端點(diǎn)相同。因?yàn)殪刂蹈?#xff0c;所以作為損失函數(shù)時(shí)的懲罰力度更大。

scipy中實(shí)現(xiàn)了KL散度的計(jì)算,當(dāng)參數(shù)中只有一個(gè)序列時(shí),計(jì)算的是熵,并且可以指定以e為底還是以2為底:

>>>entropy([1/2, 1/2], base=2) 1.0

當(dāng)有兩個(gè)序列時(shí),以第一個(gè)序列為先驗(yàn)分布計(jì)算二者的KL散度:

>>>entropy([1/2, 1/2], qk=[9/10, 1/10]) 0.5108256237659907

而我在這里計(jì)算的時(shí)候返回的值是inf,即便輸入的是兩個(gè)完全一致的序列也是這樣,問題出在哪里呢?我這里犯了一個(gè)錯(cuò),輸入的序列應(yīng)該是各個(gè)事件發(fā)生的概率,即應(yīng)該是一個(gè)離散的概率密度序列,而不能直接輸入兩個(gè)取值的集合。尤其是取值可能出現(xiàn)負(fù)數(shù),這樣把它當(dāng)做概率進(jìn)行求對數(shù),就會(huì)出錯(cuò),返回inf。

對應(yīng)做法是利用scipy中的norm.pdf估計(jì)概率密度。還有就是手動(dòng)統(tǒng)計(jì)兩個(gè)序列在各個(gè)區(qū)間內(nèi)數(shù)值的頻率。比如可以利用np.percentile得到四分位數(shù)。

Reference:

https://zhuanlan.zhihu.com/p/59550047

https://www.zhihu.com/question/65288314

https://zhuanlan.zhihu.com/p/40024110

https://www.cnblogs.com/arkenstone/p/10524720.html

https://zhuanlan.zhihu.com/p/76667156

近似https://blog.csdn.net/yingwei13mei/article/details/75452526?utm_source=blogxgwz7

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的深度学习中的信息论——交叉熵的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。