机器学习是什么

世界上无论是多难的学科,只要你肯花时间,没有先天性的障碍,凭借普通人的能力都能理解80%。即便是相对论,慢慢磨个五六年,也能理解透彻,更何况属于工科的机器学习。

其次,学完Andrew的课程,你确实能够找到工作,甚至能够去湾区,加入明星企业;又或者哪个大牛的start-up。最近听的讲座,那些所谓搞大数据的人,到过各种明星企业(LinkedIn,Google,Coursera)的人,其实连大数据是什么都没有搞清楚,只知道讲怎么存数据、取数据、处理数据,展示数据。核心的机器学习方法,一点都不会。无非是把各种架构、框架拿来组合,实践的时候看看哪个部分出问题了,然后想想工程办法去解决。如果你学完Andrew,简直是他们眼中的牛人了。

既然我都同意了第一名用户的主要观点了,我为什么要写本文呢?答案是:我就是来打击像第一名用户的这种思想的人的。我首先讲讲自己对机器学习的理解:

  1. 机器学习究竟是是什么:数学。 请注意,不是算法,不是业务领域,是数学。如果要更详细点,是数学分析、线性代数、概率论、拓扑学、矩阵分析、统计理论、凸优化、数值分析、实分析、泛函分析、随机过程,微分流形等等。算法仅仅是机器学习的最后一步,而且实际上是最简单的一步。套用爱迪生的一句话,机器学习 = 1%的数学 + 9%的业务+ 90%的算法。但是这1%的数学,甚至比余下的99%都还要重要。
  2. 机器学习的领域(业务)知识是什么:简单来讲,领域知识就是你所要处理的数据所蕴含的知识。这部分知识对于模型的好坏至关重要,因为这部分知识是被运用到机器学习的最早阶段,即数据采集和处理。这一步没有做好,遑论建模。特别是热衷于从事生物、医学、金融等方向的朋友,如果没有一个好的领域专家加入团队,请做好学习一年以上相关领域知识的打算。至于其他领域的知识,比如网络、LBS、推荐系统等等,由于和计算机关系很近,倒不必学这么久的领域知识,看一本书、十几篇论文足矣。
  3. 机器学习的算法是什么:这个问题其实可以扩展为,算法是什么?算法,其实就是数学模型的现实应用。由于受到物理计算机模型的限制,一般所讲的算法都是基于随机存取模型的。但实质上,冯诺伊曼体系结构不过是图灵机的实现,而图灵机本质上就是数学函数。我们所学的基础算法,其实也不过是可以抽象为数学函数的解法而已。计算机科学的伪科学成分,大多来源于此。

