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

Posted chenxp2311

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了豆豆叶:机器学习与我的学术日常相关的知识,希望对你有一定的参考价值。

注意:
之前因为没有得到 豆豆叶学长 的授权就把他这次 Live 的内容发出来,我在此再次抱歉。所以我之前的那篇文章已经被我删除了。这次的发表已经得到 豆豆叶学长 的授权,并且 豆豆叶学长 也检校过了:

因此,我再次发出来,希望能够对你的学习有所帮助,谢谢 豆豆叶学长:

对这篇文章的转载需要得到授权,谢谢!


Preface

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

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

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


Background

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


Contents

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

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


机器学习有很多方向

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


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

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


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

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

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

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

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

同时,如果不把这些菜谱的菜做出来,也区分不出来,哪个是湘菜,哪个是粤菜。可能不会 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 本身是个几何的模型,Geometric 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 ,现在 f(a)>f(b) 。那么模型输出的 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 DescentNewton Method,或者是拟牛顿的方法,二阶的、一阶的都有。但是带约束的问题,该怎么求解呢?

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

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


那么其实现实中还有很多问题,它是带有约束的。如现在比较火的人脸追踪。它会 fit 你的人脸,fit 一个模板。它实际上也是一个优化问题,它需要去优化人脸的朝向,实际上人脸的朝向是一个 rotation,你要优化这个 rotation。rotation 本身有好几种表达,如果表达成一个矩阵,它是要满足 正交约束 的。如果表达成一个 Euler angles(欧拉角) α β γ ,它也是带有约束的,角度会有 bounded range

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

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


还有一类问题,如果你知道约束区间的形式比较好,你可以将区域外的点 project 到区域内,这个方法叫做 Projected Gradient Descent(只要对 gradient descent 做一点修改)。

最经典的,比如说你要优化一个 Orthogonal Matrix(正交矩阵),但每次迭代一次之后,这个矩阵就不是正交的了。这时候把矩阵重新做一个 SVD 分解,把 SVD 的 singular value 重新 map 到 1(因为正交矩阵的 SVD 分解值为 1 或者 -1)。所以每次做一步 gradient descent , update 之后,你就可以 projected 回原来的区域里面 。这种方法有优点,也有缺点:

  • 优点是,不需要针对一个优化问题做一个很复杂的优化算法,用以前的 gradient descent 也是可以求解的;
  • 缺点是,收敛速度会变得越来越慢。因为当你的优化方向和 projection 方向正交的时候,你的 progress 会越来越少。

那不用 Projected Gradient Descent,你该怎么做呢?你可以用之前提到的 Reparameterization(重新参数化),其实这在优化里面有个专门的名字的:Mirror Descent。之所以叫做 Mirror Descent,是因为把要优化的 parameters map 到新的空间,在新的空间里面,原来带约束的区域的边界被 map 到了无穷远。如果是个凸的区域,被 map 到了无穷远,即把一个约束问题转化为非约束问题。在每次 update gradient 时候,在这个 mirror 空间里做 update,也就相当于在原来空间里做 update,所以叫做 Mirror Descent


除了 Mirror Descent 以外,一个常见的方法就是用 Alternating Direction Method of Multipliers(ADMM)

ADMM 是个古老的算法,但最近几年被提及很多,主要因为大家都在做并行计算了。并行计算的一个 fundamental problem,就是你的参数是 show off different computer(或 different computer node)的。比如说你做神经网络的优化,现在大部分神经网络的并行优化,都是 data parallelism 的。但是做 data 的并行,实际上是有问题的。就是说,如果数据存在同一个地方,可以用传统的并行优化方法;但是数据存在不同的地方,这时候数据间的 communication 的开销非常大。比如说在一个网络上做优化问题,你的数据是在网络的不同节点上的,如果你要去 estimate 一个模型,要去 aggregate 所有网络的数据。这时候的问题是什么呢?尽管你可以把所有的数据 move 到一个 central 的 center 里,然后在 center 里面做优化,但这中间的通信开销很大。

