Pytorch学习笔记-softmax回归

前面的线性回归模型适用于输出为连续值的情景。在另一类情景中,模型输出可以是一个像图像类别这样的离散值。对于这样的离散值预测问题,可以使用如softmax回归这样的分类模型。和线性回归不同,softmax回归的输出单元从一个变成了多个,且引入了softmax运算使输出更适合离散值的预测和训练。以softmax回归模型为例,介绍神经网络中的分类模型。

分类问题

考虑一个简单的图像分类问题,其输入图像的高和宽均为2像素,且色彩为灰度。这样每个像素值都可以用一个标量表示。将图像中的4像素分别记为 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4,假设训练数据集中图像的真实标签为狗、猫或鸡(假设可以用4像素表示出这3种动物),这些标签分别对应离散值 y 1 , y 2 , y 3 y_1,y_2,y_3 y1,y2,y3。通常使用离散的数值来表示类别,例如 y 1 = 1 , y 2 = 2 , y 3 = 3 y_1=1,y_2=2,y_3=3 y1=1,y2=2,y3=3。这样,一张图像的标签为1、2和3这3个数值中的一个。虽然仍然可以使用回归模型来进行建模,并将预测值就近定点化到1、2和3这3个离散值之一,但这种连续值到离散值的转化通常会影响到分类质量。因此一般使用更加适合离散值输出的模型来解决分类问题。

softmax回归模型

softmax回归跟线性回归一样将输入特征与权重做线性叠加。与线性回归的一个主要不同在于,softmax回归的输出值个数等于标签里的类别数。因为一共有4种特征和3种输出动物类别,所以权重包含12个标量(带下标的 w w w)、偏差包含3个标量(带下标的 b b b),且对每个输入计算 o 1 , o 2 , o 3 o_1,o_2,o_3 o1,o2,o3这三个输出:

o 1 = x 1 w 11 + x 2 w 21 + x 3 w 31 + x 4 w 41 + b 1 o 2 = x 1 w 12 + x 2 w 22 + x 3 w 32 + x 4 w 42 + b 2 o 3 = x 1 w 13 + x 2 w 23 + x 3 w 33 + x 4 w 43 + b 3 \begin{aligned}o_{1} &=x_{1} w_{11}+x_{2} w_{21}+x_{3} w_{31}+x_{4} w_{41}+b_{1} \\o_{2} &=x_{1} w_{12}+x_{2} w_{22}+x_{3} w_{32}+x_{4} w_{42}+b_{2} \\o_{3} &=x_{1} w_{13}+x_{2} w_{23}+x_{3} w_{33}+x_{4} w_{43}+b_{3}\end{aligned} o1o2o3=x1w11+x2w21+x3w31+x4w41+b1=x1w12+x2w22+x3w32+x4w42+b2=x1w13+x2w23+x3w33+x4w43+b3

用神经网络图描绘了上面的计算。softmax回归同线性回归一样,也是一个单层神经网络。由于每个输出 o 1 , o 2 , o 3 o_1,o_2,o_3 o1,o2,o3的计算都要依赖于所有的输入 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1,x2,x3,x4,softmax回归的输出层也是一个全连接层。

在这里插入图片描述

既然分类问题需要得到离散的预测输出,一个简单的办法是将输出值 o i o_i oi当作预测类别是 i i i的置信度,并将值最大的输出所对应的类作为预测输出,即输出 arg ⁡ max ⁡ i o i \underset{i}{\arg \max } o_{i} iargmaxoi。例如,如果 o 1 , o 2 , o 3 o_1,o_2,o_3 o1,o2,o3分别为 0.1 , 10 , 0.1 0.1,10,0.1 0.1,10,0.1,由于 o 2 o_2 o2最大,那么预测类别为 2 2 2,代表猫。

然而,直接使用输出层的输出有两个问题。一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。例如,刚才举的例子中的输出值10表示“很置信”图像类别为猫,因为该输出值是其他两类的输出值的100倍。但如果 o 1 = o 3 = 1 0 3 o_1=o_3=10^3 o1=o3=103,那么输出值10却又表示图像类别为猫的概率很低。另一方面,由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。

