1 softmax函數
softmax函數的定義為
$$softmax(x)=\frac{e^{x_i}}{\sum_j e^{x_j}} \tag{1}$$
softmax函數的特點有
- 函數值在[0-1]的范圍之內
- 所有$softmax(x_i)$相加的總和為1
面對一個分類問題,能將輸出的$y_i$轉換成[0-1]的概率,選擇最大概率的$y_i$作為分類結果[1]。

這里需要提及一個有些類似的sigmoid函數,其定義為
$$sigmoid(x)=\frac{1}{1+e^{-x_i}} \tag{2}$$
sigmoid函數將每個$y_i$都映射到[0-1]之間,但每個$y_i$之間是相互獨立的,$\sum y_i$與1沒有關系,可以用作二分類;而softmax函數的本質是將一個k維數據$[a_1,a_2,a_3,...,a_k]$映射成另外一個K為向量$[b_1,b_2,b_3,...,b_k]$,每個值之間是相互存在關系的[2],$\sum a_i=\sum b_i=1$,可以用於多分類問題,選取權重最大的一維。
下面介紹幾個例子,區分softmax和sigmoid的使用場景[1]。
如果你在開發一個音樂分類的應用,需要對k種類型的音樂進行識別,那么是選擇使用 softmax 分類器呢,還是使用 logistic 回歸算法建立 k 個獨立的二元分類器呢?
這一選擇取決於你的類別之間是否互斥,例如,如果你有四個類別的音樂,分別為:古典音樂、鄉村音樂、搖滾樂和爵士樂,那么你可以假設每個訓練樣本只會被打上一個標簽(即:一首歌只能屬於這四種音樂類型的其中一種),此時你應該使用類別數 k = 4 的softmax回歸。(如果在你的數據集中,有的歌曲不屬於以上四類的其中任何一類,那么你可以添加一個“其他類”,並將類別數 k 設為5。)
如果你的四個類別如下:人聲音樂、舞曲、影視原聲、流行歌曲,那么這些類別之間並不是互斥的。例如:一首歌曲可以來源於影視原聲,同時也包含人聲 。這種情況下,使用4個二分類的 logistic 回歸分類器更為合適。這樣,對於每個新的音樂作品 ,我們的算法可以分別判斷它是否屬於各個類別。
現在我們來看一個計算視覺領域的例子,你的任務是將圖像分到三個不同類別中。(i) 假設這三個類別分別是:室內場景、戶外城區場景、戶外荒野場景。你會使用sofmax回歸還是 3個logistic 回歸分類器呢? (ii) 現在假設這三個類別分別是室內場景、黑白圖片、包含人物的圖片,你又會選擇 softmax 回歸還是多個 logistic 回歸分類器呢?
在第一個例子中,三個類別是互斥的,因此更適於選擇softmax回歸分類器 。而在第二個例子中,建立三個獨立的 logistic回歸分類器更加合適。
因此,當label之間是互斥的,我們通常使用softmax,而當label之間是相互獨立的,我們可以使用sigmoid。
2 交叉熵
2.1 信息熵
香農曾提出了一個重要的概念:信息熵,其定義為:
$$H(X)=\sum_j p(x)log(p(x)) \tag{3}$$
信息熵表示一個信息的混亂程度,信息熵越大,混亂程度越大。因此,在C4.5中就信息增益的最大值,其目的就是使一個信息的混亂程度最大化降低。
2.2 相對熵(KL散度)
從而引出相對熵(KL散度)的概念:如果我們對於同一個隨機變量x有兩個單獨的概率分布P(x)和Q(x),我們可以使用KL散來衡量這兩個分布的差異。
其中,P往往用來表示樣本的真實分布,比如[1,0,0]表示當前樣本屬於第一類。Q用來表示模型所預測的分布,比如[0.7,0.2,0.1]。直觀的理解就是,如果用P來描述樣本,那么就非常完美;而用Q來描述樣本,雖然可以大致描述,但是不是那么的完美,信息量不足,需要額外的一些”信息增量”才能達到和P一樣完美的描述。如果我們的Q通過反復訓練,也能完美的描述樣本,那么就不再需要額外的“信息增量”,Q等價於P[3]。
相對熵的定義為:
$$D_{K||L}(p||q)=\sum_{i=1}^{n}p(x_i)ln(\frac{p(x_i)}{q(x_i)}) \tag{4}$$
其中,$D_{K||L}$的值越小,表示q分布和p分布越接近。
2.3 交叉熵
對公式4進行變形,從而得到:
\begin{align*}
{D_{KL}}(p||q) &= \sum\limits_{i = 1}^n {p({x_{_i}})\ln (p({x_i}))} - \sum\limits_{i = 1}^n {p({x_{_i}})\ln (q({x_i}))} \\
&= - H(p(x)) + [ - \sum\limits_{i = 1}^n {p({x_{_i}})\ln (q({x_i}))} ] \tag{5}
\end{align*}
等式的前一部分恰巧就是p的熵,等式的后一部分,就是交叉熵:
\begin{align*}
H(p,q) = - \sum\limits_{i = 1}^n {p({x_{_i}})\ln (q({x_i}))}\tag{6}
\end{align*}
在機器學習中,我們需要評估label和predicts之間的差距,使用KL散度剛剛好,即${D_{KL}}(y|\hat y)$。當${D_{KL}}(y|\hat y)$越小,說明label和predicts之間的差距越小。由於KL散度中的前一部分$H(y)$不變,故在優化過程中,只需要關注交叉熵就可以了。所以一般在機器學習中直接使用交叉熵做loss,評估模型[3]。
3 softmax+交叉熵求導
接下來,我們針對softmax模型,損失函數為交叉熵進行求導,了解其數學原理[4]。
對公式6稍作變形,損失函數為:
\begin{align*}
L = - \sum\limits_i {{y_i}\ln {a_i}} \tag{7}
\end{align*}
其中,$y_i$為真實分布,$a_i$而為預測分布,即softmax輸出的結果。因此,softmax的定義為:
\begin{align*}
{a_i} = \sigma ({z_i}) = \frac{{{e^{{z_i}}}}}{{\sum\limits_j {{e^{{z_j}}}} }} \tag{8}
\end{align*}
\begin{align*}
{z_i} = \sum\limits_j {{w_{ij}}{x_{ij}} + b} \tag{9}
\end{align*}
其中,$z_i$為神經元的輸出,如下圖所示。

