SoftMax 回归 · 深度学习 01

Hailiang Zhao | 2021/08/24

Categories: math Tags: deep-learning optimization softmax

Softmax 回归是最简单的神经网络模型,输入数据经过线性组合后,直接通过 softmax 运算得到一个数据分布作为输出。Softmax 回归是 logistic 回归从二类拓展到多类的结果(将 logistic 函数换成 softmax 运算)。

模型定义

接下来的向量指 列向量

设标签 $c \in \{1, ..., C \}$,对于样本 $(\vec{x}, y)$,softmax 回归预测样本标签为 $c$ 的概率 $$ p \left( y=c | \vec{x} \right) = \textrm{softmax} \left(\vec{w}_c^\textrm{T} \vec{x} \right) = \frac{\exp \left(\vec{w}_c^\textrm{T} \vec{x} \right)}{\sum_{c'=1}^C \exp \left(\vec{w}_{c'}^\textrm{T} \vec{x} \right)} \in [0, 1], $$

因此 softmax 回归的预测结果为 $$ \hat{y} =\operatorname{argmax}_{c=1}^C p \left(y=c|\vec{x} \right) = \operatorname{argmax}_{c=1}^C \vec{w}_c^\textrm{T} \vec{x}. $$ 本质上,softmax 回归是一个单层神经网络,输出层为 softmax 层,是一个概率分布。

单样本的矢量计算表达式

为了更方便地定义 torch tensor,接下来的向量为 行向量

$d$ 为样本特征个数且 $\vec{x} \in \mathbb{R}^{1 \times d}$$W \in \mathbb{R}^{d \times C}$ 为待学习的权重,$\vec{b} \in \mathbb{R}^{1 \times C}$ 为偏置,则对于样本 $\left( \vec{x}^{(i)}, y^{(i)} \right)$,softmax 回归的矢量计算表达式为 $$\hat{\vec{y}}^{(i)} = \textrm{softmax} \left(\vec{x}^{(i)} W + \vec{b} \right),$$ 其中 $ \hat{\vec{y}}^{(i)} \in \mathbb{R}^{C} $ 的各个元素反应了 softmax 回归预测各标签的概率。

多样本的矢量计算表达式

为了更方便地定义 torch tensor,假设 $\vec{b}$行向量

$X \in \mathbb{R}^{n \times d}$$n$ 个样本的特征矩阵,则 $$ \hat{Y} = \textrm{softmax} \left( XW + \vec{b} \right). $$ PyTorch 会自动对 $\vec{b}$ 进行广播(将 $\vec{b}$ 转变为 $\bigg( \underbrace{\vec{b};...;\vec{b}}_{n \text{ elements}} \bigg) \in \mathbb{R}^{n \times C}$)。

参数学习

采用交叉熵损失函数,只关心正确类别的预测概率: $$ l ( W, \vec{b} ) = - \frac{1}{N} \sum_{n=1}^N \sum_{c=1}^C y_c^{(n)} \log \hat{y}_c^{(n)}. $$

# 交叉熵的 PyTorch 实现(此处不计算 batch 上的平均值)
def cross_entropy(y_hat, y):
    return -torch.log(y_hat.gather(1, y.view(-1, 1)))

根据该损失函数,参数 $W$$\vec{b}$ 的更新公式为 $$ W_{t+1} \leftarrow W_t + \alpha \left( \frac{1}{|\mathcal{B}|} \sum_{n \in \mathcal{B}} \vec{x}^{(n)} \left(\vec{y}^{(n)} - \hat{\vec{y}}^{(n)}_{W_t}\right)^\textrm{T} \right) $$

$$ b_{t+1} \leftarrow b_t + \alpha \left( \frac{1}{|\mathcal{B}|} \sum_{n \in \mathcal{B}} \left(\vec{y}^{(n)} - \hat{\vec{y}}^{(n)}_{b_t}\right) \right), $$ 其中 $\vec{y}^{(n)}$ 是一个 one-hot 向量,仅有 true label 位置对应的元素为 1。

推导过程