softmax运算符(softmax operator)解决了以上两个问题。它通过下式将输出值变换成值为正且和为1的概率分布:

y ^ 1 , y ^ 2 , y ^ 3 = softmax ⁡ ( o 1 , o 2 , o 3 ) \hat{y}_{1}, \hat{y}_{2}, \hat{y}_{3}=\operatorname{softmax}\left(o_{1}, o_{2}, o_{3}\right) y^1,y^2,y^3=softmax(o1,o2,o3)

其中,

y ^ 1 = exp ⁡ ( o 1 ) ∑ i = 1 3 exp ⁡ ( o i ) y ^ 2 = exp ⁡ ( o 2 ) ∑ i = 1 3 exp ⁡ ( o i ) y ^ 3 = exp ⁡ ( o 3 ) ∑ i = 1 3 exp ⁡ ( o i ) \hat{y}_{1}=\frac{\exp (o 1)}{\sum_{i=1}^{3} \exp (o i)} \quad \hat{y}_{2}=\frac{\exp \left(o_{2}\right)}{\sum_{i=1}^{3} \exp (o i)} \quad \hat{y}_{3}=\frac{\exp \left(o_{3}\right)}{\sum_{i=1}^{3} \exp (o i)} y^1=i=13exp(oi)exp(o1)y^2=i=13exp(oi)exp(o2)y^3=i=13exp(oi)exp(o3)

容易看出, y ^ 1 + y ^ 2 + y ^ 3 = 1 \hat{y}_{1}+\hat{y}_{2}+ \hat{y}_{3}=1 y^1+y^2+y^3=1 0 ≤ y ^ 1 , y ^ 2 , y ^ 3 ≤ 1 0\leq\hat{y}_{1}, \hat{y}_{2}, \hat{y}_{3}\leq1 0y^1,y^2,y^31,因此 y ^ 1 , y ^ 2 , y ^ 3 \hat{y}_{1}, \hat{y}_{2}, \hat{y}_{3} y^1,y^2,y^3是合法的概率分布。这时候,如果 y ^ 2 \hat{y}_{2} y^2,不管 y ^ 1 , y ^ 3 \hat{y}_{1}, \hat{y}_{3} y^1,y^3的值是多少,我们都知道图像类别是猫的概率是80%。此外,注意到 arg ⁡ max ⁡ i o i = arg ⁡ max ⁡ i y ^ i \underset{i}{\arg \max } o_{i}=\underset{i}{\arg \max } \hat{y}_{i} iargmaxoi=iargmaxy^i。因此softmax运算不改变预测类别输出。

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

为了提高计算效率,我们可以将单样本分类通过矢量计算来表达。在上面的图像分类问题中,假设softmax回归的权重和偏差参数分别为:

W = [ w 11 w 12 w 13 w 21 w 22 w 23 w 31 w 32 w 33 w 41 w 42 w 43 ] , b = [ b 1 b 2 b 3 ] \boldsymbol{W}=\left[\begin{array}{lll}w_{11} & w_{12} & w_{13} \\w_{21} & w_{22} & w_{23} \\w_{31} & w_{32} & w_{33} \\w_{41} & w_{42} & w_{43}\end{array}\right], \quad \boldsymbol{b}=\left[\begin{array}{lll}b_{1} & b_{2} & b_{3}\end{array}\right] W=w11w21w31w41w12w22w32w42w13w23w33w43,b=[b1b2b3]

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

x ( i ) = [ x 1 ( i ) x 2 ( i ) x 3 ( i ) x 4 ( i ) ] \boldsymbol{x}^{(i)}=\left[\begin{array}{llll} x_{1}^{(i)} & x_{2}^{(i)} & x_{3}^{(i)} & x_{4}^{(i)} \end{array}\right] x(i)=[x1(i)x2(i)x3(i)x4(i)]

输出层的输出为:

o ( i ) = [ o 1 ( i ) o 2 ( i ) o 3 ( i ) ] \boldsymbol{o}^{(i)}=\left[\begin{array}{lll}o_{1}^{(i)} & o_{2}^{(i)} & o_{3}^{(i)}\end{array}\right] o(i)=[o1(i)o2(i)o3(i)]

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

