综合来看,整个课程可以分成一下四个大块,本篇博客也将按照以下四个模块来谈一些自己的理解。
首先来看,机器学习系统整体可以分为监督学习和无监督学习两个部分,主要在于数据集的不同,下面分别进行说明:
监督学习在于其处理的数据集,每一个数据X有一个对应的标签Y,Y可能是一些具体的数据,比如经典的房价预测,Y表示房价,也可能表示简单的0、1、2、...N,即分类问题,Y的值表示当前数据点属于哪一个类别,通过现有的(X,Y)数据集来进行模型训练,进而达到分类、预测等目的。
监督学习在课程中具体来说有一下四种:
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。我认为,回归的本质就是根据现有的数据集,来寻找一个较好的拟合模型,即能对当前的数据集中X和Y的关系进行拟合。之所以说是“较好的拟合模型”,是因为有时候为了过分的追求完美的数据拟合曲线,可能会造成过拟合等情况的出现,从而导致选择的拟合曲线固然能对当前的数据集进行可以说是完美的拟合,但是却不能对其他的数据进行较好的预测,也就是“过拟合”的问题,这在后面会谈到。因此,在进行拟合训练模型时,我们应该注意适度,而不是一味的去追求对当前数据进行完美拟合。下面谈一下线性回归中的一些概念理解和一些步骤的实施。
首先时预测函数的建立,即Hypothesis function(在后面以表示)。根据前面对线性回归的解释(利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法),在这里我们假设一参数Θ,根据对每一个数据中X进行特征提取(比如说预测房价,对房价可能产生影响的地段、房间面积、绿化...等情况)来进行Θ的假设,建立向量Θ=[,,...],而根据特征提取,我们又有一关于数据集的特征向量X=[,,...],因此我们假设有Θ*=Y',即根据对每一个特征分配不同的比值可以计算出最后的结果,因此Θ在这里又可以称之为权重,它表示每一个特征X在计算最终的结果Y时所占的比例。即应该有=Θ*=Y'。
随后就是代价函数的建议。我们已经建立了预测函数,通过对X的特征分配不同的权重已经计算出了一个结果,我们称为预测值,由于Θ是我们随意假设的,预测的结果Y'和实际的数据Y之间肯定是存在差距的,即有误差的存在,因此在这里我们定义一误差函数来表示预测值与实际值之间的误差,根据我们前面的分析,要对数据进行一个较好的拟合,也就是要使预测值与实际值尽可能的相等,即使误差J(Θ)尽可能的小,因此我们要根据现有的数据集来寻找一合适的“权重”向量Θ使J(Θ)取得最小值。
求取最下值的方法有最小二乘法和梯度下降法,在这里主要说梯度下降法,这也是在后面会多次提到的一个方法。从数学的角度来说,梯度的方向是函数增长最快的方向,那么反过来就有梯度的反方向就是函数下降的最快的方向,基于此,如果想求解一个函数的最小值,就可以依据梯度下降法的思想来计算。应用到上面的代价函数中,要求解代价函数的最小值,可以从初始的=[,,...]开始,基于学习率>0构建一个迭代的过程,,其中,=[,,...]。实际上,梯度下降法是一个迭代的过程,不断更新的值,当达到一定的收敛条件,即我们判断已经取得了最小值后,迭代结束,此时我们就得到了我们想要的线性回归模型。
值得注意的是,对于原始的数据集,我们应该按照3:1:1的比例将数据集分为Train dataset,Cross-validation dataset,Test dataset,因此在得到线性回归模型后,我们需要进行交叉误差验证并绘制学习曲线,来判断是否存在欠拟合或者过拟合,并采取相应的解决措施来得到一个效果较好的回归模型。
逻辑回归是一种用于解决二分类问题的机器学习方法,用于估计某种事物的可能性(0/1)。逻辑回归与线性回归都是一种广义线性模型,逻辑回归是假设因变量y服从伯努利分布,线性回归则是假设y服从高斯分布,严格意义上来说,逻辑回归以线性回归为理论支持,但是逻辑回归又通过Sigmoid函数引入了非线性因素,因此可以处理(0/1)问题,去除掉映射函数Sigmoid,逻辑算法就是一个线性回归。
同线性回归一样,逻辑回归也具有假设函数(Hypothesis function),不过与线性回归不同的是在这里引入了映射函数(也称为逻辑函数),其中,,即有 = ,其中,x是我们的输入,Θ是我们要求的参数。(逻辑函数图像如下图所示)
有了假设函数,同线性回归,下一步我们需要找出代价函数的表达式。由于逻辑回归解决的是二分类问题,即y的值只会有0 or 1两种情况,因此我们可以分开讨论。
1.y = 1
此时,应该有代价函数,其函数图像如下:
从图上可以看到,当较大时,误差较小,反之误差无穷大。
2.y = 0
此时,应有代价函数,其函数图像如下:
从图上可以看到,当较小时,误差较小,反之误差无穷大。
通过对上面两种情况下的误差函数进行组合,我们可以得到整体的误差函数如下:
有了代价函数,参照线性回归,接下来需要用梯度下降法求误差函数的最小值,此处梯度下降法公式如下:
看起来这里公式和线性回归一样的,实则不然,这里的经过了替换,变成了逻辑函数,这里是我们需要注意的地方,要注意我们使用的是线性回归还是逻辑回归,不要将二者混淆。
神经网络,实质上也是一种分类算法,其本质也是找到输入X和输出Y之间的关系从而建立模型,对数据进行分类。不过于逻辑分类有些不同,神经网络模型可以解决一对多的问题。
通常来说,一个最简单的神经网络模型应该包含三层:输入层、隐藏层、输出层,其中,输入层是我们的数据集,输出层是我们的预测函数结果,隐藏层就是我们要找到输入和输出之间的关系(隐藏层可能有多层),模型如下:
其中,Layer 1是输入层(Input Layer),Layer 2/Layer 3是隐藏层(Hidden Layer),Layer 4是输出层(Output Layer)。
前面我们已经说过,神经网络模型实质上也是一个分类模型(非线性分类器),因此同逻辑回归一样,在神经网络中也有映射函数Sigmoid的存在,即有,根据权重由输入计算输出的过程称为神经网络的正向传播过程,具体的公式借用吴老师课上的PPT来说明,如下:
可以看到,计算过程和前面的回归模型类似,但是需要足以到的是,在每一层(i)都添加了一项,根据上面的计算公式,我们应该注意到如果在第层有个单元,而在层有个单元,则应该有是一个 x 维的矩阵,因此,通过正向传播过程可以一步一步的计算出最终的结果。
计算出了预测函数的结果,和回归类似,下面就需要找出模型的代价函数,然后寻找最小值来求出最合适的模型。在我看来,神经网络模型实质上是多重逻辑回归的组合模型,其是以逻辑回归为理论基础的,因为其代价函数和逻辑回归类似,但是又有不同之处,具体的公式对比如下:
可以看到,从整体结构来说,神经网络模型的代价函数和逻辑回归模型的代价函数是一致的,不同的是,神经网络有多个输出,因此要对多个输出分别求解然后求和,同时我们也应该注意到,和逻辑回归相比,神经网络模型的权重值Θ也有多层,因此在进行规则化处理解决过拟合问题时,应该对多层权重值分别计算和值并求和,这一点和逻辑回归是不一样的。
与代价函数不同的也体现在梯度下降法的方式上,实质上,根据上面的的代价函数式子我们也可以看出来,如果采用求偏导进行梯度下降的方式,整个计算过程会非常的繁杂,计算成本较高,因此在这里我们有另外一种算法:Backpropagation intuition(反向传播算法),同样,我们这里借用吴老师课上的PPT来进行说明。
从图上我们可以看到,算法首先会执行整个前向传播的过程,计算出一个预测值,但是这个预测值和实际值之间存在误差值,因此需要对前面的权重值Θ进行调整,这就是反向传播算法的作用,通过计算出的误差值来进行反向推算。也就是说,在神经网络模型中,如果计算出预测值后存在误差,不再像之前那样使用梯度下降法来更新权重,而是利用误差来进行反向计算梯度,进而更新每一层的权重。梯度的计算过程如下图:
得到梯度后就可以按照正常的步骤来更新权重,即将梯度乘以上一个比例并取反后加到权重上。这个比例将会影响到训练过程的速度和效果,因此称为“训练因子”。梯度的方向指明了误差扩大的方向,因此在更新权重的时候需要对其取反,从而减小权重引起的误差。
支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane),也就是说,SVM的本质也是一个二元分类器,因此我们很容易联想到前面说的逻辑回归,同样都是二元分类器,那么二者之间有何异同呢?
实际上,在这两者之间我认为是很容易混淆的,因为他们的目的都是根据增加对分类影响较大的数据点的权重,减小与分类关系较小的数据点的权重,从而达到对数据进行分类的目的。但是其实二者是不一样的,下面我们由二者的损失函数来进行比较。
从二者的损失函数图像上,我们可以看到,相较于逻辑回归来说,SVM的处理方法就是只考虑support vectors,也就是和分类最相关的少数点,通过这些点来学习分类器得到决策边界,即距离分类平面较远的点不在SVM分类算法的考虑之内。而逻辑回归是通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重,两者的根本目的都是一样的。[参考自:知乎--逻辑回归和SVM的区别是什么?各适用于解决什么问题?]
无监督学习与监督学习在处理的数据集上是有区别的,监督学习处理的数据集是有标签的,即[(),(),...()],每个数据点都有对应的标签值y,但是无监督学习处理的数据集是没有标签的,即[,,... ]。也就是说,无监督学习是根据类别未知的样本解决模式识别中的各种问题的一种机器学习方法。
与监督学习相同,在无监督学习的课程中,主要从以下三个方面来进行介绍:
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
该算法其实核心只有两个步骤:
1.计算每个点到聚类中心的距离,选取距离最近的点作为中心点,从而对所有的数据进行分类;
2.根据第一步分类后的数据,计算出每一类数据的中心点,以此作为下一次分类的聚类中心点,然后重复进行步骤1.
就这样,通过两个步骤的不断迭代执行,得到数据集的最佳分类。
主要成分分析(简称PCA)实质上是一种数据预处理方法。有些时候我们可能会发现,我们得到的数据集里面有很多的特征值,这可能意味着这个数据集对某个事物的描述十分的详尽。当然,我们说一个这样的数据集对提高我们训练的模型的准确性是有很大提升的,但是我们也应该注意到另一个问题,那就是越多的特征值意味着我们的模型会越复杂,过多的特征值可能会导致我们需要做太多的工作去尝试对数据进行拟合,我们可能就不想要那么多的特征值,但是直接抛弃一部分数据显然是不可能的,这样会导致数据集信息缺失,最后得到的结果就是错误的,这时候PCA的作用就体现出来了。
简单来说,PCA是一种降维算法,二维的数据可以通过一维来表示,三维也可以降维成二维...,通过PCA算法,我们可以对数据集进行预处理,使得我们的模型没有那么的复杂,同时,运用PCA算法还可以节约存储空间,需要使用时再将数据还原。
PCA算法主要是通过以下几个方面来进行降维简化数据:
1.计算协方差矩阵
2.计算特征向量
svd是Matlab中的函数,S是对角阵,U是特征向量阵,将n维的数据转化为k维的数据,则取U阵的前k维进行转换。 ,为转换矩阵,转换后的数据。易推出有,这就是数据还原公式,即根据转换后的数据z还原原本的数据集z。
异常检测是一个概率问题,根据事物的某些特征值来计算其正常的概率,当低于某个值时就判定其为异常。其以高斯(正态)分布为理论基础,假设数据集x服从参数均值为,方差为的高斯分布,即,函数图形如下图所示:
对于一个假设有两个特征值的事物,我们借用以下图片来尝试说明异常检测的原理:
从图中我们可以看到,对于我们的数据集来说,大部分的样本都分布在较靠中心的位置,只有少部分分布在外围区域,下面的二维图显示的是每个区域的概率大小,很显然,中心区域最高,这表示在中心区域的概率最大,也就是说,通过这两个特征点的情况,我们可以得到以下结论:该事物通过这两个特征计算出来的概率越靠近中心点,即是正常的概率越大,反之,越远则越有可能是异常的,这就是异常检测。
还有另外一种情况,我们称之为多元高斯模型异常检测。
通过这幅图,我们可以看到整个数据集分布在一个椭圆范围内,但是如果使用我们前面的高斯模型,最后系统进行判断时,使用的不是椭圆而是圆,也就是说,系统会认为在一个同心圆内的所有点,他们的概率都是一样的,但显然这是不对的,这时候我们就要构建多元高斯模型,如下图:
两张图对比,我们可以很明显的看到二者的区别,多元高斯模型通过改变参数的值,最后构建的概率模型为一个椭圆,这显然更能契合我们前面的数据集进行异常检测。
这里主要讲的是推荐系统,也是一个求概率问题。
简单来说,主要是以下两个方面:
1.对于大数据样本来说,如果按照我们前面进行梯度下降算法的公式,需要求的和太多,计算代价太大,因此有随机梯度算法和Mini-Batch算法,同时,还可以将一个数据集分成几分,使用多台计算机或者多个核心同时计算节省时间。
2.在对系统进行优化时,应该首先进行天花板分析,即对于一个学习流程中的多个环节,我们可以手动将某一个环节的正确率改为100%,看这样对整个系统准确率的提升有多少,根据这个数据来决定在优化时应该将主要精力放在哪一方面,如果说对系统准确率的提升很高,那我们就应该尽可能保证这个环节在实际应用中的正确率尽可能的高,而对于某些环节,可能去正确率为100%时,对系统的提升只有1%,对于这些环节,我们就没有必要花太多的精力在这上面。
下一个目标:李宏毅老师的机器学习课程