softmax
我們知道卷積神經網絡(CNN)在圖像領域的應用已經非常廣泛了,一般一個CNN網絡主要包含卷積層,池化層(pooling),全連接配接層,損失層等。雖然現在已經開源了很多深度學習架構(比如MxNet,Caffe等),訓練一個模型變得非常簡單,但是你對這些層具體是怎麼實作的了解嗎?你對softmax,softmax loss,cross entropy了解嗎?相信很多人不一定清楚。雖然網上的資料很多,但是品質參差不齊,常常看得眼花缭亂。為了讓大家少走彎路,特地整理了下這些知識點的來龍去脈,希望不僅幫助自己鞏固知識,也能幫到他人了解這些内容。
這一篇主要介紹全連接配接層和損失層的内容,算是網絡裡面比較基礎的一塊内容。先理清下從全連接配接層到損失層之間的計算。來看下面這張圖:

這張圖的等号左邊部分就是全連接配接層做的事,W是全連接配接層的參數,我們也稱為權值,X是全連接配接層的輸入,也就是特征。從圖上可以看出特征X是N * 1的向量,
X這是怎麼得到的呢?
這個特征X就是由全連接配接層前面多個卷積層和池化層處理後得到的。
這個特征X就是由全連接配接層前面多個卷積層和池化層處理後得到的
這個特征X就是由全連接配接層前面多個卷積層和池化層處理後得到的
重要的事說三遍。
假設全連接配接層前面連接配接的是一個卷積層,這個卷積層的輸出是100個特征(也就是我們常說的feature map的channel為100),每個特征的大小是4 * 4。那麼在将這些特征輸入給全連接配接層之前會将這些特征flat成N*1的向量(這個時候N就是100 * 4 * 4=1600)。這就是X的由來。
W的解釋:
W是全連接配接層的參數,是個T * N的矩陣,這個N和X的N是對應的(也就是必須一緻)。
T表示類别數,比如你是7分類,那麼T就是7。我們所說的訓練一個網絡,對于全連接配接層而言就是尋找最合适的W矩陣。
例子:
MINIST的資料分為2個部分:55000份訓練資料(mnist.train)和10000份測試資料(mnist.test),每一個圖檔均為28×28像素,我們可以将其了解為一個二維數組的結構,在數學意義上可以把MINIST每張圖檔看成是在784次元向量空間中的點。是以,W的N的值應該為784。MINIST資料集隻有10類資料:0 1 2 3 4 5 6 7 8 9 。是以W的T應該為10。是以W為W[10 * 784]。
是以,全連接配接層就是執行WX得到一個T * 1的向量(也就是圖中的logits[T * 1]),這個向量裡面的每個數都沒有大小限制的,也就是從負無窮大到正無窮大。然後如果你是多分類問題,一般會在全連接配接層後面接一個softmax層,這個softmax的輸入是T * 1的向量,輸出也是T * 1的向量(也就是圖中的prob[T * 1],這個向量的每個值表示這個樣本屬于每個類的機率),隻不過輸出的向量的每個值的大小範圍為0到1。
現在你知道softmax的輸出向量是什麼意思了,就是機率,該樣本屬于各個類的機率
比如:minist資料集 有10類,softmax會輸出樣本中屬于0類的機率是多少,屬于1類的機率是多少,屬于2類的機率是多少…
那麼softmax執行了什麼操作可以得到0到1的機率呢?先來看看softmax的公式(以前自己看這些内容時候對公式也很反感,不過靜下心來看就好了):
公式非常簡單,前面說過softmax的輸入是WX。假設模型的輸入樣本是L,讨論一個3分類問題(類别用1,2,3表示),樣本L的真實類别是2,那麼這個樣本經過網絡所有層到達softmax層之前就得到了WX(也就是第一張圖檔等号的左邊部分),也就是說WX是一個3 * 1的向量,那麼上面公式中的aj就表示這個3 * 1的向量中的第j個值(最後會得到S1,S2,S3),而分母中的ak則表示3 * 1 的向量中的3個值。是以會有個求和符号(這裡求和是k從1到T,T和上面圖中的T是對應相等的,也就是類别的意思,j的範圍也是1到T)。也就是每一個類别的值除以所有類别加起來的和。因為e^x恒大于0,是以分子永遠是正數,分母又是多個正數的和,是以分母也肯定是正數,是以Sj是正數,而且範圍一定是(0,1)。如果現在不是在訓練模型,而是在測試模型,那麼當一個樣本經過softmax層并輸出一個T * 1的向量時,就會取這個向量中值最大的那個數的index作為這個樣本的預測标簽。
例如tensorflow的邏輯回歸模型,測試模型的時候代碼為:
#經過softmax得到向量preds,然後tf.argmax(preds, 1)計算取這個向量中每一行最大元素所在的索引
preds = tf.nn.softmax(logits)
correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(Y, 1))
是以我們訓練全連接配接層的W的目标就是使得其輸出的WX在經過softmax層計算後其對應于真實标簽的預測機率要最高。
舉個例子:假設你的WX=[1,2,3],那麼經過softmax層後就會得到[0.09,0.24,0.67],這三個數字表示這個樣本屬于第1,2,3類的機率分别是0.09,0.24,0.67。值怎麼來的以0.09為例:
e1/(e1 + e2 + e3) = 0.09。其他值一樣算。
損失函數softmax_loss
在神經網絡反向傳播中,要求一個損失函數,這個損失函數其實表示的是真實值與網絡的估計值的誤差,知道誤差了,才能知道怎樣去修改網絡中的權重。
損失函數可以有很多形式,這裡用的是交叉熵函數,主要是由于這個求導結果比較簡單,易于計算,并且交叉熵解決某些損失函數學習緩慢的問題。交叉熵的函數是這樣的:
首先L是損失。Sj是softmax的輸出向量S的第j個值,前面已經介紹過了,表示的是這個樣本屬于第j個類别的機率。yj前面有個求和符号,j的範圍也是1到T類别數,是以y是一個1 * T的向量,裡面的T個值,而且隻有1個值是1,其他T-1個值都是0。那麼哪個位置的值是1呢?答案是真實标簽對應的位置的那個值是1,其他都是0。是以這個公式其實有一個更簡單的形式:
j指向目前樣本的真是标簽。假設一個5分類問題,然後一個樣本I的标簽y=[0,0,0,1,0],也就是說樣本I的真實标簽是4,假設模型預測的結果機率(softmax的輸出)p=[0.2,0.3,0.4,0.6,0.5],可以看出這個預測是對的,那麼對應的損失L=-log(0.6),也就是當這個樣本經過這樣的網絡參數産生這樣的預測p時,它的損失是-log(0.6)。那麼假設p=[0.2,0.3,0.4,0.1,0.5],這個預測結果就很離譜了,因為真實标簽是4,而你覺得這個樣本是4的機率隻有0.1(遠不如其他機率高,如果是在測試階段,那麼模型就會預測該樣本屬于類别5),對應損失L=-log(0.1)。那麼假設p=[0.2,0.3,0.4,0.3,0.5],這個預測結果雖然也錯了,但是沒有前面那個那麼離譜,對應的損失L=-log(0.3)。我們知道log函數在輸入小于1的時候是個負數,而且log函數是遞增函數,是以-log(0.6) < -log(0.3) < -log(0.1)。簡單講就是你預測錯比預測對的損失要大,預測錯得離譜比預測錯得輕微的損失要大。
這個過程也說明了softmax和max的差別。如我有兩個數a和b,max選取ab中機率最大的那個數,沒有第二種可能,但是對于b不公平啊,a的可能性比b大,但是不代表b不可能取不到,是以我想根據機率選取,機率大的多去,機率小的少取,這就是softmax。
交叉熵Cross entropy
前言
分類問題和回歸問題是監督學習的兩大種類:分類問題的目标變量是離散的;回歸問題的目标變量是連續的數值。
神經網絡模型的效果及優化的目标是通過損失函數來定義的。
回歸問題解決的是對具體數值的預測。比如房價預測、銷量預測等都是回歸問題。這些問題需要預測的不是一個事先定義好的類别,而是一個任意實數。解決回顧問題的神經網絡一般隻有一個輸出節點,這個節點的輸出值就是預測值。對于回歸問題,常用的損失函數是均方誤差( MSE,mean squared error )。
分類問題常用的損失函數為交叉熵( Cross Entropy Loss)。
交叉熵描述了兩個機率分布之間的距離,當交叉熵越小說明二者之間越接近
盡管交叉熵刻畫的是兩個機率分布之間的距離,但是神經網絡的輸出卻不一定是一個機率分布。為此我們常常用Softmax回歸将神經網絡前向傳播得到的結果變成機率分布。
softmax常用于多分類過程中,它将多個神經元的輸出,歸一化到( 0, 1) 區間内,是以Softmax的輸出可以看成機率,進而來進行多分類。
損失函數為什麼要用Cross Entropy Loss
出于直覺,人們會覺得可以使用classification error來做損失函數:
也就是錯誤的個數除以總數。
我們不置可否,先來看兩個模型:
以上兩個模型,computed 是預測結果,targets 是預期結果。 二者的數字,都可以了解為機率。 correct 一欄表示預測是否正确。
模型 1 中,item 1 和 2 以非常微弱的優勢判斷正确,item 3 則徹底錯誤,計算其classification error:
classification−error = 1 / 3 =0.33
模型 2 中,item 1 和 2 的判斷非常精準,item 3 判錯,但比較輕,計算其classification error
classification−error=1/3=0.33
如果僅僅從2 個模型的 classification error 來判斷,那這兩個模型性能相同,但實際情況是:模型 2 要明顯優于模型 1。是以說,classification error 很難精确描述模型與理想模型之間的距離。
如果使用 ACE ( average cross-entropy error )?
首先,我們給出Cross Entropy Loss的公式:
其中yi是預測結果,y′i是真實資料。
那麼根據公式, 模型中 1 第一項的 cross-entropy 是:
−((ln(0.3)∗0)+(ln(0.3)∗0)+(ln(0.4)∗1))=−ln(0.4)
以此類推,模型1的 ACE ( average cross-entropy error ) 是:
−(ln(0.4)+ln(0.4)+ln(0.1))/3=1.38
模型 2 的 ACE 是:
−(ln(0.7)+ln(0.7)+ln(0.3))/3=0.64
這樣一來ACE的結果準确的展現了模型 2 要優于模型 1的事實,是以說 Cross-Entropy Loss 更清晰的描述了模型與理想模型的距離。
最後的結論
分類問題用 One Hot Label + Cross Entropy Loss
Training 過程,分類問題用 Cross Entropy Loss,回歸問題用 Mean Squared Error。
validation / testing 過程,使用 Classification Error更直覺,也正是我們最為關注的名額。
參考資料:
https://blog.csdn.net/xg123321123/article/details/80781611
https://www.cnblogs.com/smartwhite/p/8601477.html
https://www.jianshu.com/p/47172eb86b39