接下来针对单样本的情形分析。多样本的参数学习公式可以直接类比得到,请自行训练。 令 $\vec{z} = W^\textrm{T} \vec{x} + \vec{b} \in \mathbb{R}^{C}$,则 $\hat{\vec{y}} = \textrm{softmax} (\vec{z})$, 所以$$ \frac{\partial \hat{\vec{y}}}{\partial \vec{z}} = \textrm{diag} \left( \textrm{softmax} (\vec{z}) \right) - \textrm{softmax} (\vec{z}) \cdot \left( \textrm{softmax} (\vec{z}) \right)^\textrm{T}. $$ 其次,因为 $\vec{z} = W^\textrm{T} \vec{x} + \vec{b} = \left( \vec{w}_1^\textrm{T} \vec{x}, ..., \vec{w}_C^\textrm{T} \vec{x} \right)^\textrm{T} + \vec{b} \in \mathbb{R}^C$$\vec{w}_c \in \mathbb{R}^d$,所以 $\forall c = 1, ..., C$$$ \frac{\partial \vec{z}}{\partial \vec{w}_c} \in \mathbb{R}^{d \times c} = \left(\frac{\partial \vec{w}_1^\textrm{T} \vec{x}}{\partial \vec{w}_c}, ..., \frac{\partial \vec{w}_C^\textrm{T} \vec{x}}{\partial \vec{w}_c} \right)^\textrm{T} = \left(\vec{0}, ..., \underbrace{\vec{x}}_{\textrm{the }c\textrm{-th col}}, ..., \vec{0} \right) \triangleq M_c(\vec{x}). $$

因为 $l ( W, \vec{b} ) = - \vec{y}^\textrm{T} \log \hat{\vec{y}} \in \mathbb{R}$ 且其中的 $\vec{y} \in \mathbb{R}^C$ 为 one-hot 向量,$\hat{\vec{y}} \in \mathbb{R}^C$ 是 softmax 回归的输出,所以根据链式法则有 1

$$ \begin{align} \frac{\partial l ( W, \vec{b} ) }{\partial \vec{w}_c} &= - \frac{\partial \vec{z}}{\partial \vec{w}_c} \cdot \frac{\partial \hat{\vec{y}}}{\partial \vec{z}} \cdot \frac{\partial \log \hat{\vec{y}}}{\partial \hat{\vec{y}}} \cdot \vec{y} \\ &= - M_c(\vec{x}) \left( \textrm{diag} \hat{\vec{y}} - \hat{\vec{y}} \cdot \hat{\vec{y}}^\textrm{T} \right) \left( \textrm{diag} \hat{\vec{y}} \right)^{-1} \cdot \vec{y} \\ &= - M_c(\vec{x}) \left( I - \hat{\vec{y}} \vec{1}^\textrm{T} \right) \vec{y} && \hat{\vec{y}}^\textrm{T} \left( \textrm{diag} \hat{\vec{y}} \right)^{-1} = \vec{1}^\textrm{T} \\ &= -M_c(\vec{x}) \left( \vec{y} - \hat{\vec{y}} \vec{1}^\textrm{T} \vec{y} \right) \\ &= -M_c(\vec{x}) \left( \vec{y} - \hat{\vec{y}} \right) && \vec{1}^\textrm{T} \vec{y} = 1 \textrm{ since } \vec{y} \textrm{ is one-hot } \\ &= -\vec{x} \left( \vec{y} - \hat{\vec{y}} \right)_c \\ &= -\vec{x} \bigg( \underbrace{\mathbf{1} (\vec{y}_c = 1) - \hat{\vec{y}}_c}_{\textrm{scalar}} \bigg). \end{align} $$

由此可得 $$\frac{\partial l(W, \vec{b})}{\partial W} = -\vec{x} \big( \vec{y} - \hat{\vec{y}} \big)^\textrm{T}.$$

同理可得 $$\frac{\partial l(W, \vec{b})}{\partial \vec{b}} = -\big( \vec{y} - \hat{\vec{y}} \big)^\textrm{T}.$$

最后

Softmax 回归的 PyTorch 实现见本链接

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接。您必须给出适当的署名,并标明是否对本文作了修改。


  1. 关于这个推导过程,更多细节参见 需要熟练掌握的算法理论基础 的 “第二部分,15(14)”。 ↩︎