程序员是一个知识更新较为迅速的职业,这个行业的知识的更新速度,有时会超过你的学习速度。在互联网公司工作过的人都应该有这样的感触,我们正在从IT到DT的转型,算法在应用中变得越来越重要了。处在向DT转型中的我们也就理所当然的需要掌握DT的核心——算法。 现在很多产品,工程只是对算法进行包装,很多产品的核心是算法。学习机器学习相关算法是提升个人核心竞争力的重要一步。
执行系统:用学会的目标函数来解决给定的任务,在此就是对弈西洋跳棋,它把新问题(新的一盘棋)的实例作为输入,产生一组解答路线(对弈历史记录)作为输出。在这里,执行系统采用的选择下一步走法的策略是由学到的评估函数V~来决定的。
鉴定器:以对弈的路线或者历史记录作为输入,输出目标函数的一系列训练样例。
泛化器:以训练样例作为输入,产生一个火速出假设,作为它对目标函数的估计。
实验生成器:以当前的假设作为输入,输出一个新的问题供执行系统去探索,它的作用是挑选新的实践问题,以使整个系统的学习速率最大化。
总体来看,设计西洋跳棋程序流程如下图:
三、机器学习基础知识
线性代数知识是在工作中用的最广的大学知识,特别是矩阵相关知识在实际应用中使用最为广泛。很多人对于矩阵的SVD会解,但背后的物理意义却模糊不清。
讲义链接:[Linear Algebra Review and Reference](http://ai-coder.com/batbus/pdf/cs229-linalg.pdf)
概率知识是也是实际工作中使用较为广的知识。其中较为常用的就是贝叶斯定理了,在复习这部分的知识的时候,一定要弄清楚相关定理的前置条件。
讲义链接:[Review of Probability Theory](http://ai-coder.com/batbus/pdf/cs229-prob.pdf)
在许多机器学习算法中,最终是求一个目标函数的最大值或最小值,很多时候这种问题最终归咎为目标函数的优化问题,实质是一种凸优化问题,所以读者需要掌握一些凸优化问题的基础知识。
讲义链接:[Convex Optimization Overview](http://ai-coder.com/batbus/pdf/cs229-cvxopt.pdf)
学习一种算法是,最好先从原论文入手,读不懂的时候可以参考一下博文或其他渠道,这样对于理解算法有好处。这里推荐大家直接学习Andrew Ng的公开课,讲的比较容易懂,对于初学者来说是一个好的学习资源。
其实特征提取是作为监督学习中特别重要的一个环节。往往我们要处理的问题可能供处理的特征特别多,比如图像处理,如果完全用像素,对于一张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)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):随机森林比较适合做多分类问题,其优点是: 训练和预测速度快; 对训练数据的容错能力好; 实现简单且易并行。 当数据集中有大比例的数据缺失时仍然可以保持精度不变和能够有效地处理大的数据集;可以处理没有删减的成千上万的变量;能够在分类的过程中可以生成一个泛化误差的内部无偏估计;能够检测到特征之间的相互影响以及重要性程度。但容易出现过度拟合。 实际上该算法实际上可以理解为专投票算法,一个森林可以拆解成很多树,每个树都是一个决策算法,可以理解成一个领域专家,众多专家组合成一个森林,对于待处理的问题,专家组进行投票,最终少数服从多数,由票数决定结果。
深度学习是近几年较为火的一种学习方式,目前在实际工作中使用的越来越广,往往不需要较为复杂的调优就能达到其他常用的调优过后的机器学习算法达到的水平,也就是说,他的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时,避免了显示的特征抽取,而隐式地从训练数据中进行学习。
第一步:
推荐elements of machine learning,Machine Learning In Action(应用语言是Python),这本书最大的优点就是用较少的公式给你讲解了尽量多的基本算法,而且剖析到位,讲解生动,降低了机器学习的抽象程度。
第二步:
可以学习一些网上的教学课程了,建议学习国外的,毕竟外国人的性格更擅长深入浅出。这里推荐Coursera上面Andrew Ng大神的Machine Learning课程。这门课程的特点如下:全面、深入浅出、有课堂作业来印证学习的内容。
第三步:
这个时候可以培养一些全局观了,可以看这两本中文教材:周志华大神的<机器学习>、李航大神的<统计学习方法>, 英文书籍的话,可以看
第四步:
到了上一步,就真的完全入门了,这一步就是选择自己的应用方向了,毕竟机器学习是一个笼统的概念。比如大数据分析预测、图模型、深度学习、自然语言处理、图像识别、语音识别等等,这些都是一些应用方向。
然后要讲讲机器学习的平台,现在最火的自然是Tensorflow了,谷歌公司用C++开发,用Python、Go(很快就会在官方的api库中正式发布,对此我还是很期待的,毕竟Go语言的性能是非常高的,工程师不像算法科学家,我们对于性能要求也是很苛刻的)做Api接口。学习这个平台可以从tensorflow上那些models学起,看看这些应用是怎么用tensorflow实现机器学习的。
参考: