想明白多分类,必须得谈逻辑回归

1 引例

《跟我一起机器学》 中,我们已经介绍了什么是逻辑回归回归。但是为了能更好的与深度学习相关内容进行衔接,在本篇文章中我们依旧是首先回顾一下逻辑回归,然后再一步步引入多分类直至过渡到深度神经网络的相关学习中。

1.1 从逻辑回归说起

我们都知道逻辑回归其实并不是一个回归任务,而是一个彻彻底底的分类任务。之所以当时被称之为回归其原因之一就是逻辑回归在最后预测的时候首先是输出一个 [ 0 , 1 ] [0,1] [0,1]的连续值,然后我们再来人为的指定一个阈值进行分类。也就是,你还可以将逻辑回归先看成是一个回归任务,然后再根据预测得到的阈值进行分类。因此,对于一个包含有4个特征输入的逻辑回归模型,我们同样可以用如下结构图进行表示:

图 1. 逻辑回归结构图(偏置未画出)

如图1所示,左边 x 1 x_1 x1 x 4 x_4 x4为模型的输入。输入特征经过线性组合后再经激活函数sigmoid作用后便能得到一个位于区间 [ 0 , 1 ] [0,1] [0,1]的连续值。最后,通过设定一个阈值来对不同样本进行分类得到类标 y y y,完成整个二分类任务。可以看出,其与线性回归的唯一区别就在于对输出层的处理上。

1.2 问如何解决多分类问题

在说完逻辑回归这个二分类模型后,我们是不是自然而然的就会想到如何进行多分类的任务呢?因为在实际情况中,绝大多数任务场景都不会是一个简单的二分类任务。在**《跟我一起机器学习》**中我们介绍过可以通过建立多个二分类模型利用One-vs-All的思想来完成多分类任务。

图 2. 多分类示意图(偏置未画出)

如图2所示为通过三个逻辑回归模型来完成一个三分类任务的解决方案。对于包含有A、B、C三个类别的分类任务来说,图2所示的三个模型将分别以[1,0,0][0,1,0][0,0,1]的划分方式将所有的数据样本重新进行类别划分。也就是说第一个模型在建模时仅把A类样本认为是正样本,其余两类均看作是负样本;而第二个模型在建模时仅把B类样本认为是正样本其余的均为负样本。最后,对于同一个样本,其所属类别应是三个分类器输出可信度最高的分类器所对于的类别。

2 从单分类到多分类

对于图2所示的这种表示方法来说,当分类类别较多时表示起来可能就不太那么方便;并且明显可以看出,图2所示的结构图可以进行简化,因为其输入均为一样。

图 3. 多分类结构图(偏置未画出)

从图3可以看出,这种表示形式比图2简洁了许多,其中中间部分不同黑色实线均表示不同的权重参数。同时,我们在利用图3所示的结构进行预测时,只需要选择三个输出部分置信值最高的所对应的类别即可。因此,哪怕是再多的分类的问题,我们也可以如法炮制的进行下去。一切看起来都是那么的合理与自然。

在介绍逻辑回归时我们说过,经过激活函数 g ( ⋅ ) g(\cdot) g()作用后可以将原本取值为 ( − ∞ , + ∞ ) (-\infin,+\infin) (,+)的输出映射到范围 [ 0 , 1 ] [0,1] [0,1]中,进而可以看作是输入样本被预测为正样本时的概率。如果是通过图3所示的结构进行预测时,某个输入样本可能会得到这么一个结果 [ 0.8 , 0.7 , 0.9 ] [0.8,0.7,0.9] [0.8,0.7,0.9]。虽然根据前面的规则该样本应该被认为是属于第三个类别,但这样的结果似乎看起来不那么友好。如果能有一种方法将这三个置信值进行归一化,使得三者在大小的关系仍旧不变,但是三者相加等于1,那么我们就可以将这个输出结果直接看作是该样本属于某一类的概率,然后依旧是选择最大的即可。例如将上面的 [ 0.8 , 0.7 , 0.9 ] [0.8,0.7,0.9] [0.8,0.7,0.9]归一化成 [ 0.33 , 0.30 , 0.37 ] [0.33,0.30,0.37] [0.33,0.30,0.37]

