机器学习所需要的编程基础

首先求同存异一下:机器学习这玩意容易不起来。毕竟是需要动脑子和经验的东西,没法容易。
但是,“上两门公开课实现两个算法就能找着好工作纯属想多了”这个观点不光不正确,而且很有打击其它同学的倾向,我在下文会解释为什么。
首先为了符合匿名用户对做过ML和DM的要求:笔者也算做过一些肤浅的数据挖掘应用,读书的时候在一些还算靠谱的会议上水过一些文章,目前在Twitter的modeling team做model。找工作的时候常见的该拿的offer也都拿了,全是ML相关的工作。从匿名用户提的问题来看,我该读过的书也都读过。
那么笔者是什么水平呢?
也就刚到上完公开课,有过一些经验的水平。不是笔者自谦,事实就是这么回事,因为我现在回头去看公开课的时候,每次还会有新的收获,学到新的技巧
说到这里,匿名用户的言论“老师还说了,你在面试时说自己学过这个课那个课,人家公司根本看不上。。。”已经完全不适用了,如果一个已经在“人家公司”里工作的人告诉你这句话不成立,那么应该具有一定的说服力。
当然,匿名用户可能会反驳说,你就一个样本而已,也许是你长得特别帅人家公司才要你的呢?
非也,如果你仔细上过Andrew的课,他在结尾处提到:如果你认认真真学完了这些算法,你已经比湾区绝大多数工程师在ML上的造诣高很多了。
此话半点不假。在楼主所在的公司(以及以前呆过的地方),绝大多数工程师不一定了解ML在干些什么。大家充其量了解一些基本的ML概念,仅此而已。但是这并不是说,他们就不能胜任我现在在干的工作了,这也是我想提出与匿名用户观点相左的地方,原因如下
1) 对,你是在念ML的PhD,没有人会怀疑你多聪明你能解多少最优化问题,但是有一点:你的这些特长并不是在日常工作中每时每刻会用上的。我并不是在说这些技能不重要,我只是在说,绝大多数跟ML或者DM相关的应用性工作中,太过于fancy的技能在日常工作中,是派不上太多用常的。按照80/20的原理,80%的日常工作你在倒腾数据,20%的时间才在折腾算法(我猜很多data scientist也会同意我的观点吧)。
如果你常读ESL,那么应该有印象,全世界所有的cpu time大概有80%左右在做linear regression这个简单算法。这很令人意外吗?一点都不,因为LR确实就是最常用的ML技术之一。反过来讲,如果你的LR可以用到了极致,那么你不会KKT条件又怎样,你不明白SVM推导又怎样,难道这样的同学就不可以从事跟LR相关的工作吗?把LR用到极致,不光可以处理非线性的,还可以做大规模的,online的,distributed的,multi-label的,多了去了。可不要忘了,号称最牛逼的Vowpal Wabbit不也就把LR做到了极致吗?所以按照答者的理论,假设John Langford只做LR,他应该滚出ML界了?不是吧,多少公司(至少按照github上他声称的)都在用他写的牛叉哄哄的vowpal wabbit啊
2)对于有数理思维的同学,尤其是编程特别好或者数学底子不错的同学,学起ML来更加容易。即始没有,也没太大关系。说到底,ML里的算法跟算法导论上的算法有很大差别吗?本质上没有,因为算法导论里告诉你的多数是确定性算法,而ESL或者PRML里告诉你的多数是不确定性的算法,但是重点是,它们都是算法,都是给定计算机一套指令,给定特定输入,写出特定输出的过程而已。那么,为什么我们相信每个人都应该能明白算法导论上的东西,但却怀疑,“觉得上两门公开课实现两个算法就能找着好工作纯属想多了”呢?奇怪
3)训练并不是靠时间和地点堆砌的。这里的时间指的是匿名用户指的“每周十七八个小时”,地点则是指“顶级学校”。相反,有效的训练才是真正让人从一个境界到达另一个境界的地方。当然啦,每个阶段都会有更厉害的人,这我见太多了,可是重点是,不能因为“跟那些专门搞机器学习模式识别的优秀研究生比仍然相去甚远”就自认不如或者放弃掉吧?这是个什么样的奇怪理由。也说个个人相关的例子吧,之前的室友是做ML最厉害几个人之一的弟子,他的NIPS的列表一个页面装不满,vision界的publication更是装不下,就这么厉害。于是他碰到了我这个推个LDA还吭哧的弱室友。
但是问题是,这就是停止学习ML的理由吗?
4)究竟机器学习这玩意有多难?是你匿名用户说的那么玄幻吗?

没多难,不是rocket science,认真学多花时间总是可以学成的。同样的问题我以前问过“C语言这玩意有多难?”,后来发现把指针弄明白了以后没多难,不像谭老师讲那么玄乎。“函数式编程这玩意有多难?”,也没多难,坐下来把主要概念看明白了多写写也就会了。
同样道理,机器学习需要的数学里面,能把人绕进去的并不是那么多。有难的吗?有!你需要自己去创造一个算法来beat已有的算法的时候,那是真tm难,但是题主问的是什么呢?“从事这样的工作靠谱吗”,如果我来说的话,靠谱,只要你肯学,把该学的磨会了,你就靠谱了。
重申一下:机器学习没有那么难,但是要创造个新的漂亮的能用的机器学习算法很难。所有需要创新的东西几乎都难,因为你得在没有指导的前提下试很多种东西,恰好试出来一种能work的,这当然难了。问题在于,现实生活中的工作里哪里需要这么多新的东西?非常少,你有一个open mind能随时接受新东西你就已经领先别人一大截了,如果你还能创造出来新的东西(并且是个实用的东西),那不管在哪个公司,你都是一颗新星了。我能想到的需要匿名用户说的那样高水准的机器学习技能的地方,也就那么几个,Google X, NASA, Yahoo labs, MSR。其它地方,题主好好加把劲,还是靠谱的。
5)嫌你打击自信心?当然嫌,至少我嫌,给本身需要信心的人泼冷水这本身就不是什么好事,何况还是在这样公开的场合下。所谓闻道有先后,术业有专攻,你做你的,他做他的,先来后到而已。岂能是因为天资不堪作为理由就停止,尤其扬起鼻子让别人停止

当然,之所以产生了以上这个略有点激动的反驳式答案,是因为我想到了作为一个小弱的自己。幸运的是路上碰到的人们都一直支持多于打击。
然后对于楼主的问题的回答:
请多写代码,一定要写到能娴熟表达自己想法的地步,如果非要加个量的话,那么写个几万行有意义的代码吧。
请多学数学,没事把线性代数和概率都好好学学吧,MIT的这两门公开课都很棒。之后可以入门读读统计学习入门:Introduction to Statistical Learning
再之后慢慢啃ESL:Elements of Statistical Learning: data mining, inference, and prediction. 2nd Edition.
上面两本书都是免费的。
再之后可以慢慢啃PRML,搜搜都有。
然后最后匿名用户说的绝大多数我不同意,但是有一点我仍然是赞同的,如果不花心思和时间,上面那几步看似简单的过程,是没法完成的。
希望我的答案没有太冒犯到匿名用户同学,我只是想用强烈的语气表达我的观点,我希望知乎变成一个多一些支持的地方。每个人在某个阶段都曾经是小白,有的人很幸运走对了方向,有的人不太好运走歪了,但是没有必要因为别人走歪了想调整的时候就觉得人想走捷径。每个人的情况都不一样,你没法知道别人的情况,我也没法知道,premature judgements are bad