作者: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函式中的值可以用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()複製程式碼
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
個樣本的批處理中,交叉熵誤差函式可以這樣計算:
其中,當且僅當tic
是1
,那麼樣本i
是屬於類別c
,yic
是樣本i
屬於類別c
的概率。
softmax函式的交叉熵損失函式的推導
損失函式對於zi
的導數∂ξ/∂zi
求解如下:
上式已經求解了當i=j
和i≠j
的兩種情況。
最終的結果為∂ξ/∂zi=yi−ti for all i ∈ C
,這個求導結果和Logistic函式的交叉熵損失函式求導是一樣的,再次證明softmax函式是Logistic函式的一個擴充套件板。
CoderPai 是一個專注於演算法實戰的平臺,從基礎的演算法到人工智慧演算法都有設計。如果你對演算法實戰感興趣,請快快關注我們吧。加入AI實戰微信群,AI實戰QQ群,ACM演算法微信群,ACM演算法QQ群。詳情請關注 “CoderPai” 微訊號(coderpai) 。