softmax求導的過程



(圖出自李宏毅老師的PPT

對機器學習/深度學習有所了解的同學肯定不會對 softmax 陌生,它時而出現在多分類中用於得到每個類別的概率,時而出現在二分類中用於得到正樣本的概率(當然,這個時候 softmaxsigmoid 的形式出現)。

1. 從 sigmoidsoftmax

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
顯然,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 的概率。

再說回 sigmoidsoftmax 的關系,其實從上面的的世子我們也看出來了其實 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\).

以上!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM