摘要
这周将以宝可梦为例学习回归和分类任务的处理方法。对于回归任务,学习了如何提高预测的准确度以及降低过拟合的风险。对于分类任务,手推了后验概率公式,了解了如何运用数学语言来区分类别。对比了生成模型和判别模型的优缺点,以及实现线性回归和逻辑回归步骤的差异。
Abstract
This week, we will take Pokémon as an example to learn how to handle regression and classification tasks. For regression tasks, I learned how to improve prediction accuracy and reduce the risk of overfitting. For classification tasks, we manually derived the posterior probability formula and learned how to use mathematical language to distinguish categories. We compared the advantages and disadvantages of generative models and discriminative models, as well as the differences in linear regression and logistic regression.
1.以宝可梦为例学习回归和分类
1.1.Regression
回归(Regression)是指利用机器学习算法对连续数值数据进行预测或建模的任务。在回归任务中,我们尝试找到输入特征与输出变量之间的关系,以便预测新的输入特征对应的输出值。
案例1:预测宝可梦的CP值,其中 x c p x_{cp} xcp表示宝可梦的CP值, x s x_s xs表示宝可梦的类别, x h p x_{hp} xhp表示宝可梦的血量, x w x_w xw表示宝可梦的体重, x h x_h xh表示宝可梦的身高, y y y表示宝可梦进化后的CP值。
1.1.1.Model(函数建模)
我们可以猜测宝可梦进化前和进化后的CP值关系是线性的,对于本案例我们可以采用线性模型(Linear model)对其建模,其中 x i x_i xi为各种输入的数据,称为feature, w i w_i wi称为weight, b b b称为bias。
1.1.2.Goodness of Function(评价函数的好坏)
字母的上标代表了一个完整object的输入,而下标代表了一个object中的某一个输入数据,字母的hat代表了这是一个我们观察到的正确值。
我们搜集到10只宝可梦相应的CP值数据,绘制成散点图,其中横坐标代表初始的CP值,纵坐标代表进化后的CP值,数据的坐标可以表示为 ( x c p n , y ^ n ) (x^n_{cp},\hat{y}^n) (xcpn,y^n)。
为了评价函数的好坏,我们需要定义损失函数(Loss Function)。在该例中,我们将真实值和预测值之差的平方进行求和来作为该模型的一个损失函数。显然,损失函数的参数为 w w w和 b b b,损失函数的取值越小证明我们所求得的函数越好。
损失函数考虑了所有的数据集,里面的未知参数变量只有 w w w和 b b b,所以只要确定了 w w w和 b b b的取值我们就可以确定loss的大小。我们可以将Loss函数关于 w w w和 b b b的图像绘制出来,图中的任意一点都代表一个Loss函数,红色越深的地方代表Loss函数的值越大,蓝色越深的地方代表Loss函数的值越小。所以我们需要的 w w w和 b b b的取值应该处于等高图最低的位置。
1.1.3.Best Function(挑选最好的函数)
要找到一个最好的函数实际上就是找到一组 w w w和 b b b的值使得Loss函数的取值最小。
1.1.4.Gradient Descent(梯度下降法)
梯度下降法的具体步骤参考上一周学习笔记,此处不再赘述。
在线性回归问题中总会找到一个全局最低点,不用担心找到的是不同的loacal optimal位置。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1a77b842e0374c4c8e826c6a06f313de.png#pic_center)
通过梯度下降法求得 b = − 188.4 b=-188.4 b=−188.4, w = 2.7 w=2.7 w=2.7,绘制出 y y y的图像,可以看到图像已经大致可以拟合训练集的数据。
对于测试集,函数也可以大致拟合图像,但误差会比训练集稍大,那么我们是否可以做到更好呢?
1.1.5.Selecting another Model(选择其他模型)
把之前猜测的线性模型调整为一个含二次项的模型,使用梯度下降法求得 b b b和 w w w后,可以看到新模型的平均误差比之前线性模型的误差低了不少。
倘若再考虑三次项,可以看到误差就更低了,那么有没有可能是更加复杂的一个modle?
考虑四次项之后对于训练集的误差虽然降低的,但是在测试集上面的误差就更大了。
引入五次项之后可以很显著地发现测试集上的误差异常。
我们可以看到在训练集上表现更为优秀的模型,在测试集反而变差 。原因是模型在训练集上发生了过拟合。越复杂的模型,训练集上误差越来越低,但不一定在测试集上有更好的表现,因此要选择合适的模型。
我们考虑更多的training data之后发现进化后的CP值不仅与进化前的CP值有关系,也和宝可梦的物种有关系。
1.1.6.Redesign the Model(重新设计模型)
考虑物种的因素后可以写成上图的式子,但是新的问题又来了,这个model看起来已经不是一个linear model了,我们要如何对这个式子求导呢?
我们仅需引入一个 δ \delta δ函数便可以解决这个问题了。
我们可以试着确定某个物种之后进行推算看看是不是图20的式子,由上图推导可知,确定物种之后计算出来的就是图20的式子。
考虑了物种因素之后我们才观察实验结果可以看到无论是训练集还是测试集都表现的还行,但仍然没有达到我们想要的结果,会不会还有一些隐藏的因素我们没有考虑到呢?
1.1.7.Redesign the Model Again(再次重新设计模型)
我们把之前定义的所有feature都纳入考虑,最后得到的结果在训练集上表现优异,但是在测试集中又出现了过拟合现象。我们必须要想办法解决处理这个问题。
1.1.7.Regularization(正则化)
我们重新设计损失函数,在损失函数后面加上一个正则化惩罚项,其中 λ λ λ是手动控制的一个超参数,代表着正则化惩罚项的强度。由于我们想要一个最小的Loss,这就会导致加入了正则化惩罚项进行训练后参数 w w w会向0靠近或尽量变小,这也使得我们的模型更加的平滑,减少对单个样本或特定特征的过度依赖。平滑(smooth)是指输入的一些噪声值对输出的结果施加更小的影响。例如,输入多了一个 △ x i △x_i △xi,输出则会输出多一个 w i △ x i w_i△x_i wi△xi,由于 w w w趋向0,输出的这一项对于总结果的影响不大。
λ的取值是手动控制的,我们想要一个平滑的函数,但是也不能太过平滑。可以看到当我们的λ越来越大之后training error也会随之增大,而testing error经历了一个先减小后增大的过程。所以我们应该要选择合适的λ来使得训练误差和测试误差尽量小。
1.2.Classification
分类任务可以应用于贷款、医疗诊断、手写识别和人脸识别等任务。
案例2:宝可梦有很多的种类,通过宝可梦的各种数值我们是否可以找到一个函数来判断宝可梦的种类呢?
1.2.1 二分类问题
如果我们把分类任务当做回归任务来处理,将输入的数据集分类为class1和class2。输入的值为class1类别,则输出为1,输入的值为class2类别,则output输出为-1。理想状态如左图,绿线确实可以将训练集分为两部分。但有可能会出现如右图的情况,右下角的数据会出现远远大于1的结果,这就导致了训练之后的分界线为紫色直线,因此就不能很好地实现红色数据和蓝色数据的分类。显然,强行使用回归方法去进行分类并不合适。
如图所示,假设我们已经取得了一个蓝球,此时蓝球来自B1的概率是多少呢?也就是说我们要如何求得 P ( B 1 ∣ B l u e ) P(B_1|Blue) P(B1∣Blue)呢?显然,这用到了概率论中的贝叶斯公式。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7bfeb426218f4f60bc81574e054b0c47.png#pic_center)
像上述的这种模型我们称作生成模型(Generative Model),只需要求红框中的四个值我们就可以利用贝叶斯公式完成分类任务。
如图将宝可梦分为水系和一般系,我们可以算得每种系占总体的概率。
每一个宝可梦都有一个根据它们自身属性和特征而定的向量来表示,那么我们如何求x属于水系的概率呢?
根据宝可梦的防御力和特殊防御力将水系的宝可梦分布在图上,假设这79个点是从高斯分布中取样的。高斯分布是最常见的分布之一,这个只是我们的一个猜测而已,也有可能是其他分布。
如图输入的x为vector,而输出为向量x在所有数据中所出现的概率。同样的x,将不同的∑ 和μ 代入高斯公式中,对应x的几率分布也不尽相同,图上是多元高斯分布的公式。
如果我们知道了这个高斯分布μ和∑,给出一个新的点x,将这个新的点x代入高斯分布公式中去,就可以算出这个x在79个点中的几率。x越接近红线圈出来的区域,被抽取出来的几率越大,反之,则被抽取的几率比较小。那么我们怎么找到高斯分布μ和∑?
极大似然估计(Maximum Likelihood Estimation, MLE)是一种常用的参数估计方法,用于从给定数据中估计模型中的未知参数。它基于一个假设,即给定模型的参数值,数据的产生是符合某个已知的概率分布的。极大似然估计的核心思想是通过最大化似然函数,找到使得观测数据出现的概率最大的参数值。
写出该分布的似然函数,该函数实际上就是每个x在高斯分布上的概率密度乘积,这是因为假设每个点都是独立的,所以所有概率连乘得到的取值就是产生这79个数据的联合概率密度。令似然函数取得最大值,此时求出来的 μ μ μ和 ∑ ∑ ∑就是 μ ∗ μ^* μ∗和 ∑ ∗ ∑^* ∑∗。
由图39公式可以分别求得water和normal满足高斯分布的参数 μ μ μ和 ∑ ∑ ∑,有了这些数据之后就可以求分类问题了。
任取一个向量 x x x,向量 x x x来自 C 1 C_1 C1的概率如上式所示,其中 P ( C 1 ) P(C_1) P(C1)和 P ( C 2 ) P(C_2) P(C2)是我们先前求出来的, P ( x ∣ C 1 ) P(x|C_1) P(x∣C1)和 P ( x ∣ C 2 ) P(x|C_2) P(x∣C2)是多元高斯分布在参数 μ 1 μ^1 μ1和 ∑ 1 ∑^1 ∑1、 μ 2 μ^2 μ2和 ∑ 2 ∑^2 ∑2中求得的概率。若 P ( C 1 ∣ x ) P(C_1|x) P(C1∣x)大于0.5,则 x x x属于类别1。
观察实验结果,红色区域代表属于water,蓝色区域代表 normal,此时可以很直观的看出在二维条件下蓝色点和红色点不能很好的区分出来,在测试集上当准确率只有47%。但是其实宝可梦的数据不仅只有两个,实际上是分布在一个七维的空间里,我们考虑一个七维的向量作为 x x x之后,准确率来到了54%。
1.2.2 Modifying Model(修改模型)
为了防止overfitting,我们会故意让两个不同的高斯分布使用通一个协方差矩阵,这会使得我们只需要比较少的参数就可以去拟合这个model。
在这个新的似然函数中 μ 1 μ^1 μ1和 μ 2 μ^2 μ2和原来还是一样的,而 Σ Σ Σ由上式所求。
共用了一个Σ之后分类边界变成了一条直线,这也可以叫做linear model。并且,考虑了所有的特征之后准确度达到了73%,相比之前提升显著。
1.2.3 Posterior Probability(后验概率)
后验概率实际上也是一种条件概率,后验概率(Posterior Probability)是指在考虑先验信息的情况下,根据已经观测到的数据来计算得到的某一事件或假设发生的概率。
令 z = l n P ( x ∣ C 1 ) P ( C 1 ) P ( x ∣ C 2 ) P ( C 2 ) z=ln{P(x|C_1)P(C_1)\over P(x|C_2)P(C_2)} z=lnP(x∣C2)P(C2)P(x∣C1)P(C1), P ( C 1 ∣ x ) P(C_1|x) P(C1∣x)可化为右边的形式,此时可以看做是一个sigmoid函数。那么我们是否可以知道, z z z又是一个什么样的图像呢?
由以上推导可以看出, z z z其实可是一个关于 x x x的linear function。
2.Logistic Regression(逻辑回归)
2.1 Function Set
逻辑回归 = 线性回归+sigmoid函数
按生成模型的方法进行计算需要求得概率分布的各个参数,计算过程太过于复杂。从后验概率的推导来看,后验概率其实是将某一个线性函数通过sigmoid函数求值而已,所以如果我们可以一步到位求到此线性函数的w和b,那么就可以大大简化计算量。
2.2 Goodness of a Function
利用极大似然估计的方法写出似然函数,令似然函数求最大值时求出来的 w w w和 b b b就是我们要求得的 w ∗ w^* w∗和 b ∗ b^* b∗。
找到一组参数 w w w和 b b b使得似然函数最大,同理也就是找到一组参数 w w w和 b b b使得 − l n L ( w , b ) -ln L(w,b) −lnL(w,b)最小。由上图推导可知 − l n L ( w , b ) -ln L(w,b) −lnL(w,b)等于两个伯努利分布所作的交叉熵。因此,损失函数即为这两个分布所作的交叉熵,要使得损失函数最小,只需要用梯度下降法求得参数即可。
2.3 Find the best function
2.4 逻辑回归与线性回归的对比
逻辑回归是在线性回归基础上通过一个Sigmoid函数产生的,二者在梯度下降更新w参数的方式是一摸一样的,但是逻辑回归函数值为0或1,线性回归的值可以是任何值。
如果我们使用方差来作为损失函数的话,当真实分类为class 1时,若分类函数求得的值为1,此时 L L L对 w i w_i wi求偏导的值为0,说明预测值和真实值很近(不用再更新了),这很合理。但是如果分类函数的值为0时,预测值和真实值相距很远,但 L L L对 w i w_i wi求偏导的值也为0,此时产生了梯度消失现象,无法正确地更新参数了。
我们可以对比一下分别用交叉熵和方差来作为损失函数的微分图像。对于交叉熵来说,距离目标值越远,微分值越大,更新速度越快。而对于方差来说,距离目标值到一定程度后,微分值都比较小,且处于一个较为平坦的区域,更新速度非常慢。虽然微分值很小的时候,可以手调学习率来加快更新速度,当微分值很小的时候有可能参数w本身就在目标值附近,这时如果学习率过大我们就不能精准地到达目标值了。
采用逻辑回归方法的模型我们也叫他判别模型。判别模型是一种直接对输入数据进行建模从而学习输入数据与标签之间的映射关系的模型。判别模型的主要目标是预测输入数据的标签或类别,而不是直接学习数据的分布。
无论是判别模型还是生成模型他们的构成都是一样的,但是生成模型需要先假设数据的概率分布,然后去找到这个分布的参数,再通过这些参数去找到 w w w和 b b b。而判别模型可以直接去找模型的 w w w和 b b b。
实验结果表明,在考虑了宝可梦七个不同的特征之后,使用判别模型的准确度要比生成模型高。但是为什么会产生这样的结果呢?
考虑这样一个例子,如上图所示,如果测试数据库的 x 1 x_1 x1和 x 2 x_2 x2均为1,采用朴素贝叶斯之后会识别为class 1还是class 2呢?
从直觉上来看,测试数据应该要归为class 1,但是采用朴素贝叶斯求出来的概率小于0.5,此时机器判定分类应为class 2。为什么会产生这种现象的?这是因为生成模型会从训练集的概率分布去计算新数据的类别,换句话说就是会根据训练集进行“脑补”。由于训练集中class 2的采样远远多于class 1,对于新到来的数据,机器便会认为新数据更有可能属于class 2,虽然训练集中的class 2类别中未出现符合的内容,但是机器会认为采样足够多之后就会出现相应的数据。而判别模型不用考虑训练集的概率分布,只会直接对训练数据进行判断,数据越多判断越精准。
判别模型收到数据影响很大,所以比较适合训练数据很大的任务,而生成模型适合训练数据比较少的任务。
2.5 Multi-class Classification(多分类任务)
多分类和之前二分类也没有什么本质的区别,只是最后要通过一个softmax分类器求得每个类别的概率。softmax函数会使得数据归一化,并且大和小的差距拉开得更加明显。
最后再把 y y y和 y ^ \hat y y^做交叉熵,令这个交叉熵为损失函数,再根据梯度下降法求得参数即可。这个交叉熵实际上也是来自极大似然估计的方法。
不过,逻辑回归也是存在局限的。逻辑回归属于线性分类器,无法处理异或问题,如图所示,无论怎么画一条直线都不能把蓝色点和红色点区分开来。
第一个解决办法是我们可以做特征变换,将 x 1 x_1 x1和 x 1 x_1 x1变换到 x 1 ′ x'_1 x1′和 x 2 ′ x'_2 x2′, x 1 ′ x'_1 x1′和 x 2 ′ x'_2 x2′分别表示某一点到(0,0)和(1,1)的距离。这样子就可以用一条直线将蓝色点和红色点分开了。但是做特征变化是一个比较困难的事情,我们倾向让机器来自己完成这个任务。
我们可以将两个逻辑回归模型叠加起来,左边红框就是为了完成特征变换任务,而右边红框就是为了完成分类任务。
每一个逻辑回归单元都可以与它前面的逻辑回归单元和后面的逻辑回归单元相连接,每个逻辑回归单元既可以做输入,也可以是输出。我们把每一个逻辑回归单元叫做Neuron(神经元),而这些逻辑回归单元所连接形成的结构,就变成了Neural Network(神经网络)。
总结
这周以宝可梦为例学习了对回归问题和分类问题的处理。对于回归问题我们还是按照函数建模、函数评优和挑选函数三个步骤来解决问题。为了提高回归预测的准确度,我们可以增加模型的复杂度。但是,过于复杂的模型可能会导致过拟合现象,使得模型不能很好地泛化新的数据。为了防止过拟合,我们可以在损失函数中加入正则化惩罚项,使得损失函数更加平滑,降低函数的复杂度,减少对单个样本或特定特征的过度依赖。对于分类问题我们主要学习了生成模型和判别模型。生成模型要求我们要先求得训练集的概率分布,再通过这个概率分布去预测新数据的分类,这适用于训练数据比较少的情形。而判别模型只基于训练集的数据,不需要去求概率分布,只需要直接求w和b即可。判别模型采取的方法我们称之为逻辑回归,逻辑回归实际上是一个线性分类器。为了解决逻辑回归的局限性,我们叠加了多个逻辑回归函数。多个逻辑回归函数通过叠加连接,最后形成了神经网络,而含多个隐藏层的神经网络就是深度学习。