注:上面这一段其实并不算是要引入Softmax的主要原因,其真正原因待介绍完反向传播后再进行介绍。

2.1 softmax回归

上面我们说到想找一种方法将输出的结果进行归一化,那有没有这样的方法呢?答案是当然有,而Softmax回归就是其中之一。同逻辑回归一样,Softmax也是一种分类模型,并且它还是一种多分类模型。

图 4. 三分类Softmax结构图(偏置未画出)

同上面介绍的逻辑回归一样,Softmax回归首先进行人就是各个特征之间的线性组合,即:
o 1 = x 1 w 1 + x 2 w 2 + x 3 w 3 + x 4 w 4 + b 1 o 2 = x 1 w 5 + x 2 w 6 + x 3 w 7 + x 4 w 8 + b 2 o 3 = x 1 w 9 + x 2 w 10 + x 3 w 11 + x 4 w 12 + b 3 (1) \begin{aligned} o_1&=x_1w_1+x_2w_2+x_3w_3+x_4w_4+b_1\\[1ex] o_2&=x_1w_5+x_2w_6+x_3w_7+x_4w_8+b_2\\[1ex] o_3&=x_1w_9+x_2w_{10}+x_3w_{11}+x_4w_{12}+b_3\\[1ex] \end{aligned}\tag{1} o1o2o3=x1w1+x2w2+x3w3+x4w4+b1=x1w5+x2w6+x3w7+x4w8+b2=x1w9+x2w10+x3w11+x4w12+b3(1)
接着,再将得到的结果 o 1 , o 2 , o 3 o_1,o_2,o_3 o1,o2,o3进行归一化处理:
y ^ 1 , y ^ 2 , y ^ 3 = S o f t m a x ( o 1 , o 2 , o 3 ) (2) \hat{y}_1,\hat{y}_2,\hat{y}_3=Softmax(o_1,o_2,o_3)\tag{2} y^1,y^2,y^3=Softmax(o1,o2,o3)(2)
其中:
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 ) (3) \begin{aligned} \hat{y}_1=\frac{\exp{(o_1)}}{\sum_{i=1}^3\exp{(o_i)}},\;\; \hat{y}_2=\frac{\exp{(o_2)}}{\sum_{i=1}^3\exp{(o_i)}},\;\; \hat{y}_3=\frac{\exp{(o_3)}}{\sum_{i=1}^3\exp{(o_i)}} \end{aligned}\tag{3} y^1=i=13exp(oi)exp(o1),y^2=i=13exp(oi)exp(o2),y^3=i=13exp(oi)exp(o3)(3)
因此经过这样一个操作后,不难看出 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\leq 1 0y^1,y^2,y^31,即 y 1 , y 2 , y 3 y_1,y_2,y_3 y1,y2,y3是一个合法的概率分布。最后通过不同类别输出概率值的大小我们便能够判断对应样本的所属类别。

举个例子,某样本经过图4中的softmax归回后得到的概率分布为 [ 0.2 , 0.1 , 0.7 ] [0.2,0.1,0.7] [0.2,0.1,0.7],那么显然该样本就应该属于0.7所代表的类别。

2.2 交叉熵损失函数

正如我们在机器学习中第一次介绍线性回归一样,对于建立的任何一个模型我们都应该找到一个衡量模型好坏的目标函数,最后通过最小化该目标函数间接的求得模型中的未知参数。那在softmax回归中,我们应该通过一个什么样的方式来衡量预测标签与真实标签之间的差异呢?

在上面我们说到,Softmax回归最终能够得到每个样本所属类别的概率分布,并且通过选择概率值最大所对应的类别便能完成整个分类任务。而实际上,对于真实的标签值我们也可以用类别分布表达:对于样本 i i i,我们构造向量 y ( i ) ∈ R q y^{(i)}\in\mathbb{R}^q y(i)Rq,同时使其第 y ( i ) y^{(i)} y(i)个元素的值为 1 1 1,其余均为 0 0 0,其中 q q q表示类别总数。例如某数据集一共包含有 5 5 5个类别,且第 i i i个样本属于第 3 3 3类,那么向量 y ( i ) = [ 0 , 0 , 0 , 1 , 0 ] y^{(i)}=[0,0,0,1,0] y(i)=[0,0,0,1,0](类别从 0 0 0开始编码)。并且,我们将这种编码方式称为**独热(One-hot)**编码。

