A. 深度学习系列(四):什么是稀疏编码
现在深度学习在机器学习领域是一个很热的概念,不过经过各种媒体的转载播报,这个概念也逐渐变得有些神话的感觉:例如,人们可能认为,深度学习是一种能够模拟出人脑的神经结构的机器学习方式,从而能够让计算机具有人一样的智慧;而这样一种技术在将来无疑是前景无限的。那么深度学习本质上又是一种什么样的技术呢? 深度学习是什么 深度学习是机器学习领域中对模式(声音、图像等等)进行建模的一种方法,它也是一种基于统计的概率模型。在对各种模式进行建模之后,便可以对各种模式进行识别了,例如待建模的模式是声音的话,那么这种识别便可以理解为语音识别。而类比来理解,如果说将机器学习算法类比为排序算法,那么深度学习算法便是众多排序算法当中的一种(例如冒泡排序),这种算法在某些应用场景中,会具有一定的优势。 深度学习的“深度”体现在哪里 论及深度学习中的“深度”一词,人们从感性上可能会认为,深度学习相对于传统的机器学习算法,能够做更多的事情,是一种更为“高深”的算法。而事实可能并非我们想象的那样,因为从算法输入输出的角度考虑,深度学习算法与传统的有监督机器学习算法的输入输出都是类似的,无论是最简单的Logistic Regression,还是到后来的SVM、boosting等算法,它们能够做的事情都是类似的。正如无论使用什么样的排序算法,它们的输入和预期的输出都是类似的,区别在于各种算法在不同环境下的性能不同。 那么深度学习的“深度”本质上又指的是什么呢?深度学习的学名又叫深层神经中国络(Deep Neural Networks ),是从很久以前的人工神经中国络(Artificial Neural Networks)模型发展而来。这种模型一般采用计算机科学中的图模型来直观的表达,而深度学习的“深度”便指的是图模型的层数以及每一层的节点数量,相对于之前的神经中国络而言,有了很大程度的提升。 深度学习也有许多种不同的实现形式,根据解决问题、应用领域甚至论文作者取名创意的不同,它也有不同的名字:例如卷积神经中国络(Convolutional Neural Networks)、深度置信中国络(Deep Belief Networks)、受限玻尔兹曼机(Restricted Boltzmann Machines)、深度玻尔兹曼机(Deep Boltzmann Machines)、递归自动编码器(Recursive Autoencoders)、深度表达(Deep Representation)等等。不过究其本质来讲,都是类似的深度神经中国络模型。 既然深度学习这样一种神经中国络模型在以前就出现过了,为什么在经历过一次没落之后,到现在又重新进入人们的视线当中了呢?这是因为在十几年前的硬件条件下,对高层次多节点神经中国络的建模,时间复杂度(可能以年为单位)几乎是无法接受的。在很多应用当中,实际用到的是一些深度较浅的中国络,虽然这种模型在这些应用当中,取得了非常好的效果(甚至是the state of art),但由于这种时间上的不可接受性,限制了其在实际应用的推广。而到了现在,计算机硬件的水平与之前已经不能同日而语,因此神经中国络这样一种模型便又进入了人们的视线当中。 “ 2012年6月,《纽约时报》披露了Google Brain项目,吸引了公众的广泛关注。这个项目是由着名的斯坦福大学机器学习教授Andrew Ng和在大规模计算机系统方面的世界顶尖专家Jeff Dean共同主导,用16000个CPU Core的并行计算平台训练一种称为“深层神经中国络”(DNN,Deep Neural Networks) ” 从Google Brain这个项目中我们可以看到,神经中国络这种模型对于计算量的要求是极其巨大的,为了保证算法实时性,需要使用大量的CPU来进行并行计算。 当然,深度学习现在备受关注的另外一个原因,当然是因为在某些场景下,这种算法模式识别的精度,超过了绝大多数目前已有的算法。而在最近,深度学习的提出者修改了其实现代码的Bug之后,这种模型识别精度又有了很大的提升。这些因素共同引起了深层神经中国络模型,或者说深度学习这样一个概念的新的热潮。 深度学习的优点 为了进行某种模式的识别,通常的做法首先是以某种方式,提取这个模式中的特征。这个特征的提取方式有时候是人工设计或指定的,有时候是在给定相对较多数据的前提下,由计算机自己总结出来的。深度学习提出了一种让计算机自动学习出模式特征的方法,并将特征学习融入到了建立模型的过程中,从而减少了人为设计特征造成的不完备性。而目前以深度学习为核心的某些机器学习应用,在满足特定条件的应用场景下,已经达到了超越现有算法的识别或分类性能。 深度学习的缺点 深度学习虽然能够自动的学习模式的特征,并可以达到很好的识别精度,但这种算法工作的前提是,使用者能够提供“相当大”量级的数据。也就是说在只能提供有限数据量的应用场景下,深度学习算法便不能够对数据的规律进行无偏差的估计了,因此在识别效果上可能不如一些已有的简单算法。另外,由于深度学习中,图模型的复杂化导致了这个算法的时间复杂度中国剧提升,为了保证算法的实时性,需要更高的并行编程技巧以及更好更多的硬件支持。所以,目前也只有一些经济实力比较强大的科研机构或企业,才能够用深度学习算法,来做一些比较前沿而又实用的应用。 本回答由科学教育分类达人 张雪推荐
B. 如何在Boosting算法中使用SVM
其实现在能够找到的,关于SVM的中文资料已经不少了,不过个人觉得,每个人的理解都不太一样,所以还是决定写一写,一些雷同的地方肯定是不可避免的,不过还是希望能够写出一点与别人不一样的地方吧。另外本文准备不谈太多的数学(因为很多文章都谈过了),尽量简单地给出结论,就像题目一样-机器学习中的算法(之前叫做机器学习中的数学),所以本系列的内容将更偏重应用一些。如果想看更详细的数学解释,可以看看参考文献中的资料。
一、线性分类器:
首先给出一个非常非常简单的分类问题(线性可分),我们要用一条直线,将下图中黑色的点和白色的点分开,很显然,图上的这条直线就是我们要求的直线之一(可以有无数条这样的直线)
假如说,我们令黑色的点 = -1, 白色的点 = +1,直线f(x) = w.x + b,这儿的x、w是向量,其实写成这种形式也是等价的f(x) = w1x1 + w2x2 … + wnxn + b, 当向量x的维度=2的时候,f(x) 表示二维空间中的一条直线, 当x的维度=3的时候,f(x) 表示3维空间中的一个平面,当x的维度=n > 3的时候,表示n维空间中的n-1维超平面。这些都是比较基础的内容,如果不太清楚,可能需要复习一下微积分、线性代数的内容。
刚刚说了,我们令黑色白色两类的点分别为+1, -1,所以当有一个新的点x需要预测属于哪个分类的时候,我们用sgn(f(x)),就可以预测了,sgn表示符号函数,当f(x) > 0的时候,sgn(f(x)) = +1, 当f(x) < 0的时候sgn(f(x)) = –1。
但是,我们怎样才能取得一个最优的划分直线f(x)呢?下图的直线表示几条可能的f(x)
一个很直观的感受是,让这条直线到给定样本中最近的点最远,这句话读起来比较拗口,下面给出几个图,来说明一下:
第一种分法:
第二种分法:
这两种分法哪种更好呢?从直观上来说,就是分割的间隙越大越好,把两个类别的点分得越开越好。就像我们平时判断一个人是男还是女,就是很难出现分错的情况,这就是男、女两个类别之间的间隙非常的大导致的,让我们可以更准确的进行分类。在SVM中,称为Maximum Marginal,是SVM的一个理论基础之一。选择使得间隙最大的函数作为分割平面是由很多道理的,比如说从概率的角度上来说,就是使得置信度最小的点置信度最大(听起来很拗口),从实践的角度来说,这样的效果非常好,等等。这里就不展开讲,作为一个结论就ok了,:)
上图被红色和蓝色的线圈出来的点就是所谓的支持向量(support vector)。
上图就是一个对之前说的类别中的间隙的一个描述。Classifier Boundary就是f(x),红色和蓝色的线(plus plane与minus plane)就是support vector所在的面,红色、蓝色线之间的间隙就是我们要最大化的分类间的间隙。
这里直接给出M的式子:(从高中的解析几何就可以很容易的得到了,也可以参考后面Moore的ppt)
另外支持向量位于wx + b = 1与wx + b = -1的直线上,我们在前面乘上一个该点所属的类别y(还记得吗?y不是+1就是-1),就可以得到支持向量的表达式为:y(wx + b) = 1,这样就可以更简单的将支持向量表示出来了。
当支持向量确定下来的时候,分割函数就确定下来了,两个问题是等价的。得到支持向量,还有一个作用是,让支持向量后方那些点就不用参与计算了。这点在后面将会更详细的讲讲。
在这个小节的最后,给出我们要优化求解的表达式:
||w||的意思是w的二范数,跟上面的M表达式的分母是一个意思,之前得到,M = 2 / ||w||,最大化这个式子等价于最小化||w||, 另外由于||w||是一个单调函数,我们可以对其加入平方,和前面的系数,熟悉的同学应该很容易就看出来了,这个式子是为了方便求导。
这个式子有还有一些限制条件,完整的写下来,应该是这样的:(原问题)
s.t的意思是subject to,也就是在后面这个限制条件下的意思,这个词在svm的论文里面非常容易见到。这个其实是一个带约束的二次规划(quadratic programming, QP)问题,是一个凸问题,凸问题就是指的不会有局部最优解,可以想象一个漏斗,不管我们开始的时候将一个小球放在漏斗的什么位置,这个小球最终一定可以掉出漏斗,也就是得到全局最优解。s.t.后面的限制条件可以看做是一个凸多面体,我们要做的就是在这个凸多面体中找到最优解。这些问题这里不展开,因为展开的话,一本书也写不完。如果有疑问请看看wikipedia。
C. 试说明boosting的核心思想是什么,boosting中什么操作使得基分类器具备多样性
详细解释下,boosting中最基本的是adaboost,你要是弄清楚这个算法其他主要原理都差不多,只是实现手段或者说采用的数学公式不同。它是这样的:先对所有样本辅以一个抽样权重(一般开始的时候权重都一样即认为均匀分布),在此样本上训练一个分类器对样本分类,这样可以得到这个分类器的误差率,我们根据它的误差率赋以一个权重,大体是误差越大权重就越小,针对这次分错的样本我们增大它的抽样权重,这样训练的下一个分类器就会侧重这些分错的样本,然后有根据它的误差率又计算权重,就这样依次迭代,最后我们得到的强分类器就是多个弱分类器的加权和。我们可以看出性能好的分类器权重大一些,这就体现了boosting的精髓。
D. boosting算法到底是什么算法请详解
详细解释下,boosting中最基本的是adaboost,你要是弄清楚这个算法其他主要原理都差不多,只是实现手段或者说采用的数学公式不同。它是这样的:先对所有样本辅以一个抽样权重(一般开始的时候权重都一样即认为均匀分布),在此样本上训练一个分类器对样本分类,这样可以得到这个分类器的误差率,我们根据它的误差率赋以一个权重,大体是误差越大权重就越小,针对这次分错的样本我们增大它的抽样权重,这样训练的下一个分类器就会侧重这些分错的样本,然后有根据它的误差率又计算权重,就这样依次迭代,最后我们得到的强分类器就是多个弱分类器的加权和。我们可以看出性能好的分类器权重大一些,这就体现了boosting的精髓。
E. 为什么说bagging是减少variance,而boosting是减少bias
【机器学习】Boosting和Bagging的差别
boosting和bagging的差别:
bagging中的模型是强模型,偏差低,方差高。目标是降低方差。在bagging中,每个模型的bias和variance近似相同,但是互相相关性不太高,因此一般不能降低Bias,而一定程度上能降低variance。典型的bagging是random forest。
boosting中每个模型是弱模型,偏差高,方差低。目标是通过平均降低偏差。boosting的基本思想就是用贪心法最小化损失函数,显然能降低偏差,但是通常模型的相关性很强,因此不能显着降低variance。典型的Boosting是adaboost,另外一个常用的并行Boosting算法是GBDT(gradient boosting decision tree)。这一类算法通常不容易出现过拟合。
过拟合的模型,通常variance比较大,这时应该用bagging对其进行修正。
欠拟合的模型,通常Bias比较大,这时应该可以用boosting进行修正。使用boosting时, 每一个模型可以简单一些。
金融常见的问题,是只用linear regression,这样一般来讲是欠拟合的,因此需要引入一些非线性的特征,欠拟合的模型可以先使用boosting尝试一下,如果效果不好,再使用其他的方法。过拟合的方法,通常使用bagging是会有一定的作用的。
F. boosting算法到底是什么算法
详细解释下,boosting中最基本的是adaboost,你要是弄清楚这个算法其他主要原理都差不多,只是实现手段或者说采用的数学公式不同.它是这样的:先对所有样本辅以一个抽样权重(一般开始的时候权重都一样即认为均匀分布),在此样本上训练一个分类器对样本分类,这样可以得到这个分类器的误差率,我们根据它的误差率赋以一个权重,大体是误差越大权重就越小,针对这次分错的样本我们增大它的抽样权重,这样训练的下一个分类器就会侧重这些分错的样本,然后有根据它的误差率又计算权重,就这样依次迭代,最后我们得到的强分类器就是多个弱分类器的加权和.我们可以看出性能好的分类器权重大一些,这就体现了boosting的精髓.
G. matlab中Boosting算法的代码是什么
先看这个结构里面的这些函数都是干什么用的,prob,概率。[1:keep],这里应该能大概看出来keep是整数,1:keep等价于1:1:keep,比如1:10,就是1,2,3,4,5,6,7,8,9,10。步长为1,从1到keep.右上角的',这个符号,表示转置,比如1:10,是一个1行10列的矩阵,通过转置变成10行一列。其中,sum([1:keep]),表示对这个矩阵(从1到keep求和),但是这个语句prob=flipud([1:keep]'/sum([1:keep]));里面总觉得缺少了一个.。prob=flipud([1:keep]'./sum([1:keep]));这样看来应该才能运行,我没尝试,在commandwindow里面直接做是可以的,但是在脚本文件里面做,可能会报错。这个和矩阵运算有关,暂且放在这里。然后到外部,这样我们知道了在第一行flipud()函数体里面,实际上是在用1到keep的每一个数,除以1到keep的和值,得到一个长度为keep的矩阵。值得注意的是,这个矩阵的和值为1,在下面会用到这一点。然后flipud()函数的作用,是把矩阵倒置,比如[1,3,4,5],使用flipud()之后变成[5,4,3,1]。注意,这个操作和sort()函数不同,这个只是把以前的顺序倒置,并不排序。从这里大概可以看出来,其实这个keep的值,等于chromosomes,染色体数量。这样,对于不同的染色体,配对概率就不一样了。从这里可以看出来,染色体配对概率应该是第一条最高,然后依次递减。然后计算或然率,cumsum(),进行累加求和,比如matlab中给出的例子,我们用[1,2,3]也可以写作1:3,来说,cumsum之后的结果是[1,3,6],也就是从第一个开始加和,一直加到这一项。这一点,非常类似高斯函数积分的感觉。用来计算概率cumulativedistribution。然后odd变量,把0加在了cumsum结果的前面,比如刚刚的例子[0cumsum([1,2,3])],就变成了[0,1,3,6]。注意这个地方他又转置了一次,因为在第一行计算prob的时候,他把一个行向量,转换成了列向量,然后现在要把0加在头上,所以在进行cumsun()运算的时候,又把结果从列向量转换成了行向量。仅从这两行代码里面,就大概只能看出这个意思了。不过简单一说,现在看不出来这个遗传算法的核心是什么样的,一般的神经网络里面只有连锁交换定律的应用,一般没有基因分离定律的应用。看这个样子,这是分离出来然后自由配对的做法,应该是比较高端的东西吧。
H. Bagging与Boosting最大的不同在哪里它们对模型性能最大的贡献在哪里
两种不同的集成算法,Bagging采用重复取样:boostrap 每个个体分类器所采用的训练样本都是从训练集中按等概率抽取的,因此Bagging的各子网能够很好的覆盖训练样本空间,从而有着良好的稳定性。
而Boosting注重分类错误的样本,将个体子网分类错误的训练样本的权重提高,降低分类错误的样本权重,并依据修改后的样本权重来生成新的训练样本空间并用来训练下一个个体分类器。然而,由于Boosting算法可能会将噪声样本或分类边界样本的权重过分累积,因此Boosting很不稳定,但其在通常情况下,其泛化能力是最理想的集成算法之一。
你得自己去查文献,别来这问,这没人做学术的,我也是偶尔看到你的提问。
I. 什么是boosting方法
Boosting 作为一种通用的学习算法,可以提高任一给定算法的性能。Kearns and Valiant最先指出,在PAC学习模型中,若存在一个多项式级的学习算法来识别一组概念,并且识别率很高,那么这组概念是强可学习的;而如果学习算法识别一组概念的正确率仅比随机猜测的略好,那么这组概念是弱可学习的。如果能将一个弱学习算法提升为强学习算法,那么在学习概念时,只要找到一个比随机猜测略好的弱学习算法,就可以将其提升为强学习算法,而不必直接去找通常情况下很难获得的强学习算法 。
再给你个官方网站:http://www.boosting.org/