判别式模型和生成式模型的差别我之前一直是比较模糊的,没想到李宏毅老师通过Logistic Regression模型的引出就很把这件事讲明白了,真是佩服至极!
首先老师提出了一个我曾经思考过的问题:
我们可以用回归的思路做分类吗?
上图的例子说明了用回归方法直接处理分类问题的困难。
首先,即使只是处理二分类问题,boundary都会因为某些取值过大或过小的点而产生较大偏移,从而导致分类结果变差。
其次,对于多分类的情形,我们很难给各个类别定目标target,类别一为1,类别二为2,类别三为3的做法会隐含假定“类别一和类别二比类别一和类别三更接近”,然而这未必是真实的。
那么我们可以换一种思路,放宽限制,让各个类别对应的target是一个数值范围不就行了吗?
是的,比如让类别一对应大于0的数,类别二对应小于0的数,这样就可以很自然的找到一条直线将两类分开,不过这并非今天要讨论的主题。
我们思考一种古典的概率方法——贝叶斯。
我们的分类问题本质上不就是一个条件概率吗?直接套用贝叶斯公式就能解决问题了!
没错,理论上是这样,但我们看看使用贝叶斯时会有什么问题。
没错,我们拥有的样本是有限的,对的估计可能会很不准确,最极端的情况如图,训练集中水属性的样本里未出现海龟,那么估计海龟|水属性,但是这显然是不妥的。退一步说,就算训练集中有一个海龟样本,我们做出的估计同样可能是很不准确的,因为样本量不够大,大数定律没有办法发挥作用。
怎么解决这个问题呢?
我们可以假设我们的样本是服从一个特定分布的(实际上我们假设样本分布和总体分布相同,样本就是从总体中独立抽样得到的,这是第一个隐含假设),这样我们就可以用样本进行参数估计从而得到一个概率分布,这里我们采用最常用的高斯分布。采用高斯分布后,即使样本集中没有出现海龟,我们对海龟概率的估计也不会为零了。
接下来我们使用最大似然法进行参数估计得到能最好拟合两类数据的两个高斯分布(这里隐含了第二个假设,即各样本是独立抽样得到的,所以联合概率等于各概率乘积)。
现在我们就可以使用贝叶斯公式进行分类了:
然而这个模型的表现并不好,李宏毅老师给出的实验精度是47%。即使将特征数由2个扩充至7个,精度依然只有54%。
那么这个模型还有什么可以改进的地方呢?我们注意到,模型对每个类别都拟合一个高斯分布,参数会非常多,这就导致模型很容易过拟合,为了减少参数数量,我们可以假设每个高斯分布的协方差阵都是相同的,这个假设其实是有一定合理性的,因为协方差阵表示的其实是此类样本的各个特征之间的关系,而各特征之间的关系一般是具有普适性的,在各类别样本中表现相似。
可以看到,做了上述假设后得到的模型表现有了很大提升。而且我们注意到,新模型的boundary是一条直线。这不就是我们之前想得到的效果吗——找到一条直线将不同类别样本分开。
以上两个模型其实就是朴素贝叶斯分类器(基于各特征之间独立的假设)。当然,这里的分布不一定要是高斯分布,可以换成任意你喜欢的分布。
下面我们考虑另一个问题,为什么使用高斯分布且共享协方差矩阵的朴素贝叶斯模型这样产生的模型就是一条直线呢?
以下是具体的数学推导(看起来复杂,其实就是一个化简过程):
化简到最后我们看到,这个后验概率可以表示成:
这不就是Logistic Regression嘛!
这里需要注意的是,在朴素贝叶斯模型中的是有固定的表达式去计算的,而这建立在一系列的假设之上(样本服从高斯分布且各类样本的协方差矩阵相同)。相比之下,Logistic Regression相当于放宽了限制条件,直接求解。
这就引出了生成式模型和判别式模型的区别:
由于放宽了限制,判别式模型最终选取的分类器和生成式模型选取的分类器并不相同。
以下是两个模型产生的分类器的对比:
可以看到判别式模型的精度要高一些。
那么是不是说明判别式模型总是好的呢?生成式模型在什么情况下有用武之地呢?
李宏毅老师给出了一个很简单的例子说明生成式模型的劣势:
这个例子当中,按人的观点来看,大概率会直接把测试数据归为class 1,但朴素贝叶斯模型却给出了不同的结果,究其原因,就是因为特征之间相互独立的假设在这里并不适用(实际上我们判断测试数据属于class 1就是依据两个特征同时为1来判断的)。
那么生成式模型的优势有哪些呢?
第一,生成式模型可以用较少的数据完成分类任务。这当然是因为对数据分布的假设实际上也为我们提供了一些信息,这部分信息多少可以弥补一些数据量不足带来的损失。
第二,生成式模型对噪声更加稳健。这其实依然要归功于我们对数据分布的假设,当数据中有一些noise的时候,数据分布的假设可以帮助我们无视掉这些噪声点。
第三,可以把问题分解成先验概率和关于类别的条件概率两部分进行估计。这样做的好处李宏毅老师是用语音识别的例子来说明的,当我们判别一段语音的下一个单词是什么的时候,我们采用的先验未必也要从语音中估计获得,直接去网上搜集一些文本来进行估计就可以了,而条件概率的部分我们则可以用语音数据进行估计。