y ^ ( i ) = [ y ^ 1 ( i ) y ^ 2 ( i ) y ^ 3 ( i ) ] \hat{\boldsymbol{y}}^{(i)}=\left[\begin{array}{lll}\hat{y}_{1}^{(i)} & \hat{y}_{2}^{(i)} & \hat{y}_{3}^{(i)}\end{array}\right] y^(i)=[y^1(i)y^2(i)y^3(i)]

softmax回归对样本ii分类的矢量计算表达式为:

o ( i ) = x ( i ) W + b y ^ ( i ) = softmax ⁡ ( o ( i ) ) \begin{array}{l}\boldsymbol{o}^{(i)}=\boldsymbol{x}^{(i)} \boldsymbol{W}+\boldsymbol{b} \\\hat{\boldsymbol{y}}^{(i)}=\operatorname{softmax}\left(\boldsymbol{o}^{(i)}\right)\end{array} o(i)=x(i)W+by^(i)=softmax(o(i))

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

为了进一步提升计算效率,我们通常对小批量数据做矢量计算。广义上讲,给定一个小批量样本,其批量大小为 n n n,输入个数(特征数)为 d d d,输出个数(类别数)为 q q q。设批量特征为 X ∈ R n × d \boldsymbol{X} \in \mathbb{R}^{n \times d} XRn×d。假设softmax回归的权重和偏差参数分别为 W ∈ R d × q \boldsymbol{W} \in \mathbb{R}^{d \times q} WRd×q b ∈ R 1 × q \boldsymbol{b} \in \mathbb{R}^{1 \times q} bR1×q。softmax回归的矢量计算表达式为

O = X W + b Y ^ = softmax ⁡ ( O ) \begin{array}{l}\boldsymbol{O}=\boldsymbol{X} \boldsymbol{W}+\boldsymbol{b} \\\hat{\boldsymbol{Y}}=\operatorname{softmax}(\boldsymbol{O})\end{array} O=XW+bY^=softmax(O)

其中的加法运算使用了广播机制, O , Y ^ ∈ R n × q \boldsymbol{O}, \hat{\boldsymbol{Y}} \in \mathbb{R}^{n \times q} O,Y^Rn×q,且这两个矩阵的第 i i i行分别为样本 i i i的输出 o i \boldsymbol{o}_i oi和概率分布 y ^ ( i ) \hat{\boldsymbol{y}}^{(i)} y^(i)

交叉熵损失函数

前面提到,使用softmax运算后可以更方便地与离散标签计算误差。我们已经知道,softmax运算将输出变换成一个合法的类别预测分布。实际上,真实标签也可以用类别分布表达:对于样本 i i i,我们构造向量 y ( i ) ∈ R q \boldsymbol{y}^{(i)} \in \mathbb{R}^{q} y(i)Rq,使其第 y ( i ) y^{(i)} y(i)(样本 i i i类别的离散数值)个元素为1,其余为0。这样我们的训练目标可以设为使预测概率分布 y ^ ( i ) \hat{\boldsymbol{y}}^{(i)} y^(i)尽可能接近真实的标签概率分布 y ( i ) \boldsymbol{y}^{(i)} y(i).

可以像线性回归那样使用平方损失函数 ∥ y ^ ( i ) − y ( i ) ∥ 2 / 2 \left\|\hat{\boldsymbol{y}}^{(i)}-\boldsymbol{y}^{(i)}\right\|^{2} / 2 y^(i)y(i)2/2。然而,想要预测分类结果正确,我们其实并不需要预测概率完全等于标签概率。例如,在图像分类的例子里,如果 y ( i ) = 3 y^{(i)}=3 y(i)=3,那么我们只需要 y ^ 3 ( i ) \hat{y}^{(i)}_3 y^3(i)比其他两个预测值 y ^ 1 ( i ) \hat{y}^{(i)}_1 y^1(i) y ^ 2 ( i ) \hat{y}^{(i)}_2 y^2(i)大就行了。即使 y ^ 3 ( i ) \hat{y}^{(i)}_3 y^3(i)值为0.6,不管其他两个预测值为多少,类别预测均正确。而平方损失则过于严格,例如 y ^ 1 ( i ) = y ^ 2 ( i ) = 0.2 \hat{y}_{1}^{(i)}=\hat{y}_{2}^{(i)}=0.2 y^1(i)=y^2(i)=0.2 y ^ 1 ( i ) = 0 , y ^ 2 ( i ) = 0.4 \hat{y}_{1}^{(i)}=0, \hat{y}_{2}^{(i)}=0.4 y^1(i)=0,y^2(i)=0.4的损失要小很多,虽然两者都有同样正确的分类预测结果。

