现在,机器学习变得十分诱人,它已在网页搜索、商品推荐、垃圾邮件检测、语音识别、图像识别以及天然语言处理等诸多领域发挥重要做用。和以往咱们显式地经过编程告诉计算机如何进行计算不一样,机器学习是一种数据驱动方法(data-driven approach)。然而,有时候机器学习像是一种"魔术",即便是给定相同的数据,一位机器学习领域专家和一位新手训练获得的结果可能相去甚远。html
本文简要讨论了实际应用机器学习时九个须要注意的重要方面。git
做者 | 张皓github
整理 | AI科技大本营(微信ID:rgznai100)算法
这多是你面对一个具体应用场景想到的第一个问题。编程
你可能会想"机器学习里面这么多算法,究竟哪一个算法最好"。很"不幸"的是,没有免费午饭定理(No Free LunchTheorem)告诉咱们对于任意两个学习算法,若是其中一个在某些问题上比另外一个好,那么必定存在一些问题另外一个学习算法(表现会)更好。所以若是考虑全部可能问题,全部算法都同样好。微信
"好吧",你可能会接着想, "没有免费午饭定理假定全部问题都有相同机会发生,但我只关心对我如今面对的问题,哪一个算法更好"。又很"不幸"的是,有可能你把机器学习里面所谓"十大算法"都试了一遍,而后感受机器学习"这东西根本没用,这些算法我都试了,没一个效果好的"。前一段时间"约战比武"的话题很热,其实机器学习和练武术有点像,把太极二十四式朝对方打一遍结果对方应声倒下这是不可能的。网络
机器学习算法是有限的,而现实应用问题是无限的,以有限的套路应对无限的变化,必定是会存在有的问题你没法用现有的算法解决的,岂有不败之理?app
所以,该选什么学习算法要和你要解决的具体问题相结合。不一样的学习算法有不一样的概括偏好(inductive bias),你使用的算法的概括偏好是否适应要解决的具体问题直接决定了学得模型的性能,有时你可能须要改造现有算法以应对你要解决的现实问题。框架
目标函数用于刻画什么样的模型是好的,和选择学习算法同样,选什么目标函数也要和具体问题相结合。大部分的教材和文献重点在呈现算法,对目标函数和优化方法的选择一般使用缺省值。以分类问题为例,咱们缺省地优化分类均等代价(cost)下的错误率。可是在你所要解决的问题中,问问本身这些问题:机器学习
除此以外还有其余的一些问题。这些问题存不存在,要不要考虑,该怎么考虑都是和你要处理的实际问题有关,最终体如今你的目标函数之中。
“我是谁?我从哪里来?我往哪里去?”是哲学里避不开的三个问题,而“选什么算法?选什么目标函数? 选什么优化方法?”是机器学习里常常遇到的三个问题,这三者的组合就构成了一个机器学习解决方案基本框架。一般,咱们使用现有的数值优化方法对目标函数进行优化,好比梯度降低(gradient descent),牛顿法等。
可是当目标函数非凸(non-convex),有多个局部极小(local minima)时,选什么优化方法会对结果产生直接影响。好比深度学习中一般目标函数有多个局部极小,使用不一样的参数初始化方法(如高斯(Gaussian)随机初始化,Xavier 初始化, MSRA 初始化等),不一样的优化方法(如SGD,带动量(momentum)的SGD, RMSProp, ADAM 等),或不一样的学习率(learning rate)策略等,都会对结果有很大影响。
另外一方面,即便目标函数是凸函数,设计合适的优化方法可能会使你的训练过程有质的飞跃。好比SVM 的优化是一个二次规划(quadratic programming)问题,能够经过调用现成的QP 软件包进行优化。然而,这个二次规划问题的大小和训练样本数成线性关系,当数据量很大时将致使巨大的开销。为了避开这个障碍,人们根据SVM 的特色设计出了SMO (sequential minimaloptimization)这样的高效优化方法。
不要偷看测试数据
咱们但愿学习器能从训练数据中尽量学出适用于全部潜在样本(sample)的广泛规律,从而能很好的泛化(generalize)到新样本。为了评估模型的泛化能力,咱们一般收集一部分数据做为测试集(testing set)计算测试偏差用以做为泛化偏差的近似。为了能获得较准的近似,咱们不能在训练阶段以任何方式偷看测试数据。
一个常见错误作法是用测试数据调模型的参数。这至关于老师在考试前向学生透露考试原题,这虽然可能会使学生在此次考试中拿到高分,但这不能有效反应学生是否对这门课学的很好,得到了对所学知识触类旁通的能力,获得的将是过于乐观的估计结果。调参的正确作法是从训练数据中再划分出一部分做为验证集(validation set),用训练集(training set)剩下的数据作训练,用验证集调参。
另外一个常见错误是用测试数据参加训练数据预处理(data pre-processing)。一般,数据在输入给模型以前会通过一些预处理,好比减去各维的均值,除以各维的方差等。若是这个均值和方差是由训练集和测试集数据一块儿计算获得的,这至关于间接偷看了测试数据。
这至关于老师在考前向学生划重点,虽然比直接透露原题好一些,因为学生知道了考试范围(即测试数据分布),也会使咱们获得过于乐观的估计。正确作法是只从训练数据中计算预处理所用的统计量,将这个量应用于测试集。
欠拟合/过拟合: 认准你的敌人
欠拟合(underfitting)一般是因为学习器的学习能力不足,过拟合(overfitting)一般是因为学习能力过于强大。二者都会影响模型的泛化能力,可是解决这两个问题的方法迥然不一样。解决欠拟合能够经过使用更复杂的模型,增长训练轮数等。缓解过拟合能够经过使用简单模型,正则化(regularization),训练早停(early-stopping)等。欠拟合比较容易解决,而过拟合是没法完全避免的,咱们只能缓和,减少其风险。所以,问题的关键在于认准你当前的敌人是欠拟合仍是过拟合。
判断欠拟合或过拟合最简单直接的方法是画出学习曲线(learning curve)。过拟合的表现是: 训练偏差很低(甚至为0),而测试偏差很高,二者有很大的差距。而欠拟合的表现是: 训练偏差和测试偏差很接近,但都很高,下图是两个例子,你能看出来哪一个处于过拟合,哪一个处于欠拟合吗?
通过前面这几部分你可能已经意识到了,机器学习不是把数据扔给机器而后本身能够撒手无论。机器学习不是"空手套白狼",若是咱们对问题/数据认识的越深入,咱们越容易找到概括假设与之匹配的学习算法,学习算法也越容易学到数据背后的潜在规律。
数据中特征的好坏直接影响学习算法的性能。若是数据之间相互独立而且与数据的标记有很好的相关性,学习过程将相对容易。但不少状况下,你手中数据的原始特征并无这么好的性质,特征和标记之间是一个很是复杂的映射关系。这时候机器智能须要人类智能的配合,咱们须要从原始数据中构造合适的特征。这个过程叫作特征工程(featureengineering),这一般须要领域知识和你对这个问题的认识。
你可能会想"既然机器学习能够学到从数据的表示到标记的映射,那么咱们能不能让机器自动地从数据的原始特征中学习到合适的表示呢",表示学习(representation learning)就专门研究这方面的内容。
深度学习的最大优势就在于其表示学习能力,经过不少层的堆叠,深度神经网络能够对输入数据进行逐层加工,从而把初始的,与输出目标关系不密切的表示转化为与输出目标关系密切的表示。这样将低层表示转化为高层表示后,用"简单模型"便可完成复杂的学习任务。所以,深度学习才能在计算机视觉,天然语言处理,语音识别这样数据的原始表示和数据的合适表示相差很大的任务上大放异彩。
通过上一节你可能会想“既然特征工程这么重要,那我就把想到的全部的特征组合都做为数据的特征不就行了吗”。这么作的结果会使特征维数增长,一方面会增长存储和计算开销,更重要的是,它会招来机器学习担心的另外一头猛兽: 维数灾难(curse ofdimensionality)。
因为你能拿到手中的训练数据是有限的,当维数增长时,输入空间(input space)的大小随维数指数级增长,训练数据占整个数据空间的比例将急剧降低,这将致使模型的泛化变得更困难。在高维空间中,样本数据将变得十分稀疏,许多的类似性度量在高维都会失效。
好比下图中,最左边的是原图,右边三张图看上去差异很大,但和原图都有着相同的欧氏距离。
解决维数灾难的一个重要途径是降维(dimension reduction),即经过一些手段将原始高维空间数据转变为一个低维子空间,在这个子空间中样本密度大幅提升,距离计算也更容易。特征选择(feature selection)和低维投影(如PCA)是用来处理高维数据的两大主流技术。
看了前面各部分的讨论可能你已经有点受不了了:“机器学习没有通式通法,要根据任务具体状况具体分析;要当心翼翼,不能偷看测试数据,要设法避免过拟合和欠拟合;特征工程很重要,可是特征又不能太多...哦天呐!这太麻烦了! 有没有什么能提高性能直截了当的方法啊!”。有!那就是收集更多的数据。一般状况下,你有不少的数据,可是学习算法通常和你设计出了很好的学习算法但手中数据不足相比,前者效果会更好。这是由于收集更多的数据是缓解过拟合最直接有效的方法。
收集更多的数据一般有下面两种办法:一种方法是收集更多的真实数据,这是最直接有效的方法。但有时收集数据很昂贵,或者咱们拿到的是第二手数据,数据就这么多。这就须要另外一个方法:从现有数据中生成更多数据,用生成的"伪造"数据看成更多的真实数据进行训练。这个过程叫作数据扩充(data augmentation)。以图像数据作分类任务为例,把图像水平翻转,移动必定位置,旋转必定角度,或作一点色彩变化等,这些操做一般都不会影响这幅图像对应的标记。而且你能够尝试这些操做的组合,理论上讲,你能够经过这些组合获得无穷多的训练样本。
在收集/生成数据过程当中一个要注意的关键问题是:确保你的数据服从同一分布。这好比说老师教了学生一学期的英语结果期末考试倒是考俄语,虽然英语和俄语在语言学上有必定的类似性,可是这给学习过程增长了不少困难。迁移学习(transfer learning)旨在研究数据分布变化状况下的学习算法的泛化能力,但若是你的目的不是作迁移学习方面的科学研究,建议你确保你的训练和测试数据服从同一分布,这会使问题简单许多。
面对大多数的任务,集成学习应当是你的必备招式。集成学习的目的在于结合多个弱学习器的优势构成一个强学习器,“三个臭皮匠,顶个诸葛亮”讲的就是这个道理。在各类机器学习/数据挖掘竞赛中,那些取得冠军的队伍一般会使用集成学习,有的甚至用成百上千个个体学习器来作集成。一般咱们面对一个实际问题时会训练获得多个学习器,而后使用模型选择(model selection)方法来选择一个最优的学习器。而集成学习则至关于把这些学习器都利用起来,所以,集成学习的实际计算开销并不比使用单一学习器大不少。
目前的集成学习方法大体能够分为两大类:
以Boosting 为表明的集成学习方法中每一个个体学习器相互有强依赖关系,必须序列化生成;
以Bagging 为表明的集成学习方法中每一个个体学习器不存在强依赖关系,能够并行化生成。
而从误差-方差分解(bias-variancedecomposition)的角度看, Boosting 主要关注下降误差,而Bagging 主要关注下降方差。欠拟合/过拟合这两个敌人是否是又一次出如今你眼前了呢?
参考文献
[1]. Domingos, Pedro. "A few useful things to know about machine learning."
Communications of the ACM 55.10 (2012): 78-87.
[2]. Glorot, Xavier, and Yoshua Bengio. "Understanding the difficulty of training
deep feedforward neural networks." Aistats. Vol. 9. 2010.
[3]. He, Kaiming, et al. "Delving deep into rectifiers: Surpassing human-level
performance on imagenet classification." Proceedings of the IEEE international
conference on computer vision. 2015.
[4]. Kingma, Diederik, and Jimmy Ba. "Adam: A method for stochastic
optimization." arXiv preprint arXiv:1412.6980 (2014).
[5]. Li, Fei-Fei, Andrej Karpathy, and Justin Johnson. CS231n: Convolutional
Neural Networks for Visual Recognition. Stanford. 2016.
[6]. Lin, Hsuan-Tien. Machine Learning Foundations. National Taiwan University.
[7]. Lin, Hsuan-Tien. Machine Learning Techniques. National Taiwan University.
[8]. Murphy, Kevin P. Machine learning: a probabilistic perspective. MIT press,
2012.
[9]. Ng, Andrew. Machine learning yearning. Draft, 2016.
[10]. Ng, Andrew. CS229: Machine Learning. Stanford.
[11]. Platt, John. "Sequential minimal optimization: A fast algorithm for training
support vector machines." (1998).
[12]. Tieleman, Tijmen, and Geoffrey Hinton. "Lecture 6.5-rmsprop: Divide the
gradient by a running average of its recent magnitude." COURSERA: Neural
networks for machine learning 4.2 (2012).
[13]. Wei, Xiu-Shen. Must Know Tips/Tricks in Deep Neural Networks.
http://lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html.
[14]. Wolpert, David H. "The lack of a priori distinctions between learning
algorithms." Neural computation 8.7 (1996): 1341-1390.
[15]. Wolpert, David H., and William G. Macready. No free lunch theorems for
search. Vol. 10. Technical Report SFI-TR-95-02-010, Santa Fe Institute, 1995.
[16]. Zhou, Zhi-Hua. Ensemble methods: foundations and algorithms. CRC
press, 2012.
[17]. Zhou, Zhi-Hua. "Learnware: on the future of machine learning." Frontiers
of Computer Science 10.4 (2016): 589-590.
[18]. 周志华著. 机器学习, 北京: 清华大学出版社, 2016 年1 月.
做者github地址
https://github.com/HaoMood/