損失函數:交叉熵

給定兩個概率分佈p和q,通過q來表示p的交叉熵爲:

H(p,q)=xp(x)logq(x)\LARGE H(p,q)=-\sum_{x}p(x)logq(x)

交叉熵刻畫的是兩個概率分佈之間的距離,或可以說它刻畫的是通過概率分佈q來表達概率分佈p的困難程度,p代表正確答案,q代表的是預測值,交叉熵越小,兩個概率的分佈約接近。

在神經網絡中通常使用 Softmax 迴歸把前向傳播得到的結果變成概率分佈,所以交叉熵經常和 softmax 一起使用。

且在邏輯迴歸中,平方損失函數爲非凸函數,交叉熵損失函數爲凸函數。(只有當損失函數爲凸函數時,梯度下降算法才能保證達到全局最優解

import numpy as np


def cross_entropy(p, q):
    return -np.sum(p * np.log(q))


if __name__ == '__main__':
    print(cross_entropy([1, 0, 0], [0.5, 0.4, 0.1]))
    print(cross_entropy([1, 0, 0], [0.8, 0.1, 0.1]))
    print(cross_entropy([1, 0, 0], [0.9, 0.05, 0.05]))
    print(cross_entropy([1, 0, 0], [0.99, 0.005, 0.005]))
    print(cross_entropy([1, 0, 0], [0.99999, 0.000005, 0.000005]))
    # 0.3010299956639812
    # 0.09691001300805639
    # 0.045757490560675115
    # 0.004364805402450088
    # 4.342966533881614e-06

注:正確概率 p 一般是 one-hot 向量,而預測概率 q 經過 softmax 之後沒有零值,因爲 log0 無意義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章