ADMM 之所以最近几年被大家认可,是因为与其把数据 copy 到数据的一个 central 的 center 上,不如你把 parameter 做了很多的 copy,copy 到网络的不同节点上。然后每一份 parameter copy 负责优化对应它所在位置的那些 data。那么怎么保证这些 parameter 不同的 copy 的 update 是 synchronize 的?你为了 synchronize 这些 parameter,保证这些 parameter 在优化的过程中,最后迭代收敛到同一个 parameter,这时候就会用 ADMM。


豆豆叶 推荐了一篇今年 ICML 上做 Neural Network ADMM 的一篇 Paper:Training Neural Networks Without Gradients: A Scalable ADMM Approach,有兴趣的可以去看看。

同时,豆豆叶 还推荐了 ADMM 作者 Stephen P. Boyd 写的一篇文章:Distributed Optimization and Statistical Learning via the Alternating Direction Method of Multipliers,发表在 Foundations and Trends 上。

同时,如果你想了解上面那些带约束的算法,如 Mirror DescentProjected Gradient Descent 之类的,你可以去 Princeton 开的 Introduction to Online Convex Optimization 这门课,课中的 课件 会解释这些内容的。


我的学术日常

这部分 豆豆叶 讲了他的学术日常。

很多人都有这么一个体会,我们虽然想学很多知识,但是我们并没有这个资源、平台去学这个知识。

如 豆豆叶 的导师并不是做优化出身的,他写出的优化的文章,也较难的被 community 接受。没有学术资源,就不知道他这个文章写到什么程度,才给发表;因为导师不是这个方向的专家,他做出的东西也缺少一个自我评价机制,在发文章中会遇到很多困难。

如果你的导师并不是做机器学习的,只是希望用机器学习,并不是机器学习专家,你周围也并不是做机器学习的,你没有足够的资源,那么确实会对你的成长有一定的影响。

碰到这些问题,改怎么解决,怎么调整自己的心态呢?下面 豆豆叶 谈了他对于,如果没有足够多的学术资源,你该怎么做科研?

首先,应该提高自己的写作能力。文章能不能中,能不能发表,很大程度上在于你文章写的有多好。什么叫做写的好呢?如果你对你的文章评价有 80 分,别人看起来估计只有 60 分;如果你自己觉得你的文章有 100 分,估计别人看起来才有 70 分。你的文章要让 review 看的非常明白,从你的文章中看到新的东西,但又大致看的懂,那么他会觉得你的工作会比较好。如果让 review 觉得你的文章太差、或者太难懂,都难以获得好的评价。

怎么提升自己的写作能力呢?

从导师的修改中,他的 structure,argument,他的措辞等等,这些很多细节,要去慢慢体会、学习。

还有写文章要对很多细节处理的好。图表的大小、字体,没有语法错误之类的,要让人感觉到你的这篇文章花了很多心血。人家才会认真的去看你的文章,他认真的看,他就越能看懂你的文章。

这里后面部分,豆豆叶 谈了他的导师对于他的培养方式。

不像一些年轻的老师,有着压力要去发论文,对于一个学生,他直接给一个 idea,让学生实现出来。而 豆豆叶 的导师却不很在乎发论文,对他的毕业也没有论文的要求。而是让他能够自己提出一个新的东西、领域,在这块做到最好,最后发表在顶级期刊上。

豆豆叶 是非常享受这种培养模式的,能够有时间自己去学东西。但是他认为,他导师对他的这种要求,其实要比发顶会、顶级期刊难很多。(嗯,我也是这样认为的。这种散养的方式,对于学生的自身的素质要求更高。)


关于选择去工业界还是去学术界

现在有一些读硕士、读博士的人,都会有这样的 confusion,是去工业界好呢,还是去学术界好呢?

豆豆叶 认为,这个问题当然因人而异的。但他认为,去工业界对人的综合实力要求更高。因为在工业界,不仅仅是技术,还要跟 business 的各个方面打交道,你要知道自己做的哪个部分是有 business value 的。并不是说你的 classification error 更小了,你就能创造更大的经济价值。

他强调要工业界,要有扎实的基础,因为不可能在一个岗位上做一辈子。如果有扎实的基础,就能胜任各种各样的职位。

如果你去学术界,你不仅需要一个扎实的基础,还要有一个绝对深入的方向,对某一个领域有很深的研究,在这个领域方向,全世界没几个人做的过你。豆豆叶 觉得这样你才适合去学术界。