打脸开始,下面我针对每一处引文,进行反驳:

  1. 反过来讲,如果你的LR可以用到了极致,那么你不会KKT条件又怎样,你不明白SVM推导又怎样,难道这样的同学就不可以从事跟LR相关的工作吗?”:且不论人家没有说LR不好,光是这样的回答就难以自圆其说。 KKT条件基本上是解决一切凸优化问题的基础,解凸优化问题大多数情况下就是解KKT条件,包括答主所说的LR问题也可以归结为求解KKT条件。答主没有仔细推导过KKT条件,自然无法理解KKT条件的重要性。另一方面,SVM不属于LR的范畴,而是一个二次优化问题。推导SVM不在于说你能否重现SVM,这本来就没啥意思,而在于说你是否了解这是一个二次优化问题,然后进一步通过优化问题的一般情况和二次优化的特殊情况,对SVM进行合理的扩展,例如加入惩罚函数、核函数、正则项。每一个扩展都是追求卓越的过程,就跟我们写排序算法,最开始是基础归并排序,然后是快排,然后是随机快排,最后是加入了插入排序的随机快排。如果你连最基础的快排都无法理解、无法实现,怎么考虑快速排序的其他形式呢?难道学算法最后就只学了归并排序?一个极致的归并排序走天下
  2. “把LR用到极致,不光可以处理非线性的,还可以做大规模的,online的,distributed的,multi-label的,多了去了。”:LR名字中就是Linear Regression,即便是广义线性模型,也只能解决线性问题。哪怕说有指数,加个对数之后,目标函数自然也是线性的,根本不是典型的非线性问题。什么是典型的非线性优化问题,请参考SVM。另一方面, 答主所说的三个方向,完全就是最为基础的数学变换。online基本是做递推学习或者并行计算,考虑样本无关性之后进行相关数学变换就能得到; distributed基本是分离变量,或者说求一个近似的下降方向(SGD算法),本质上还是数学; multi-label更是数学应用,无非是 one vs one, one vs rest, 和 all in one等几种策略,前两种策略是模型复用,最后一种是新建模型,本质上还是数学。如果朝着这个方向去学习,根本没什么意义。就像你用C++写了一个排int数组的程序,又写了一个排double数组的程序,但是就是不去学习如何编写最短路径算法,还说排序问题是80%计算机所做的问题。
  3. “可不要忘了,号称最牛逼的Vowpal Wabbit不也就把LR做到了极致吗?”: 我查了一下人家的Github Tutorial(Tutorial · JohnLangford/vowpal_wabbit Wiki · GitHub),拜托,人家实现了SVM,这还仅仅是把 LR做到极限?重申一遍,SVM是二次优化问题,不是线性优化问题
  4. “训练并不是靠时间和地点堆砌的。这里的时间指的是匿名用户指的“每周十七八个小时”,地点则是指“顶级学校””任何一项技能的训练,都基本遵循一万小时定律。一个学期最多20周,每周就算你花了25个小时来学模式识别,也不过500小时。比起一万小时,这才5%,都还没有跨过门槛,还怎么谈时间的堆砌;地点的堆砌则更无厘头了,人家也没说什么顶级学校,这样批判很不好,没什么逻辑可言。在我看来,好学校最好的就是人,好的老师讲得透彻,好的同学可以交流,《模式识别》课程配备了4个助教给我们改作业+答疑,老师还把自己多年来的心得发给我们,供我们课外阅读。我不知道,真的还有哪种环境可以让人更快地“让人从一个境界到达另一个境界”。补充一点未查证但是流传甚广的消息, Andrew Ng在Standford授课的时候,可是要求他的学生24小时之类提交算法实现的,我也不知道这是否是答主说的堆砌?
  5. 没多难,不是rocket science,认真学多花时间总是可以学成的。同样的问题我以前问过“C语言这玩意有多难?”,后来发现把指针弄明白了以后没多难,不像谭老师讲那么玄乎。“函数式编程这玩意有多难?”,也没多难,坐下来把主要概念看明白了多写写也就会了”: 我首先承认机器学习不难,但是真的是这么简单?我能说C语言指针我就学了一周,函数式编程看了一个月,就基本上入门了。但是我学机器学习,可是花了整整一年半的时间学习数学,外加自己课外勤奋,才能说勉强入门的?各行各业虽然没有贵贱,但是总有一个知识密度的问题,有的领域知识密度大,比如数学、物理、化学、生物等等,有些领域知识密度相对较小,比如行政、驾驶、水电工、保安。 用一个知识密度如此之低的C语言指针和一个中等密度的函数式编程,去跟学科级难度的机器学习来比较,简直是没有逻辑,我看不出这跟说“驾驶汽车有多难?也没多难,驾驶飞机又能难道那里去呢?有什么区别。真要比较,你得用计算机程序语言和机器学习比,而且个人认为前者还是稍微简单一点的。
  6. “问题在于,现实生活中的工作里哪里需要这么多新的东西?非常少,你有一个open mind能随时接受新东西你就已经领先别人一大截了,如果你还能创造出来新的东西(并且是个实用的东西),那不管在哪个公司,你都是一颗新星了”:答主这种回答,不外乎有急于求成,误人子弟之嫌。的确,如果你刚刚入职,怎么可能创造出很多问题来呢?可是,你是想今后几十年靠这门技术养家糊口还是仅仅去投机淘金?举个例子,学计算机可以去北大青鸟,也可以去985高校。北大青鸟教你最实际的编程技巧,告诉你这没多难,难的玩意你也遇不到。高校教你的全是理论,实践基本靠自觉,还告诉你这玩意挺折磨人的。现在,这两个选择摆在你面前,你选哪个?我肯定选择后者,虽然北大青鸟可以让我3年不到毕业,还月薪8000,但是这些东西不过是肤浅的知识,人人都可以学会。不到3年,就基本上到顶了,不是永无止境的waiting-list,就是30岁后基本失业。如果选择后者,那么前景更广,扎实的理论基础将会成为我职业生涯的最好支持。
  7. “嫌你打击自信心?当然嫌,至少我嫌,给本身需要信心的人泼冷水这本身就不是什么好事,何况还是在这样公开的场合下。”:支持题主本是好事,但是掩盖事实真相让题主走向一条荆棘小路就不是什么好事了。要知道,学习最忌讳半途而废,因为你啥也没学精通,还浪费了你学习其他东西的时间,这也就是所谓的机会成本。 把事实真真切切的讲出来,才是回答问题的本质。 我虽然也觉得匿名用户回答欠妥,但是排名第一用户更欠妥。与其让人家不知深浅而一头扎进泳池,倒不如先告诉他水深3米5来得实际。我想要说的就是,机器学习本质上就是数学,如果你认为数学难,机器学习当然难,否则为啥大家都想招这种人才。如果你没有什么基础,建议首先花半年到一年时间,重头到尾好好复习三门基础数学课(微积分、线性代数、概率),再好好学习高级课程(矩阵分析、统计理论、数值分析、凸优化)。到这里,如果不想再深入,基本上就足够了,至少看论文实现算法没问题。然后,再好好看看机器学习相关的书籍(PRML等),用数学证明算法的正确性,用python、matlab、R等语言实现算法。 这样,才算是基本入门。 至于其后,想看数学就先看看拓扑,然后是实分析、泛函分析、随机过程、微分流形等等。 想看机器学习,就去看看各个机器学习顶会的论文。想看领域知识,就去认真地翻阅领域课本。