這篇教程是翻譯Peter Roelants寫(xiě)的神經(jīng)網(wǎng)絡(luò)教程,作者已經(jīng)授權(quán)翻譯,這是原文。
該教程將介紹如何入門(mén)神經(jīng)網(wǎng)絡(luò),一共包含五部分。你可以在以下鏈接找到完整內(nèi)容。
softmax分類(lèi)函數(shù)
這部分教程將介紹兩部分:
- softmax函數(shù)
- 交叉熵?fù)p失函數(shù)
在先前的教程中,我們已經(jīng)使用學(xué)習(xí)了如何使用Logistic函數(shù)來(lái)實(shí)現(xiàn)二分類(lèi)問(wèn)題。對(duì)于多分類(lèi)問(wèn)題,我們可以使用多項(xiàng)Logistic回歸,該方法也被稱(chēng)之為softmax函數(shù)。接下來(lái),我們來(lái)解釋什么事softmax函數(shù),以及怎么得到它。
我們先導(dǎo)入教程需要使用的軟件包。
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函數(shù)
在之前的教程中,我們已經(jīng)知道了Logistic函數(shù)只能被使用在二分類(lèi)問(wèn)題中,但是它的多項(xiàng)式回歸,即softmax函數(shù),可以解決多分類(lèi)問(wèn)題。假設(shè)softmax函數(shù)? 的輸入數(shù)據(jù)是C 維度的向量z ,那么softmax函數(shù)的數(shù)據(jù)也是一個(gè)C 維度的向量y ,里面的值是0或者1。softmax函數(shù)其實(shí)就是一個(gè)歸一化的指數(shù)函數(shù),定義如下:
softmax函數(shù)
式子中的分母充當(dāng)了正則項(xiàng)的作用,可以使得
作為神經(jīng)網(wǎng)絡(luò)的輸出層,softmax函數(shù)中的值可以用C 個(gè)神經(jīng)元來(lái)表示。
對(duì)于給定的輸入z ,我們可以得到每個(gè)分類(lèi)的概率t = c for c = 1 ... C 可以表示為:
概率方程
其中,P(t=c|z) 表示,在給定輸入z 時(shí),該輸入數(shù)據(jù)是c 分類(lèi)的概率。
下圖展示了在一個(gè)二分類(lèi)(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函數(shù)的導(dǎo)數(shù)
在神經(jīng)網(wǎng)絡(luò)中,使用softmax函數(shù),我們需要知道softmax函數(shù)的導(dǎo)數(shù)。如果我們定義:
那么可以得到:
因此,softmax函數(shù)的輸出結(jié)果y 對(duì)于它的輸入數(shù)據(jù)z 的導(dǎo)數(shù)?yi/?zj 可以定義為:
導(dǎo)數(shù)推導(dǎo)
注意,當(dāng)i = j 時(shí),softmax函數(shù)的倒數(shù)推導(dǎo)結(jié)果和Logistic函數(shù)一樣。
softmax函數(shù)的交叉熵?fù)p失函數(shù)
在學(xué)習(xí)softmax函數(shù)的損失函數(shù)之前,我們先從學(xué)習(xí)它的最大似然函數(shù)開(kāi)始。給定模型的參數(shù)組θ ,利用這個(gè)參數(shù)組,我們可以得到輸入樣本的正確預(yù)測(cè),正如在Logistic損失函數(shù)推導(dǎo)中,我們可以仿照寫(xiě)出這個(gè)的最大似然估計(jì):
最大似然估計(jì)
根據(jù)聯(lián)合概率,我們可以將似然函數(shù)改寫(xiě)成:P(t,z|θ) ,根據(jù)條件分布,我們最終可以得到如下公式:
條件分布
因?yàn)槲覀儾魂P(guān)心z 的概率,所以公式又可以改寫(xiě)為:L(θ|t,z)=P(t|z,θ) 。而且,P(t|z, θ) 可以被寫(xiě)成P(t|z) ,如果θ 會(huì)一個(gè)定值。因?yàn)?,每一個(gè)ti 都是依賴(lài)于整個(gè)z ,而且只有其中一個(gè)t 將會(huì)被激活,所以我們可以得到下式:
概率推導(dǎo)
正如我們?cè)贚ogistic函數(shù)中推導(dǎo)損失函數(shù)的導(dǎo)數(shù)一樣,最大化似然函數(shù)就是最小化它的負(fù)對(duì)數(shù)釋然函數(shù):
負(fù)對(duì)數(shù)似然函數(shù)
其中,ξ 表示交叉熵誤差函數(shù)。在二分類(lèi)問(wèn)題中,我們將t2 定義為t2=1?t1 。同理,在softmax函數(shù)中,我們也可以定義為:
交叉熵誤差函數(shù)
在n 個(gè)樣本的批處理中,交叉熵誤差函數(shù)可以這樣計(jì)算:
批處理
其中,當(dāng)且僅當(dāng)tic 是1 ,那么樣本i 是屬于類(lèi)別c ,yic 是樣本i 屬于類(lèi)別c 的概率。
softmax函數(shù)的交叉熵?fù)p失函數(shù)的推導(dǎo)
損失函數(shù)對(duì)于zi 的導(dǎo)數(shù)?ξ/?zi 求解如下:
求導(dǎo)過(guò)程
上式已經(jīng)求解了當(dāng)i=j 和i≠j 的兩種情況。
最終的結(jié)果為?ξ/?zi=yi?ti for all i ∈ C ,這個(gè)求導(dǎo)結(jié)果和Logistic函數(shù)的交叉熵?fù)p失函數(shù)求導(dǎo)是一樣的,再次證明softmax函數(shù)是Logistic函數(shù)的一個(gè)擴(kuò)展板。
完整代碼,點(diǎn)擊這里
|