首页 > 代码库 > 豆豆叶:机器学习与我的学术日常

豆豆叶:机器学习与我的学术日常

Preface

今晚参加了 豆豆叶 在知乎举办的 Live:机器学习与我的学术日常 。

我参加的目的就是我想了解一下机器学习有一定成果的同龄人,是怎么样子做学术,怎么样学习这个学科的。

参加完这个 Live,回头总结来看,收获真的挺多的。

Background

豆豆叶,本科毕业于中科大数学系。他原来是中科大计算机的,后来转到数学系的。因为他觉得计算机上的知识通过自己看书、看视频就能学会了,但是数学知识需要跟着老师走,做题练习,一步一个脚印的来。

后来他去了香港读了两年博士,之后直接 quit 了,申请了美国大学的 Phd,现在他刚刚博士第四年。

Contents

数学与编程是两个重要的 foundation

数学、编程都是两个非常重要的 foundation,以后从事任何行业,都会得心应手。豆豆叶 很庆幸自己当初选择了数学专业(他从计算机专业转到了数学专业)。

机器学习有很多方向

机器学习里面,尤其是在工业界。机器学习是被肢解成好多方向的,比如说有些人做数据处理,有些人专门做建模、有些人专门做算法的实现,这些在招聘的时候都有不同的 title 的。如果想做机器学习,要清楚自己的 career 往哪个方向发展,是做 engineering?modeling?还是要做与客户之间的 Data Analysis?

知乎不是学机器学习的地方

想学机器学习不应该去知乎,在知乎里关于机器学习的有价值的问题,在他看来特别特别少,不如多看几本书、教材,更有价值。

菜谱上的菜只有做出来才知道味道

刚开始学机器学习,看一些机器学习的文章、课本,公式能一步一步的推到出来,整本书看完之后,我清楚的书中的每一个公式,花了很大精力看懂了书中的每一个公式。

但是拿一篇新的文章,又一头雾水,不知道这篇文章跟以前学的东西有什么联系;或者说哪一个新的算法过来,不知道这个算法跟以前学的算法、模型有什么联系。他自己实验室的师弟师妹都有这种体会,他非常能理解。

他在这里做了一个有趣的比喻:

像做饭、做菜一样,看书本、论文如看菜谱,看菜谱看的再多,也不知道哪个菜谱的菜好吃,只有把每个菜谱的菜做出来,自己尝一尝,才能知道哪个菜谱的菜好吃。

同时,如果不把这些菜谱的菜做出来,也区分不出来,哪个是湘菜,哪个是粤菜。可能不会 pay attention 很多 details。不知道不同风格的做菜方法,它们会产生什么样的风味。

刚刚学习机器学习的时候,就如同看菜谱,并不明白菜谱背后的味道是什么样的。等你看多了,自己把这些菜谱实现出来,有了一定经验。等遇见一个新的菜谱,就不会照本宣科的去做。就会明白,这个地方放多少糖不重要,那个地方放多少盐也不太重要。

到了这个境界,能够 make relationship,就是不同模型之间,它们的相似性。

比如说,现在可能 Deep Learning 比较火,但前几年大家都在做 Probabilistic Graphical Model,那可能就会知道一些,比如说 Conditional Random Fields。这时候我就会问,Conditional Random Fields 最简单的模型是什么样子的?或者 Markov Random Fields,你能给我一个最简单的模型?

你可能会回答我:哦,Conditional Random Fields 最简单的模型是 Bayesian Linear Model。那我又会问,这个 Bayesian Linear Model 和 Ridge Regression 又有什么关系?

这就是 豆豆叶 刚刚随时开出的脑洞,如果这个领域有一个大的 Big picture,实际上你是很容易回答这些问题的。但如果你只是一个菜谱、一个菜谱的去学,你可能就不能回答这些问题,你可能就会非常吃力。所以 豆豆叶 强调好的 foundation 的重要性。一旦你掌握了基础的数学知识,那么你对这些模型的理解就很容易超越这个公式本身了。

区别深知识、浅知识的

豆豆叶 认为我们学知识时,要学会区分,什么是 Deep knowledge(深知识),什么是 Shallow knowledge(浅知识)。

有些知识是浅知识,只需要 记忆 就能知道。但是深知识是需要去 实践 才能掌握的。

