作者:rain | 来源:互联网 | 2023-09-23 21:16
本文将主要介绍两种经典分类模型,一种是Generative的,例如朴素贝叶斯(NaiveBayes),这种算法通过训练集估计样本总体分布的参数,从而得到每个样本在分布中产生的概率。
本文将主要介绍两种经典分类模型,一种是Generative的,例如朴素贝叶斯(Naive Bayes),这种算法通过训练集估计样本总体分布的参数,从而得到每个样本在分布中产生的概率。另一种是Discriminative的,例如逻辑回归(Logistic Regression),和Generative的区别是,它不需要假设分布,也不需要估计分布的参数,而是对贝叶斯公式进行简化,直接对模型中相关的参数进行优化。
可能你现在还是晕晕的,没关系,现在假设你还没有接触过分类算法,遇到分类问题时首先会想到什么呢?一个可能的答案是线性回归。用一条线把样本分开,一边大于0,一边小于0,这样好像是可以的。来看看宝可梦的例子,任务是根据宝可梦的属性对其进行分类。先考虑简单的二分类,class1标记为1,class2标记为-1,测试集结果中接近1的就分到class1,接近-1的就分到class2。
来看看分类的结果,在左图中样本都聚集在分界线附近,分类的结果还不错。但在右图中出现了远离分界线的样本,分类的界线也受到了影响,分类结果出现了错误,这可以理解为是对那些“太正确”的例子的惩罚。好吧看来此路不通,再换一种思路看看。
接下来考虑Probabilistic Generative Model,直译就算概率生成模型。
贝叶斯公式了解一下!现在从下图中的两个箱子class中随机拿出一个球。P(C1)和P(C2)是先验概率,也就是假设你不知道球的颜色,随便拿一个球出来,它来自Calss1的概率P(C1)=5/(5+5)=0.5,来自class2的概率P(C2)=5/(5+5)=0.5。但是当你知道球的颜色的时候,你还会这么算吗,肯定不会了,因为这时要考虑在某个class中拿到某个颜色球的条件概率,例如P(x|C1),具体公式参见下图。
用后验概率来表示分类结果,需要知道先验概率P(C1)和P(C2),同时也需要知道P(x|C1)和P(x|C2)。前一个好解决,后一个需要用极大似然法进行参数估计。
在宝可梦的问题中,我们假设样本服从正态分布,每个class对应一个具体的正态分布。通过训练集估计出正态分布的参数后,就可以对新样本出现的概率进行计算。(这里用概率密度近似表示概率)
用极大似然法进行参数估计,找出能使训练集产生概率最大正态分布,即找出其最优参数期望μ和协方差矩阵Σ。
对两个类别分别运用极大似然法估计参数:
结果,好像不咋滴,就算考虑所有7个feature,也只有54%的准确率。So sad!(李宏毅老师原话,说得很有韵味)
试着对模型简化一下,假设不同的class对应的协方差矩阵Σ是相同的,只有期望μ不同。
期望还是和前面一样用均值表示,协方差需要和class的样本数量加权平均一下。
结果出来了,准确率从54%提升到了73%,棒棒哒。
再用经典的三步来回顾一下Probabilistic Generative Model:
那么朴素贝叶斯(Naive Bayes)是什么东东呢?
如果假设所有的feature都是相互独立的,也就是说P(C|x) = P(C|x1)*P(C|x2)....P(C|xn),协方差除了对角线其余位置都是0,这种情况下的Generative model就是朴素贝叶斯了。只是简化了分布假设,其它都一毛一样。
接下来,我们对后验概率的公式做一点小小的变换。这个Sigmoid function看着蛮舒服,值域正好在在(0,1)之间,用来表示分类结果再合适不过了。可是,那个z是什么东东,属于Class1的概率除以属于Class2的概率再取对数(西瓜书里面成为对数几率),看着就很奇怪。
推导的过程就不贴了,总之在李大大一番精妙的推导之后,我们恍然发现,原来z可以表示为一个简单的线性多项式。既然z的形式这么简单,那我们直接求w和b就可以了啊,什么先验概率条件概率看着实在是太多余了。
逻辑回归(Logistic Regression)闪亮登场~
这简洁的表达式和优美的函数曲线,啧啧,不愧是最优秀的分类算法(SVM表示不服)。从函数的表达式来看,Logistic大概可以分为两个过程,第一步是把Features通过线性变换得到z,第二步是把z放入Sigmoid(本意是长得像s)函数中将值域压缩到(0,1)之间。
模型有了,接下来还是利用极大似然估计构造需要Maximize的优化函数,加个负号就是熟悉的Loss Function了。这个例子中,属于class1的概率直接用P(C1|x),属于class2概率的用1减掉P(C1|x)就是了。
取对数,加负号,正常操作。为了把P(C1|x)和1-P(C1|x)形式统一,进一步的转换需要一点小技巧,用到了交叉熵(cross Entropy)。不管标记y是0还是1,带入交叉熵,就会发现它恰好是我们要的东西。
把逻辑回归和线性回归对比一下,Model里面差了个sigmoid function,所以输出一个在(0,1)之间,一个是任意值。构造Loss Funtion时,逻辑回归用到了极大似然估计和交叉熵;线性回归用的是最小二乘法。
求解过程和线性回归一样,还是用梯度下降(Gradient Descent),结果非常的amazing!
尽管参数表示的意思完全不同,但是参数更新的公式在形式上竟然一毛一样。
李老师还开了下脑洞,如果用Square Error来作为逻辑回归的Loss Function会怎么样呢?答案是无法收敛,Square Error在不同参数下的变化非常小,请看下图:
再来对比一下Discriminative和Generative两种方法。Discriminative是直接的找出w和b,而Generative是先找到分布的参数,再计算概率。同样的Function Set,在同一个训练集中得到了不同的模型。在宝可梦的例子,Logistic Regression的效果比Generative的效果好一些。
通常认为Discriminative的模型要好一点,但是Generative的模型也是有一些好处的,比如需要更少的训练集,以及更加的robust等等:
二分类问题先讨论到这,来看看多分类问题。在多分类问题中,有个经典算法叫Softmax。
求解的时候还是用交叉熵:
最后的最后,来看一下逻辑回归的不足之处。作为一个广义线性模型,对于异或(XOR)这种非线性问题,它是无能为力的。
解决方法也不是没有,通过对特征进行变换,将非线性问题转化为线性问题就可以通过LogisticRegression求解了。比如此例中,用样本点到[0, 0]和[1, 1]的距离作为变换后的新特征,就可以将原来线性不可分的样本点转化为线性可分的了。
但是这种巧妙的转换不是很容易想出来啊,有没有什么自动化的方法可以完成这种转换呢?
答案是把几个逻辑回归“串”起来,前面一层的逻辑回归单元做特征转换,后一层的进行分类。
看着是不是有点眼熟呢,如果把这里的逻辑回归单元叫做神经元(Neuron),连起来就叫做神经网络(Neuron Network)!
欢迎来到深度学习(Deep Learning)。