大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)

                                                    大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)算法

上一节中,咱们讲解了逻辑回归的优化,本节的话咱们讲解逻辑回归作多分类问题以及传统的多分类问题,咱们用什么手段解决。网络

先看一个场景,假如咱们如今的数据集有3个类别,咱们想经过逻辑回归建模给它区分出来。但咱们知道逻辑回归本质上是区分二分类的算法模型。难道没有解决办法了吗?办法仍是有的,既然想分出3类,咱们姑且称这3个类别号为0,1,2。想经过逻辑回归作二分类的话,那么咱们就分别判断每一条样本数据属不属于0号类别,属不属于1号类别,属不属于2号类别去判断,这样至关于创建3个逻辑回归的模型,分别训练,既照顾了逻辑回归二分类的本质,也照顾了多分类的需求。假如咱们训练出来的3个模型, 第一个模型判断是否是1号类别的几率是0.8  第二个模型判断是否是2号类别的几率是0.1  第三个模型判断是否是3号类别的几率是 0.6 ,综合来看0.8>0.6>0.1,因此咱们对这条样本判别为1号类别。剩下的全部样本数据亦如此。这种用逻辑回归解决问题的方式就是OVR( ovr  one vs rest )。这里问个问题,这三个模型判断出来各自的几率相加结果是1 吗?确定不是。由于咱们是对每一个模型单独训练出来的。函数

咱们先总结一下OVR思路就是:1,修改数据的lable。2,而后训练N个逻辑回归模型。3,根据输出结果几率输出。测试

这里须要注意一个问题就是样本不均衡的问题。逻辑回归就怕样本不均衡,当负例比正例或者正列比负例多不少的时候,模型判断会不许确,逻辑回归,最喜欢的是1:1的正负例。 由于假若有一个训练集只有一条正例,其它的全都是负例,那么哪怕把全部的条目都判断为负例,正确率仍是99%。由于在训练过程当中,咱们是找了一组w带来总的预测正确率最高,但这样状况下当样本不均衡的时候就会对正例特别的不公平,由于它只追求总的预测正确率最高,无论是正例仍是负例,都会对少的那一部分很不公平,它会着重的想把多的预测准确了,得到更大的收益,对它来讲这个w是更好的w。因此当样本不均衡的时候不必定会很差,可是颇有可能的模型会不稳定。优化

怎么解决样本不均衡的问题?人工智能

一般的办法是对多的进行降采样。 好比说只有30%的正例,有70%是负例,第一对70%的负例里面进行一个降采样,不要所有的负例了。第二,创造一些新的正例样本,属性随机采样,就是说把正例样本的每一个属性对应的值随机采起点出来,组合出一个新的正例样原本,这样凡是涉及到人工建立的训练集一般不太好,可是它是没办法的办法,已经不均衡了,没有更多的训练集了。按理说用降采样,可是发现不光负例多,正例还特别少,才几十条正例这会这已经很难了,只要样本少,谁也帮不了,神仙也救不了,惟一能自救的方法就是重采样一下。适当的生成出一些新的训练集,但生成的东西并不必定能表明客观规律,这是没办法的事儿,确实少,也只能试一试。因此能够经过对少的样本进行重采样,经过对多的样本进行降采样,来必定程度上缓和咱们样本不均衡的问题。除此以外,使用决策树的方法。那么它对于样本不均衡,要比逻辑回归要坚固的多,鲁棒性要好得多,因此换句话说,须要选择其它的算法来解决这个问题。spa

除此以外,咱们引入一种叫softmax的方式,它比OVR对样本不均衡的问题要稍好一些,并且它的分类效果更好。它其实就是一个跟逻辑回归相似的一个专门解决多分类的模型,它有本身的判别函数,也有本身的损失函数,是逻辑回归的一种拓展,逻辑回归是softmax的一种特例。3d