比如说 Coursera 上 Andrew Ng 开设的 Machine Learning。上面讲了很多 Machine Learning 中一些常用的 Model,豆豆叶 认为这些就是浅知识。因为对于一个有数学基础的人来说,这门课都头到尾过一遍不需要一个小时(当然不包含习题)。因为这里面涉及的大部分内容,都是基础的数学知识。

比如说 Neural Network,其中的 Back Propagation,就是一个求导的过程。

又如 Logistic Regression,有一些统计的知识,回来看这个 Logistic Regression,并不很复杂。

选择自己的方向

除了上面谈到的 foundation,还有就是怎么选择自己的一个规划。你是从 Research 的方向做 Machine Learning 的事情?还是从 Industry 的方向做 Machine Learning 事情?这个是很不一样的。

因为 Machine Learning 的 Research 是有很多分支的。跟着不同的导师,就做着完全不同的事情。不同的分支之间,差别会非常大。

如果你是去 Industry,其实 Industry 常用的那一套并不多,你去通过比赛,做项目,就能学到这方面的知识。

如何学到这些知识: 去参加如 Kaggle 这样的比赛

那么该学习什么知识,如何学到这些知识,豆豆叶 在知乎上有一个高票的回答:机器学习,数据挖掘在研究生阶段大概要学些什么?。

基本上来说,从 Classification model、Regression model 出发,你其实并不需要真的理解这些 model 本身做了什么事情,你就算看懂了数学公式也不知道这些 model 在干什么。更多的是你通过比赛,用这些 model,知道这个 model 有什么样的 output,有什么样的 performance。

而且 豆豆叶 建议我们 花式 的去用这些 model。还可以做各种各样的 combination,每种 combination 有什么样的结果,你可以去 compare 这些结果,这个过程还是挺有趣的。

豆豆叶 推荐我们去做 Kaggle 这样的比赛,比赛竞争非常激烈的,这样的比赛要想进前 10,前 20,要花很大的精力的。

同时,参加这样的比赛,就要把他当成一个比赛,而不是像锻炼身体一样。如果你把它当成奥林匹克运动会,就会拼了命的去获得奖牌,要以那样的心情去参加这种比赛,你就会做的很好。如果你把它当成去健身房,上上器械什么的,那样程度的运动,自己并不会有什么成长,你原来知道什么,比赛完还是只知道那些。

实践之后对 model 的反思

等你有了一些实践经验之后 ,比如说你用过 classification model 做过一些数据。你应该反过来思考,你用过的这些 model 有什么样的性质?这些性质会怎么样影响这个模型的 performance?

这时候就需要有一些统计知识,就需一些计算数学的 background。这些模型的计算量有多大?核心的计算瓶颈在哪里?是矩阵分解,还是优化?这些都需要你有一个数学背景在那。

比如说,最简单的,你想用 Gaussian model 去 estimate 一组数据。从这组 Gaussian model 里去 sample data,这时候计算量就在矩阵分解上。那如果做个 Logistic regression,那计算量就是在优化上。

当你能够清晰的将不同的 model 塞进不同的 toolbox 里,如 优化、统计、数值数学,你对每个模型所需要哪些数学知识有一个清晰的认识,那就到了一个新的境界了。

比如说,豆豆叶 曾经回答过 Logistic regression 和 Linear SVM 有什么区别?可能很多人都知道数学公式是什么。很多人可能觉得 Linear SVM 推导有些复杂。如果你之前学过 convex optimization,知道 convex optimization 一些基本理论,那回头看 Linear SVM,还是比较 straight forward 的。

对上面的模型的理解有两个层次:

  • 第一个层次,你能够理解这些模型的数学公式了。

  • 第二个层次,进一步深入的思考,这两个数学模型有什么 property?这两个都是线性模型,有什么 difference?这时候就需要你有深入的思考,对模型的输入、输出有一个辩证的思考。如对模型的输入做一个什么样的 transform,对模型的输出是没有影响的,模型的输出是不会变的。这个模型对输入哪些方面比较 sensitive?这些既可以通过实践来获得,又可以通过从数学上分析来获得。


对模型的反思: 以 SVM 与 Decision Tree 为例

比如说,工业界其实很少有人用 SVM 的模型。这是为什么呢?