还要能够承受更大的孤独感,因为你做的东西,没有人关心,每人 care,其他人不知道你做的这个有多牛逼,或者这东西非常有用(或者这东西确实没用)。

能够承受这种孤独感,是一个成熟 researcher 的标志


Question and Answer

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

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

有人问:

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

豆豆叶 的回答:

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


Industry 是不是只读 master 就可以了

有人问:

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

豆豆叶 的回答:

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


女生学机器学习的多吗

豆豆叶的回答:

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


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

有人问:

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

豆豆叶 的回答:

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


豆豆叶自己参加比赛的经验

最近 豆豆叶 刚刚发表了一篇专栏文章:我的Kaggle初体验 – Grupo Bimbo Inventory Demand,他推荐我们去看这篇专栏。

如果实验室、实习的公司有项目做,都是很好的机会。如果没有这种很好的机会,他推荐去参加 Kaggle 的比赛,向排名靠前的人学习。你要去反思,他们为什么做的比你好。

第一次你排到了 30% ,第二次排名 20% ,第三次排名就可能排名前 20 了。


学术界对于特征工程的态度

豆豆叶 的回答:

不得不说的一点是特征工程虽然在工业界很重要,但在学术界并不那么重要。

写文章的时候,并不会因为你的特征工程做的更好,你就能把这篇文章发出来。因为写文章的目的不仅仅向别人传达你做了什么,更重要的是别人能从你的这篇文章里学到什么。

你在一个特定的问题上做了一个很好的特征工程,别人并不能有所借鉴。如果别人不做你这个问题,那你的这个特征工程就没有意义了。

注:当然,豆豆叶 说这只是自己看这个问题的角度。


SVM 处理 imbalance 的 data

有人问:

怎么用 SVM 处理 imbalance 的 data?有什么方法?

豆豆叶 的回答:

豆豆叶 觉得,实际上一般的 data 和 balance data 是一回事,取决于你怎么样衡量你的 performance。

传统的 classification 的衡量 performance 是用 accuracy。对于 imbalance data,accuracy 可能就不是很好的衡量标准。这个时候根据你的衡量标准来选择,怎么去处理这个数据。常用的方法是对数据做 upsampling,但这样做本身还是有点问题的。

所以,对于怎么样处理 imbalance data,还是 case by case。常用的策略包括,如果正样本太少,可以把正样本做 upsampling,做 cropration,去 argument 你的数据集。

或者可以选择不用 SVM,可以选择 Logistic regression,random forest,这些模型能够输出一个概率值,你可以通过 control 概率值的 threshold 来控制 recall 和 precision。


工业界的机器学习工作是什么样子的

有人问:

现在机器学习掌握到不同的程度分别在工业界薪资水平大概是怎么样呢?我之前看过的一些还不错的公司也只是调参为主。

豆豆叶 的回答:

其实大部分机器学习的工作,举个例子吧。比如说一个团队要做一个问题,团队的 leader 应该是做 model,做 model 的把控。团队底下的人,有的人洗数据,有些人做数据的 exploration,有些人负责调参。

有些工作确实很 boring,但这就是工业界。工业界并不是给你学习的机会的,它要最大化利益、效率。有些人确实是在那做调参的工作,还有人做标数据的工作。

所以想开点就明白这个事情了。如果你想做更高级的工作,那就提高自己,让别人认可你。


神经网络适合什么样的场景呢

豆豆叶 的回答:

我个人理解神经网络适合的场景十分有限。因为神经网络处理的数据,比较成功的是图像、文本、音频。其他的场景,据我所知,没有一定用神经网络的必要性。

实际上很多时候大家并不用神经网络做,就能做的一样好,甚至更好。


怎么转行做机器学习

有人问:

研究生阶段做的和机器学习不相关,转行做机器学习,怎么开始,技能树是什么?

豆豆叶 的回答:

就像我说的,如果你有足够的数学、编程基础,你直接可以去阅读一些具体的模型。把它们用在具体的问题中,或者具体的比赛中。

如果想转行找相关的工作,那就积累相关的背景。去找实习,去做比赛。


这么多模型该怎么学习, 容易迷失怎么办

有人问:

