【转载】李航博士的《浅谈我对机器学习的理解》 机器学习与自然语言处理

李航博士的《浅谈我对机器学习的理解》 机器学习与自然语言处理

[日期:2015-01-14] 来源:新浪长微博  作者: 李航 [字体:  ]

  算算时间,从开始到现在,做机器学习算法也将近八个月了。虽然还没有达到融会贯通的地步,但至少在熟悉了算法的流程后,我在算法的选择和创造能力上有了不小的提升。实话说,机器学习很难,非常难,要做到完全了解算法的流程、特点、实现方法,并在正确的数据面前选择正确的方法再进行优化得到最优效果,我觉得没有个八年十年的刻苦钻研是不可能的事情。其实整个人工智能范畴都属于科研难题,包括模式识别、机器学习、搜索、规划等问题,都是可以作为独立科目存在的。我不认为有谁可以把人工智能的各个方面都做到极致,但如果能掌握其中的任一方向,至少在目前的类人尖端领域,都是不小的成就。

  这篇日志,作为我2014年的学业总结,详细阐述目前我对机器学习的理解,希望各位看官批评指正,多多交流!

  机器学习(MachineLearning),在我看来就是让机器学习人思维的过程。机器学习的宗旨就是让机器学会“人识别事物的方法”,我们希望人从事物中了解到的东西和机器从事物中了解到的东西一样,这就是机器学习的过程。在机器学习中有一个很经典的问题:

  “假设有一张色彩丰富的油画,画中画了一片茂密的森林,在森林远处的一棵歪脖树上,有一只猴子坐在树上吃东西。如果我们让一个人找出猴子的位置,正常情况下不到一秒钟就可以指出猴子,甚至有的人第一眼就能看到那只猴子。”

  那么问题就来了,为什么人能在上千种颜色混合而成的图像中一下就能识别出猴子呢?在我们的生活中,各种事物随处可见,我们是如何识别出各种不同的内容呢?也许你可能想到了——经验。没错,就是经验。经验理论告诉我们认识的所有东西都是通过学习得到的。比如,提起猴子,我们脑海里立刻就会浮现出我们见过的各种猴子,只要画中的猴子的特征与我们意识中的猴子雷同,我们就可能会认定画中画的是猴子。极端情况下,当画中猴子的特征与我们所认识某一类猴子的特征完全相同,我们就会认定画中的猴子是哪一类。

  另一种情况是我们认错的时候。其实人识别事物的错误率有的时候也是很高的。比如,当我们遇见不认识的字的时候会潜意识的念字中我们认识的部分。比如,“如火如荼”这个词,是不是有朋友也跟我一样曾经念过“如火如茶(chá)”?我们之所以犯错,就是因为在我们没有见过这个字的前提下,我们会潜意识的使用经验来解释未知。

  目前科技如此发达,就有牛人考虑可不可以让机器模仿人的这种识别方法来达到机器识别的效果,机器学习也就应运而生了。

  从根本上说,识别,是一个分类的结果。看到四条腿的生物,我们可能会立即把该生物归为动物一类,因为我们常常见到的四条腿的、活的东西,九成以上是动物。这里,就牵扯出了概率的问题。我们对身边的事物往往识别率很高,是因为人的潜意识几乎记录了肉眼看到的事物的所有特征。比如,我们进入一个新的集体,刚开始大家都不认识,有的时候人和名字都对不上号,主要原因就是我们对事物的特征把握不够,还不能通过现有特征对身边的人进行分类。这个时候,我们常常会有这种意识:哎,你好像叫张三来着?哦,不对,你好像是李四。这就是分类中的概率问题,有可能是A结果,有可能是B结果,甚至是更多结果,主要原因就是我们的大脑收集的特征不够多,还无法进行准确分类。当大家都彼此熟悉了之后,一眼就能识别出谁是谁来,甚至极端情况下,只听声音不见人都能进行识别,这说明我们已经对该事物的特征把握相当精确。

  所以,我认为,人识别事物有四个基本步骤:学习、提取特征、识别、分类。

  那么机器可不可以模仿这个过程来实现识别呢?答案是肯定的,但是没有那么容易。难题有三:第一,人的大脑有无数神经元进行数据交换和处理,在目前的机器中还达不到同等的处理条件;第二,人对事物特征的提取是潜意识的,提取无意识情况下的信息,误差很大;第三,也是最重要的一点,人的经验来自于人每时每刻的生活中,也就是人无时无刻都处在学习中,如何让机器进行各个方面的自主学习?因此,目前在人工智能领域始终还没达到类人的水平,我认为主要原因就是机器没有潜意识。人的潜意识其实并不完全受人的意识支配,但却可以提高人类识别事物的概率。我们无法给机器加载潜意识,因为主动加载的意识就是主观意识,在机器里无法完成人类潜意识的功能。所以,以目前的发展情况来看,要达到完全类人,还有不短的时间。但即便如此,与人的思维差别很大的机器依然可以为我们的生活带来帮助。比如,我们常用的在线翻译、搜索系统、专家系统等,都是机器学习的产物。

  那么,如何实现机器学习呢?

  整体上看,机器学习就是模仿人识别事物的过程,即:学习、提取特征、识别、分类。由于机器不能跟人类思维一样根据事物特征自然而然的选择分类方法,所以机器学习方法的选择依然还需要人工选择。目前,机器学习的方法主要有三种:监督学习、半监督学习和无监督学习。监督学习是利用一组已知类别的样本调整分类器的参数,使其达到所要求性能的过程。白话一点,就是根据已知的,推断未知的。代表方法有:Nave Bayes、SVM、决策树、KNN、神经网络以及Logistic分析等;半监督方法主要考虑如何利用少量的标注样本和大量的未标注样本进行训练和分类的问题,也就是根据少量已知的和大量未知的内容进行分类。代表方法有:最大期望、生成模型和图算法等。无监督学习是利用一组已知类别的样本调整分类器的参数,使其达到所要求性能的过程。也就是及其自个儿学。代表方法有:Apriori、FP树、K-means以及目前比较火的Deep Learning。从这三方面看,无监督学习是最智能的,有能实现机器主动意识的潜质,但发展还比较缓慢;监督学习是不太靠谱的,从已知的推断未知的,就必须要把事物所有可能性全都学到,这在现实中是不可能的,人也做不到;半监督学习是“没办法中的办法”,既然无监督学习很难,监督学习不靠谱,就取个折中,各取所长。目前的发展是,监督学习技术已然成熟,无监督学习还在起步,所以对监督学习方法进行修改实现半监督学习是目前的主流。但这些方法基本只能提取信息,还不能进行有效的预测(人们就想,既然没法得到更多,就先看看手里有什么,于是数据挖掘出现了)。

  机器学习方法非常多,也很成熟。下面我挑几个说。

  首先是SVM。因为我做的文本处理比较多,所以比较熟悉SVM。SVM也叫支持向量机,其把数据映射到多维空间中以点的形式存在,然后找到能够分类的最优超平面,最后根据这个平面来分类。SVM能对训练集之外的数据做很好的预测、泛化错误率低、计算开销小、结果易解释,但其对参数调节和核函数的参数过于敏感。个人感觉SVM是二分类的最好的方法,但也仅限于二分类。如果要使用SVM进行多分类,也是在向量空间中实现多次二分类。

  SVM有一个核心函数SMO,也就是序列最小最优化算法。SMO基本是最快的二次规划优化算法,其核心就是找到最优参数α,计算超平面后进行分类。SMO方法可以将大优化问题分解为多个小优化问题求解,大大简化求解过程。

  SVM还有一个重要函数是核函数。核函数的主要作用是将数据从低位空间映射到高维空间。详细的内容我就不说了,因为内容实在太多了。总之,核函数可以很好的解决数据的非线性问题,而无需考虑映射过程。

  第二个是KNN。KNN将测试集的数据特征与训练集的数据进行特征比较,然后算法提取样本集中特征最近邻数据的分类标签,即KNN算法采用测量不同特征值之间的距离的方法进行分类。KNN的思路很简单,就是计算测试数据与类别中心的距离。KNN具有精度高、对异常值不敏感、无数据输入假定、简单有效的特点,但其缺点也很明显,计算复杂度太高。要分类一个数据,却要计算所有数据,这在大数据的环境下是很可怕的事情。而且,当类别存在范围重叠时,KNN分类的精度也不太高。所以,KNN比较适合小量数据且精度要求不高的数据。

  KNN 有两个影响分类结果较大的函数,一个是数据归一化,一个是距离计算。如果数据不进行归一化,当多个特征的值域差别很大的时候,最终结果就会受到较大影响;第二个是距离计算。这应该算是KNN的核心了。目前用的最多的距离计算公式是欧几里得距离,也就是我们常用的向量距离计算方法。

  个人感觉,KNN最大的作用是可以随时间序列计算,即样本不能一次性获取只能随着时间一个一个得到的时候,KNN能发挥它的价值。至于其他的特点,它能做的,很多方法都能做;其他能做的它却做不了。

  第三个就是Naive Bayes了。Naive Bayes简称NB(牛X),为啥它牛X呢,因为它是基于Bayes概率的一种分类方法。贝叶斯方法可以追溯到几百年前,具有深厚的概率学基础,可信度非常高。Naive Baye中文名叫朴素贝叶斯,为啥叫“朴素”呢?因为其基于一个给定假设:给定目标值时属性之间相互条件独立。比如我说“我喜欢你”,该假设就会假定 “我”、“喜欢”、“你”三者之间毫无关联。仔细想想,这几乎是不可能的。马克思告诉我们:事物之间是有联系的。同一个事物的属性之间就更有联系了。所以,单纯的使用NB算法效率并不高,大都是对该方法进行了一定的改进,以便适应数据的需求。

  NB 算法在文本分类中用的非常多,因为文本类别主要取决于关键词,基于词频的文本分类正中NB的下怀。但由于前面提到的假设,该方法对中文的分类效果不好,因为中文顾左右而言他的情况太多,但对直来直去的老美的语言,效果良好。至于核心算法嘛,主要思想全在贝叶斯里面了,没啥可说的。

  第四个是回归。回归有很多,Logistic回归啊、岭回归啊什么的,根据不同的需求可以分出很多种。这里我主要说说Logistic回归。为啥呢?因为 Logistic回归主要是用来分类的,而非预测。回归就是将一些数据点用一条直线对这些点进行拟合。而Logistic回归是指根据现有数据对分类边界线建立回归公式,以此进行分类。该方法计算代价不高,易于理解和实现,而且大部分时间用于训练,训练完成后分类很快;但它容易欠拟合,分类精度也不高。主要原因就是Logistic主要是线性拟合,但现实中很多事物都不满足线性的。即便有二次拟合、三次拟合等曲线拟合,也只能满足小部分数据,而无法适应绝大多数数据,所以回归方法本身就具有局限性。但为什么还要在这里提出来呢?因为回归方法虽然大多数都不合适,但一旦合适,效果就非常好。

  Logistic 回归其实是基于一种曲线的,“线”这种连续的表示方法有一个很大的问题,就是在表示跳变数据时会产生“阶跃”的现象,说白了就是很难表示数据的突然转折。所以用Logistic回归必须使用一个称为“海维塞德阶跃函数”的Sigmoid函数来表示跳变。通过Sigmoid就可以得到分类的结果。

  为了优化Logistic回归参数,需要使用一种“梯度上升法”的优化方法。该方法的核心是,只要沿着函数的梯度方向搜寻,就可以找到函数的最佳参数。但该方法在每次更新回归系数时都需要遍历整个数据集,对于大数据效果还不理想。所以还需要一个“随机梯度上升算法”对其进行改进。该方法一次仅用一个样本点来更新回归系数,所以效率要高得多。

  第五个是决策树。据我了解,决策树是最简单,也是曾经最常用的分类方法了。决策树基于树理论实现数据分类,个人感觉就是数据结构中的B+树。决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。决策树计算复杂度不高、输出结果易于理解、对中间值缺失不敏感、可以处理不相关特征数据。其比 KNN好的是可以了解数据的内在含义。但其缺点是容易产生过度匹配的问题,且构建很耗时。决策树还有一个问题就是,如果不绘制树结构,分类细节很难明白。所以,生成决策树,然后再绘制决策树,最后再分类,才能更好的了解数据的分类过程。

  决策树的核心树的分裂。到底该选择什么来决定树的分叉是决策树构建的基础。最好的方法是利用信息熵实现。熵这个概念很头疼,很容易让人迷糊,简单来说就是信息的复杂程度。信息越多,熵越高。所以决策树的核心是通过计算信息熵划分数据集。

  我还得说一个比较特殊的分类方法:AdaBoost。AdaBoost是boosting算法的代表分类器。boosting基于元算法(集成算法)。即考虑其他方法的结果作为参考意见,也就是对其他算法进行组合的一种方式。说白了,就是在一个数据集上的随机数据使用一个分类训练多次,每次对分类正确的数据赋权值较小,同时增大分类错误的数据的权重,如此反复迭代,直到达到所需的要求。AdaBoost泛化错误率低、易编码、可以应用在大部分分类器上、无参数调整,但对离群点敏感。该方法其实并不是一个独立的方法,而是必须基于元方法进行效率提升。个人认为,所谓的“AdaBoost是最好的分类方法”这句话是错误的,应该是“AdaBoost是比较好的优化方法”才对。