若是如今只让用一个模型去判断一个5分类任务,这个模型要输出什么?至少得输出5个几率出来,才能判断。只输出两个几率,我怎么判断剩下3个?输出形式必定要出现5个几率。因而它特别简单,它就搞出了5组w,其实就有点神经网络的感受了。神经网络咱们还没讲,不过不要紧,你先有个大致的概念。之后咱们再会对神经网络里面softmax函数详细解释,由于它很重要。几乎能够说是任何多分类问题最后的一步。咱们这里就直到softmax就是一个单层的神经网络就能够了,如下关于神经网络解释softmax的问题听不懂不要紧,后面在神经网络里面会详细说的。我们说五分类,5组模型,W1,W2,W3,W4,W5,如今一个x扔进来以后,要同时交给每组W算出一个结果,获得了W1^Tx,W2^Tx,W3^Tx,W4^Tx,W5^Tx,接下来把获得的每个结果几率化输出,为:rest

                                                \frac{e^{w_{1}^{T}x}}{\sum e^{w_{i}^{T}x}}\frac{e^{w_{2}^{T}x}}{\sum e^{w_{i}^{T}x}}\frac{e^{w_{3}^{T}x}}{\sum e^{w_{i}^{T}x}}\frac{e^{w_{4}^{T}x}}{\sum e^{w_{i}^{T}x}}\frac{e^{w_{5}^{T}x}}{\sum e^{w_{i}^{T}x}}code

在 softmax回归中,咱们解决的是多分类问题(相对于 logistic 回归解决的二分类问题),类标y能够取k个不一样的值(而不是两个)所以,对于训练集\left\{\left(x^{(1)}, y^{(1)}\right), \ldots,\left(x^{(m)}, y^{(m)}\right)\right\},咱们有$y^{(i)} \in\{1,2, \ldots, k\}$,(注意此处的类别下标从 1 开始,而不是 0)。对于给定的测试输入x,咱们想用假设函数针对每个类别j估算出几率值p(y=j|x),也就是说,咱们想估计x的每一种分类结果出现的几率。

所以,咱们的假设函数将要输出一个k维(k个类别)的向量来表示这k个估计的几率值。具体地说,咱们的假设函数h(θ)形式以下:

                             h_{\theta}\left(x^{(i)}\right)=\left[ \begin{array}{c}{p\left(y^{(i)}=1 | x^{(i)} ; \theta\right)} \\ {p\left(y^{(i)}=2 | x^{(i)} ; \theta\right)} \\ {\vdots} \\ {p\left(y^{(i)}=k | x^{(i)} ; \theta\right)}\end{array}\right]=\frac{1}{\sum_{j=1}^{k} e^{\theta_{j}^{T} x^{(i)}}} \left[ \begin{array}{c}{e^{\theta_{1}^{T} x^{(i)}}} \\ {e^{\theta_{2}^{T} x^{(i)}}} \\ {\vdots} \\ {e^{\theta_{k}^{T} x^{(i)}}}\end{array}\right]

其中$\theta_{1}, \theta_{2}, \ldots, \theta_{k} \in \mathrm{R} \mathfrak{e}^{n+1}$是模型的参数,\frac{1}{\sum_{j=1}^{k} e^{\theta_{j}^{T} x^{(i)}}}这一项对几率分布进行归一化,使得全部几率之和为 1。实际上就是把一个x(i)丢在一个hθ里面要输出一组几率,好比这个例子里面要输出5个几率,每一个几率实际上它的判别函数都是它们共用同一个分母,只不过度子部分不一样,第一个几率就是第一组w算出来分数扔到e的上面得出来的结果,每个都是每一组w对于同一个x(i)的运算结果,分母又是全部分子的加和,所以它们整体的加和必定是等于1的。这个就是softmax的判别函数。

为了方便起见,咱们一样使用符号θ来表示所有的模型参数,将θ用一个k*n的矩阵来表示,k个类别,n个属性值,每一类这这些属性上面都对应着一组参数。该矩阵是将每组$\theta_{1}, \theta_{2}, \ldots, \theta_{k}$按照行罗列起来获得的。以下所示:

                                                                       \theta=\left[ \begin{array}{c}{-\theta_{1}^{T}-} \\ {-\theta_{2}^{T}-} \\ {\vdots} \\ {-\theta_{k}^{T}-}\end{array}\right]
