1. 后验概率
对于给定数据,我们首先假设数据是由某种分布产生的,这样,根据贝叶斯公式我们可以得到后验概率分布,将后验概率最大的类作为 x x x的类输出。后验概率计算根据贝叶斯定理进行:
(1) P ( Y = c k ∣ X = x ) = p ( X = x ∣ Y = c k ) P ( Y = c k ) ∑ k p ( X = x ∣ Y = c k ) P ( Y = c k ) P(Y=c_k|X=x) = {p(X=x|Y=c_k)P(Y=c_k) \over \sum_k p(X=x|Y=c_k)P(Y=c_k)} \tag 1 P(Y=ck∣X=x)=∑kp(X=x∣Y=ck)P(Y=ck)p(X=x∣Y=ck)P(Y=ck)(1)
假设给定数据是由高斯分布生成的,我们希望对这组数据进行分类,首先考虑二分类的情况:
为什么使用高斯分布?
由于我们并不知道数据的真实分布,实际上我们可以假设任何一种分布。另外,根据中心极限定理,当数据量n足够大时,可以用正态分布逼近其它分布,这也是参数估计的理论基础。
我们知道,从一个高斯分布里面可以采样到空间内的任何一个点,但是在不同的高斯分布里,采样到这个点的几率是不同的。
比如:下图中的79个点分别属于两个分类,我们假设这些点可以从图中的两个高斯分布中采样得到,但是每个点从不同分布中采样出来的概率是不同的。
我们首先假设数据的分布,然后根据数据估计该分布的参数,得到数据的生成机制,叫做生成模型。
因为高斯分布是由 μ \mu μ和 Σ \Sigma Σ确定的,我们想要得到数据的生成机制,就要考虑如何求出这两个参数?
这里就要用到概率论与数理统计中的参数估计方法,其中最常用的是极大似然估计:极大似然估计,简单来说,就是在已知观测数据的条件下,估计使得当前数据出现可能性最大的分布。如果我们认为当前观测到的数据是独立同分布的,并且每个样本出现的可能性为 p i p_i pi,那么当前数据出现的可能性最大,就是所有样本出现的概率之积最大(由于数据独立,所以用乘法公式),使这个概率达到最大的方法就是极大似然估计。针对本例中的79个点( x 1 , x 2 , . . . , x 79 x^1, x^2, ..., x^{79} x1,x2,...,x79),我们定义似然概率如下:
(2) L ( μ , ∑ ) = f μ , ∑ ( x 1 ) f μ , ∑ ( x 2 ) f μ , ∑ ( x 3 ) . . . . . . f μ , ∑ ( x 79 ) L(\mu, \sum) = f_{\mu, \sum}(x^1) f_{\mu, \sum}(x^2) f_{\mu, \sum}(x^3)... ... f_{\mu, \sum}(x^{79}) \tag 2 L(μ,∑)=fμ,∑(x1)fμ,∑(x2)fμ,∑(x3)......fμ,∑(x79)(2)
其中: f μ , ∑ ( x ) = 1 ( 2 π ) D / 2 1 ∣ ∑ ∣ 1 / 2 e x p { − 1 2 ( x − μ ) T ∑ − 1 ( x − μ ) } f_{\mu, \sum}(x) = {1 \over (2\pi)^{D/2}}{1 \over |\sum|^{1/2}}exp \{-{1 \over 2}(x - \mu)^T \sum^{-1}(x - \mu)\} fμ,∑(x)=(2π)D/21∣∑∣1/21exp{−21(x−μ)T∑−1(x−μ)}
注:
其实这里的 f μ , ∑ ( x ) f_{\mu, \sum}(x) fμ,∑(x)并不是概率,而是概率密度,与概率成正比(对概率密度积分可以得到概率),由于这里只是对似然函数求极值,为简化计算,直接使用概率密度。
如果我们做条件独立性假设,认为数据在不同特征上是独立的,那么,我们其实并不用对数据的分布机制做假设,求出分布的参数,只要利用条件独立性假设,从数据中统计出不同特征下的概率,然后使用乘法公式便可得到 p ( X = x ∣ Y = c k ) p(X=x|Y=c_k) p(X=x∣Y=ck),这就是朴素贝叶斯法。实际不同特征之间基本不会是独立的,这样我们对数据的分布作出假设,利用统计学中的估计方法求出其参数。
下面我们就要求使似然函数 L ( μ , ∑ ) L(\mu, \sum) L(μ,∑)达到最大的参数值 μ ∗ \mu^* μ∗和 Σ ∗ \Sigma^* Σ∗:
μ ∗ , Σ ∗ = a r g m a x μ , ∑ L ( μ , ∑ ) \mu^*, \Sigma^* = argmax_{\mu, \sum} L(\mu, \sum) μ∗,Σ∗=argmaxμ,∑L(μ,∑)
对于高斯分布, μ \mu μ和 Σ \Sigma Σ分别代表均值和方差,所以可以直接用统计量求出(其实我们可以采用极大似然估计法,对似然函数求导得出参数):
μ ∗ = 1 79 ∑ n = 1 79 x n ∑ ∗ = 1 79 ∑ n = 1 79 ( x n − μ ∗ ) ( x n − μ ∗ ) T \mu^* = {1 \over 79} \sum^{79}_{n=1} x^n \qquad \sum^* = {1 \over 79} \sum^{79}_{n=1} (x^n - \mu^*)(x^n - \mu^*)^T μ∗=791n=1∑79xn∑∗=791n=1∑79(xn−μ∗)(xn−μ∗)T
既然我们从数据出发,得到了生成数据的分布,接下来我们就可以采用贝叶斯公式计算出给定输入的后验概率:
计算几率(后验概率)来进行分类的方法作如下理解:
不同的分类具有不同的高斯分布,如果我们想要知道当前样本属于C1的概率,其实就是当前样本从C1的分布中采样到的概率,在所有可能的分布中采样到的概率之和所占的比重(简单来理解,就是对其中一类的概率做归一化),写成表达式如下:
当 前 样 本 属 于 C 1 的 概 率 = C 1 的 分 布 中 采 样 到 当 前 样 本 的 概 率 所 有 可 能 的 分 布 中 采 样 到 当 前 样 本 的 概 率 之 和 当前样本属于C1的概率 = {C1的分布中采样到当前样本的概率 \over 所有可能的分布中采样到当前样本的概率之和} 当前样本属于C1的概率=所有可能的分布中采样到当前样本的概率之和C1的分布中采样到当前样本的概率
通常情况下我们一般是不采用这种方法的,其结果不太好,因为参数过多,容易过拟合。对于不同的分类,我们一般使用相同的covariance matrix,这样会使模型具有更少的参数,不那么容易过拟合。如下图所示,我们调整模型,让Class1和Class2使用相同的协方差矩阵 ∑ \sum ∑。
那么,如果采用相同的协方差矩阵,我们应该如何去求解参数呢?如下图所示,也是一种很直观的方式,用每个分类的样本个数去加权求和:
这样的话会提升最终模型的预测效果。
接下来,我们对后验概率做一些简单的变化,如下:
如上图所示,我们将后验概率转化为对 z z z求sigmoid函数的形式,那么这里的 z z z有什么意义呢?我们对 z z z做进一步数学推导,如下:
通过上面的数学推导,我们发现 z z z可以写成 w ⋅ x + b w·x+b w⋅x+b的形式,那么我们就要想了,既然直接求w和b就可以得到分类结果,那么就没必要舍近求远去估计这么多参数,因而便将其转化为我们熟知的逻辑回归的形式。
2. 逻辑回归
2.1 Function Set:Model
通过上面的推导过程,我们知道逻辑回归最终得到的就是后验概率,当某个样本属于C1的后验概率大于0.5时,则将其分类为C1,否则划分为C2。逻辑回归的function set如下所示,包括所有不同的 w w w和 b b b构成的总体,我们训练模型就是要找到对数据分类最好的那个function:
逻辑回归的结构可以写成如下的形式,包括一个线性单元和一个非线性单元,处理过程类似于神经网络的单个神经元,其中非线性部分采用的激活函数是sigmoid函数。
比较逻辑回归和线性回归的function set的区别:
我们发现逻辑回归与线性回归相比,只是在线性单元上加个sigmoid函数,将输出变成分类的后验概率,本质上还是线性模型,使用直线来对数据分类。
2.2 Goodness of a Function:确定损失函数
既然逻辑回归模型就是由 w w w和 b b b确定的function set,那么如何选择一个最好的function呢?
我们同样采用极大似然估计,让当前数据出现的可能性最大,定义所有数据的似然概率 L ( w , b ) L(w,b) L(w,b),让其最大化,如下:
我们认为不同数据是独立采样出来的,因此采用乘法公式,似然概率 L ( w , b ) L(w,b) L(w,b)如上所示。
不同分类的概率如下:
p ( x ) = { f w , b ( x ) , if y = 1 1 − f w , b ( x ) , if y = 0 p(x) =\begin{cases}f_{w,b}(x), & \text{if y = 1} \\1-f_{w,b}(x), & \text{if y = 0} \end{cases} p(x)={fw,b(x),1−fw,b(x),if y = 1if y = 0
由于不同类别使用不同的概率来表示,不好处理,因此做等价转换,将概率写成 y f ( x ) + ( 1 − y ) ( 1 − f ( x ) ) yf(x) + (1-y)(1-f(x)) yf(x)+(1−y)(1−f(x))的形式,下图是一个例子:
对似然函数求负对数,得到最终的损失函数:
虽然最终推导出的这个结果与信息论没什么关系,但是形式上是一致的,故可以将其理解为两个伯努利分布的交叉熵。
交叉熵反映两个概率分布有多接近,交叉熵越小表明两个分布越接近,我们希望预测值与实际值尽可能接近,也就是他们的分布的交叉熵尽可能小,这与对损失函数求极小是一致的。
比较逻辑回归和线性回归的损失函数:
逻辑回归的损失函数采用交叉熵,我们希望损失函数越小越好,即两个分布越接近越好,这样估测值便可以反映真实值。
2.3 Find the best function:梯度下降
我们想到找到最好的function,就要使损失函数最小。下面对损失函数求导,求其最小值:
由求解结果可知,预测值离目标越远,参数的update量就越大。
比较逻辑回归和线性回归的参数更新:
我们发现逻辑回归和线性回归的参数更新公式是一样的,说明这两种线性方法是统一的,只不过分别用在分类和回归。
Question:既然逻辑回归和线性回归存在一致性,那么我们就要考虑,为什么逻辑回归不同样采用更简单的平方损失来作为损失函数呢?
下面我们对逻辑回归使用平方损失,看一下会出现什么情况?
其中, y ^ n \hat y^n y^n为实际值, f w , b ( x n ) f_{w,b}(x^n) fw,b(xn)为预测值。
从上面两张图我们看到:当模型预测正确时,损失函数的梯度为0,这个没有问题;但是当模型预测错误时,损失函数的梯度仍旧是0,这样就没法采用梯度下降来更新参数了,所以逻辑回归不能使用平方损失。
再结合下面的Loss surface来比较交叉熵和平方误差:
由上图可知:
- 使用交叉熵作为损失函数,距离目标点远的地方梯度较大,参数更新较快,距离目标点近的地方梯度较小,参数更新较慢,这是很合理的;
- 使用平方损失作为损失函数,距离目标点远的地方梯度也很小,导致参数更新很缓慢,无法收敛;
3. 判别模型和生成模型
- 判别模型中没有对模型做任何假设,一切都是从数据出发,找到最好的w和b;
- 生成模型对数据的分布做假设,假设数据的分布是高斯分布、伯努利分布等,根据假设的分布找到一组w和b;
- 虽然看起来差不多,但是这两组w和b是不一样的,那么,哪种模型更好呢?
上图是前面的例子的分类结果,这里可以看到:判别模型分类结果更好。一般情况下,判别模型会优于生成模型。
下面再看个简单的例子,来理解为什么是这样:
对于这个例子,我们直观上应该觉得测试数据应该分类到class1,但是生成模型(NB)却将其分类为class2。这是因为生成模型自己做了某些假设(假设生成数据的分布),自己脑补出来某些数据中没有观测到的情况,认为在当前假设下,有些样本虽然没有观测到,但是也是有可能发生的。
判别模型却是完全从数据本身出发,从数据中学习到存在的模式。
其实,生成模型也有一些优点:
- 比如数据很少的情况下,假设数据的分布可以得到比较好的结果;
- 假设数据的分布可以使模型更加鲁棒,不容易受噪声的影响;
- Priors和class-dependent probabilities可以从不同的数据源估计;
4. 多分类
下面是一个三分类的例子:
多分类实际同二分类一样,采用相同推导方式可以得到softmax函数,同时多分类的损失函数也是交叉熵的形式,其中y值是one-hot的形式。
5. 逻辑回归的限制
由于逻辑回归是线性模型,所以模型存在一定的限制,比如:我们使用逻辑回归去分类下面四个点。
我们发现,即使是简单的四个点,逻辑回归也是无法进行分类的,因为图中的点不是线性可分的:
由于逻辑回归本质还是线性分类,所以无法对不能线性可分的点做划分。
如果坚持要用逻辑回归,可以对数据做特征转换,也就是将数据从一个特征空间转换到另一个特征空间。转换后点的分布如下图所示:
通过特征转换,我们发现数据变得线性可分,逻辑回归便可以work了。
但是,这里还有一个问题,通常情况下,我们很难自己找到一个好的transformation。
因此,我们便希望机器学习能帮我们找到这样的transformation。那么,机器学习如何找到这样的transformation呢?
我们通过串联逻辑回归模型来做到:
- 这里忽略bias;
- 使用串联的逻辑回归:第一层逻辑回归进行自动的特征转换,第二层对转换后的点进行分类;
同样使用前面的四个点,具体执行过程如下:
(1)首先,第一层对原始数据做特征转换;
(2)转换后的特征输入第二层逻辑回归,得到预测结果y;
我们发现,通过串联逻辑回归模型确实可以做到特征转换,实现分类。
这里串联的逻辑回归模型就类似于深度学习里的神经网络:
这里就非常自然的从逻辑回归进化到神经网络。
对于深度学习,也就是使用了多个hidden layer实现特征转换,然后采用线性分类器实现分类。
注:
这里说明的feature transformation + Linear Model的过程,体现了机器学习方法内在的一致性。