做完上面的准備后,我們需要對Loss損失函數進行求導,即$\frac{{\partial L}}{{\partial {w_i}}}$和$\frac{{\partial L}}{{\partial {b_i}}}$。根據鏈式法則,我們可以分解成
\begin{align*}
\frac{{\partial L}}{{\partial {w_{ij}}}} = \frac{{\partial L}}{{\partial {z_i}}}\frac{{\partial {z_i}}}{{\partial {w_{ij}}}}{\rm{ = }}\frac{{\partial L}}{{\partial {z_i}}}{x_{ij}}\\
\frac{{\partial L}}{{\partial {b_i}}} = \frac{{\partial L}}{{\partial {z_i}}}\frac{{\partial {z_i}}}{{\partial {b_i}}} = \frac{{\partial L}}{{\partial {z_i}}} \tag{10}
\end{align*}
因此,重點還是$\frac{{\partial L}}{{\partial {z_i}}}$的獲取。根據鏈式法則:
\begin{align*}
\frac{{\partial L}}{{\partial {z_i}}} = \sum\limits_j {(\frac{{\partial {L_j}}}{{\partial {a_j}}}\frac{{\partial {a_j}}}{{\partial {z_i}}})} \tag{11}
\end{align*}
這里為什么是$a_j$而不是$a_i$呢?這里要看一下softmax的公式了,因為softmax公式的特性,它的分母包含了所有神經元的輸出,所以,對於不等於i的其它輸出里面,也包含着$z_i$,所有的a都要納入到計算范圍中,並且后面的計算可以看到需要分為$i=j$和i \ne j兩種情況求導。
對於公式(11)中的前一項$\frac{{\partial L_j}}{{\partial {a_j}}}$可以先行求出來,得到:
\begin{align*}
\frac{{\partial {L_j}}}{{\partial {a_j}}}{\rm{ = }}\frac{{\partial ( - {y_j}\ln {a_j})}}{{\partial {a_j}}} = - {y_j}\frac{1}{{{a_j}}} \tag{12}
\end{align*}
這里值得留意的是,$L=L_1+L_2+...+L_n$,我們這里是對$L_j$進行求導。
- 當$i=j$時
\begin{align*}
\frac{{\partial {a_j}}}{{\partial {z_i}}} = \frac{{\partial {a_i}}}{{\partial {z_i}}} = \frac{{\partial \left( {\frac{{{e^{{z_i}}}}}{{\sum\nolimits_j {{e^{{z_j}}}} }}} \right)}}{{\partial {z_i}}} = \frac{{{e^{{z_i}}}\sum\nolimits_j {{e^{{z_j}}}} - {{\left( {{e^{{z_i}}}} \right)}^2}}}{{{{\left( {\sum\nolimits_j {{e^{{z_j}}}} } \right)}^2}}} = \frac{{{e^{{z_i}}}\left( {\sum\nolimits_j {{e^{{z_j}}}} - {e^{{z_i}}}} \right)}}{{{{\left( {\sum\nolimits_j {{e^{{z_j}}}} } \right)}^2}}}\\
= \frac{{{e^{{z_i}}}}}{{\sum\nolimits_j {{e^{{z_j}}}} }}\left( {1 - \frac{{{e^{{z_i}}}}}{{\sum\nolimits_j {{e^{{z_j}}}} }}} \right) = {a_i}\left( {1 - {a_i}} \right) \tag{13}
\end{align*}
- 當$i \ne j$時
\begin{align*}
\frac{{\partial {a_j}}}{{\partial {z_i}}} = \frac{{\partial \left( {\frac{{{e^{{z_j}}}}}{{\sum\nolimits_k {{e^{{z_k}}}} }}} \right)}}{{\partial {z_i}}} = \frac{{ - {e^{{z_j}}}{e^{{z_i}}}}}{{{{\left( {\sum\nolimits_k {{e^{{z_k}}}} } \right)}^2}}} = - {a_j}{a_i} \tag{14}
\end{align*}
因此,將兩種情況進行相結合
\begin{align*}
\frac{{\partial L}}{{\partial {z_i}}} &= \sum\limits_j {(\frac{{\partial {L_j}}}{{\partial {a_j}}}\frac{{\partial {a_j}}}{{\partial {z_i}}})} \\
&= \sum\limits_{i = j} {(\frac{{\partial {L_j}}}{{\partial {a_j}}}\frac{{\partial {a_j}}}{{\partial {z_i}}})} + \sum\limits_{i \ne j} {(\frac{{\partial {L_j}}}{{\partial {a_j}}}\frac{{\partial {a_j}}}{{\partial {z_i}}})} \\
&= - {y_i}\frac{1}{{{a_i}}}{a_i}(1 - {a_i}) + \sum\limits_{i \ne j} {({y_j}\frac{1}{{{a_j}}}{a_j}{a_i})} \\
&= - {y_i}(1 - {a_i}) + \sum\limits_{i \ne j} {{y_j}{a_i}} \\
&= \sum\limits_{i \ne j} {{y_j}{a_i}} + {y_i}{a_i} - {y_i}\\
&= {a_i}\sum\limits_j {{y_j}} - {y_i} \tag{15}
\end{align*}
最后,針對分類問題,我們給定的結果$y_i$最終只會有一個類別是1,其他類別都是0,即$\sum_j y_j=1$,因此,對於分類問題,這個梯度等於:
\begin{align*}
\frac{{\partial L}}{{\partial {z_i}}}{\rm{ = }}{a_i} - {y_i} \tag{16}
\end{align*}
references:
[1] https://blog.csdn.net/bitcarmanlee/article/details/82320853
[2] https://www.cnblogs.com/charlesblc/p/6750290.html
[3] https://blog.csdn.net/tsyccnh/article/details/79163834
[4] https://blog.csdn.net/qian99/article/details/78046329