现在,一方面我们有了每个样本预测得到的概率分布 y ^ ( i ) \hat{y}^{(i)} y^(i),而另一方面我们还要每个样本真实的概率分布 y ( i ) y^{(i)} y(i)。因此接下来我们便可以通过**交叉熵(cross entropy)**来衡量两个概率分布差异的大小。
H ( y ^ ( i ) , y ( i ) ) = − ∑ j = 1 q y j ( i ) log ⁡ y ^ j ( i ) (4) H(\hat{y}^{(i)},y^{(i)})=-\sum_{j=1}^qy^{(i)}_j\log{\hat{y}^{(i)}_j}\tag{4} H(y^(i),y(i))=j=1qyj(i)logy^j(i)(4)
如公式 ( 4 ) (4) (4)所示便是计算两个分布之间的交叉熵,如果两个分布越相似则交叉熵会越小。例如:真实标签为 y ( i ) = [ 0 , 0 , 1 ] y^{(i)}=[0,0,1] y(i)=[0,0,1],第一个预测分布为 y ^ 1 ( i ) = [ 0.3 , 0.1 , 0.6 ] \hat{y}^{(i)}_1=[0.3,0.1,0.6] y^1(i)=[0.3,0.1,0.6],第二个预测分布为 y ^ 1 ( i ) = [ 0.7 , 0.2 , 0.1 ] \hat{y}^{(i)}_1=[0.7,0.2,0.1] y^1(i)=[0.7,0.2,0.1]。则两种情况下的交叉熵分别为:
H 1 = − ( 0 ⋅ log ⁡ 0.3 + 0 ⋅ log ⁡ 0.1 + 1 ⋅ log ⁡ 0.6 ) = 0.51 H 2 = − ( 0 ⋅ log ⁡ 0.7 + 0 ⋅ log ⁡ 0.2 + 1 ⋅ log ⁡ 0.1 ) = 2.3 (5) \begin{aligned} H_1&=-(0\cdot\log{0.3}+0\cdot\log{0.1}+1\cdot\log{0.6})=0.51\\[1ex] H_2&=-(0\cdot\log{0.7}+0\cdot\log{0.2}+1\cdot\log{0.1})=2.3\\ \end{aligned}\tag{5} H1H2=(0log0.3+0log0.1+1log0.6)=0.51=(0log0.7+0log0.2+1log0.1)=2.3(5)
因此,假设训练数据中一共包含有 m m m个样本,则整体交叉熵损失函数定义为:
L ( Θ ) = 1 m ∑ i = 1 n H ( y ^ ( i ) , y ( i ) ) (6) \mathcal{L}(\Theta)=\frac{1}{m}\sum_{i=1}^nH(\hat{y}^{(i)},y^{(i)})\tag{6} L(Θ)=m1i=1nH(y^(i),y(i))(6)
其中 Θ \Theta Θ表示所有可训练的参数。

最后,我们便可以通过最小化目标函数 ( 6 ) (6) (6)来求得模型中的所有未知参数。

3 总结

在本篇文章中,笔者首先带大家简单的回顾了一下逻辑回归模型,回顾了如何建立多个逻辑回归模型来完成多分类的任务。然后在此基础上顺利的引入了同样用于多分类任务的Softmax回归模型,其通过将最后的输出值归一化来表示样本属于各个类别的概率。最后笔者还介绍了如何通过交叉熵损失来衡量多分类任务中,预测标签分布与真实标签分布之间的差距,即多分类任务中的目标函数。本次内容就到此结束,感谢您的阅读!

本次内容就到此结束,感谢您的阅读!如果你觉得上述内容对你有所帮助,欢迎关注并传播本公众号!若有任何疑问与建议,请添加笔者微信’nulls8’加群进行交流。青山不改,绿水长流,我们月来客栈见!

引用

[1]动手深度学习

[2]示例代码:https://github.com/moon-hotel/DeepLearningWithMe

推荐阅读

[1]Pytorch之Linear与MSELoss

[2]Pytorch之拟合正弦函数你会吗?

[3]你告诉我什么是深度学习

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页