光各种树就一堆的 model,感觉怎么也学不完啊,很容易就在各种模型中迷失了,这种情况该怎么办?

豆豆叶 的回答:

模型是数不完的,各种给样的。如果你把模型都背一遍,那没什么意义。你不需要掌握很多的模型,你需要掌握理解这些 model 的基础知识。你有了这个 foundation 在那,来了一个新的模型,你也能很快的掌握。

我相信大部分招聘的过程中,它是不会去问这些犄角旮旯的问题的。公司是不会问题具体的模型。我觉得一个公司要问你:什么是 Gaussian process?或者问你:什么是不同版本的 random forests?我觉得这个问题是没有意义的。


有必要做 data 的 visualization 吗

有人问:

在做 Kaggle 的比赛中,有必要做 data 的 visualization 吗?

豆豆叶 回答:

我本人是没有做 visualization 的,我也没有做 visualization 的经验。但是至少简单的画个图,plot 几个 curve 还是很正常,需要做的。

我觉得做 data visualization,或者 data exploration,其目的是验证或者否定你对数据的假设、观察。

它的目的并不是为了做 visualization 而做 visualization,不是为了做 data exploration 而做 data exploration。而是在你设计特征的过程中,你需要知道哪些特征可能更重要?这时候需要你去做 data visualization,或者 data exploration,去验证你的想法。


Gradient Boost Decision Tree 与 Random Forest

有人问:

再讲讲 GBDT 和 RF 吧,你之前讲的太浅了。

豆豆叶 回答:

首先我的经验也没有很多。但据我知道几件事情是,在标准的分析下,大部分比赛中,GBDT 要比 RF 要好。

原因也很容易理解,GBDT 有一个 Boost 的过程。

因为可以认为 error 有两项:一项是 bias,一项是 variance

而 RF 的能够做的事情只是优化 variance 这一项,因为优化 bias 只是通过一个 decision tree 来完成的,而 variance 是通过好几个 decision tree 来 ensemble 一起来做优化的。

而 Gradient Boost Decision Tree 在这两项上都是有贡献的。

而且,我感觉,这两个模型到底哪个有用,要取决于数据量。一般来说,在大规模的数据上,GBDT 肯定要比 RF 要好。但是在小规模的数据上,RF 效果更好。在最近的 JMLR 的一篇文章中, 跑了 UCI dataset 上一百多个数据集,通过实验验证了在小规模数据上,RF 确实要比 GBDT 要好。这也是大家 expect 的东西。

注:刚刚 豆豆叶 提到的 JMLR 的文章是:Do we Need Hundreds of Classifiers to Solve Real World Classification Problems?

同时,我推荐 Quora 上的这个回答:How do random forests and boosted decision trees compare?,我就是在这里找到 豆豆叶 提到的 JMLR 的这篇文章的。


如何深入理解一个模型, 有什么系统性的方法吗

有人问:

关于对模型的反思有没有系统性的方法?从哪些角度去深入理解模型?

豆豆叶 回答:

对,其实是有的。就像我们在做文章时候,你要设计实验,都是有一些套路的。

比如说,你需要研究这个模型对数据的 sensitivity,对一些 parameter 的 sensitivity。

你在学习一个模型的过程中,你也要 keep thinking。比如说:
模型的计算量有多大?
核心的计算复杂度是多少?
它的主要的计算瓶颈在哪里?
它的 performance 跟哪些参数有关,这些参数的 sensitivity 是什么样的?
它对数据本身有什么样的要求,对数据 distribution 的 assumption 有多强?是非常强还是非常弱?

这些都是大家在学习一个模型需要反思的。

比如说大家学习了 Hidden Markov Model,Hidden Markov Model想法非常简单,它也有成熟的 inference 的方法。但是现实中,为什么大家都不用 Hidden Markov Model,而是用 LSTM model,neural network model 呢?

其实你仔细思考一下就应该知道,Hidden Markov Model 的一些假设太强了,这种强的假设对大部分数据都不 make sense。


机器学习框架的个人理解

有人问:

你用过哪些机器学习框架?对于工业界的框架你有什么个人理解?

豆豆叶 回答:

首先,我觉得,机器学习时没有框架的,框架只是针对特定的问题而设计的