有了这一组θ,咱们的h(x)就可使用了,那怎么获得最好的一组θ?仍是经过最大似然来推导损失函数。咱们先来看下示性函数的表示就是1,其取值规则为:1{值为真的表达式}=1,1{值为假的表达式} =0。举例来讲,表达式:1{2+2=4}的值为1 ,由于2+2=4是正确的值为真,因此1{2+2=4}的值为1。同理, 1{2+2=5}的值为 0。

回顾下逻辑回归的损失函数:

                                                $-\sum_{i=1}^{m}\left(y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right)$

这个函数中,虽然每一项加和的部分是两部分yi*log h(x)+(1-yi)*log (1-h(x))组成,可是由于yi不是0就是1,前面在后面就没了,后面在前面就没了,因此对每一条样原本说就只能存活下来一项,这个是针对二分类来讲的。把其写成示性函数的表达就是:

                                                -$\sum_{i=1}^{m} \sum_{j=0}^{1} 1\left\{y^{(i)}=j\right\} \log p\left(y^{(i)}=j | x^{(i)} ; \theta\right)$

解释下:好比一条样本标签真实值yi是0,根据咱们上面的描述yi*log h(x)+(1-yi)*log (1-h(x))这里面只能存在一项就是后面一项。而对于示性函数来讲$\sum_{j=0}^{1} 1\left\{y^{(i)}=j\right\} \log p\left(y^{(i)}=j | x^{(i)} ; \theta\right)$这个里面j是累加到1,两个取值,j先为0的时候,yi=j=0为真。1{值为真的表达式}=1,因此当j为0的时候值保留下来,当j为1的时候yi=j=1≠0,1{值为假的表达式} =0,因此当j为1的时候值没有累加。所以真正每一条样本计算的就是其对应真实y的时候那一部分几率值。