因为 SVM 本身是个几何的模型,Geometry Model,这个 model 依赖一些 assumption,你需要定义 Instance 与 Instance 之间的 kernel,或者说这个 similarity。这个东西本身你是不知道的。你在一个简单的 case 下,如 Linear SVM,你可以假设 similarity 就是内积。但在现实生活中一个复杂的问题,你的特征是从各个 channel 来的,如有年龄、性别,有各种各样的特征。你怎么从这么复杂的特征上做 similarity 呢?所以很少有人用 SVM 做这样特征的分类。

其实 SVM 常用在 Computer Vision 里面的 HoG 特征,LBP 特征。这些特征为什么适合用 SVM 呢?

因为这些特征本身就是个 histogram,各个 dimension 是差不多的,是同性质的东西。所以你不需要定义特别复杂的 kernel,你就可以套用 SVM 的模型。但是在实际的工业界问题中,你很少碰到同性质的特征,如语音特征,图像特征,文本特征。这时候你再用 SVM 就显得非常古怪了,因为你很难找出合理的 kernel。

这时候大家就会上一些什么样的模型呢?如 Decision Tree、Random Forest,Gradient Boost Tree。这些模型的好处,对每个 dimension 来说,它不依赖 dimension 里数据的分布,只依赖数据的 order(顺序),你对数据做一个变换,只要是单调的变换,如原来是 a>b<script type="math/tex" id="MathJax-Element-1">a \gt b</script>,现在 f(a)>f(b)<script type="math/tex" id="MathJax-Element-2">f(a) \gt f(b)</script>。那么模型输出的 decision tree,输出的 random forest,输出的 gradient boost tree,它的结果是一致的。

这就是为什么工业界中大家都使用 decision tree,或者 decision tree 的一些 model,因为它对数据的 distribution 不那么敏感。相比较于 SVM 来说,SVM model 其实是很敏感的。这些其实从 decision tree 的原理有关,它的判别条件非常简单,它就是设置一个 threshold,小于这个 threshold 分到一边,大于这个 threshold 分到另一边,跟数据的 distribution 并没有直接的关系。

对模型的反思: 以 Linear SVM 与 Logistic regression 为例

刚刚举的是 Linear SVM 与 Decision Tree 的例子。那这里谈一谈 non-linear SVM 与 Logistic regression 之间的关系。

实际应用中,一般 Logistic regression 会应用在一些 High dimensional 的问题上。

这因为一方面相比较于 non-linear SVM,Logistic regression 的计算速度更快,更容易 scale 到更大规模的数据上。而 non-linear SVM 它的计算量实际上是跟数据的数量成平方的关系,它的 complexity 是 square 的。很难把 non-linear SVM 用在很大规模的数据上。如果数据的 dimension 是几千还好,如果是几百万维度的数据(广告推荐的时候)这时候只能用 Logistic regression,加上一些 penalty。

对模型的反思: 以 Lasso 与 Ridge regression 为例

又比如说,什么时候用 Lasso(L1 模做正则项),什么时候用 Ridge regression(L2 模做正则项)?

大部分模型用 Ridge(L2 模) 做正则项,是非常常见的,大部分时候确实比 Lasso 好。

但为什么,但在学术界,你会看到很多人都在用 L1 模做正则项,那肯定 L1 模的方法比 L2 模要好。

这些内容需要在课本外,在实践中,去思考它们有什么差别?是什么因素导致了这些差别?如果抱着这种思维方式去学习,能够学到书本外的知识的。而这些知识都是比书本上都要宝贵的知识,课本以外对模型的这些反思,你做的越多,你理解的越深入,在使用、交流时也会得心应手。


根据现实需求选择合适的 model

真正在实践中,你要理解现实世界的需求,不能套 model,因为每个 model 都有自己的优势与劣势。在一个现实问题中,用不同的 model,肯定会有不同的结果啦。到底选择什么样的 model 呢?这个问题 豆豆叶 认为是比较 math 的。但即使你都看懂了 model ,那现实中到底哪个 model 合适呢?这个问题数学本身回答不了的,没有一个公论的。

换句话说,你需要对现实需求做一个预性的判断。如你这个 model 包含了什么样的假设,这个假设在现实世界中到底多有用,到底有多对? 豆豆叶认为 这个问题是一门 Art。

