博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)
阅读量:5951 次
发布时间:2019-06-19

本文共 4537 字,大约阅读时间需要 15 分钟。

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

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

如果现在只让用一个模型去判断一个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,接下来把得到的每一个结果概率化输出,为:

                                                \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}}

在 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的逻辑回归

转载于:https://www.cnblogs.com/LHWorldBlog/p/10801253.html

你可能感兴趣的文章
Gamma阶段第三次scrum meeting
查看>>
python3之装饰器修复技术@wraps
查看>>
[考试]20150606
查看>>
Javascript_备忘录5
查看>>
Can’t create handler inside thread that has not called Looper.prepare()
查看>>
敏捷开发方法综述
查看>>
Hadoop数据操作系统YARN全解析
查看>>
Django 运行报错 ImportError: No module named 'PIL'
查看>>
修改数据库的兼容级别
查看>>
Windows下同时安装两个版本Jdk
查看>>
uoj#228. 基础数据结构练习题(线段树)
查看>>
JS键盘事件监听
查看>>
ios开发周期之--(向上,向下,四舍五入)取整
查看>>
加油!
查看>>
拦截导弹问题(动态规划)
查看>>
iOS 单元测试(Unit Test 和 UI Test)
查看>>
[linux小技巧]
查看>>
文件下载_中文乱码:"Content-disposition","attachment; filename=中文名
查看>>
HBase 笔记3
查看>>
2017.11.23 display fun --STM8
查看>>