Softmax分類函式

coderpai發表於2019-02-28

作者:chen_h
微訊號 & QQ:862251340
微信公眾號:coderpai
我的部落格:請點選這裡

這篇教程是翻譯Peter Roelants寫的神經網路教程,作者已經授權翻譯,這是原文

該教程將介紹如何入門神經網路,一共包含五部分。你可以在以下連結找到完整內容。

softmax分類函式

這部分教程將介紹兩部分:

  • softmax函式
  • 交叉熵損失函式

在先前的教程中,我們已經使用學習瞭如何使用Logistic函式來實現二分類問題。對於多分類問題,我們可以使用多項Logistic迴歸,該方法也被稱之為softmax函式。接下來,我們來解釋什麼事softmax函式,以及怎麼得到它。

我們先匯入教程需要使用的軟體包。

import numpy as np 
import matplotlib.pyplot as plt  
from matplotlib.colors import colorConverter, ListedColormap 
from mpl_toolkits.mplot3d import Axes3D  
from matplotlib import cm 複製程式碼

Softmax函式

在之前的教程中,我們已經知道了Logistic函式只能被使用在二分類問題中,但是它的多項式迴歸,即softmax函式,可以解決多分類問題。假設softmax函式ς的輸入資料是C維度的向量z,那麼softmax函式的資料也是一個C維度的向量y,裡面的值是0到1之間。softmax函式其實就是一個歸一化的指數函式,定義如下:

softmax函式

式子中的分母充當了正則項的作用,可以使得

作為神經網路的輸出層,softmax函式中的值可以用C個神經元來表示。

對於給定的輸入z,我們可以得到每個分類的概率t = c for c = 1 ... C可以表示為:

概率方程

其中,P(t=c|z)表示,在給定輸入z時,該輸入資料是c分類的概率。

下圖展示了在一個二分類(t = 1, t = 2)中,輸入向量是z = [z1, z2],那麼輸出概率P(t=1|z)如下圖所示。

# Define the softmax function
def softmax(z):
    return np.exp(z) / np.sum(np.exp(z))複製程式碼
# Plot the softmax output for 2 dimensions for both classes
# Plot the output in function of the weights
# Define a vector of weights for which we want to plot the ooutput
nb_of_zs = 200
zs = np.linspace(-10, 10, num=nb_of_zs) # input 
zs_1, zs_2 = np.meshgrid(zs, zs) # generate grid
y = np.zeros((nb_of_zs, nb_of_zs, 2)) # initialize output
# Fill the output matrix for each combination of input z`s
for i in range(nb_of_zs):
    for j in range(nb_of_zs):
        y[i,j,:] = softmax(np.asarray([zs_1[i,j], zs_2[i,j]]))
# Plot the cost function surfaces for both classes
fig = plt.figure()
# Plot the cost function surface for t=1
ax = fig.gca(projection=`3d`)
surf = ax.plot_surface(zs_1, zs_2, y[:,:,0], linewidth=0, cmap=cm.coolwarm)
ax.view_init(elev=30, azim=70)
cbar = fig.colorbar(surf)
ax.set_xlabel(`$z_1$`, fontsize=15)
ax.set_ylabel(`$z_2$`, fontsize=15)
ax.set_zlabel(`$y_1$`, fontsize=15)
ax.set_title (`$P(t=1|mathbf{z})$`)
cbar.ax.set_ylabel(`$P(t=1|mathbf{z})$`, fontsize=15)
plt.grid()
plt.show()複製程式碼

P(t=1|z)的概率

softmax函式的導數

在神經網路中,使用softmax函式,我們需要知道softmax函式的導數。如果我們定義:

那麼可以得到:

因此,softmax函式的輸出結果y對於它的輸入資料z的導數∂yi/∂zj可以定義為:

導數推導

注意,當i = j時,softmax函式的倒數推導結果和Logistic函式一樣。

softmax函式的交叉熵損失函式

在學習softmax函式的損失函式之前,我們先從學習它的最大似然函式開始。給定模型的引數組θ,利用這個引數組,我們可以得到輸入樣本的正確預測,正如在Logistic損失函式推導中,我們可以仿照寫出這個的最大似然估計:

最大似然估計

根據聯合概率,我們可以將似然函式改寫成:P(t,z|θ),根據條件分佈,我們最終可以得到如下公式:

條件分佈

因為我們不關心z的概率,所以公式又可以改寫為:L(θ|t,z)=P(t|z,θ)。而且,P(t|z, θ)可以被寫成P(t|z),如果θ會一個定值。因為,每一個ti都是依賴於整個z,而且只有其中一個t將會被啟用,所以我們可以得到下式:

概率推導

正如我們在Logistic函式中推導損失函式的導數一樣,最大化似然函式就是最小化它的負對數釋然函式:

負對數似然函式

其中,ξ表示交叉熵誤差函式。在二分類問題中,我們將t2定義為t2=1−t1。同理,在softmax函式中,我們也可以定義為:

交叉熵誤差函式

n個樣本的批處理中,交叉熵誤差函式可以這樣計算:

批處理

其中,當且僅當tic1,那麼樣本i是屬於類別cyic是樣本i屬於類別c的概率。

softmax函式的交叉熵損失函式的推導

損失函式對於zi的導數∂ξ/∂zi求解如下:

求導過程

上式已經求解了當i=ji≠j的兩種情況。

最終的結果為∂ξ/∂zi=yi−ti for all i ∈ C,這個求導結果和Logistic函式的交叉熵損失函式求導是一樣的,再次證明softmax函式是Logistic函式的一個擴充套件板。

完整程式碼,點選這裡

CoderPai 是一個專注於演算法實戰的平臺,從基礎的演算法到人工智慧演算法都有設計。如果你對演算法實戰感興趣,請快快關注我們吧。加入AI實戰微信群,AI實戰QQ群,ACM演算法微信群,ACM演算法QQ群。詳情請關注 “CoderPai” 微訊號(coderpai) 。

相關文章