
(圖出自李宏毅老師的PPT)
對機器學習/深度學習有所了解的同學肯定不會對 softmax
陌生,它時而出現在多分類中用於得到每個類別的概率,時而出現在二分類中用於得到正樣本的概率(當然,這個時候 softmax
以 sigmoid
的形式出現)。
1. 從 sigmoid
到 softmax
sigmoid
出現的頻率在機器學習/深度學習中不可謂不高,從 logistic 回歸到深度學習中的激活函數。先來看一下它的形式:
\[sigmoid(z) = \sigma(z) = \frac{1}{1 + e^{-z}}, \:\:\:\: z \in \mathbb{R} \]
我們把它的圖像畫一下:
import numpy as np
imort matplotlib.pyplot as plt
x = np.arange(-5, -5, 0.05)
z = x / (1 + np.exp(-x))
plt.plot(x, z)
plt.show()

顯然,sigmoid
將實數域的值壓縮到了 \((0, 1)\) 之間。那么在二分類中又是怎么用的呢?以 logistic 回歸為例。在邏輯回歸中通常假設樣本的類別呈現為伯努利分布,即:
\[P(y=1) = p_1 \\ P(y=0) = p_0 \]
且有 \(p_1 + p_0 = 1\)。用邏輯回歸解決二分類問題時,我們用建模的時樣本為正樣本的概率(根據伯努利分布,為負樣本的概率顯而易見):將邏輯回歸得到的回歸值輸入到 sigmoid
中就得到了 \(p_1\),即:
\[z = f(z) \\ p_1 = \frac{1}{1 + e^{-z}} \]
其中 \(f\) 即是一個回歸函數。那么 sigmoid
又與 softmax
有什么關系呢?先來看一下 softmax
的定義:
\[softmax(\mathbf{z}) = \frac{e^{\mathbf{z}}}{\sum_{i}^{n} e^{z_i}}, \:\:\:\: \mathbf{z} \in \mathbb{R}^n \]
顯然,softmax
是一個向量的函數,正如本文開頭的圖示一樣。softmax
將一個向量中的值進行了歸一化,我們在多分類中常將其視作樣本屬於不同類別的概率值。我們將設有一個二分類模型,其輸出是一個向量 \(\mathbf{z} \in \mathbb{R}^2\),其中 \(z_0, z_1\) 分別是樣本屬於類別 0, 1 的未歸一化的值。如果我們用 \(softmax\) 得到類別概率,則:
\[p_0 = \frac{e^{z_0}}{e^{z_0} + e^{z_1}} \\ p_1 = \frac{e^{z_1}}{e^{z_0} + e^{z_1}} \]
\(p_0, p_1\) 即是樣本分別屬於 0, 1 的概率,我們對其進行以下變形:
\[\begin{aligned} p_1 &= \frac{e^{z_1}} {e^{z_0} + e^{z_1}} \\ &= \frac{e^{z_1}} {e^{z_0}( e^{z_0 - z_0} + e^{z_1 - z_0} )} \\ &= \frac{e^{z_1 - z_0}} {e^{z_0 - z_0} + e^{z_1 - z_0} } \\ &= \frac{e^\Delta} {e^{0} + e^{\Delta}} \\ &= \frac{e^\Delta} {1 + e^{\Delta}} \\ &= \frac{1} {1 + e^{-\Delta}} \end{aligned} \]
其中 \(\Delta = z_1 - z_0\),同理可得 \(p_0 = \frac{1} {e^{\Delta} + 1}\)。回想到邏輯回歸是對樣本屬於 1 概率進行建模,那么 \(\Delta\) 就是邏輯回歸進入 sigmoid
之前的預測值,這里我們來看看 \(\Delta\) 到底是什么:
\[\frac{p_1} {p_0} = \frac{1} {e^\Delta} = e^{\Delta} \\ \log \frac{p_1} {p_0} = \Delta \]
由上可知,邏輯回歸是對樣本為 1 和 為 0 的概率的比值(幾率)的對數(對數幾率)進行回歸。所以說邏輯回歸也是一種回歸,只不過回歸的是樣本的對數幾率,得到了對數幾率后再來得到樣本屬於類別 1 的概率。
再說回 sigmoid
和 softmax
的關系,其實從上面的的世子我們也看出來了其實 sigmoid
只是 softmax
的一種情況,sigmoid
隱式地包含了另一個元素地 softmax
值。在對分類任務進行建模時,我們通常將二分類任務中的一個類別進行建模,假設其服從伯努利分布;或者建模為二項分布,分別建模樣本屬於每個類別地概率(即 \(\mathbf{z}\) 中的每一位表示樣本為對應類別的對數幾率,\(softmax(\mathbf{z})\) 中的每一位表示樣本為對應類別的概率)。
2. softmax
損失的求導
在多分類任務中,我們通常使用對數損失(在二分類中就是交叉熵損失):
\[\mathcal{L} = -\frac{1} {N} \sum_{i=1}^N \sum_{j=1}^C y_{ij} \log \hat{y}_{ij} \]
其中,\(N, C\) 分別為樣本數和類別數,\(y_{ij} \in \{0, 1\}\) 表示樣本 \(x_i\) 是否屬於類別 \(j\),\(\hat{y}_{ij}\) 表示對應的預測概率。在多分類中,概率值通常通過 softmax
獲得,即:
\[\hat{y}_{ij} = softmax(\mathbf{z}_i)_j = \frac{e^{z_{ij}}} {\sum_{k=1}^C e^{z_{ik}}} \]
這里我們只考慮一個樣本的損失,即:
\[\mathcal{l} = -\sum_{j=1}^C y_{j} \log \hat{y}_{j} \\ \hat{y}_{j} = softmax(\mathbf{z})_j = \frac{e^{z_{j}}} {\sum_{k=1}^C e^{z_{k}}} \]
好了,開始重頭戲,求多分類對數損失對 \(z_k\) 的偏導:
\[\begin{aligned} \frac{\partial \mathcal{l}} {\partial z_k} &= - \frac{\partial} {\partial z_k} (\sum_{j=1}^C y_{j} \log \hat{y}_{j}) \\ &= - \sum_{j=1}^C y_{j} \frac{\partial \log \hat{y}_{j}} {\partial z_k} \\ &= - \sum_{j=1}^C y_{j} \frac{1} {\hat{y}_j} \frac{\partial \hat{y}_j} {\partial z_k} \end{aligned} \]
到這里其實以及很簡單了,只需要算出 \(\frac{\partial \hat{y}_j} {\partial z_k}\) 就行了,那就來吧:
\[\begin{aligned} \frac{\partial \hat{y}_j} {\partial z_k} &= \frac{\partial} {\partial z_k} (\frac{e^{z_j}} {\sum_{c=1}^C e^{z_c}}) \\ &= \frac{\frac{\partial e^{z_j}} {\partial z_k} \cdot \sum - e^{z_j} \cdot \frac{\partial \sum} {\partial z_k} } {(\sum)^2} \\ &= \frac{\frac{\partial e^{z_j}} {\partial z_k} \cdot \sum - e^{z_j} \cdot e^{z_k} } {(\sum)^2} \end{aligned} \]
其中 \(\sum = \sum_{c=1}^C e^{z_c}\),其中 \(\frac{\partial e^{z_j}} {\partial z_k}\) 需要分情況討論一下:
\[\frac{\partial e^{z_j}} {\partial z_k} = \begin{cases} e^{z_j} & k = j \\ 0 & k \neq j \end{cases} \]
因此,
\[\frac{\partial \hat{y}_j} {\partial z_k} = \begin{cases} \frac{e^{z_j}\ \cdot \ \sum - (e^{z_j})^2 } {(\sum)^2} & k = j \\ \frac{0 \cdot \sum - e^{z_j} \cdot e^{z_k} } {(\sum)^2} & k \neq j \end{cases} \]
看起來有點復雜,我們來化簡以下:
\[\frac{\partial \hat{y}_j} {\partial z_k} = \begin{cases} \hat{y}_j (1 - \hat{y}_j) & k = j \\ - \hat{y}_j \cdot \hat{y}_k & k \neq j \end{cases} \]
收工了嗎?不!我們的目的是求 \(\frac{\partial \mathcal{l}} {\partial z_k}\):
\[\begin{aligned} \frac{\partial \mathcal{l}} {\partial z_k} &= -[y_k \frac{1} {\hat{y}_k} \frac{\partial \hat{y}_k} {\partial z_k} + \sum_{j \neq k} y_j \frac{1} {\hat{y}_j} \frac{\partial \hat{y}_j} {\partial z_k} ] \\ &= -[y_k \frac{1} {\hat{y}_k} \cdot \hat{y}_k (1 - \hat{y}_k) + \sum_{j \neq k} y_j \frac{1} {\hat{y}_j} \cdot (- \hat{y}_j \cdot \hat{y}_k) ] \\ &= -[y_k \cdot (1 - \hat{y}_k) - \sum_{j \neq k} y_j \cdot \hat{y}_k ] \\ &= -[y_k - y_k \cdot \hat{y}_k - \sum_{j \neq k} y_j \cdot \hat{y}_k ] \\ &= -[y_k - \sum_{j} y_j \cdot \hat{y}_k ] \\ &= \sum_{j} y_j \cdot \hat{y}_k - y_k \\ &= \hat{y}_k \cdot \sum_{j} y_j - y_k \\ &= \hat{y}_k - y_k \end{aligned} \]
別看求起來有一點復雜,但是最后的結果還是很優雅的嘛:預測值 - 真實值
。
這里有幾個要注意的點:
- 上式第二部中依據 \(j\) 是否等於 \(k\) 將求和分成了兩部分;
- 上式的倒數第二步中,利用了多分類的目標中只有一個為 1,即 \(\sum_j y_j = 1\).
以上!