很多时候文章里会题一些很 fancy 的 model(以前是提 Graphical model,现在是 Neural Network)。会有一些很 fancy 的 idea,每个 idea 都会有一些 assumption,但模型越复杂,assumption 越多。但现实情境中,这些 assumption 会很苛刻。


带约束的优化问题

常见的不带约束的优化,如 Gradient descent,Newton method,或者是拟牛顿的方法,二阶的、一阶的都有。但是带约束的问题,该怎么求解。

如果你读了那本《Numerical Optimization》的书,里面是有一些方案的,但是并不全。尤其是这个问题在近十几年、二十年才被人重视起来。在更早的时候,虽然有一些带约束的优化的方法,但是在实践中,都有很大的计算量。

如果你看了 《Numerical Optimization》 这本书,它会讲到如果是凸优化问题,这个约束是怎么做的?它会把一个硬约束变为一个软约束,导出一个 Lagrange 出来,这个 Lagrange 式子会推出一个对偶形式,很多时候这个对偶形式比原问题更容易求解。因此只要求这个对偶形式就可以了。但这样做还是很 limited,这种方法虽然在凸优化中非常漂亮,但计算起来并不容易。能够解决的问题也非常少,能解决 Linear Programming,Quadratic Programming,再复杂一点的模型用这个方法做就非常吃紧了。

那么其实还是有很多问题,它是带有约束的。

如现在比较火的人脸追踪。它会 fit 你的人脸,fit 一个模板。它实际上也是一个优化问题,它需要去优化人脸的朝向,人脸的朝向是一个 rotation,你要优化这个 rotation。rotation 本身有好几种表达,如果表达成一个矩阵,它是要满足正交约束的。如果表达成一个 Euler angles(欧拉角):α<script type="math/tex" id="MathJax-Element-398">\alpha</script>、β<script type="math/tex" id="MathJax-Element-399">\beta</script>、γ<script type="math/tex" id="MathJax-Element-400">\gamma</script>,它也是带有约束的,角度会有 bounded range

那么对这些问题该怎么优化呢?一个很好的方法就是,假设你的问题能够被 Reparameterization(重新参数化),你 Reparameterize 你的 model 之后,model 的约束就没有了。这个思想影响是非常深远的,实际上很多标准的带约束问题,在 Reparameterize 之后,就变成不带约束的问题。

如你想优化一个概率分布,参数求和为 1,每个分量都大于 0,这是你的约束。你可以对它做一个 log transform,那么这个问题就变为不带约束的问题了。在不带约束的问题上,你就可以用 gradient descent,拟牛顿的方法来求解。


Question and Answer

这部分是 豆豆叶 回答一些知友的提问。我选一些,贴上来。

统计专业与机器学习专业有什么不同

现在很多的统计专业都有了机器学习,Statistics Learning 的课程。请问机器学习专业和统计专业有什么不同?

统计专业不关心计算,虽然也有 computional statistics。还有统计下面研究的一些问题,不关心 application。机器学习也更加交叉,虽然包含了统计,但它兼顾计算,兼顾现实需求。


Industry 是不是只读 master 就可以了

如果你将来想从事机器学习的工作,是不是只需要读个 master 就行了?

看你对自己的定位,很多时候很多专业,确实只需要 master 就可以了,如 data engineering,不是 data scientists,就不需要一个 Phd。还有你的产出并不需要做 model,那也不需要一个 Phd。


女生学机器学习的多吗

这个专业大方向上,女生确实比较少。如果是女生,会有一些 advantage。找工作的时候,女生也确实有些优势。


需要掌握的知识与技术有哪些

就机器学习这个方向而言,每个时间段内需要掌握的知识和技术有哪些?

机器学习是个很大的方向。如果你的目的是去工业界,你只需要掌握那一小部分必备的知识就可以了。如果我来面试别人,如果对方不知道什么是 gaussian model,OK。不知道 random forest,也 OK 的。只需要直接最基础的数学知识,如怎么算 eigenvalue,怎么算 eigenvector。或者稍微难一点的,怎么做 hypothesis testing,这些基础的本科知识需要扎实的掌握。其他的 model 都是一些浅知识。


#

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

    豆豆叶:机器学习与我的学术日常