比如说最近比较火的 TensorFlow,以及华人搞的 DMLC。他们都是针对特定的问题才设计的框架。在我看来,不存在统一的框架。

我之前看到过 陈天奇 曾经说过一句话:不存在绝对的框架,只存在最优质的 package。

他做了一个 Gradient Boost Tree,这个 package 非常优质,他把这个做到了极致。我认为这就是非常有价值的。他不需要什么 platform。那些 platform 里单个模型的 performance 并没有这些优质的 package 来的高。单独的搭建一个 platform,并不会带来业务增长点。在具体的业务中,肯定会用这些优质的 package。


Kaggle 比赛并不需要太深的 ML, 你认同吗

有人问:

在做kaggle的比赛中,我感觉到很多工作都是关于data scientist 的,包括特征选择,数据预处理,模型的话都是几行代码的事情,很少涉及到 ML,你认同吗?

豆豆叶 回答:

我也认同的。Kaggle 比赛本身并不是考察机器学习的比赛,它考察一个人的综合能力。但是我觉得只有你对机器学习有了基本的了解,你才能去参加 Kaggel 的比赛。

我觉得这其实挺正常的吧。你说的这些特征选取、预处理都是非常必要的。这就为什么去工业界,也基本不做 model,而是去做数据预处理,去调参,特征选取,其实是一回事。


现在很多大牛跑到工业界了, 你怎么看

有人问:

现在很多大牛跑去工业界。有传言说,现在能够真正work的工作已经不在学术界了。对于您这种做优化问题的,目前来说大家的选择也是偏向于工业界吗?

豆豆叶 回答:

当然不是了,我觉得只有 deep learning 的人,才会去工业界吧。还有很多别的方向,他们都没去工业界呀。


数学或统计专业学生, 如何装点计算机技能树

有人问:

对于数学或者统计专业的学生,如何去点计算机的技能树?比如算法,linux,java,spark之类的?

豆豆叶 回答:

这个问题非常好,我之前一开始是做 Computer graphic,所以我 C++ 非常熟。但是用 C++ 做 data 可能不合适,后来我又补了 python、R。

现在我用 C++ 做特征工程,for performance。然后用 python 或者 R 来写 model、调用 model,然后用一些脚本语言把这个 pipeline 串起来。这是我日常做研究的过程。

Linux 肯定得知道的;

算法的话只需要知道一些简单的算法,因为计算机里的那些算法跟机器学习关系并没有太大的联系。

Spark 除非真正的做大数据,否则工作后再知道也行,没什么区别。


如何阅读论文

有人问:

您一天读一篇paper吗?分不分精读、泛读呢?读完paper自己实现出来吗?

豆豆叶 回答:

我觉得读文章分为 3 个阶段。

第一个阶段是,读什么,什么都不懂。那这时候就要去 review 自己数学、计算机的 foundation, 是否足够了。

第二个阶段是,非常渴望读文章,读什么也都能读懂。我大四刚刚毕业那会儿就是,一天可以读 3 篇文章,而且都能读懂。

但是,随着你文章越读越多,你会发现很多文章都是大同小异。很多文章是几个 idea 的排列组合。读到一定的程度,不必要再读更多的文章了,不需要漫无目的的读文章了。

最后阶段,你读文章是当你想到一个问题、idea,你要查阅有没有人做过这个 idea,这时候你要去寻找文章。这时候,应该更有目的的去读。

而且,随着你对一个问题研究的深入。其他领域的文章,你就不会那么 care 了。因为那些文章并不会太影响你的工作。


Postscript

整理了两天,终于整理完了。没想到整理出这么多,居然有 15000 多字。回来来看,真心干货满满的,收获很多,值得细细体会。

希望整理的这些能够对你学习机器学习有所帮助。

再次感谢 豆豆叶 学长,赶紧去知乎关注点赞吧~

以上是关于豆豆叶:机器学习与我的学术日常的主要内容,如果未能解决你的问题,请参考以下文章

机器学习博士在获得学位之前需要掌握的九种工具!

机器学习博士在获得学位之前需要掌握的九种工具!

如何解决机器学习中数据不平衡问题

采样问题

论文导读会议精选:SysML2018,SysML2019

字节跳动开源云原生机器学习平台 Klever