好了,说了这么多了,我有点晕了,还有一些方法过几天再写。总的来说,机器学习方法是利用现有数据作为经验让机器学习,以便指导以后再次碰到的决策。目前来说,对于大数据分类,还是要借助分布式处理技术和云技术才有可能完成,但一旦训练成功,分类的效率还是很可观的,这就好比人年龄越大看待问题越精准的道理是一样的。这八个月里,从最初的理解到一步步实现;从需求的逻辑推断到实现的方法选择,每天都是辛苦的,但每天也都是紧张刺激的。我每天都在想学了这个以后可以实现什么样的分类,其实想想都是让人兴奋的。当初,我逃避做程序员,主要原因就是我不喜欢做已经知道结果的事情,因为那样的工作没有什么期盼感;而现在,我可以利用数据分析得到我想象不到的事情,这不仅满足了我的好奇感,也让我能在工作中乐在其中。也许,我距离社会的技术需求还有很远的距离,但我对自己充满信心,因为,我不感到枯燥,不感到彷徨,虽然有些力不从心,但态度坚定。

时间: 2024-10-13 16:19:41

【转载】李航博士的《浅谈我对机器学习的理解》 机器学习与自然语言处理的相关文章

李航博士:浅谈我对机器学习的理解

原文:http://www.itongji.cn/article/06294DH015.html 机器学习方法非常多,也很成熟.下面我挑几个说. 首先是SVM.因为我做的文本处理比较多,所以比较熟悉SVM.SVM也叫支持向量机,其把数据映射到多维空间中以点的形式存在,然后找到能够分 类的最优超平面,最后根据这个平面来分类.SVM能对训练集之外的数据做很好的预测.泛化错误率低.计算开销小.结果易解释,但其对参数调节和核函数的参 数过于敏感.个人感觉SVM是二分类的最好的方法,但也仅限于二分类.如果