改善上述问题的一个方法是使用更适合衡量两个概率分布差异的测量函数。其中,交叉熵(cross entropy)是一个常用的衡量方法:

H ( y ( i ) , y ^ ( i ) ) = − ∑ j = 1 q y j ( i ) log ⁡ y ^ j ( i ) H\left(\boldsymbol{y}^{(i)}, \hat{\boldsymbol{y}}^{(i)}\right)=-\sum_{j=1}^{q} y_{j}^{(i)} \log \hat{y}_{j}^{(i)} H(y(i),y^(i))=j=1qyj(i)logy^j(i)

其中带下标的 y j ( i ) y_{j}^{(i)} yj(i)是向量 y ( i ) \boldsymbol{y}^{(i)} y(i)中非0即1的元素,需要注意将它与样本 i i i类别的离散数值,即不带下标的 y ( i ) y^{(i)} y(i)区分。在上式中,我们知道向量 y ( i ) \boldsymbol{y}^{(i)} y(i)中只有第 y ( i ) y^{(i)} y(i)个元素 y y ( i ) ( i ) y_{\left.y^{(i}\right)}^{(i)} yy(i)(i) 1 1 1,其余全为 0 0 0。于是 H ( y ( i ) , y ^ ( i ) ) = − log ⁡ y ^ y ( i ) ( i ) H\left(\boldsymbol{y}^{(i)}, \hat{\boldsymbol{y}}^{(i)}\right)=-\log \hat{y}_{y^{(i)}}^{(i)} H(y(i),y^(i))=logy^y(i)(i)。也就是说,交叉熵只关心对正确类别的预测概率,因为只要其值足够大,就可以确保分类结果正确。然而遇到一个样本有多个标签时,例如图像里含有不止一个物体时,并不能做这一步简化。但即便对于这种情况,交叉熵同样只关心对图像中出现的物体类别的预测概率。

假设训练数据集的样本数为 n n n,交叉熵损失函数定义为

ℓ ( Θ ) = 1 n ∑ i = 1 n H ( y ( i ) , y ^ ( i ) ) \ell(\boldsymbol{\Theta})=\frac{1}{n} \sum_{i=1}^{n} H\left(\boldsymbol{y}^{(i)}, \hat{\boldsymbol{y}}^{(i)}\right) (Θ)=n1i=1nH(y(i),y^(i))

其中 Θ \boldsymbol{\Theta} Θ代表模型参数。同样地,如果每个样本只有一个标签,那么交叉熵损失可以简写成 ℓ ( Θ ) = − ( 1 / n ) ∑ i = 1 n log ⁡ y ^ y ( i ) ( i ) \ell(\boldsymbol{\Theta})=-(1 / n) \sum_{i=1}^{n} \log \hat{y}_{y^{(i)}}^{(i)} (Θ)=(1/n)i=1nlogy^y(i)(i)。从另一个角度来看,我们知道最小化 ℓ ( Θ ) \ell(\boldsymbol{\Theta}) (Θ)等价于最大化 exp ⁡ ( − n ℓ ( Θ ) ) = ∏ i = 1 n y ^ y ( i ) ( i ) \exp (-n \ell(\boldsymbol{\Theta}))=\prod_{i=1}^{n} \hat{y}_{y(i)}^{(i)} exp(n(Θ))=i=1ny^y(i)(i),即最小化交叉熵损失函数等价于最大化训练数据集所有标签类别的联合预测概率。

模型预测及评价

在训练好softmax回归模型后,给定任一样本特征,就可以预测每个输出类别的概率。通常,把预测概率最大的类别作为输出类别。如果它与真实类别(标签)一致,说明这次预测是正确的。使用准确率(accuracy)来评价模型的表现。它等于正确预测数量与总预测数量之比。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值