zoukankan      html  css  js  c++  java
  • 动手学深度学习5-softmax回归

    softmax回归

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

    让我们先考虑一个简单的图像分类维内托,其输入图像的高和宽均为2像素,且色彩是灰度。这样的像素值都可以用一个标量表示。我们将图像中的4像素分别记为(x_{1},x_{2},x_{3},x_{4})。假设训练数据中图像的真实标签为狗,猫或者鸡(假设可以用4个像素表示出这三种动物),这些标签分别对应的离散值(y_{1},y_{2},y_{3})。我们通常使用离散值的数值来表示类别,例如(y_{1}=1,y_{2}=2,y_{3}=3)。这样一张图片的标签为1,2和3这三个数值中的一个。但是这种连续值到离散值的转化通常会影响到分类的质量。因此我们使用更加适合离散值输出的模型来解决分类问题

    softmax 回归模型

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

    (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_{2}).

    下图用神经网络描绘了上面的计算。softmax回归同线性回归一样,也是一个单层神经网络。由于每个输出(o_{1},o_{2},o_{3})的计算都有以来与所有的输入(x_{1},x_{2},x_{3},x_{4}),softmax回归的输出层也是一个全连接层。

    既然分类问题需要输出离散的预测结果,一个简单的方法就是把计算出来的(o_{1},o_{2},o_{3})作为预测类别的是i的置信度,并将值最大的输出所对应的类作为预测输出,即
    (underset{i}{argmax}o_{i}),如果(o_{1},o_{2},o_{3})分别为0.1,10,0.1,由于(o_{2})最大,那么预测的类别为2,其代表猫

    • 输出层的值的范围不确定,很难直观的判断这些值的意义。
    • 真实标签是离散值,离散值与不确定范围的输出值之间的误差难以衡量,
      而通过softmax运算解决了以上两个问题,它通过下式将输出值转换成值为正,且和为1的概率分布:
      (hat{y}_{1},hat{y}_{2},hat{y}_{3}) = (softmax(o_{1},o_{2},o_{3}))
      其中

    [hat { y } _ { 1 } = frac { exp ( o_{1} ) } { sum _ { i = 1 } ^ { 3 } exp ( o_{i }) } , quad hat { y } _ { 2 } = frac { exp left( o _ { 2 } ight) } { sum _ { i = 1 } ^ { 2 } exp left( o _ { i } ight) } , quad hat { y } _ { 3 } = frac { exp left( o _ { 3 } ight) } { sum _ { i = 1 } ^ { 3 } exp left( o _ { i } ight) } ]

    容易看出(hat{y}_{1}+hat{y}_{2}+hat{y}_{3}=1),且0<=(hat{y}_{1},hat{y}_{2},hat{y}_{3})<=1。(hat{y}_{1},hat{y}_{2},hat{y}_{3})是一个合理的概率分布。这时候,如果(hat{y}_{2})=0.8,不管其他两个值是多少,我们都知道图像类别为猫的概率为80%,此外
    (underset{i}{argmax}o_{i}) = (underset{i}{argmax}hat{y}_{i}),softmax运算不会改变预测类别的输出结果。

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

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

    [oldsymbol { W } = left[ egin{array} { l l l } { 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} ight] , quad oldsymbol { b } = left[ egin{array} { l l l } { b _ { 1 } } & { b _ { 2 } } & { b _ { 3 } } end{array} ight] ]

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

    [x^{(i)} = left[ egin{array} { l l 1 1} { x _ { 1 }^{(i)} } & { x _ { 2 }^{(i)} } & { x _ { 3 }^{(i)} }&{x_{4}^{(i)}} end{array} ight]$$, 输出层的输出为 $$oldsymbol { o^{(i)} } = left[ egin{array} { l l l } { o _ { 1 }^{(i)} } & { o _ { 2 }^{(i)}} & { o _ { 3 }^{(i)} } end{array} ight]$$, 预测为狗、猫或者鸡的概率分布为 $$oldsymbol {hat{oldsymbol{y}}^{(i)} } = left[ egin{array} { l l l } { hat{y} _ { 1 }^{(i)} } & { hat{y} _ { 2 }^{(i)}} & { hat{y} _ { 3 }^{(i)} } end{array} ight]$$, softmax回归对样本i分类的矢量计算表达式为 $$o^{(i)}=x^{(i)} oldsymbol{W} +b]

    [hat{y}^{(i)} = softmax(o^{(i)}) ]

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

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

    [oldsymbol{O}=oldsymbol{X}oldsymbol{W}+oldsymbol{b} ]

    [oldsymbol{hat{Y}} = softmax(oldsymbol{O}) ]

    其中的假发运算使用了广播机制,(oldsymbol{O},oldsymbol{hat{Y}}∈R^{n✖️q}且这两个矩阵的第i行分别为样本i的输出o^{(i)}和概率分布hat{y}^{(i)})

    交叉熵损失函数

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

    我们可以像线性回归那样使用平方损失函数(||hat{y}^{(i)}-y^{(i)}||^2/2),然而想要预测出正确的分类结果,并不需要预测概率完全等于标签概率。交叉熵(cross entropy)是一个常用的衡量方法:

    [H left( oldsymbol { y } ^ { ( i ) } , hat { oldsymbol { y } } ^ { ( i ) } ight) = - sum _ { j = 1 } ^ { q } y _ { j } ^ { ( i ) } log hat { y } _ { j } ^ { ( i ) } ]

    假设训练样本的样本数为n,交叉熵损失函数定义为
    (ellleft({Θ} ight)) = (frac{1}{n}sum_{i=1}^{n}Hleft(oldsymbol{y^{(i)}},hat{oldsymbol{y}}^{(i)} ight))

    (Θ)代表模参数吗,具体细节可以参考
    讨论区
    博客

    cross entropy一般是用来量化两个机率分布之间的差距的
    举个例子,你现在要预测一张图片是狗或猫
    你的模型得到的概率是
    狗 = 0.4, 猫 = 0.6
    而真实的概率则是
    狗 = 0.0, 猫 = 1.0
    
    那么预测出来的概率和真实的概率,两者之间的差距有多大呢?这就是cross entropy要量化的事情了
    根据上述的例子,我们可知道cross entropy为
    
    -( 0.0 * log(0.4) + 1.0*log(0.6) ) = 0.22
    
    0.22代表的是你的model预测出来的概率和真实的概率之间,差距有多大
    
    模型预测以及评价

    在训练好softmax回归模型后,给定任意样本特征,就可以预测出每个输出类别的概率。通常我们把预测概率最大类别作为输出类别。如果它与真实标签一致,说明预测是正确的。后续分类问题将采用准确率accuracy 来评估模型的表现。

    小结
    • softmax回归适用于分类问题,它使用softmax运算输出类别的概率分布
    • softmax回归是一个单层神经网络,输出个数等于分类问题中的类别个数
    • 交叉熵适合衡量两个概率分布的差异
  • 相关阅读:
    大数据架构资料
    SQLServer 随机生成指定范围的日期
    源码解析Django CBV的本质
    源码剖析Django REST framework的认证方式及自定义认证
    Django----中间件详解
    权限管理系统
    Django---分页器、中间件
    linux每日命令(37):top命令
    linux每日命令(36):wc命令
    linux每日命令(35):grep命令
  • 原文地址:https://www.cnblogs.com/onemorepoint/p/11777524.html
Copyright © 2011-2022 走看看