《动手学深度学习》3.4 softmax回归

前言

从零开始学习ai文章系列计划是个人在《动手学深度学习》和《磨菇书》两本书的学习中的个人笔记,文章也会以课本中的章节分开,即每个章节一片笔记。我会尽量的把主要内容以及遇到的难点进行记录与解决,如果哪里有错误的欢迎指正。或者不清晰的可以直接查看原文部分。

《动手学深度学习》原文(课本):https://tangshusen.me/Dive-into-DL-PyTorch/#/

《动手学深度学习》代码:https://github.com/ShusenTang/Dive-into-DL-PyTorch

(由于有时候公式太多,可能会直接贴图片)

1.分类问题

softmax模型是用来解决分类问题的一种方法

我们将图像中的4像素分别记为\(x_1,x_2,x_3,x_4\)

假设训练数据集中图像的真实标签为狗、猫或鸡(假设可以用4像素表示出这3种动物),这些标签分别对应离散值\(y_1,y_2,y_3\)

举个例子,第i个图像样本\(x^{(i)}=[x_1,x_2,x_3,x_4]\),在经过了相应大小的的w和b进行计算后,该第i图像样本对应的输出为\(\hat{y}^{(i)}=[y_1,y_2,y_3]\),其中\(y_1,y_2,y_3\)结果对应狗、猫、鸡3个结果。

以该图像是狗为例,在样本的label中\(y^{(i)}=[1,0,0]\),而我们计算结果可能是\(\hat{y}^{(i)}=[0.8,0.1,0.07]\)

2.softmax回归模型

softmax回归跟线性回归一样将输入特征与权重做线性叠加。

与线性回归的一个主要不同在于,softmax回归的输出值个数等于标签里的类别数。 \[ \begin{aligned} o_1=x_1w_{11}+x_2w_{21}+x_3w_{31}+x_4w_{41}+b_1 \\ o_2=x_1w_{12}+x_2w_{22}+x_3w_{32}+x_4w_{42}+b_2 \\ o_3=x_1w_{13}+x_2w_{23}+x_3w_{33}+x_4w_{43}+b_3 \end{aligned} \] image-20250311102451667

softmax回归同线性回归一样,也是一个单层神经网络。

由于每个输出\(o_1,o_2,o_3\)的计算都要依赖于所有的输入\(x_1,x_2,x_3,x_4\),softmax回归的输出层也是一个全连接层。

softmax运算符(softmax operator)通过下式将输出值变换成值为正且和为1的概率分布: \[ \hat{y}_1,\hat{y}_2,\hat{y}_3 = softmax(o_1,o_2,o_3) \] 其内部具体计算为

image-20250311102822395

容易看出 \(\hat{y}_1+\hat{y}_2+\hat{y}_3=1 且 0<=\hat{y}_1,\hat{y}_2,\hat{y}_3<=1\)

其中exp 代表的是指数函数,即 e 的幂次运算,数学上表示为:\(exp(x)=e^x\)

指数函数 \(exp(x) = e^x\) 会放大较大的数值,而较小的数值则被压缩得更接近 0。例如: \[ \begin{aligned} exp(o_1=3)=20.09,\quad exp(o_2=1)=2.72,\quad exp(o_3=-1)=0.37\\ \\ y_1=\frac {20.09} {20.09+2.72+0.37}=0.86,\quad y_1=0.12 \quad y_3=0.02 \end{aligned} \] 可以看到 较大的值 \(o_1\) 产生的概率明显更高。

这种特性可以让模型在做决策时更明确,避免输出值之间的差距太小,导致不确定性过高。

3.单样本分类的矢量计算表达式

为了提高计算效率,我们可以将单样本分类通过矢量计算来表达。

在上面的图像分类问题中,假设softmax回归的权重和偏差参数分别为

设高和宽分别为2个像素的图像样本i的特征为

输出层的输出为

预测为狗、猫或鸡的概率分布为

综上,softmax回归对样本i分类的矢量计算表达式为

4.小批量样本分类的矢量计算表达式

\[ \begin{align} \mathbf{O} = \mathbf{XW+b} \\ \mathbf{\hat{Y}} = softmax(\mathbf{O}) \end{align} \]

其中\(\mathbf{X}\)是多个\(x^{(i)}\)排列而成。

5.交叉熵损失函数

\[ H(y^{(i)},\hat{y}^{(i)}) = -\sum ^{q}_{j=1} {y^{(i)}_jlog\hat{y}^{(i)}_j} \]

其中\(y^{(i)}_j\)是向量\(y^{(i)}\)中非0即1的元素

在上式中,我们知道向量\(y^{(i)}\)中只有第k个元素\(y^{(i)}_k\)为1,其余全为0,因此我们能够改写如下 \[ H(y^{(i)},\hat{y}^{(i)}) = -log\hat{y}^{(i)}_k \] 举例 \[ y^{(i)}=[0,1,0] \] 代入交叉熵公式中 \[ H(y^{(i)},\hat{y}^{(i)}) = -(0*log\hat{y}^{(i)}_1+1*log\hat{y}^{(i)}_2+0*log\hat{y}^{(i)}_3)=-log\hat{y}^{(i)}_2 \]

因此我们能看出损失函数\(H(y^{(i)},\hat{y}^{(i)})\)实际上是一个log函数

如果模型对真实类别的预测概率高(接近 1),那么 -log(概率) 也就小,损失低,说明模型预测正确。

如果模型对真实类别的预测概率低(接近 0),那么 -log(概率) 会变大,损失也就更高,说明模型预测错误。

image-20250311145719398

假设训练数据集的样本数为n,交叉熵损失函数定义为 \[ L=\frac {1} {n}\sum ^{n}_{i=1} {H(y^{(i)},\hat{y}^{(i)})} \]