而对于多分类来讲咱们须要像推导逻辑回归损失函数同样,把每一条样本预测正确的几率连乘,使得似然最大。那多分类的每一条样本预测正确的几率就是:

                                                      \sum_{j=1}^{k} 1\left\{y^{(i)}=j\right\} \log \frac{e^{\theta_{j}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}

在Softmax回归中将x分类为类别j的几率为:

                                            h(\theta)x=p\left(y^{(i)}=j | x^{(i)} ; \theta\right)=\frac{e^{\theta_{j}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}

举例来讲,假如是3分类,这个预测就输出3个几率,也就是3个数,对每一条样原本说,其中第一个几率表明是我预测它最后类别是1的几率,第二个是表明我预测它类别为2的几率,第三个就是我预测它类别为3的几率,它实际的类别假如为1的话,我预测对了的几率是第一个数,第二个数仍是第三个数?应该是第一个数。就从里边挑出应该预测正确的几率放在这,这就是它正确的几率,由于对每个样原本说yi只能取一个值,因此里面的加和也只会存活下来一项。每一条样本yi等于多少其对应的hθ(x)的值就留下来。好比第一个样本真实分类是0,那就保留\frac{e^{\theta_{0}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}这一部分,第二个真实样本类别是1 ,那就保留\frac{e^{\theta_{1}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}这一部分,第三个真实样本分类是2,那就保留\frac{e^{\theta_{2}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}这一部分,损失函数只取决于预测对的那一项的几率,其它的几率其实损失函数角度是不关心的。因此它尽可能,想让训练集上所有预测的总正确率最大,就须要把每条数据被预测正确的几率给连乘起来,求最大似然,加个log,连乘变连加,而后加个负号就获得这个损失函数了。最后推导出来的softmax损失函数以下:

                                                       J(\theta)=-\sum_{i=1}^{m} \sum_{j=1}^{k} 1\left\{y^{(i)}=j\right\} \log \frac{e^{\theta_{j}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}}

能够看到,Softmax代价函数与logistic 代价函数在形式上很是相似,只是Softmax损失函数中对类标记的k个可能值进行了累加。

对于J(θ)的最小化问题,当前尚未闭式解法。所以,咱们使用迭代的优化算法(例如梯度降低法,或 L-BFGS)。通过求导,咱们获得梯度公式以下:

                                            \nabla_{\theta_{j}} J(\theta)=-\frac{1}{m} \sum_{i=1}^{m}\left[x^{(i)}\left(1\left\{y^{(i)}=j\right\}-p\left(y^{(i)}=j | x^{(i)} ; \theta\right)\right)\right]

有了上面的偏导数公式之后,咱们就能够将它代入到梯度降低法等算法中,来最小化J(θ)。例如,在梯度降低法的标准实现中,每一次迭代须要进行以下更新:

                                                            $\theta_{j} :=\theta_{j}-\alpha \nabla_{\theta_{j}} J(\theta)(j=1, \ldots, k)$

获得一组θ使得模型表现最好。此时获得θ就是softmax训练出来的结果。因此无论它是什么损失函数,你总能够交给sgd或者l-bfgs进行最小化,获得一组θ使得模型表现最好。

对于softmax,你它的本质是把好几个逻辑回归塞到一块儿去了,可是它判别函数又变了变,原来是1/{1+exp(-z)},如今变成了e的z求和,有多少个z就求和多少次,加起来以后当分母,而后分子为对应部分预测的几率,这样它们输出的每一个几率就都进行了归一化。

softmax有一个有趣的特色:softmax的形式是有几个分类,就有几组w向量,好比三类,最终训练出来的参数实际上就是θ1,θ2,θ3,原来逻辑回归是一组θ,如今是三组θ。你把这三组θ都减去一个相同的向量φ,好比φ全是1。 假如这θ长度为五,φ是五个1也好,五个2也好,12345也好,只要把每个θ的向量都减去同一个φ,你就会发现他们预测结果没有任何变化。假如我拿每个θ都减去了同一个φ,我把θj-φ看成原来的θj,即:

                                                          \begin{aligned} p\left(y^{(i)}=j | x^{(i)} ; \theta\right) &=\frac{e^{\left(\theta_{j}-\psi\right)^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\left(\theta_{l}-\psi\right)^{T} x^{(i)}}} \\ &=\frac{e^{\theta_{j}^{T} x^{(i)} e^{-\psi^{T} x^{(i)}}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)} e^{-\psi^{T} x^{(i)}}}} \\ &=\frac{e^{\theta_{l=1}^{T} x^{(i)}}}{\sum_{l=1}^{k} e^{\theta_{l}^{T} x^{(i)}}} \end{aligned}

经过上面公式展开,也就是说减φ与不减φ不影响最终的预测结果。这说明softmax参数有冗余,既然随便减一个φ能够,那我都给他减一个θ1,也能够,那么就是把θ1全变成零了,θ2变成θ2-θ1了,θ3变成θ3-θ1了。因此实际上咱们只须要保存两组参数就够了。

咱们再来看下Softmax回归与Logistic 回归的关系:当类别数k=2时,softmax 回归退化为 logistic 回归。这代表 softmax 回归是 logistic 回归的通常形式。具体地说,当k=2时,softmax 回归的假设函数为:

                                                                      h_{\theta}(x)=\frac{1}{e^{\theta_{1}^{T} x}+e^{\theta_{2}^{T} x^{(i)}}} \left[ \begin{array}{c}{e^{\theta_{1}^{T} x}} \\ {e^{\theta_{2}^{T} x}}\end{array}\right]

利用softmax回归参数冗余的特色,θ1全置为0,θ2变成θ2-θ1:那么h(x)会输出两个结果。即:

                                                                       h(x)=\frac{1}{e^{\overrightarrow{0}^{T} x}+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x^{(i)}}} \left[ \begin{array}{c}{e^{\overrightarrow{0}^{T} x}} \\ {e^{\left(\theta_{2}-\theta_{1}\right)^{T} x} ]}\end{array}\right]

                                                                               =\left[ \begin{array}{c}{\frac{1}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x}}} \\ {\frac{e^{\left(\theta_{2}-\theta_{1}\right)^{T} x}}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x}}}\end{array}\right]

                                                                              =\left[ \begin{array}{c}{\frac{1}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x^{(i)}}}} \\ {1-\frac{1}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x^{(i)}}}}\end{array}\right]

咱们就会发现 softmax 回归器预测其中一个类别的几率为\frac{1}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x(i)}},另外一个类别的几率就是1-\frac{1}{1+e^{\left(\theta_{2}-\theta_{1}\right)^{T} x}(i)}

此时的softmax回归就是参数为θ2-θ1的逻辑回归

相关文章
相关标签/搜索