ML Lecture 5: Classification——Logistic Regression
判别模型与生成模型
前面解决二分类问题的过程中,Logistic回归方法是一种判别(Discriminative)
方法,而用多维高斯分布来描述后验分布的过程是一种生成(Generative)
方法。
实际上,不管是用Logistic回归判别法,还是事先假设一个概率分布(高斯、伯努利等)的生成方法,这两种方法都是基于同一个模型/函数集的:
如果用Logistic回归方法,可以通过梯度下降法更新参数,直接找出最优的 、
如果是用生成模型,我们首先会计算 、 、 ,然后根据上一节的参数公式:
通过判别方法(上图左)和生成方法(上图右)求出来的最佳参数 、 会是同一组参数吗?如果不同,哪一种方法找出来的参数更好?
上述两种方法找出来的两组参数是不一样的。尽管它们是基于同一个模型/函数集,并根据相同的训练数据,从模型中挑选函数。但由于两种方法的假设不同,所以最后找出来的参数是不同的。
事实上,Logistic回归并没有做任何假设,没有对概率分布有任何的描述,只是单纯地去找一组参数 和 。而在生成模型中,我们对概率分布是有假设的,例如假设它是高斯分布、伯努利分布,假设它是不是特征独立(朴素贝叶斯)等,然后再根据这些假设找出一组参数 和 。
这两组参数虽然是从同一个模型、且基于相同的训练数据找出来的,数值却不是相等的。
比较生成方法的分类结果(下图左)和判别方法的分类结果(下图右),蓝色点代表水系样本,红色点代表一般系样本。落在粉红色区域内的样本将被判为水系,落在蓝紫色区域内的样本将被判为一般系。如下散点图只用了
维特征(防御力、特殊防御力),难以辨别哪种方法的分类效果更好。
但是如果采用全部的
维特征,会发现生成模型的分类准确率是
%;而判别模型的分类准确率上升到
%。在同样的数据集上,仅仅是因为假设不同,从而找到了不同的
和
,导致最后对测试集的预测效果也不一样。
许多文献中经常认为判别方法比生成方法的表现更佳,为什么会出现这样的预测差异呢?
这两个方法所做的不同假设,分别对数据产生了什么影响?
假设在一个简单的二元分类问题中,训练集的情况如下。每个样本都具有 维特征,共有 个样本,它们被分为两类:
- 第 个样本属于 ,它的两个特征都取 :
- 第 - 个样本属于 ,第一个特征取 ,第二个特征取 :
- 第 - 个样本属于 ,第一个特征取 ,第二个特征取 :
- 第
-
个样本属于
,两个特征都取
:
对于测试集中的一个新样本: 。直觉上,这个新样本极可能是属于 的。因为从训练集的构成来看,新样本所代表的情况只在 中出现过,而从未在 中出现过。因此,新样本属于 的概率更可能是 。
但是在概率生成模型中,当我们做了一些假设后,模型就会脑补一些额外的信息,使得新样本 在 中出现的概率不再是 。下面以朴素贝叶斯为例,判别新样本 属于哪一类。朴素贝叶斯假设样本的每一维特征都是相互独立的,所以有:
这里因为特征取值要么是 ,要么是 ,而不像之前pokemon的生命值、攻击力、防御力、速度等可以是任意数值,所以我们不再假设条件概率 服从多维高斯分布,而是假设服从伯努利分布。
根据训练集,统计并计算各个概率:
将各个概率值代入如下贝叶斯公式,计算出后验概率
是小于
的。说明基于这个训练集所建立的朴素贝叶斯模型认为新样本
属于
。
其中:
为什么朴素贝叶斯生成模型会把看似属于第一类的样本,判别为第二类?
这是因为朴素贝叶斯假设第一维特征 与第二维特征 的出现是相互独立的。所以,在第二个类别中,样本有一定的概率出现第一维特征为 : ,也有一定的概率出现第二维特征为 : 。那么这两个特征同时为 的情况: 也是有可能的,哪怕我们没有在训练集的第二个类别里发现有 这种样本。在朴素贝叶斯的眼里:
- 样本 来自 的概率并不是
- 第二个类别样本数在总样本中的比重很大,
综合考量这两个因素后,朴素贝叶斯生成模型反而认为新样本 更有可能是来自 。而判别模型和我们直观的判断结果都认为新样本 更有可能是来自 。
尽管朴素贝叶斯模型的结果看起来不太正确,但其中不乏一定的道理:如果现有的测试集数量不够,导致模型见过的样本太少,其分类结果就不准确。而朴素贝叶斯这样的生成模型,会基于种种假设,脑补一些没有发生过的情况或没有出现过的样本,并认为这些情况/样本也是以一定概率可能发生/出现的,这样就使得模型具有“对未接触过的样本进行分类”的能力。
我们通常认为判别模型比生成模型的效果更好,但并不代表判别模型就绝对优于生成模型。事实上,生成模型有时也会占有优势,它具有如下优点:
对概率分布做了假设
- 当训练数据很少时,往往需要靠概率模型脑补一些在训练集中无法观察到的情况。由于生成模型具有脑补特性,所以很适用于训练数据少的情况
- 当训练数据中有噪声、实际观察情况出现错误的时候,例如上例的训练集中,样本
可能并不属于
,它恰好是一个错误的训练数据,会误导判别模型的分类结果
而生成模型则多了一些假设,虽然这些假设有时候与实际状况并不相符,但是在训练数据本身就有误(噪声)的情况下,这些假设反而是正确的,能减少噪声带来的干扰
后验概率被拆为两项:先验 、条件概率 ,这两项可以基于不同的原始资料,分别计算。
例如做语音识别,把不同的词汇视为不同的类别 , 是不同的声音讯号样本。我们要计算的是,给定一段声音讯号 ,它属于某一个词汇的概率是多大 ,找到概率最大的那个词汇,我们就认为它是声音讯号所反映的内容。而:
总之,在某些应用场景下,这两个概率如果能够基于不同的样本资料计算获得,就可以最大程度地降低因为同一个训练集所带来的误差。
多元分类
回顾二分类问题:
、
。我们要计算一个样本分别来自这两个类别的概率:
,模型取决于参数
、
,模型取决于参数
、
由于
,所以只需要考察其中一个模型,如
,从而只需考察一组参数
,可以用Logistic回归。
对于多分类问题,以三元分类为例:
1. 模型/函数集
考虑三元分类:
、
、
。我们要计算一个样本分别来自这三个类别的概率:
,模型取决于参数
、
,模型取决于参数
、
,模型取决于参数
、
需要考察的一组参数为
。
2. 判断函数优劣——交叉熵损失函数
我们需要衡量某一组参数 ,它对训练集数据的预测效果如何。
假设对于训练集中的第 个样本 ,随机选取一组参数 。则这组参数代表着一个分类模型,分别计算:
利用Softmax函数
把实数向量
做归一化:
- 分别取指数:
- 加总求和:
- 分别求各指数的权重:
Softmax函数又称归一化指数函数,是逻辑函数的一种推广。它能将一个含任意实数的多维向量压缩成另一个多维实向量,使得该向量中的每一个元素取值范围都在 之间,并且所有元素的和为 。
这里假设三维向量 ,经过Softmax函数,将其压缩为另一个三维向量 ,且 。
因此,
、
、
可以视为是概率值,分别代表样本
属于
、
、
的概率。从而通过比较
的大小就能确定样本
的类别。
为什么 能够等价于 ,对第 个样本 进行分类?
在三分类问题中,若假设 、 、 分别服从多维高斯分布: 、fμ2,Σ(x)、fμ3,Σ(x),且它们共用一个协方差矩阵Σ。则经过推导化简后,会发现P(Cl|x)(l=1,2,3)就是经Softmax函数归一化的结果。如果把Softmax函数应用在两个类别的情况下,得到的结果就是Logistic回归的结果,此时Softmax函数简化为Sigmoid函数。
在多(L)分类问题中,真实类别标签ˆy可以看作是一个分布,对某个样本x属于哪个类别可以用One-hot编码方式,用一个L维的向量表示。
例如,当第n个样本xn的真实类别是属于第l类时,那么L维向量中的第l个元素为1,其他元素全部为0。
以三元分类为例,样本xn的真实类别ˆyn的分布为:ˆyn={[100],xn∈C1[010],xn∈C2[001],xn∈C3
了解真实类别ˆyn的目的是,为了将分类模型的预测结果与真实类别做比较,看看它们的相近程度。如果相近,说明分类模型效果好,接近实际的分类情况,亦即前面的参数(w1...w3;b1...b3)选得好。
在上例中,我们抽取了训练集的第n个样本xn,并将它放进由参数(w1...w3;b1...b3)所构成的分类模型中,经过Softmax函数的转换,得到分类结果:yn=[yn1yn2yn3]=[0.880.120]
可见,一个样本的分类结果就是一个概率分布,现在需要衡量预测分布yn与真实分布ˆyn之间的相似程度,用交叉熵来表示:H(ˆyn,yn)=−3∑l=1ˆynllogynl=−ˆyn1logyn1−ˆyn2logyn2−ˆyn3logyn3
如果xn的真实类别是C1,则ˆyn=[ˆyn1ˆyn2ˆyn3]=[100],交叉熵H(ˆyn,yn)=−logyn1
如果xn的真实类别是C2,则ˆyn=[ˆyn1ˆyn2ˆyn3]=[010],交叉熵H(ˆyn,yn)=−logyn2
如果xn的真实类别是C3,则ˆyn=[ˆyn1ˆyn2ˆyn3]=[001],交叉熵H(ˆyn,yn)=−logyn3
最终,三元分类问题的损失函数是训练集中共N个样本的交叉熵的加和:N∑n=1H(ˆyn,yn)=−N∑n=13∑l=1ˆynllogynl
同理,L元分类问题的损失函数表示为:N∑n=1H(ˆyn,yn)=−N∑n=1L∑l=1ˆynllogynl
寻找最佳参数时,使交叉熵最小的过程也是使似然函数最大化的过程。
总结比较
假设第n个样本xn有K维特征:
1. 二分类问题
- 只需要寻找1个w、1个b(w是K维列向量,b为实数)
- 每一组参数(w,b)构成一个分类模型,用训练集的第n个样本xn计算:zn=wTxn+b
- 用
Sigmoid函数
将实数zn转换为一个概率值σ(zn)=f(xn),这个值代表将样本xn判为第一个类别的预测概率 - 第n个样本xn的交叉熵:H(ˆyn,f(xn))=−ˆynlogf(xn)−(1−ˆyn)log(1−f(xn))
- 损失函数:∑Nn=1H(ˆyn,f(xn))=−∑Nn=1[ˆynlogf(xn)+(1−ˆyn)log(1−f(xn))]
2. L个分类的问题
- 需要寻找L个w:w1...wL;L个b:b1...bL(w1...wL为K维列向量,b1...bL为实数)
- 每一组参数(w1...wL;b1...bL)构成一个分类模型,用训练集的第n个样本xn分别计算:zn1=(w1)Txn+b1
- 用
Softmax函数
将实数向量(zn1,...,znL)T转换为一个L维的概率向量σ(zn)=yn,这个向量中的各个元素分别代表第n个样本xn被判为各个类别的预测概率 - 第n个样本xn的交叉熵:H(ˆyn,yn)=−∑Ll=1ˆynllogynl
- 损失函数:∑Nn=1H(ˆyn,yn)=−∑Nn=1∑Ll=1ˆynllogynl