一、簡介
softmax函數是在深度學習和神經網路中常用的函數,主要用於多分類問題和概率分布。在反向傳播演算法中,softmax函數的求導是一個非常重要的過程,本文將從多個方面闡述softmax函數的求導方法。
二、softmax函數的定義
在介紹softmax函數的求導方法之前,我們先來了解一下softmax函數的定義和基本性質。
def softmax(x): shift_x = x - np.max(x) exp_x = np.exp(shift_x) return exp_x / np.sum(exp_x)
softmax函數的定義是將任意的實數向量$\mathbf{x}$映射成一個概率分布$\mathbf{p}$的函數,即:
$$
\mathrm{softmax}(\mathbf{x})_i = \frac{\exp(x_i)}{\sum_{j=1}^k \exp(x_j)}
$$
其中,$i \in \{1,2,\dots,k\}$,$k$ 是 $\mathbf{x}$ 中元素的個數,$x_i$ 是 $\mathbf{x}$ 的第 $i$ 個元素。
softmax函數具有以下性質:
- 每個元素都非負,並且所有元素之和為1。
- softmax函數是單調遞增函數,即對於所有 $i,j$,如果 $i<j$,則 $\mathrm{softmax}(\mathbf{x})_i < \mathrm{softmax}(\mathbf{x})_j$。
- softmax函數是一個連續可微的函數。
三、softmax函數的求導方法
1. 簡單情況下的求導方法
在簡單情況下,我們可以根據softmax函數的定義求導。
設 $\mathbf{p} = \mathrm{softmax}(\mathbf{x})$,則:
$$
\begin{aligned}
\frac{\partial p_i}{\partial x_j} &= \frac{\partial}{\partial x_j}\frac{\exp(x_i)}{\sum_{k=1}^k \exp(x_k)} \\
&= \frac{\exp(x_i) \cdot \frac{\partial}{\partial x_j}\sum_{k=1}^k \exp(x_k) – \exp(x_j) \cdot \frac{\partial}{\partial x_j}\exp(x_i)}{\left(\sum_{k=1}^k \exp(x_k)\right)^2} \\
&= \frac{\exp(x_i)}{\sum_{k=1}^k \exp(x_k)} \cdot \left(\frac{\partial}{\partial x_j}\sum_{k=1}^k \exp(x_k)\right) – \frac{\exp(x_i) \cdot \exp(x_j)}{\left(\sum_{k=1}^k \exp(x_k)\right)^2} \\
&= \frac{\exp(x_i)}{\sum_{k=1}^k \exp(x_k)} \cdot \frac{\partial}{\partial x_j}(\exp(x_j)) – \frac{\exp(x_i) \cdot \exp(x_j)}{\left(\sum_{k=1}^k \exp(x_k)\right)^2} \\
&= \begin{cases}
\mathrm{softmax}(\mathbf{x})_i \cdot (1 – \mathrm{softmax}(\mathbf{x})_j) & i=j \\
-\mathrm{softmax}(\mathbf{x})_i \cdot \mathrm{softmax}(\mathbf{x})_j & i \neq j
\end{cases}
\end{aligned}
$$
這裡我們使用了兩個基本公式:
$$
\begin{aligned}
\frac{\partial}{\partial x}\exp(x) &= \exp(x) \\
\frac{\partial}{\partial x}\sum_{i=1}^k g(x_i) &= \sum_{i=1}^k \frac{\partial}{\partial x_i} g(x_i)
\end{aligned}
$$
2. 計算交叉熵損失函數的梯度
在深度學習中,我們通常使用交叉熵損失函數來評價模型的預測結果,交叉熵損失函數的定義是:
$$
L(y, \hat{y}) = -\sum_{i=1}^k y_i \log \hat{y}_i
$$
其中,$y$ 是真實的標籤向量,$\hat{y}$ 是模型的預測向量。
由於交叉熵損失函數是關於$\hat{y}$的函數,因此我們需要計算 $\frac{\partial L}{\partial \hat{y}}$ 來更新模型的參數。
設 $p = \mathrm{softmax}(\mathbf{x})$,則 $\hat{y} = p$,交叉熵損失函數可以表示為:
$$
L(y, p) = -\sum_{i=1}^k y_i \log p_i
$$
我們需要計算 $\frac{\partial L}{\partial x_i}$ 來更新模型的參數,根據鏈式法則,有:
$$
\frac{\partial L}{\partial x_i} = \sum_{j=1}^k \frac{\partial L}{\partial p_j} \cdot \frac{\partial p_j}{\partial x_i}
$$
由於 $p$ 與 $x$ 之間的關係已經求出,我們只需要計算 $\frac{\partial L}{\partial p_j}$ 即可。
根據交叉熵損失函數的定義,有:
$$
\frac{\partial L}{\partial p_j} = -\frac{y_j}{p_j}
$$
將其代入上式,有:
$$
\frac{\partial L}{\partial x_i} = -\sum_{j=1}^k \frac{y_j}{p_j} \cdot \frac{\partial p_j}{\partial x_i}
$$
接下來,我們將 $\frac{\partial L}{\partial x_i}$ 帶入求導公式,得到:
$$
\frac{\partial L}{\partial x_i} = \begin{cases}
(p_i – y_i) & i \in \{1,2,\dots,k\} \\
\end{cases}
$$
這個式子非常有用,我們可以直接使用它來更新模型的參數,例如在使用SGD、Adam等優化演算法的時候。
3. 使用矩陣運算簡化求導過程
在實際中,我們通常使用矩陣形式表示softmax函數,即:
$$
\mathrm{softmax}(\mathbf{x}) = \frac{\exp(\mathbf{x})}{\mathbf{1}^\mathrm{T} \exp(\mathbf{x})}
$$
其中,$\mathbf{x} \in \mathbb{R}^d$ 是輸入向量,$\mathbf{1}$ 是全1向量。
我們可以使用矩陣運算來簡化求導過程。
首先,我們定義:
$$
\mathbf{P} = \mathrm{softmax}(\mathbf{x}) \\
\mathbf{Y} = \mathrm{diag}(\mathbf{y}) \\
\mathbf{J} = \mathbf{P} – \mathbf{Y}
$$
其中,$\mathrm{diag}(\cdot)$ 表示將向量轉化成對角矩陣。
根據第2節的求導公式,我們有:
$$
\frac{\partial L}{\partial x_i} = \sum_{j=1}^k \frac{\partial L}{\partial p_j} \cdot \frac{\partial p_j}{\partial x_i}
$$
根據求導公式,我們可以將 $\frac{\partial L}{\partial p_j}$ 表示為:
$$
\frac{\partial L}{\partial p_j} = -\frac{y_j}{p_j} = -y_j \cdot (\mathbf{P})_j = (\mathbf{Y})_{jj}(\mathbf{P})_{j} = (\mathbf{Y} \odot \mathbf{P})_{j}
$$
其中,$\odot$ 表示依元素相乘。
同樣的,我們可以將 $\frac{\partial p_j}{\partial x_i}$ 表示為:
$$
\frac{\partial p_j}{\partial x_i} = \begin{cases}
p_i \cdot (1 – p_i) & i=j \\
-p_i \cdot p_j & i \neq j
\end{cases} = \begin{cases}
(\mathbf{P})_i (1 – (\mathbf{P})_i) & i=j \\
-(\mathbf{P})_i (\mathbf{P})_j & i \neq j
\end{cases} = \begin{cases}
(\mathbf{P} \odot (1-\mathbf{P}))_i & i=j \\
-(\mathbf{P} \odot \mathbf{P})_{i,j} & i \neq j
\end{cases}
$$
使用矩陣運算,我們可以得到:
$$
\frac{\partial L}{\partial x} = \mathbf{J}^\mathrm{T}
$$
這個式子跟第2節的公式是等價的。
總結
本文從多個方面詳細闡述了softmax函數的求導方法,並介紹了如何使用矩陣運算來簡化求導過程。在深度學習和神經網路中,softmax函數是非常重要的函數,softmax函數的求導是深度學習演算法中必不可少的環節,對於深入理解深度學習演算法具有重要意義。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/162656.html