chapter_linear-networks:softmax回归
时间:2023-01-18 06:00:00
softmax回归
??sec_softmax
参考动手学深度学习教材对应章节:https://zh-v2.d2l.ai/
根据课程相关章节Jupyter运行文件得到结果并导出。
在 :numref:sec_linear_regression
我们介绍了线性回归。
随后,在 :numref:sec_linear_scratch
我们从零开始实现线性回归。
然后,在 :numref:sec_linear_concise
我们使用高级的深度学习框架API线性回归的简单实现。
可用于预测回归多少的问题。
比如预测房子的售价,或者棒球队可能赢的场数,或者病人住院的天数。
其实我们也是对的分类感兴趣的问题:不是问多少,而是问哪一个:
- 电子邮件是否属于垃圾邮件文件夹?
- 用户可能注册或不注册订阅服务?
- 一幅画是驴、狗、猫还是鸡?
- 接下来有人最有可能看哪部电影?
通常,机器学习实践者使用它分类这个词描述了两个有微妙差异的问题:
- 我们只对样本的“硬性”类别感兴趣,即属于哪个类别;
- 我们希望得到属于每个类别的软性类别的概率。
两者之间的界限往往很模糊。其中一个原因是,即使我们只关心硬类,我们仍然使用软类模型。
分类问题
??subsec_classification-problem
我们从一个图像分类问题开始。
假设每次输入都是一个 2 × 2 2\times2 2×2灰度图像。
每个像素值可以用一个标量来表示,每个图像对应四个特征 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1,x2,x3,x4。
另外,假设每个图像都属于猫、鸡和狗之一。
接下来,我们将选择如何表示标签。
我们有两个明显的选择:最直接的想法是选择 y ∈ { 1 , 2 , 3 } y \in \{1, 2, 3\} y∈{
1,2,3},
其中整数分别代表 { 狗 , 猫 , 鸡 } \{\text{狗}, \text{猫}, \text{鸡}\} {
狗,猫,鸡}。
这是在计算机上存储此类信息的有效方法。
如果类别间有一些自然顺序,
比如说我们试图预测 { 婴儿 , 儿童 , 青少年 , 青年人 , 中年人 , 老年人 } \{\text{婴儿}, \text{儿童}, \text{青少年}, \text{青年人}, \text{中年人}, \text{老年人}\} {
婴儿,儿童,青少年,青年人,中年人,老年人},
那么将这个问题转变为回归问题,并且保留这种格式是有意义的。
但是一般的分类问题并不与类别之间的自然顺序有关。
幸运的是,统计学家很早以前就发明了一种表示分类数据的简单方法:独热编码(one-hot encoding)。
独热编码是一个向量,它的分量和类别一样多。
类别对应的分量设置为1,其他所有分量设置为0。
在我们的例子中,标签 y y y将是一个三维向量,
其中 ( 1 , 0 , 0 ) (1, 0, 0) (1,0,0)对应于“猫”、 ( 0 , 1 , 0 ) (0, 1, 0) (0,1,0)对应于“鸡”、 ( 0 , 0 , 1 ) (0, 0, 1) (0,0,1)对应于“狗”:
y ∈ { ( 1 , 0 , 0 ) , ( 0 , 1 , 0 ) , ( 0 , 0 , 1 ) } . y \in \{(1, 0, 0), (0, 1, 0), (0, 0, 1)\}. y∈{ (1,0,0),(0,1,0),(0,0,1)}.
网络架构
为了估计所有可能类别的条件概率,我们需要一个有多个输出的模型,每个类别对应一个输出。
为了解决线性模型的分类问题,我们需要和输出一样多的仿射函数(affine function)。
每个输出对应于它自己的仿射函数。
在我们的例子中,由于我们有4个特征和3个可能的输出类别,
我们将需要12个标量来表示权重(带下标的 w w w),
3个标量来表示偏置(带下标的 b b b)。
下面我们为每个输入计算三个未规范化的预测(logit): o 1 o_1 o1、 o 2 o_2 o2和 o 3 o_3 o3。
o 1 = x 1 w 11 + x 2 w 12 + x 3 w 13 + x 4 w 14 + b 1 , o 2 = x 1 w 21 + x 2 w 22 + x 3 w 23 + x 4 w 24 + b 2 , o 3 = x 1 w 31 + x 2 w 32 + x 3 w 33 + x 4 w 34 + b 3 . \begin{aligned} o_1 &= x_1 w_{11} + x_2 w_{12} + x_3 w_{13} + x_4 w_{14} + b_1,\\ o_2 &= x_1 w_{21} + x_2 w_{22} + x_3 w_{23} + x_4 w_{24} + b_2,\\ o_3 &= x_1 w_{31} + x_2 w_{32} + x_3 w_{33} + x_4 w_{34} + b_3. \end{aligned} o1o2o3=x1w11+x2w12+x3w13+x4w14+b1,=x1w21+x2w22+x3w23+x4w24+b2,=x1w31+x2w32+x3w33+x4w34+b3.
我们可以用神经网络图 :numref:fig_softmaxreg
来描述这个计算过程。
与线性回归一样,softmax回归也是一个单层神经网络。
由于计算每个输出 o 1 o_1 o1、 o 2 o_2 o2和 o 3 o_3 o3取决于
所有输入 x 1 x_1 x1、 x 2 x_2 x2、 x 3 x_3 x3和 x 4 x_4 x4,
所以softmax回归的输出层也是全连接层。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xibMyV0A-1652167542545)(…/img/softmaxreg.svg)]
🏷fig_softmaxreg
为了更简洁地表达模型,我们仍然使用线性代数符号。
通过向量形式表达为 o = W x + b \mathbf{o} = \mathbf{W} \mathbf{x} + \mathbf{b} o=Wx+b,
这是一种更适合数学和编写代码的形式。
由此,我们已经将所有权重放到一个 3 × 4 3 \times 4 3×4矩阵中。
对于给定数据样本的特征 x \mathbf{x} x,
我们的输出是由权重与输入特征进行矩阵-向量乘法再加上偏置 b \mathbf{b} b得到的。
全连接层的参数开销
🏷subsec_parameterization-cost-fc-layers
正如我们将在后续章节中看到的,在深度学习中,全连接层无处不在。
然而,顾名思义,全连接层是“完全”连接的,可能有很多可学习的参数。
具体来说,对于任何具有 d d d个输入和 q q q个输出的全连接层,
参数开销为 O ( d q ) \mathcal{O}(dq) O(dq),这个数字在实践中可能高得令人望而却步。
幸运的是,将 d d d个输入转换为 q q q个输出的成本可以减少到 O ( d q n ) \mathcal{O}(\frac{dq}{n}) O(ndq),
其中超参数 n n n可以由我们灵活指定,以在实际应用中平衡参数节约和模型有效性
:cite:Zhang.Tay.Zhang.ea.2021
。
softmax运算
🏷subsec_softmax_operation
现在我们将优化参数以最大化观测数据的概率。
为了得到预测结果,我们将设置一个阈值,如选择具有最大概率的标签。
我们希望模型的输出 y ^ j \hat{y}_j y^j可以视为属于类 j j j的概率,
然后选择具有最大输出值的类别 * a r g m a x j y j \operatorname*{argmax}_j y_j *argmaxjyj作为我们的预测。
例如,如果 y ^ 1 \hat{y}_1 y^1、 y ^ 2 \hat{y}_2 y^2和 y ^ 3 \hat{y}_3 y^3分别为0.1、0.8和0.1,
那么我们预测的类别是2,在我们的例子中代表“鸡”。
然而我们能否将未规范化的预测 o o o直接视作我们感兴趣的输出呢?
答案是否定的。
因为将线性层的输出直接视为概率时存在一些问题:
一方面,我们没有限制这些输出数字的总和为1。
另一方面,根据输入的不同,它们可以为负值。
这些违反了 :numref:sec_prob
中所说的概率基本公理。
要将输出视为概率,我们必须保证在任何数据上的输出都是非负的且总和为1。
此外,我们需要一个训练目标,来鼓励模型精准地估计概率。
在分类器输出0.5的所有样本中,我们希望这些样本有一半实际上属于预测的类。
这个属性叫做校准(calibration)。
社会科学家邓肯·卢斯于1959年在选择模型(choice model)的理论基础上
发明的softmax函数正是这样做的:
softmax函数将未规范化的预测变换为非负并且总和为1,同时要求模型保持可导。
我们首先对每个未规范化的预测求幂,这样可以确保输出非负。
为了确保最终输出的总和为1,我们再对每个求幂后的结果除以它们的总和。如下式:
y ^ = s o f t m a x ( o ) 其中 y ^ j = exp ( o j ) ∑ k exp ( o k ) \hat{\mathbf{y}} = \mathrm{softmax}(\mathbf{o})\quad \text{其中}\quad \hat{y}_j = \frac{\exp(o_j)}{\sum_k \exp(o_k)} y^=softmax(o)其中元器件数据手册、IC替代型号,打造电子元器件IC百科大全!