浅谈元类(个人理解)

浅谈元类(个人理解) 我们知道在python中一切皆对象(object),那么所以有的对象都成了object的子类,那么object类又是由谁创建的呢? 实际上,能够创建类的类,叫元类.还有一个概念就是:元类创建了object类,同时又是object类的子类(这是什么鬼?我们就不去考虑这个逻辑了,已经完美解决了先有鸡还是先有蛋的问题了). 元类实际还是所有类的创建者,即使所有类(包括元类自己)都是object的子类,他们的关系如下: Interesting...... 原文地址:https://

10 浅谈 装饰器模式的理解与使用

在不改变现有类结构的情况下,为这个类添加一个新的功能,这就是装饰器模式 所属与结构型模式, 这种模式的特点是:需要创建一个装饰类来包装原有的类,并且提供额外的功能. 为了解决:平时使用继承的方式,会带入许多静态的方法,导致子类过度饱和,膨胀. 举例子:悟空拥有七十二变,不管它怎么变化,他的本质还是一只猴子,但是他又有变化后的一些本领(功能) 实现:装饰类包含原有类的实例对象,即可实现装饰器模式 开始: 定义一个形状的接口 //画图接口 public interface Shape { void

浅谈对差分隐私的理解

在听完第五组的报告之后,浅谈一下对差分隐私的认识,主要针对差分隐私的思想做一个大致的梳理. 为什么会产生差分隐私? 由于有些“聪明”的用户为了知道某些信息,可以通过两次查询结果的差异进行对比,从而在两次数据的对比中找到有用的信息.正如在杨顼组的报告中提到的查询二等兵约瑟夫阿伦是否阵亡的信息,可以通过查询D5和D6两次数据结果,将两次数据结果进行对比就可以知道约瑟夫阿伦是否阵亡的消息. 差分隐私的主要思想: 差分隐私是基于噪音的安全计算方法,它的思想是:对计算过程用噪音干扰,让原始数据淹没在噪音中

