一條信息的信息量大小和它的不確定性有很大的關(guān)系 。一句話如果需要很多外部信息才能確定,我們就稱這句話的信息量比較大。比如你聽到“云南西雙版納下雪了”,那你需要去看天氣預(yù)報(bào)、問當(dāng)?shù)厝说鹊炔樽C(因?yàn)樵颇衔麟p版納從沒下過雪)。相反,如果和你說“人一天要吃三頓飯”,那這條信息的信息量就很小,因?yàn)檫@條信息的確定性很高。

你所需要的網(wǎng)站建設(shè)服務(wù),我們均能行業(yè)靠前的水平為你提供.標(biāo)準(zhǔn)是產(chǎn)品質(zhì)量的保證,主要從事成都做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)網(wǎng)站建設(shè)、成都做手機(jī)網(wǎng)站、網(wǎng)頁設(shè)計(jì)、成都品牌網(wǎng)站建設(shè)、網(wǎng)頁制作、做網(wǎng)站、建網(wǎng)站。創(chuàng)新互聯(lián)公司擁有實(shí)力堅(jiān)強(qiáng)的技術(shù)研發(fā)團(tuán)隊(duì)及素養(yǎng)的視覺設(shè)計(jì)專才。
那我們就能將事件 的信息量定義如下(其中 表示事件 發(fā)生的概率):
信息量是對于單個(gè)事件來說的 ,但是實(shí)際情況一件事有很多種發(fā)生的可能,比如擲骰子有可能出現(xiàn)6種情況,明天的天氣可能晴、多云或者下雨等等。 熵是表示隨機(jī)變量不確定的度量,是對所有可能發(fā)生的事件產(chǎn)生的信息量的期望 。公式如下:
的曲線如下:
結(jié)合熵的公式(2)以及 曲線,當(dāng)這些所有可能發(fā)生事件的概率比較小(接近0)或者比較大(接近1)時(shí),熵的值會比較小;如果事件發(fā)生的概率既遠(yuǎn)離0也遠(yuǎn)離1時(shí),熵的值就會比較大。
例如,如下三組事件比較:
1)事件概率均等,[0.2500, 0.2500, 0.2500, 0.2500],熵為2;
2)事件概率比較靠近0或者1,[0.1, 0.1, 0.1, 0.7],熵為1.3568;
3)事件概率極其靠近0或者1,[0.001, 0.001, 0.001, 0.999],熵為0.0313.
熵的一種比較特殊的情況就是擲硬幣 ,只有正、反兩種情況,該種情況(二項(xiàng)分布或者0-1分布)熵的計(jì)算可以簡化如下:
其中, 表示正面概率。
相對熵又稱KL散度,用于衡量對于同一個(gè)隨機(jī)變量 的兩個(gè)分布 和 之間的差異 。在機(jī)器學(xué)習(xí)中, 常用于描述樣本的真實(shí)分布 ,例如[1,0,0,0]表示樣本屬于第一類,而 則常常用于表示預(yù)測的分布 ,例如[0.7,0.1,0.1,0.1]。顯然使用q(x)來描述樣本不如 準(zhǔn)確, 需要不斷地學(xué)習(xí)來擬合準(zhǔn)確的分布 。
KL散度的公式如下:
KL散度的值越小表示兩個(gè)分布越接近。
我們將KL散度的公式進(jìn)行變形,得到:
前半部分就是 的熵,后半部分就是我們的交叉熵:
機(jī)器學(xué)習(xí)中,我們常常使用KL散度來評估predict和label之間的差別,但是由于KL散度的前半部分是一個(gè)常量,所以我們常常將后半部分的交叉熵作為損失函數(shù),其實(shí)二者是一樣的。
交叉熵代價(jià)函數(shù)(Cross-entropy cost function)是用來衡量人工神經(jīng)網(wǎng)絡(luò)(ANN)的預(yù)測值與實(shí)際值的一種方式。與二次代價(jià)函數(shù)相比,它能更有效地促進(jìn)ANN的訓(xùn)練。在介紹交叉熵代價(jià)函數(shù)之前,本文先簡要介紹二次代價(jià)函數(shù),以及其存在的不足。
ANN的設(shè)計(jì)目的之一是為了使機(jī)器可以像人一樣學(xué)習(xí)知識。人在學(xué)習(xí)分析新事物時(shí),當(dāng)發(fā)現(xiàn)自己犯的錯(cuò)誤越大時(shí),改正的力度就越大。比如投籃:當(dāng)運(yùn)動(dòng)員發(fā)現(xiàn)自己的投籃方向離正確方向越遠(yuǎn),那么他調(diào)整的投籃角度就應(yīng)該越大,籃球就更容易投進(jìn)籃筐。同理, 我們希望:ANN在訓(xùn)練時(shí),如果預(yù)測值與實(shí)際值的誤差越大,那么在反向傳播訓(xùn)練的過程中,各種參數(shù)調(diào)整的幅度就要更大,從而使訓(xùn)練更快收斂。 然而,如果使用二次代價(jià)函數(shù)訓(xùn)練ANN,看到的實(shí)際效果是,如果誤差越大,參數(shù)調(diào)整的幅度可能更小,訓(xùn)練更緩慢。
以一個(gè)神經(jīng)元的二類分類訓(xùn)練為例,進(jìn)行兩次實(shí)驗(yàn)(ANN常用的激活函數(shù)為sigmoid函數(shù),該實(shí)驗(yàn)也采用該函數(shù)):輸入一個(gè)相同的樣本數(shù)據(jù)x=1.0(該樣本對應(yīng)的實(shí)際分類y=0);兩次實(shí)驗(yàn)各自隨機(jī)初始化參數(shù),從而在各自的第一次前向傳播后得到不同的輸出值,形成不同的代價(jià)(誤差):
在實(shí)驗(yàn)1中,隨機(jī)初始化參數(shù),使得第一次輸出值為0.82(該樣本對應(yīng)的實(shí)際值為0);經(jīng)過300次迭代訓(xùn)練后,輸出值由0.82降到0.09,逼近實(shí)際值。而在實(shí)驗(yàn)2中,第一次輸出值為0.98,同樣經(jīng)過300迭代訓(xùn)練,輸出值只降到了0.20。
從兩次實(shí)驗(yàn)的代價(jià)曲線中可以看出: 實(shí)驗(yàn)1的代價(jià)隨著訓(xùn)練次數(shù)增加而快速降低,但實(shí)驗(yàn)2的代價(jià)在一開始下降得非常緩慢;直觀上看,初始的誤差越大,收斂得越緩慢。
其實(shí),誤差大導(dǎo)致訓(xùn)練緩慢的原因在于使用了二次代價(jià)函數(shù)。二次代價(jià)函數(shù)的公式如下:
其中, 表示代價(jià), 表示樣本, 表示實(shí)際值, 表示輸出值, 表示樣本的總數(shù)。為簡單起見,同樣一個(gè)樣本為例進(jìn)行說明,此時(shí)二次代價(jià)函數(shù)為:
目前訓(xùn)練ANN最有效的算法是反向傳播算法 。簡而言之,訓(xùn)練ANN就是通過反向傳播代價(jià),以減少代價(jià)為導(dǎo)向,調(diào)整參數(shù)。參數(shù)主要有:神經(jīng)元之間的連接權(quán)重 ,以及每個(gè)神經(jīng)元本身的偏置 。調(diào)參的方式是采用梯度下降算法(Gradient descent),沿著梯度方向調(diào)整參數(shù)大小。 和 的梯度推導(dǎo)如下:
其中, 表示神經(jīng)元的輸入, 表示激活函數(shù)。從以上公式可以看出, 和 的梯度跟激活函數(shù)的梯度成正比,激活函數(shù)的梯度越大, 和 的大小調(diào)整得越快,訓(xùn)練收斂得就越快。而神經(jīng)網(wǎng)絡(luò)常用的激活函數(shù)為sigmoid函數(shù),該函數(shù)的曲線如下所示:
如圖所示, 實(shí)驗(yàn)2的初始輸出值(0.98)對應(yīng)的梯度明顯小于實(shí)驗(yàn)1的輸出值(0.82),因此實(shí)驗(yàn)2的參數(shù)梯度下降得比實(shí)驗(yàn)1慢。這就是初始的代價(jià)(誤差)越大,導(dǎo)致訓(xùn)練越慢的原因。 與我們的期望不符,即:不能像人一樣,錯(cuò)誤越大,改正的幅度越大,從而學(xué)習(xí)得越快。
可能有人會說,那就選擇一個(gè)梯度不變化或變化不明顯的激活函數(shù)不就解決問題了嗎?那樣雖然簡單粗暴地解決了這個(gè)問題,但可能會引起其他更多更麻煩的問題。而且,類似sigmoid這樣的函數(shù)(比如tanh函數(shù))有很多優(yōu)點(diǎn),非常適合用來做激活函數(shù),具體請自行g(shù)oogle之。
換個(gè)思路,我們不換激活函數(shù),而是換掉二次代價(jià)函數(shù),改用交叉熵代價(jià)函數(shù):
其中, 表示樣本, 表示樣本的總數(shù)。那么,重新計(jì)算參數(shù) 的梯度:
因此, 的梯度公式中原來的 被消掉了;另外,該梯度公式中的 表示輸出值與實(shí)際值之間的誤差。所以,當(dāng)誤差越大,梯度就越大,參數(shù) 調(diào)整得越快,訓(xùn)練速度也就越快。 實(shí)際情況證明,交叉熵代價(jià)函數(shù)帶來的訓(xùn)練效果往往比二次代價(jià)函數(shù)要好。
在實(shí)際分類任務(wù)中,要先將輸出層的輸出值經(jīng)過Softmax函數(shù),再經(jīng)過log函數(shù),最后才用交叉熵?fù)p失函數(shù)計(jì)算損失。
pytorch中有計(jì)算交叉熵?fù)p失的接口,即 F.cross_entropy() ,不過該接口包含了Softmax函數(shù)、log函數(shù)、交叉熵?fù)p失函數(shù)。也就是說 F.cross_entropy() = F.softmax() + torch.log() + F.nnl_loss() 。即使如此,也要使用 F.cross_entropy() ,不僅是因?yàn)樗唵危驗(yàn)樗鼙WC數(shù)值穩(wěn)定。
機(jī)器學(xué)習(xí)的過程就是希望在訓(xùn)練數(shù)據(jù)熵 模型學(xué)到的分布 和 真實(shí)的分布 越近越好,我們知道KL散度可以表示兩個(gè)分布之間的不同。
但我們沒有真實(shí)數(shù)據(jù)的分布,那么只能退而求其次,希望模型學(xué)到的分布和訓(xùn)練數(shù)據(jù)的分布 ,也就是把訓(xùn)練數(shù)據(jù)當(dāng)做模型和真實(shí)數(shù)據(jù)之間的代理人 。假設(shè)訓(xùn)練數(shù)據(jù)是從總體中獨(dú)立同步分布采樣(Independent and identically distributed sampled)而來,那么我們可以利用最小化訓(xùn)練數(shù)據(jù)的經(jīng)驗(yàn)誤差來降低模型的泛化誤差。簡單說:
由此非常理想化的看法是如果 模型(左) 能夠?qū)W到 訓(xùn)練數(shù)據(jù)(中) 的分布,那么應(yīng)該近似的學(xué)到了 真實(shí)數(shù)據(jù)(右) 的分布: 近似于 近似于
簡單的交叉熵,你真的懂了嗎?
交叉熵?fù)p失函數(shù)
平滑函數(shù)。
交叉熵?fù)p失函數(shù),也稱為對數(shù)損失或者logistic損失。當(dāng)模型產(chǎn)生了預(yù)測值之后,將對類別的預(yù)測概率與真實(shí)值(由0或1組成)進(jìn)行不比較,計(jì)算所產(chǎn)生的損失,然后基于此損失設(shè)置對數(shù)形式的懲罰項(xiàng)。
在神經(jīng)網(wǎng)絡(luò)中,所使用的Softmax函數(shù)是連續(xù)可導(dǎo)函數(shù),這使得可以計(jì)算出損失函數(shù)相對于神經(jīng)網(wǎng)絡(luò)中每個(gè)權(quán)重的導(dǎo)數(shù)(在《機(jī)器學(xué)習(xí)數(shù)學(xué)基礎(chǔ)》中有對此的完整推導(dǎo)過程和案例,這樣就可以相應(yīng)地調(diào)整模型的權(quán)重以最小化損失函數(shù)。
擴(kuò)展資料:
注意事項(xiàng):
當(dāng)預(yù)測類別為二分類時(shí),交叉熵?fù)p失函數(shù)的計(jì)算公式如下圖,其中y是真實(shí)類別(值為0或1),p是預(yù)測類別的概率(值為0~1之間的小數(shù))。
計(jì)算二分類的交叉熵?fù)p失函數(shù)的python代碼如下圖,其中esp是一個(gè)極小值,第五行代碼clip的目的是保證預(yù)測概率的值在0~1之間,輸出的損失值數(shù)組求和后,就是損失函數(shù)最后的返回值。
參考資料來源:百度百科-交叉熵
參考資料來源:百度百科-損失函數(shù)
????在使用pytorch深度學(xué)習(xí)框架,計(jì)算損失函數(shù)的時(shí)候經(jīng)常回到這么一個(gè)個(gè)函數(shù):
????該損失函數(shù)結(jié)合了 和 兩個(gè)函數(shù)。它在做分類(具體幾類)訓(xùn)練的時(shí)候是非常有用的。在訓(xùn)練過程中,對于每個(gè)類分配權(quán)值,可選的參數(shù)權(quán)值應(yīng)該是一個(gè)1D張量。當(dāng)你有一個(gè)不平衡的訓(xùn)練集時(shí),這是是非常有用的。那么針對這個(gè)函數(shù),下面將做詳細(xì)的介紹。
???? 交叉熵主要是用來判定實(shí)際的輸出與期望的輸出的接近程度 ,為什么這么說呢,舉個(gè)例子:在做分類的訓(xùn)練的時(shí)候,如果一個(gè)樣本屬于第K類,那么這個(gè)類別所對應(yīng)的的輸出節(jié)點(diǎn)的輸出值應(yīng)該為1,而其他節(jié)點(diǎn)的輸出都為0,即[0,0,1,0,….0,0],這個(gè)數(shù)組也就是樣本的Label,是神經(jīng)網(wǎng)絡(luò)最期望的輸出結(jié)果。也就是說用它來衡量網(wǎng)絡(luò)的輸出與標(biāo)簽的差異,利用這種差異經(jīng)過反向傳播去更新網(wǎng)絡(luò)參數(shù)。
在說交叉熵之前,先說一下 信息量 與 熵 。
???? 信息量: 它是用來衡量一個(gè)事件的不確定性的;一個(gè)事件發(fā)生的概率越大,不確定性越小,則它所攜帶的信息量就越小。假設(shè)X是一個(gè)離散型隨機(jī)變量,其取值集合為X,概率分布函數(shù)為 ,我們定義事件 的信息量為:
當(dāng) 時(shí),熵將等于0,也就是說該事件的發(fā)生不會導(dǎo)致任何信息量的增加。
???? 熵: 它是用來衡量一個(gè)系統(tǒng)的混亂程度的,代表一個(gè)系統(tǒng)中信息量的總和;信息量總和越大,表明這個(gè)系統(tǒng)不確定性就越大。
????舉個(gè)例子:假如小明和小王去打靶,那么打靶結(jié)果其實(shí)是一個(gè)0-1分布,X的取值有{0:打中,1:打不中}。在打靶之前我們知道小明和小王打中的先驗(yàn)概率為10%,99.9%。根據(jù)上面的信息量的介紹,我們可以分別得到小明和小王打靶打中的信息量。但是如果我們想進(jìn)一步度量小明打靶結(jié)果的不確定度,這就需要用到熵的概念了。那么如何度量呢,那就要采用 期望 了。我們對所有可能事件所帶來的信息量求期望,其結(jié)果就能衡量小明打靶的不確定度:
與之對應(yīng)的,小王的熵(打靶的不確定度)為: ????雖然小明打靶結(jié)果的不確定度較低,畢竟十次有9次都脫靶;但是小王打靶結(jié)果的不確定度更低,1000次射擊只有1次脫靶,結(jié)果相當(dāng)?shù)拇_定。
???? 交叉熵: 它主要刻畫的是實(shí)際輸出(概率)與期望輸出(概率)的距離,也就是交叉熵的值越小,兩個(gè)概率分布就越接近。假設(shè)概率分布p為期望輸出,概率分布q為實(shí)際輸出, 為交叉熵,則 ????那么該公式如何表示,舉個(gè)例子,假設(shè)N=3,期望輸出為 ,實(shí)際輸出 , ,那么: 通過上面可以看出,q2與p更為接近,它的交叉熵也更小。
????Pytorch中計(jì)算的交叉熵并不是采用 這種方式計(jì)算得到的,而是交叉熵的另外一種方式計(jì)算得到的: 它是交叉熵的另外一種方式。
????Pytorch中CrossEntropyLoss()函數(shù)的主要是將softmax-log-NLLLoss合并到一塊得到的結(jié)果。
????1、Softmax后的數(shù)值都在0~1之間,所以ln之后值域是負(fù)無窮到0。
????2、然后將Softmax之后的結(jié)果取log,將乘法改成加法減少計(jì)算量,同時(shí)保障函數(shù)的單調(diào)性
????3、NLLLoss的結(jié)果就是把上面的輸出與Label對應(yīng)的那個(gè)值拿出來(下面例子中就是:將log_output\logsoftmax_output中與y_target對應(yīng)的值拿出來),去掉負(fù)號,再求均值。
下面是我仿真寫的一個(gè)例子:
最計(jì)算得到的結(jié)果為:
????通過上面的結(jié)果可以看出,直接使用pytorch中的loss_func=nn.CrossEntropyLoss()計(jì)算得到的結(jié)果與softmax-log-NLLLoss計(jì)算得到的結(jié)果是一致的。
[1]
[2]
[3]
更多自然語言處理、pytorch相關(guān)知識,還請關(guān)注 AINLPer 公眾號,極品干貨即刻送達(dá)。
網(wǎng)站名稱:python交叉熵函數(shù) 交叉熵函數(shù)公式
文章轉(zhuǎn)載:http://chinadenli.net/article0/hipsoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站收錄、網(wǎng)站策劃、、響應(yīng)式網(wǎng)站、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)