天天看點

python交叉熵損失函數實作_Python:交叉熵-損失函數 (六十)

上一節的答案為什麼會是對數呢?因為對數具有良好的特性,即 log(ab)等于 log(a) 和 log(b) 的總和。

python交叉熵損失函數實作_Python:交叉熵-損失函數 (六十)

我們得到乘積,使用對數,使用底數為 e 的對數(自然對數)而不是底數為 10 的對數,底數為 10 的對數并沒有太大的差別,所有原理都是相同的,它隻是自然對數的結果乘上一個因子,這樣做是一個慣例。

e在科學技術中用得非常多,一般不使用以10為底數的對數。以e為底數,許多式子都能得到簡化,用它是最“自然”的,是以叫“自然對數”。

(1+1/n)^n,n越來越大,就越接近它

e是自然對數的底數,是一個無限不循環小數,其值是2.71828……,是這樣定義的:

當n->∞時,(1+1/n)^n的極限。

注:x^y表示x的y次方。

python交叉熵損失函數實作_Python:交叉熵-損失函數 (六十)

我們可以看到,上邊的對數都是負數,這是因為 0 到 1 之間的數字的對數都是負值,因為對 1 取對數才能得到 0 ,是以,機率的對數都是負值,對它取相反數是行得通的,這樣會得到正數。

這就是我們要做的,我們得到的機率的對數為負值,對它們的相反數進行求和,我們稱之為交叉熵(cross entropies),這是本節非常重要的概念。

python交叉熵損失函數實作_Python:交叉熵-損失函數 (六十)

如果我們計算交叉熵,我們看到左側錯誤的模型的交叉熵是 4.8 非常高,右側的更優的模型的交叉熵較低是 1.2, 實際上這是一個規律,準确的模型可以讓我們得到較低的交叉熵,而誤差較大的模型得到的交叉熵較高,這純粹因為好模型可以給我們較高的機率,它的對數取相反數後是個較小的數字,反之亦然。

這種方法比我們想象的還要強大,如果我們計算出機率,并且得到每個點所對應的值,我們實際得到了每個點的誤差,可以發現這些分類錯誤的點的值較大,正确分類的點對應的值都較小,這個還在于正确分類點的機率更接近于1.

是以我們可以把這些對數的相反數作為每個點的誤差,分類正确的點較小,分類錯誤的點較大。

python交叉熵損失函數實作_Python:交叉熵-損失函數 (六十)

現在我們可以得到結論,交叉熵可以告訴我們模型的好壞。是以,現在我們的目标從最大化機率轉變為最小化交叉熵,我們所尋找的誤差函數就是這個交叉熵。

交叉熵(cross entropy)

我們遇到了某種規律,機率和誤差函數之間肯定有一定的聯系,這種聯系叫做交叉熵。這個概念在很多領域都非常流行,包括機器學習領域。我們将詳細了解該公式,并編寫代碼!

python交叉熵損失函數實作_Python:交叉熵-損失函數 (六十)

交叉熵公式

python交叉熵損失函數實作_Python:交叉熵-損失函數 (六十)

CE[(1,1,0),(0.8,0.7,0.1)] = 0.69 說明:(1,1,0)表示機率分布,即是否有禮物

CE[(0,0,1),(0.8,0.7,0.1)] = 5.12

import numpy as np

# Write a function that takes as input two lists Y, P,

# and returns the float corresponding to their cross-entropy.

def cross_entropy(Y, P):

Y = np.float_(Y)

P = np.float_(P)

return -np.sum(Y * np.log(P) + (1 - Y) * np.log(1 - P))

列印:

Trying for Y=[1,0,1,1] and P=[0.4,0.6,0.1,0.5].

The correct answer is

4.8283137373

And your code returned

4.8283137373

Correct!

多類别交叉熵

上邊我們讨論了兩個類别的分類,這次我們讨論兩個以上類别的。

python交叉熵損失函數實作_Python:交叉熵-損失函數 (六十)

為者常成,行者常至