机器学习入门路径

一.机器学习算法的重要性

   程序员是一个知识更新较为迅速的职业,这个行业的知识的更新速度,有时会超过你的学习速度。在互联网公司工作过的人都应该有这样的感触,我们正在从IT到DT的转型,算法在应用中变得越来越重要了。处在向DT转型中的我们也就理所当然的需要掌握DT的核心——算法。   现在很多产品,工程只是对算法进行包装,很多产品的核心是算法。学习机器学习相关算法是提升个人核心竞争力的重要一步。

二.机器学习本质问题

1、学习问题

  对于学习,机器学习有一个准确的定义:对于某类任务T和性能度量P,如果一个计算机程序在T上以P衡量的性能随着经验E而自我完善,那么我们称这个计算机程序在经验E中学习。例如:对于识别手写文字问题,任务T是识别和分类图像中的手写文字,性能标准P就是分类的正确率,训练经验E为已知分类的手写文字数据库。这里对于学习的定义与我们日常生活中的学习基本相一致,将学习过程抽象出来,有助于我们抓住学习的本质,将设计的学习算法应用得更加广泛。

2、设计一个学习系统

2.1 选择训练经验
  经验的选择对于最后的学习效果具有很重要的影响。被选择的训练经验E一个关键点是:E能否为系统的决策提供直接或者间接的反馈。比方下棋:学习系统可以接收直接的训练样例,即各种棋盘状态和相应的正确走法。也可以接收间接的训练信息,即很多过去的对弈序列以及最终结局。一般说来,从直接的训练反馈学习比间接反馈学习容易;训练经验的第二个重要属性是学习器可以再多大程度上控制训练样例序列。就是说学习器的决策多大程度上不受施教者的控制,而是通过自身的估计、规划;
训练经验的第三个重要属性是训练的样例是否能够尽可能得接近实例分布,而最终系统的性能P就是通过这种相似性来衡量的。对于学习器来说,只要类似的实例输入,那么就能够准确地处理。
算法设计(以西洋跳棋学习问题为例):
任务T:下西洋跳棋
性能标准P:击败对手的百分比
训练经验E:和自己进行对弈
现在需要选择:
(1)要学习的知识的确切类型;
(2)对于这个目标知识的表示;
(3)一种学习机制。

2.2 选择目标函数

  设计的主要任务是决定要学习的知识的确切类型以及执行程序怎样使用这些知识。在这里,学习器是从合法走子的跳棋博弈程序中开始的,那么最终学习器仅需学会从这些合法走子中选择最佳走子。这样,要学习的信息类型就是一个程序或函数,它对任何给定的棋局都能选出最好的走法,可称此函数为ChooseMove:B→M来表示这个函数,其以合法棋局集合中的状态B作为输入,并从合法走子集合中产生某个走子作为输出M。这样就把提高任务T的性能P的问题简化为学习像ChooseMove这样某个特定的目标函数问题。
因为这里的训练经验是间接的,所以直接发现ChooseMove这个目标函数式非常困难的,我们选择另一个可供选择的目标函数,这是一个评估函数,它为任何给定棋局赋予一个给定评分。令这个函数为V,并用V:B->R表示V把任何合法的棋局映射到一个实数值,我们让V给好的棋局赋予较高的评分。如果系统学会了这个目标函数,那么它便能够轻松地找到当前棋局最佳走法。
在实际情况中,我们一般仅仅希望学习算法能够得到近似的目标函数V,这个过程因此被称为函数逼近。

2.3 选择目标函数表示

  接下来需要表示好目标函数,它被学习程序用来描述要学习的函数V。一方面,我们希望选取一个非常有表征能力的描述,以最大可能的逼近理想的目标函数V,另一方面,越有表征能力的描述需要越多的训练数据,使程序能够从它表示的多种选择中选择。为了简化起见,现在选择一个简单的表示法:对于任何给定的棋盘状态,函数V可以通过以下棋盘参数的线性组合来计算。
x1:棋盘上黑子的数量
x2:棋盘上红子的数量
x3:棋盘上黑王的数量
x4:棋盘上红王的数量
x5:被红子威胁的黑子数量(即会在下一次被红子吃掉的黑子数量)
x6:被黑子威胁的红子数量
于是,学习程序把V(b) = w0 + w1*x1 + w2*x2 + w3*x3 + w4*x4 + w5*x5 + w6*x6
其中,w0-w6为权,由学习算法来选择,权决定了相应棋盘参数特征的相对重要性,w0是一个附加的状态常量。
  到目前为止,我们已经知道了学习问题的原型,即为它选择一种类型的训练经验、一个要学习的目标函数,以及这个函数的一种表示,于是现在的学习任务就是:
