深層神經網路之經典損失函式
一, 交叉熵函式
交叉熵是一個資訊理論中的概念,但在此我們不深究它的本身意義,我們要知道,交叉熵刻畫了兩個概率分佈之間的距離,在深度神經網路的構建中,我們知道真實值和預測值之間會存在一個差值,這也就是為什麼使用交叉熵函式的原因.
給定兩個概率分佈p,q, 通過q來表示p的交叉熵為
H(p,q) = -∑ p(x) log q(x)
在這裡我們要知道交叉熵函式刻畫的是兩個概率分佈之間的距離,但神經網路的輸出不一定是一個概率分佈,所以,我們將會採用softmax迴歸函式,softmax迴歸本身可以作為一個學習演算法來優化分類結果,在TensorFlow中,softmax只是一層額外的處理層,它被加在原始輸出層和最終輸出層中間,目的就是輸出一個概率分佈.
通過TensorFlow實現交叉熵函式
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10,1.0)))
y_代表正確結果,y代表預測結果,在這裡一定要知道H(p,q)和H(q,p)是不一樣的,當交叉熵作為神經網路的損失函式時,前一個代表正確答案,後一個代表預測答案,這一行程式碼包含了4個不同的TensorFlow運算
tf.clip_by_value()函式可以將一個張量中的數值限制在一個範圍內在這個裡面就是將y限制在[1e-10, 1.0]這個區間內
tf.log()函式完成了對張量中所有元素依次求對數的功能
"*"和矩陣乘法是不一樣的,因為在在TensorFlow中矩陣乘法需要使用matmul()函式進行相乘,在這裡的相乘是元素的相乘
兩者的區別
v1 = tf.constant([1,2], [3,4]) v2 = tf.constant([5,6], [7,8])
print(v1 * v2).eval() #輸出[[5, 12], [21, 32]]
print(tf.matmul(v1, v2).eval())#輸出[[19, 22] [43, 50]]
通過上面的三步計算,我們會得到一個n×m的矩陣,這裡的n代表的是一個batch(批處理)中的所有樣例的數量,m為分類的數量,然後我們要把每行中的m個結果相加得到總的交叉熵,然後在對n行取平均得到一個batch的平均交叉熵,因為交叉熵一般會和softmax一起使用,所以TensorFlow將這兩個封裝在了一起
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
其中y代表原始神經網路輸出結果,y_則是標準答案,