轉自:
創新互聯從2013年成立,我們提供高端網站建設、小程序制作、電商視覺設計、app軟件開發公司及網絡營銷搜索優化服務,在傳統互聯網與移動互聯網發展的背景下,我們堅守著用標準的設計方案與技術開發實力作基礎,以企業及品牌的互聯網商業目標為核心,為客戶打造具商業價值與用戶體驗的互聯網+產品。
注意 :tensorflow交叉熵計算函數輸入中的logits都不是softmax或sigmoid的 輸出 ,而是softmax或sigmoid函數的 輸入 ,因為它在 函數內部進行sigmoid或softmax操作
tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None)
參數: ?? _sentinel:本質上是不用的參數,不用填
? ? ?? logits:一個數據類型(type)是float32或float64;
? ? ?? shape:[batch_size,num_classes],單樣本是[num_classes]
? ? ?? labels:和logits具有相同的type(float)和shape的張量(tensor),
? ? ?? name:操作的名字,可填可不填
輸出:
? ? ?? loss,shape:[batch_size,num_classes]
Note: 它對于輸入的logits先通過sigmoid函數計算,再計算它們的交叉熵,但是它對交叉熵的計算方式進行了優化,使得結果不至于溢出。它適用于每個類別相互獨立但互不排斥的情況:例如一幅圖可以同時包含一條狗和一只大象。output不是一個數,而是一個batch中每個樣本的loss,所以一般配合tf.reduce_mea(loss)使用
計算公式:
Python 程序:
輸出的E1,E2結果相同
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)argument:
_sentinel: 本質上是不用的參數,不用填
logits:一個數據類型(type)是float32或float64;
shape :[batch_size,num_classes]
labels:和logits具有相同type和shape的張量(tensor),,是一個有效的概率,sum(labels)=1, one_hot=True(向量中只有一個值為1.0,其他值為0.0)
name:操作的名字,可填可不填
output: loss,shape:[batch_size]
Note: 它對于輸入的logits先通過softmax( 不同于sigmoid )函數計算,再計算它們的交叉熵,但是它對交叉熵的計算方式進行了優化,使得結果不至于溢出。它適用于每個類別相互獨立且排斥的情況,一幅圖只能屬于一類,而不能同時包含一條狗和一只大象。output不是一個數,而是一個batch中每個樣本的loss,所以一般配合tf.reduce_mean(loss)使用。
計算公式:
Python程序:
import tensorflow as tf
import numpy as np
def softmax(x):
sum_raw = np.sum(np.exp(x),axis=-1)
x1 = np.ones(np.shape(x))
for i in range(np.shape(x)[0]):
? ? x1[i] = np.exp(x[i])/sum_raw[i]
return x1
y = np.array([[1,0,0],[0,1,0],[0,0,1],[1,0,0],[0,1,0]])#每一行只有一個1
logits =np.array([[12,3,2],[3,10,1],[1,2,5],[4,6.5,1.2],[3,6,1]])
y_pred =softmax(logits)
E1 = -np.sum(y*np.log(y_pred),-1)
print(E1)
sess = tf.Session()
y = np.array(y).astype(np.float64)
E2 = sess.run(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=logits))
print(E2)
輸出的E1,E2結果相同
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None, name=None)
argument:
_sentinel:本質上是不用的參數,不用填
logits:一個數據類型(type)是float32或float64;
shape:[batch_size,num_classes]
labels: shape為[batch_size],labels[i]是{0,1,2,……,num_classes-1}的一個索引, type為int32或int64
name:操作的名字,可填可不填
output:
loss,shape:[batch_size]
Note:它對于輸入的logits先通過softmax函數計算,再計算它們的交叉熵,但是它對交叉熵的計算方式進行了優化,使得結果不至于溢出
它適用于每個類別相互獨立且排斥的情況,一幅圖只能屬于一類,而不能同時包含一條狗和一只大象
output不是一個數,而是一個batch中每個樣本的loss,所以一般配合tf.reduce_mean(loss)使用
計算公式:
和tf.nn.softmax_cross_entropy_with_logits()一樣,只是要將labels轉換成tf.nn.softmax_cross_entropy_with_logits()中labels的形式
tf.nn.weighted_cross_entropy_with_logits(labels,logits, pos_weight, name=None)
計算具有權重的sigmoid交叉熵sigmoid_cross_entropy_with_logits()
argument:
_sentinel:本質上是不用的參數,不用填
logits:一個數據類型(type)是float32或float64;
shape:[batch_size,num_classes],單樣本是[num_classes]
labels:和logits具有相同的type(float)和shape的張量(tensor),
pos_weight:正樣本的一個系數
name:操作的名字,可填可不填
output:
loss,shape:[batch_size,num_classes]
計算公式:
平滑函數。
交叉熵損失函數,也稱為對數損失或者logistic損失。當模型產生了預測值之后,將對類別的預測概率與真實值(由0或1組成)進行不比較,計算所產生的損失,然后基于此損失設置對數形式的懲罰項。
在神經網絡中,所使用的Softmax函數是連續可導函數,這使得可以計算出損失函數相對于神經網絡中每個權重的導數(在《機器學習數學基礎》中有對此的完整推導過程和案例,這樣就可以相應地調整模型的權重以最小化損失函數。
擴展資料:
注意事項:
當預測類別為二分類時,交叉熵損失函數的計算公式如下圖,其中y是真實類別(值為0或1),p是預測類別的概率(值為0~1之間的小數)。
計算二分類的交叉熵損失函數的python代碼如下圖,其中esp是一個極小值,第五行代碼clip的目的是保證預測概率的值在0~1之間,輸出的損失值數組求和后,就是損失函數最后的返回值。
參考資料來源:百度百科-交叉熵
參考資料來源:百度百科-損失函數
一條信息的信息量大小和它的不確定性有很大的關系 。一句話如果需要很多外部信息才能確定,我們就稱這句話的信息量比較大。比如你聽到“云南西雙版納下雪了”,那你需要去看天氣預報、問當地人等等查證(因為云南西雙版納從沒下過雪)。相反,如果和你說“人一天要吃三頓飯”,那這條信息的信息量就很小,因為這條信息的確定性很高。
那我們就能將事件 的信息量定義如下(其中 表示事件 發生的概率):
信息量是對于單個事件來說的 ,但是實際情況一件事有很多種發生的可能,比如擲骰子有可能出現6種情況,明天的天氣可能晴、多云或者下雨等等。 熵是表示隨機變量不確定的度量,是對所有可能發生的事件產生的信息量的期望 。公式如下:
的曲線如下:
結合熵的公式(2)以及 曲線,當這些所有可能發生事件的概率比較小(接近0)或者比較大(接近1)時,熵的值會比較??;如果事件發生的概率既遠離0也遠離1時,熵的值就會比較大。
例如,如下三組事件比較:
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.
熵的一種比較特殊的情況就是擲硬幣 ,只有正、反兩種情況,該種情況(二項分布或者0-1分布)熵的計算可以簡化如下:
其中, 表示正面概率。
相對熵又稱KL散度,用于衡量對于同一個隨機變量 的兩個分布 和 之間的差異 。在機器學習中, 常用于描述樣本的真實分布 ,例如[1,0,0,0]表示樣本屬于第一類,而 則常常用于表示預測的分布 ,例如[0.7,0.1,0.1,0.1]。顯然使用q(x)來描述樣本不如 準確, 需要不斷地學習來擬合準確的分布 。
KL散度的公式如下:
KL散度的值越小表示兩個分布越接近。
我們將KL散度的公式進行變形,得到:
前半部分就是 的熵,后半部分就是我們的交叉熵:
機器學習中,我們常常使用KL散度來評估predict和label之間的差別,但是由于KL散度的前半部分是一個常量,所以我們常常將后半部分的交叉熵作為損失函數,其實二者是一樣的。
交叉熵代價函數(Cross-entropy cost function)是用來衡量人工神經網絡(ANN)的預測值與實際值的一種方式。與二次代價函數相比,它能更有效地促進ANN的訓練。在介紹交叉熵代價函數之前,本文先簡要介紹二次代價函數,以及其存在的不足。
ANN的設計目的之一是為了使機器可以像人一樣學習知識。人在學習分析新事物時,當發現自己犯的錯誤越大時,改正的力度就越大。比如投籃:當運動員發現自己的投籃方向離正確方向越遠,那么他調整的投籃角度就應該越大,籃球就更容易投進籃筐。同理, 我們希望:ANN在訓練時,如果預測值與實際值的誤差越大,那么在反向傳播訓練的過程中,各種參數調整的幅度就要更大,從而使訓練更快收斂。 然而,如果使用二次代價函數訓練ANN,看到的實際效果是,如果誤差越大,參數調整的幅度可能更小,訓練更緩慢。
以一個神經元的二類分類訓練為例,進行兩次實驗(ANN常用的激活函數為sigmoid函數,該實驗也采用該函數):輸入一個相同的樣本數據x=1.0(該樣本對應的實際分類y=0);兩次實驗各自隨機初始化參數,從而在各自的第一次前向傳播后得到不同的輸出值,形成不同的代價(誤差):
在實驗1中,隨機初始化參數,使得第一次輸出值為0.82(該樣本對應的實際值為0);經過300次迭代訓練后,輸出值由0.82降到0.09,逼近實際值。而在實驗2中,第一次輸出值為0.98,同樣經過300迭代訓練,輸出值只降到了0.20。
從兩次實驗的代價曲線中可以看出: 實驗1的代價隨著訓練次數增加而快速降低,但實驗2的代價在一開始下降得非常緩慢;直觀上看,初始的誤差越大,收斂得越緩慢。
其實,誤差大導致訓練緩慢的原因在于使用了二次代價函數。二次代價函數的公式如下:
其中, 表示代價, 表示樣本, 表示實際值, 表示輸出值, 表示樣本的總數。為簡單起見,同樣一個樣本為例進行說明,此時二次代價函數為:
目前訓練ANN最有效的算法是反向傳播算法 。簡而言之,訓練ANN就是通過反向傳播代價,以減少代價為導向,調整參數。參數主要有:神經元之間的連接權重 ,以及每個神經元本身的偏置 。調參的方式是采用梯度下降算法(Gradient descent),沿著梯度方向調整參數大小。 和 的梯度推導如下:
其中, 表示神經元的輸入, 表示激活函數。從以上公式可以看出, 和 的梯度跟激活函數的梯度成正比,激活函數的梯度越大, 和 的大小調整得越快,訓練收斂得就越快。而神經網絡常用的激活函數為sigmoid函數,該函數的曲線如下所示:
如圖所示, 實驗2的初始輸出值(0.98)對應的梯度明顯小于實驗1的輸出值(0.82),因此實驗2的參數梯度下降得比實驗1慢。這就是初始的代價(誤差)越大,導致訓練越慢的原因。 與我們的期望不符,即:不能像人一樣,錯誤越大,改正的幅度越大,從而學習得越快。
可能有人會說,那就選擇一個梯度不變化或變化不明顯的激活函數不就解決問題了嗎?那樣雖然簡單粗暴地解決了這個問題,但可能會引起其他更多更麻煩的問題。而且,類似sigmoid這樣的函數(比如tanh函數)有很多優點,非常適合用來做激活函數,具體請自行google之。
換個思路,我們不換激活函數,而是換掉二次代價函數,改用交叉熵代價函數:
其中, 表示樣本, 表示樣本的總數。那么,重新計算參數 的梯度:
因此, 的梯度公式中原來的 被消掉了;另外,該梯度公式中的 表示輸出值與實際值之間的誤差。所以,當誤差越大,梯度就越大,參數 調整得越快,訓練速度也就越快。 實際情況證明,交叉熵代價函數帶來的訓練效果往往比二次代價函數要好。
在實際分類任務中,要先將輸出層的輸出值經過Softmax函數,再經過log函數,最后才用交叉熵損失函數計算損失。
pytorch中有計算交叉熵損失的接口,即 F.cross_entropy() ,不過該接口包含了Softmax函數、log函數、交叉熵損失函數。也就是說 F.cross_entropy() = F.softmax() + torch.log() + F.nnl_loss() 。即使如此,也要使用 F.cross_entropy() ,不僅是因為它簡單,更因為它能保證數值穩定。
機器學習的過程就是希望在訓練數據熵 模型學到的分布 和 真實的分布 越近越好,我們知道KL散度可以表示兩個分布之間的不同。
但我們沒有真實數據的分布,那么只能退而求其次,希望模型學到的分布和訓練數據的分布 ,也就是把訓練數據當做模型和真實數據之間的代理人 。假設訓練數據是從總體中獨立同步分布采樣(Independent and identically distributed sampled)而來,那么我們可以利用最小化訓練數據的經驗誤差來降低模型的泛化誤差。簡單說:
由此非常理想化的看法是如果 模型(左) 能夠學到 訓練數據(中) 的分布,那么應該近似的學到了 真實數據(右) 的分布: 近似于 近似于
簡單的交叉熵,你真的懂了嗎?
交叉熵損失函數
????在使用pytorch深度學習框架,計算損失函數的時候經?;氐竭@么一個個函數:
????該損失函數結合了 和 兩個函數。它在做分類(具體幾類)訓練的時候是非常有用的。在訓練過程中,對于每個類分配權值,可選的參數權值應該是一個1D張量。當你有一個不平衡的訓練集時,這是是非常有用的。那么針對這個函數,下面將做詳細的介紹。
???? 交叉熵主要是用來判定實際的輸出與期望的輸出的接近程度 ,為什么這么說呢,舉個例子:在做分類的訓練的時候,如果一個樣本屬于第K類,那么這個類別所對應的的輸出節點的輸出值應該為1,而其他節點的輸出都為0,即[0,0,1,0,….0,0],這個數組也就是樣本的Label,是神經網絡最期望的輸出結果。也就是說用它來衡量網絡的輸出與標簽的差異,利用這種差異經過反向傳播去更新網絡參數。
在說交叉熵之前,先說一下 信息量 與 熵 。
???? 信息量: 它是用來衡量一個事件的不確定性的;一個事件發生的概率越大,不確定性越小,則它所攜帶的信息量就越小。假設X是一個離散型隨機變量,其取值集合為X,概率分布函數為 ,我們定義事件 的信息量為:
當 時,熵將等于0,也就是說該事件的發生不會導致任何信息量的增加。
???? 熵: 它是用來衡量一個系統的混亂程度的,代表一個系統中信息量的總和;信息量總和越大,表明這個系統不確定性就越大。
????舉個例子:假如小明和小王去打靶,那么打靶結果其實是一個0-1分布,X的取值有{0:打中,1:打不中}。在打靶之前我們知道小明和小王打中的先驗概率為10%,99.9%。根據上面的信息量的介紹,我們可以分別得到小明和小王打靶打中的信息量。但是如果我們想進一步度量小明打靶結果的不確定度,這就需要用到熵的概念了。那么如何度量呢,那就要采用 期望 了。我們對所有可能事件所帶來的信息量求期望,其結果就能衡量小明打靶的不確定度:
與之對應的,小王的熵(打靶的不確定度)為: ????雖然小明打靶結果的不確定度較低,畢竟十次有9次都脫靶;但是小王打靶結果的不確定度更低,1000次射擊只有1次脫靶,結果相當的確定。
???? 交叉熵: 它主要刻畫的是實際輸出(概率)與期望輸出(概率)的距離,也就是交叉熵的值越小,兩個概率分布就越接近。假設概率分布p為期望輸出,概率分布q為實際輸出, 為交叉熵,則 ????那么該公式如何表示,舉個例子,假設N=3,期望輸出為 ,實際輸出 , ,那么: 通過上面可以看出,q2與p更為接近,它的交叉熵也更小。
????Pytorch中計算的交叉熵并不是采用 這種方式計算得到的,而是交叉熵的另外一種方式計算得到的: 它是交叉熵的另外一種方式。
????Pytorch中CrossEntropyLoss()函數的主要是將softmax-log-NLLLoss合并到一塊得到的結果。
????1、Softmax后的數值都在0~1之間,所以ln之后值域是負無窮到0。
????2、然后將Softmax之后的結果取log,將乘法改成加法減少計算量,同時保障函數的單調性
????3、NLLLoss的結果就是把上面的輸出與Label對應的那個值拿出來(下面例子中就是:將log_output\logsoftmax_output中與y_target對應的值拿出來),去掉負號,再求均值。
下面是我仿真寫的一個例子:
最計算得到的結果為:
????通過上面的結果可以看出,直接使用pytorch中的loss_func=nn.CrossEntropyLoss()計算得到的結果與softmax-log-NLLLoss計算得到的結果是一致的。
[1]
[2]
[3]
更多自然語言處理、pytorch相關知識,還請關注 AINLPer 公眾號,極品干貨即刻送達。
當前標題:python交叉熵函數,熵 交叉熵
當前鏈接:http://vcdvsql.cn/article8/hshcop.html
成都網站建設公司_創新互聯,為您提供標簽優化、網站導航、微信小程序、企業網站制作、網站策劃、網站維護
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