任务T:下西洋跳棋
性能标准P:击败对手的百分比
训练经验E:和自己对弈
目标函数:V:Board -> R
目标函数的表示:V(b) = w0 + w1*x1 + w2*x2 + w3*x3 + w4*x4 + w5*x5 + w6*x6
前三条是对学习任务的说明,后面两条制定了为实现这个学习程序的设计方案。这个设计的关键作用是把学习西洋跳棋战略的问题简化为学习目标函数表示中系数w0到w6值的问题。

2.4 选择函数逼近算法

为了学习目标函数,需要一系列训练样例,每一个样例描述了特定的棋盘状态b和它的训练值V-train(b),所以每个训练样例都是一个<b,V-train(b)>的序偶。
(1)估计训练值
学习器得到的信息仅仅只是对弈最后的胜负,最后的输赢情况很容易赋值,但是我们需要训练样例为每个棋盘状态赋予一个值。这里采取一种简单的方法:把任何中间棋局b的训练值V-train(b) 赋以V(Successor(b)),其中注意V~是目标函数的一个近似,Successor(b)表示b之后再轮到程序走棋时棋盘的状态(也就是程序走了一步和对手回应一步后的棋局)。所以,训练值估计法则是:
V-train(b) <--- V(Successor(b))
(2)调整权值
接下来就是选择最合适的权值wi。一种常用的方法是把最佳的假设定义为是训练值和假设V~预测出的值之间的误差平方和E最小:


2.5 最终设计

  西洋跳棋学习系统的最终设计可以用四个不同的程序模块来描述,这些模块在很多学习系统中都是核心组件,归纳在下图:


执行系统:用学会的目标函数来解决给定的任务,在此就是对弈西洋跳棋,它把新问题(新的一盘棋)的实例作为输入,产生一组解答路线(对弈历史记录)作为输出。在这里,执行系统采用的选择下一步走法的策略是由学到的评估函数V~来决定的。
鉴定器:以对弈的路线或者历史记录作为输入,输出目标函数的一系列训练样例。
泛化器:以训练样例作为输入,产生一个火速出假设,作为它对目标函数的估计。
实验生成器:以当前的假设作为输入,输出一个新的问题供执行系统去探索,它的作用是挑选新的实践问题,以使整个系统的学习速率最大化。
总体来看,设计西洋跳棋程序流程如下图:


3、机器学习的观点和问题

  机器学习问题经常归结于搜索问题,于是学习器的任务就是搜索整个空间,寻找与训练数据最佳拟合的假设。对于不同定义的假设空间的表示(例如,线性函数、逻辑描述、决策树、人工神经网络)对应有许多搜索算法。这些不同的假设表示是和与学习不同的目标函数。
  机器学习致力于回答以下问题:
存在什么样的算法能从假定的训练数据学习一般的目标函数?
多少训练数据时充足的?
学习器拥有的先验知识是怎样引导从样例进行泛化的过程的?
关于选择有效的后续训练经验,什么样的策略最好?
怎样把学习任务简化为一个或多个函数逼近问题?
学习器怎样自动地改变表示法来提高表示和学习目标函数的能力?

三、机器学习基础知识

3.1.线性代数

    线性代数知识是在工作中用的最广的大学知识,特别是矩阵相关知识在实际应用中使用最为广泛。很多人对于矩阵的SVD会解,但背后的物理意义却模糊不清。 

