1.多分类问题引入
在此篇之前,如果大家还有印象,我们会发现 处理的都是二分类问题,也就是标签y的取值只能是0,1或者-1,1。不论是我们的pla,线性回归,logistic回归,还是svm,最后都是找到一个由权重构成的分类面,它自身的限制导致了这些所有的算法只能处理二分类问题。但是我们在实际运用中,往往处理的不仅仅是“是或不是”的问题,很多时候是“是什么”的问题,那么这就是多分类问题,比如:
这是一个四类的分类,我们用肉眼很容易看出来它们之间的区别,但是如何让算法区分出这四类不同的点呢?在这一篇,我们来看几种策略,分别是1vN,1v1,softmax。
2.1vN策略
1vN策略的目的是把多分类问题转化为一系列二分类问题,从而推广到多分类问题。这句话怎么理解呢?看下面这张图就明白了。
每一类和其他类都能化成两类问题,因此,对于每一类,可以获得一个分类面,因此就把样本化为了不同的区域。当输入一个特征向量,只需要分别用每一个分类面对特征向量进行判别,取其中得分最高的区域,就可以得出最后的分类结果。但是,这个方法不好的地方我们可以看到,将分类面叠加起来后,是有盲区的,按照分类面来说,这些区域不属于任何一类。
因此,1vN策略的过程就可以描述如下:
- 对于任意的k属于Nclass
- 将属于k类的样本点作为正样本,将其他的点作为负样本,由此得出Nclass个分类面
- 将未知的样本特征向量分别计算 w k T x w_k^Tx wkTx,取值最大的第i类作为最后的分类结果
3.1v1策略
1V1是另外一种策略,不同于1vN,1v1有点像打积分赛,每次挑两类上来比较,那么位次怎么出来呢?就是看最后的胜负场。比如说我有三类样本,分别为1,2,3,那么就能生成三个分类面:12,13,23,假如此时有一个样本,12觉得它是1,13觉得它是1,23觉得它是2,那么这个样本就被分为了1类。1v1遵从的是投票的策略。
4.Softmax
4.1概念与方法
此节才是真正的重点,大家有了解过深度学习的或多或少都听过softmax这个概念。实际上,softmax在深度学习中运用极其广泛,像pytorch里头的cross-entropy loss这一多分类损失函数直接集成了softmax层在里头,因此,了解什么是softmax,为什么要用softmax是理解深度网络反向传播等算法的关键。
关于softmax,下面这张图很好的说明了它的过程:
其中
x
x
x是最后的特征向量,而
S
i
S_i
Si是特征向量关于每一类的一个线性变换,随后通过一个函数映射:
y
^
i
=
e
S
i
∑
i
=
1
N
e
S
i
\hat{y}_i = \frac{e^{S_i}}{\sum_{i=1}^Ne^{S_i}}
y^i=∑i=1NeSieSi
得到分属各个类别的概率。需要强调的是,softmax实质上是一种函数映射,它本身是没有参数的。至于为什么使用指数函数,可能是因为指数函数有良好的求导性质,且正样本的影响力会更大。最后在分类的时候,取预测概率最大的一类即可。
4.2softmax梯度传播
softmax的学习方法也就是梯度下降法,因此如何求导是一个关键的问题。首先,我们采用的loss函数自然是交叉熵损失:
E
=
−
∑
j
=
1
N
y
j
l
n
y
j
^
E = -\sum_{j=1}^N y_j ln\hat{y_j}
E=−j=1∑Nyjlnyj^
而我们的
y
y
y是一个除了目标维度是1,其他维度都是0的这么一个标签向量,假设这个样本属于类别k,那么损失函数就变为了:
E
=
−
l
n
y
k
^
E = -ln\hat{y_k}
E=−lnyk^
因为只有y_k为1,其他的都为0。于是乎,我们得到了:
s
j
=
w
j
T
x
,
;
y
j
^
=
e
s
j
∑
i
=
1
N
e
s
i
;
E
=
−
l
n
y
k
^
s_j = w^T_jx,;\quad \hat{y_j} = \frac{e^{s_j}}{\sum_{i=1}^Ne^{s_i}}; \quad E= -ln\hat{y_k}
sj=wjTx,;yj^=∑i=1Nesiesj;E=−lnyk^
让我们求个导看一看,根据链式法则:
∂
E
∂
w
j
=
∂
E
∂
y
k
^
∂
y
k
^
∂
s
j
∂
s
j
∂
w
j
\frac{\partial E}{\partial w_j} = \frac{\partial E}{\partial \hat{y_k}} \frac{\partial \hat{y_k}}{\partial s_j} \frac{\partial s_j}{\partial w_j}
∂wj∂E=∂yk^∂E∂sj∂yk^∂wj∂sj
∂
E
∂
y
k
^
=
−
1
y
k
^
;
∂
s
j
∂
w
j
=
x
∂
y
k
^
∂
s
j
=
∂
e
s
k
∂
s
j
∑
i
=
1
N
e
s
i
−
e
s
j
e
s
k
(
∑
i
=
1
N
e
s
i
)
2
=
e
s
k
∑
i
=
1
N
e
s
i
(
1
−
e
s
k
∑
i
=
1
N
e
s
i
)
=
y
k
^
(
1
−
y
k
^
)
,
j
=
k
=
−
e
s
j
e
s
k
(
∑
i
=
1
N
e
s
i
)
2
=
−
y
j
^
y
k
^
,
j
≠
k
\begin{aligned} \frac{\partial E}{\partial \hat{y_k}} &= -\frac{1}{\hat{y_k}};\quad \quad \frac{\partial s_j}{\partial w_j} = x \\ \frac{\partial \hat{y_k}}{\partial s_j} &= \frac{\frac{\partial e^{s_k}}{\partial s_j}\sum_{i=1}^Ne^{s_i} - e^{s_j}e^{s_k}}{(\sum_{i=1}^Ne^{s_i})^2}\\ &=\frac{e^{s_k}}{\sum_{i=1}^Ne^{s_i}} (1 - \frac{e^{s_k}}{\sum_{i=1}^Ne^{s_i}})=\hat{y_k}(1-\hat{y_k}), j=k\\ &=- \frac{e^{s_j}e^{s_k}}{(\sum_{i=1}^Ne^{s_i})^2} = -\hat{y_j}\hat{y_k}, j \ne k \end{aligned}
∂yk^∂E∂sj∂yk^=−yk^1;∂wj∂sj=x=(∑i=1Nesi)2∂sj∂esk∑i=1Nesi−esjesk=∑i=1Nesiesk(1−∑i=1Nesiesk)=yk^(1−yk^),j=k=−(∑i=1Nesi)2esjesk=−yj^yk^,j=k
这样一来,求导的结果就变成了了:
∂
E
∂
w
j
=
{
(
y
j
^
−
1
)
x
,
j
=
k
y
j
^
x
,
j
≠
k
\frac{\partial E}{\partial w_j} =\left\{ \begin{aligned} (\hat{y_j} -1)x \quad,j=k\\ \hat{y_j}x\quad,j\ne k \end{aligned} \right.
∂wj∂E={(yj^−1)x,j=kyj^x,j=k
通过梯度下降就可以逐步优化了