浅谈js中继承的理解和实现

一.前言 java.C#等正统面向对象语言都会提供类似extend之类的处理类的继承的方法,而javascript并没有提供专门的方法用于继承,在javascript中使用继承需要一点技巧.js中实例的属性和行为是由构造函数和原型两部分组成的,js的继承也分为这两部分.下面给大家分享一下在js中如何实现继承,讲的不对的地方望大家指正! 二.继承构造函数中的属性和行为 我们定义两个类Animal和Bird类,来实现js中类的继承. //定义Animal类 function Animal(name)

浅谈GIT之底层对象理解

一.基本概述 首先定下一个基调就是Git并不是比SVN任何方面都好.SVN在某些功能或方面或者某些场景下也优于Git. 只是这篇文章讨论涉及到的点要与SVN相比,然后突出Git的某些方面的优越性而已. 对于Git而言,它本身是一个内容寻址文件系统,会将需要存储的东西按元数据meta data方式存储在一个KV数据库里面, 类似HashMap的这样的键值对结构,然后会按照内容生成相应的唯一hashcode作为内容的key, 而对于SVN而言,则是按照文件方式存储. 所以,看出一个特点就是如果需要的

浅谈对闭包(Closure)的理解

在理解闭包前理解JavaScript的作用域是有必要的,如果有兴趣,请移步"对JavaScript作用域的认识" 什么是闭包 闭包就是指有权访问另一个函数作用域中变量的函数,通俗点讲闭包就是能够读取其他函数变量的函数.创建闭包的常见方式,就是在一个函数内部创建另一个函数. 1 function fn1() { 2 var a = 1 ; 3 function fn2() { 4 alert(a); 5 } 6 return fn2; 7 } 8 9 var result = fn1()