讲义链接:[Linear Algebra Review and Reference](http://ai-coder.com/batbus/pdf/cs229-linalg.pdf)

3.2.概率论

    概率知识是也是实际工作中使用较为广的知识。其中较为常用的就是贝叶斯定理了,在复习这部分的知识的时候,一定要弄清楚相关定理的前置条件。 

讲义链接:[Review of Probability Theory](http://ai-coder.com/batbus/pdf/cs229-prob.pdf)    

3.3.凸优化 

    在许多机器学习算法中,最终是求一个目标函数的最大值或最小值,很多时候这种问题最终归咎为目标函数的优化问题,实质是一种凸优化问题,所以读者需要掌握一些凸优化问题的基础知识。 

讲义链接:[Convex Optimization Overview](http://ai-coder.com/batbus/pdf/cs229-cvxopt.pdf) 

3.4.算法

    学习一种算法是,最好先从原论文入手,读不懂的时候可以参考一下博文或其他渠道,这样对于理解算法有好处。这里推荐大家直接学习Andrew Ng的公开课,讲的比较容易懂,对于初学者来说是一个好的学习资源。 

3.4.1常见的特征提取方法

    其实特征提取是作为监督学习中特别重要的一个环节。往往我们要处理的问题可能供处理的特征特别多,比如图像处理,如果完全用像素,对于一张1000*1000的图片,那么特征就是一个1000*1000这种高维的特征,如何降低这个特征的维度,这个过程就叫做特征提取(选择)。对于图像我们常用sift特征。常用的降维方法包括:

1.PCA(主成分分析) :这是一种无监督的降维方法,准确的说应该是一种空间映射方法,PCA一次寻找一组正交的映射空间,并且使得能够在这个映射空间上方差最大。这个方法使用的频率较高,也比较典型,比较容易掌握。一般的教材书中都有相关的介绍,在Andrew Ng的课程中有相关介绍,可以直接学习。 

2.基于树的方法 :基于树的方法可以通过剪枝的方式来去掉那些对于结果没什么大的影响的特征。这里面对于”熵”的理解,要强调一下,”熵”可以理解为不确定性,你可以认为是”商量”,熵越大,不确定性越高,就越需要”商量”,越小,代表确定性越高。关于树的相关方法,在国内的机器学习教材中都有明确的阐释。

3.SVD(矩阵分解): 矩阵分解这是机器学习里面非常重要的一个线性代数知识,能够很好的起到降维的效果。在自然语言处理中较为常用。比如X是word->document的矩阵,参考这篇博文理解一下:强大的矩阵奇异值分解(http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html)

3.4.2.常用机器学习算法

1.常见聚类算法 

  聚类算法是我们常用的算法其思想比较容易理解,常见的聚类算法包括Kmeans、EM算法等,下面简单罗列一下。

SimpleKmeans算法:接受输入参数K,然后将数据集划分为K歌聚簇,同一个聚簇中的相似度较高,不同聚簇的相似度较小。

  Xmeans算法:Kmeans的改进,在总体中通过Kmeans产生聚类,再分别对每个聚类进行Kmeas的迭代,将某些子类进行聚类,直到达到用户设定的次数为止。

  EM算法:期望最大化算法(Expectation Maximization Algorithm),是一种迭代算法,用于含有隐变量(hidden variable)的概率参数模型的最大似然估计或极大后验概率估计。EM算法背后的理论、推导需要重点掌握,对于理解其他的算法很有帮助。 

相关博文:[常用聚类算法介绍之聚类种类和算法列表](http://ai-coder.com/batbus/html/blog_detail.PHP?blog_id=250) 

2.常见分类、回归算法 

  如果我的问题最终是要将待处理的数据明确分为若干类别(常用的有二元分类、多元分类),那么就是分类问题,如果最终需要映射到一个数值区间,那么就是回归问题,比如预测一个人犯罪的概率,如果需要判断是否犯罪,那么就是一个分类问题(是和否),如果要给个概率那么就是一个回归问题。 

  常用的算法有SVM、线性回归(Linear Regression)、随机森林、朴素贝叶斯。 

  线性回归(Linear Regression):结果易于理解,计算上不复杂,但对非线性数据拟合不好。应该是线上应用最为广泛的模型,简约而不简单,更重要的是快。

  SVM:通俗的讲,SVM是一种二类分类模型,其模型的定义为特征空间上的间隔最大的线性分类器。其学习策略是使得间隔最大化,最终可以转化为凸优化问题。简单的理解就是,在低维空间中难以划分的问题,将其映射到一个高维空间,在高维空间使得数据可以线性划分。 

  朴素贝叶斯:朴素贝叶斯是贝叶斯理论的一部分,是一种概率模型,即选择较高概率的决策。其前置条件是: (1)每个特征之间相互独立。 (2)每个特征同等重要。 在数据较少的情况下仍然有效,可以处理多类别问题。但对于输入数据较为敏感。

  随机森林(Random Forest):随机森林比较适合做多分类问题,其优点是: 训练和预测速度快; 对训练数据的容错能力好; 实现简单且易并行。 当数据集中有大比例的数据缺失时仍然可以保持精度不变和能够有效地处理大的数据集;可以处理没有删减的成千上万的变量;能够在分类的过程中可以生成一个泛化误差的内部无偏估计;能够检测到特征之间的相互影响以及重要性程度。但容易出现过度拟合。 实际上该算法实际上可以理解为专投票算法,一个森林可以拆解成很多树,每个树都是一个决策算法,可以理解成一个领域专家,众多专家组合成一个森林,对于待处理的问题,专家组进行投票,最终少数服从多数,由票数决定结果。 

3.4.3深度学习相关算法 (这部分暂时不了解啊,慢慢来吧)

  深度学习是近几年较为火的一种学习方式,目前在实际工作中使用的越来越广,往往不需要较为复杂的调优就能达到其他常用的调优过后的机器学习算法达到的水平,也就是说,他的baseline很高,随着向caffee、tensorflow等框架使用的推广,这些深度模型实现起来越来越简单,所以工程师就越来越有必要掌握这些深度学习算法。你可以在机器上安装tensorflow就能够尝试在本机上进行手写体识别、word2Vector训练等。 关于学习,可以参考Stanford深度学习和NLP的公开课,讲的还比较透彻,但需要读者掌握在文章第二部分提到的一些数学知识。 

  RNN(Recursive Neural Network) RNN是较为常用的深度模型,常用的有两种变体,一种是时间递归神经网络(Recurrent neural network),另一种是结构递归神经网络(Recursive neural network)。

时间递归神经网络的神经元间连接构成有向图,而结构递归神经网络利用相似的神经网络结构递归构造更为复杂的深度网络。两者训练的算法不同,但属于同一算法变体。 Recurrent是在时间维度的展开,能够有效的表示信息在时间维度上从前往后的的传递和积累。Recursive是在空间维度的展开,你可以认为他是一种结构上递归的结构,对应为棵树。在NLP领域用的较为广泛,能够很好的提取出结构信息。

  目前最为常见的时间递归神经网络就是LSTM(Long-Short-Term-Memories),一般包括书入门、忘记门、输出门,能够很好的学习当前特征同时兼顾上下文信息。目前较多的用于NLP范畴,其能够较好的保留上下文信息,这样在语义理解、摘要生成、情感分析等问题处理上都能得到一个较好的结果。

  一般地,CNN的基本结构包括两层,其一为特征提取层,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征。一旦该局部特征被提取后,它与其它特征间的位置关系也随之确定下来;其二是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等。CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显示的特征抽取,而隐式地从训练数据中进行学习。

四、机器学习入门路径(借用Sunface-孙飞的观点。

   除却上述讲的基础知识外,还需要掌握一门编程语言,例如Python(相对容易入门,且应用越来越广泛)。后面可以大致分为:

第一步:

   推荐elements of machine learning,Machine Learning In Action(应用语言是Python),这本书最大的优点就是用较少的公式给你讲解了尽量多的基本算法,而且剖析到位,讲解生动,降低了机器学习的抽象程度。

第二步:

   可以学习一些网上的教学课程了,建议学习国外的,毕竟外国人的性格更擅长深入浅出。这里推荐Coursera上面Andrew Ng大神的Machine Learning课程。这门课程的特点如下:全面、深入浅出、有课堂作业来印证学习的内容。

第三步:

   这个时候可以培养一些全局观了,可以看这两本中文教材:周志华大神的<机器学习>、李航大神的<统计学习方法>, 英文书籍的话,可以看<Patten Recognition And Machine Learning> 和 <Elements of Statistical Learning>,  后者难度较大,但是内容很丰富,每次学习都会有新的收获。

第四步:

   到了上一步,就真的完全入门了,这一步就是选择自己的应用方向了,毕竟机器学习是一个笼统的概念。比如大数据分析预测、图模型、深度学习、自然语言处理、图像识别、语音识别等等,这些都是一些应用方向。

然后要讲讲机器学习的平台,现在最火的自然是Tensorflow了,谷歌公司用C++开发,用Python、Go(很快就会在官方的api库中正式发布,对此我还是很期待的,毕竟Go语言的性能是非常高的,工程师不像算法科学家,我们对于性能要求也是很苛刻的)做Api接口。学习这个平台可以从tensorflow上那些models学起,看看这些应用是怎么用tensorflow实现机器学习的。

参考:
http://blog.csdn.net/erlib/article/details/52725684
http://blog.csdn.net/AIvin24/article/details/7876294
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值