@(Aaron)[机器学习 | 逻辑回归]

主要内容包括:

  • softmax回归的基本概念
  • 如何获取Fashion-MNIST数据集和读取数据
  • softmax回归模型的从零开始实现,实现一个对Fashion-MNIST训练集中的图像数据进行分类的模型
  • 使用pytorch重新实现softmax回归模型

[TOC]

softmax的基本概念

分类问题

  一个简单的图像分类问题,输入图像的高和宽均为2像素,色彩为灰度。图像中的4像素分别记为x1,x2,x3,x4x_{1}, x_{2}, x_{3}, x_{4}。假设真实标签为狗、猫或者鸡,这些标签对应的离散值为y1,y2,y3y_{1}, y_{2}, y_{3}。我们通常使用离散的数值来表示类别,例如y1=1,y2=2,y3=3y_{1}=1, y_{2}=2, y_{3}=3

权重矢量

o1=x1w11+x2w21+x3w31+x4w41+b1o2=x1w12+x2w22+x3w32+x4w42+b2o3=x1w13+x2w23+x3w33+x4w43+b3\begin{aligned} &o_{1}=x_{1} w_{11}+x_{2} w_{21}+x_{3} w_{31}+x_{4} w_{41}+b_{1}\\ &\begin{array}{l} {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{array} \end{aligned}

神经网络图

  下图用神经网络图描绘了上面的计算。softmax回归同线性回归一样,也是一个单层神经网络。由于每个输出o1,o2,o3o_{1}, o_{2}, o_{3}的计算都要依赖于所有的输入x1,x2,x3,x4x_{1}, x_{2}, x_{3}, x_{4},softmax回归的输出层也是一个全连接层。

  既然分类问题需要得到离散的预测输出oio_{i},一个简单的办法是将输出值当作预测类别是的置信度,并将值最大的输出所对应的类作为预测输出,即输出 argmax(oi)argmax( o_{i}) 。例如o1,o2,o3o_{1}, o_{2}, o_{3},如果分别为0.1,10,0.10.1,10, 0.1,由于 o2o_{2} 最大,那么预测类别为2,其代表猫。

输出问题

  直接使用输出层的输出有两个问题:

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

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

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

其中

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

  容易看出 y^1+y^2+y^3=1\hat{y}_{1}+\hat{y}_{2}+\hat{y}{3}=10y^1,y^2,y^310 \leq \hat{y}{1}, \hat{y}_{2}, \hat{y}_{3} \leq 1,因此 y^1,y^2,y^3\hat{y}_{1}, \hat{y}_{2}, \hat{y}{3} 是一个合法的概率分布。这时候,如果 y^2=0.8\hat{y}{2}=0.8,不管y^1\hat{y}{1}y^2\hat{y}{2} 的值是多少,我们都知道图像类别为猫的概率是80%。此外,我们注意到

argmaxioi=argmaxiy^i\arg \max _{i} o_{i}=\arg \max _{i} \hat{y}_{i}

  因此softmax运算不改变预测类别输出。

交叉熵损失函数

  对于样本ii,我们构造向量y(i)Rq\boldsymbol{y}^{(i)} \in \mathbb{R}^{q} ,使其第y(i)y^{(i)}(样本ii类别的离散数值)个元素为1,其余为0。这样我们的训练目标可以设为使预测概率分布尽y^(i)\hat{y}^{(i)}可能接近真实的标签概率分布y(i)y^{(i)}

  • 平方损失估计

Loss=y^(i)y(i)2/2\text {Loss}=\left|\hat{\boldsymbol{y}}^{(i)}-\boldsymbol{y}^{(i)}\right|^{2} / 2

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

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

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

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

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

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

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

模型训练和预测

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

softmax回归模型的从零开始实现及使用pytorch重新实现softmax回归模型

  参考:https://github.com/Sandy1230/Dive-into-DL-PyTorch-master