【TensorFlow】tf.nn.softmax_cross_entropy_with_logits中的“logits”到底是个什么意思?
tf.nn.softmax_cross_entropy_with_logits中的“logits”到底是個什么意思?_玉來愈宏的隨筆-CSDN博客 https://blog.csdn.net/yhily2008/article/details/80262321
tf.nn.softmax_cross_entropy_with_logits函數是TensorFlow中常用的求交叉熵的函數。其中函數名中的“logits”是個什么意思呢?它時不時地困惑初學者,下面我們就討論一下。
1.什么是logits?
說到Logits,首先要弄明白什么是Odds?
在英文里,Odds的本意是指幾率、可能性。它和我們常說的概率又有什么區別呢?
在統計學里,概率(Probability) 描述的是 某事件A出現的次數 與 所有事件出現的次數之比:
P(A) = 發生事件A的次數 / 所有事件的次數。 (公式1)
Odds(A)= 發生事件A的概率 / 不發生事件A的概率 (公式2)
換句話說,事件A的Odds 等于 事件A出現的次數 和 其它(非A)事件出現的次數 之比;
相比之下,事件A的概率 等于 事件A出現的次數 與 所有事件的次數 之比。
很容易推導得知:
概率P(A)和Odds(A)的 值域 是不同的。前者被鎖定在 [0,1] 之間,而后者則是 [0,∞) .
這說了半天,又何logit有什么關系呢?
請注意Logit一詞的分解,對它(it)Log(取對數),這里“it”就是Odds。下面我們就可以給出Logit的定義了:
公式4實際上就是所謂Logit變換。
2.Logit變換的意義在哪里
與概率不同的地方在于,Logit的一個很重要的特性,就是它沒有上下限,如圖1所示。
通過變換,Logit的值域沒有上下界限,這就給建模提供了方便。
想象這么一個場景,我們想研究某個事件A發送的概率P,P值的大小和某些因素相關,例如研究有毒藥物的使用劑量大小(x)和被測小白鼠的死亡率(P)之間的關系。
很顯然,死亡率P和x是正相關的,但由于P的值域在[0,1]之間,而x的取值范圍要寬廣得多。P不太可能是x的線性關系或二次函數,一般的多項式函數也不太適合,這就給此類函數的擬合(回歸分析)帶來麻煩。
此外,當P接近于0或1的時候,即使一些因素變化很大,P的值也不會有顯著變化。
例如,對于高可靠系統,可靠度P已經是0.997了,倘若在改善條件、提高工藝和改進體系結構,可靠度的提升只能是小數點后后三位甚至后四位,單純靠P來度量,已經讓我們無所適從,不知道改善條件、提高工藝和改進體系結構到底有多大作用。
再比如,宏觀來看,災難性天氣發送的概率P非常低(接近于0),但這類事件類似于黑天鵝事件(特征為:影響重大、難以預測及事后可解釋),由于P對接近于0的事件不敏感,通過P來度量,很難找到刻畫發生這類事件的前兆信息。
這時,Logit函數的優勢就體現出來了。從圖1可以看出,在P=0或P=1附近,Logit非常敏感(值域變化非常大)。通過Logit變換,P從0到1變化時,Logit是從到。Logit值域的不受限,讓回歸擬合變得容易了!
通常,我們先借助Logit變換,讓我們方便擬合數據(即邏輯回歸),然后再變換回我們熟悉的 概率 。就是這么一個循環,為數據分析提供了便利。某種程度上,這類變換,非常類似于化學中的催化劑。
在化學反應里, 催化劑 能改變反應物化學反應速率而不改變化學平衡,且本身的質量和化學性質在化學反應前后都沒有發生改變。
事實上,在多分類(如手寫識別等)中,某種 分類器的輸出 (即分類的打分),也稱為logits,即使它和Odds的本意并沒有多大聯系,但它們通過某種變換(如Softmax變換),也能變成“概率模型”,比如下面我們即將講到的Softmax變換。
3. TensorFlow中的Softmax函數:tf.nn.softmax_cross_entropy_with_logits
再回到softmax函數的討論上。
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None,dim=-1,name=None )這個函數的功能就是計算labels 和logits 之間的交叉熵(cross entropy)。
交叉熵(Cross Entropy)是Shannon信息論中一個重要概念,主要用于度量兩個概率分布間的差異性信息。
—比如說[0.2,0.3,0.5],labels的每一行必須是一個概率分布(即概率之和,加起來為1)。
—我們可以把logist理解為原生態的、未經縮放的,可視為一種未歸一化的l“概率替代物”,如[4, 1, -2]。它可以是其他分類器(如邏輯回歸等、SVM等)的輸出。
(即,沒有經過softmax歸一化的“概率”)
softmax歸一化:
Softmax把 概率替代物(logits) 從 [-inf, +inf] 映射到[0,1]。此外,Softmax還保證把所有參與映射的值,累計之和等于1,
變成諸如 [0.95, 0.05, 0] 的概率向量。這樣一來,經過Softmax加工的數據可以當做概率來用(如圖2所示)。
經過softmax的加工,就變成“歸一化”的概率(設為p1),這個新生成的概率p1,和labels所代表的概率分布(設為p2)一起作為參數,用來計算交叉熵。
- 說白了,就是把模型訓練,得到的預測值,和正確的標簽,計算交叉熵損失函數。
這個差異信息,作為我們網絡調參的依據,理想情況下,這兩個分布盡量趨近最好。如果有差異(也可以理解為誤差信號),我們就調整參數,讓其變得更小,這就是損失(誤差)函數的作用。
最終通過不斷地調參,logit被鎖定在一個最佳值(所謂最佳,是指讓交叉熵最小,此時的網絡參數也是最優的)。softmax和 交叉熵 的工作流程如圖3所示
圖3 從Odds值到概率值(圖片來源:互聯網)
- x作輸入,經過線性模型,與權重W相乘,加上偏置b,得到未經過歸一化處理的 “概率” :logits,
- “概率” :logits,經過softmax歸一化處理得到預測的 概率 ,
- 再經過損失(誤差)函數,計算交叉熵,如果不理想,就經過反向傳播算法,不斷調整權重、偏置,
-經過模型訓練, 最終得到預測的(one hot類型)的標簽。
下面我們列舉一個案例說明:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import tensorflow as tflabels = [[0.2,0.3,0.5],#假設為:輸入的正確的標簽[0.1,0.6,0.3]] logits = [[4,1,-2],#假設為:未經過歸一化的“概率”[0.1,1,3]]logits_scaled = tf.nn.softmax(logits)result = tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)with tf.Session() as sess:print (sess.run(logits_scaled))print (sess.run(result))運行結果:
#經過softmax歸一化的 概率,每一行加起來都為1 [[0.95033026 0.04731416 0.00235563][0.04622407 0.11369288 0.84008306]]#求得的交叉熵損失 [3.9509459 1.6642545]需要注意的是:
(1)如果labels的每一行是one-hot表示,也就是只有一個地方為1(或者說100%),其他地方為0(或者說0%),還可以使用tf.sparse_softmax_cross_entropy_with_logits()。之所以用100%和0%描述,就是讓它看起來像一個概率分布。
(2)tf.nn.softmax_cross_entropy_with_logits()函數已經過時 (deprecated),它在TensorFlow未來的版本中將被去除。取而代之的是
tf.nn.softmax_cross_entropy_with_logits_v2()。
(3)參數labels,logits必須有相同的形狀 [batch_size, num_classes] 和相同的類型(float16, float32, float64)中的一種,否則交叉熵無法計算。
(4)tf.nn.softmax_cross_entropy_with_logits 函數內部的 logits 不能進行縮放,因為在這個工作會在該函數內部進行(注意函數名稱中的 softmax ,它負責完成原始數據的歸一化),如果 logits 進行了縮放,那么反而會影響計算正確性。
節選自 張玉宏《深度學習之美》第11章節,電子工業出版社,博文視點,2018年7月出版
建議結合起來看:
【TensorFlow】tf.nn.softmax_cross_entropy_with_logits 函數:求交叉熵損失
總結
以上是生活随笔為你收集整理的【TensorFlow】tf.nn.softmax_cross_entropy_with_logits中的“logits”到底是个什么意思?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【TensorFlow】tf.nn.so
- 下一篇: 银行卡银联号在哪看