浅谈对JIT编译器的理解。

1. 什么是Just In Time编译器? Hot Spot 编译 当 JVM 执行代码时,它并不立即开始编译代码.这主要有两个原因: 首先,如果这段代码本身在将来只会被执行一次,那么从本质上看,编译就是在浪费精力.因为将代码翻译成 java 字节码相对于编译这段代码并执行代码来说,要快很多. 当 然,如果一段代码频繁的调用方法,或是一个循环,也就是这段代码被多次执行,那么编译就非常值得了.因此,编译器具有的这种权衡能力会首先执行解释后的代 码,然后再去分辨哪些方法会被频繁调用来保证其本身的编

浅谈对ionic项目的理解

在思考怎么将客户端app连接到服务器的时候,就在想ionic项目的本质是什么,一开始因为ionic serve这一命令,我以为它自己就是个服务器,但是后来一细想又感觉不是这样,不然客户端又该怎么和服务端进行交互呢?而ionic本质正好验证了我的猜想. 通过ionic info我们可以发现ionic项目所需环境如下: Your system information: ordova CLI: 6.4.0 Ionic CLI Version: 2.1.17 Ionic App Lib Version:

浅谈一下对runloop的理解

一 什么是RunLoop? 从字面意思看就是运行循环,其实内部就是do-while循环,这个循环内部不断地处理各种任务(比 如Source,Timer,Observer) 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(run方法) RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source,Timer,Observer,那么就直接退出RunLoop 二 你在开发过程中怎么使用RunLoop?什么应用场景? 开启一个常驻线