0%

微调

做咸鱼没什么不好的,不过做条有梦想的咸鱼也不赖。

工业界 学术界

对于绝大部分人而言,努力成为交叉领域的熟手,远比成为计算机科学家要现实且有意义
大部分人最终不会从事算法研究,而会奋斗在一线应用领域。

背景

工业界未来需要什么样的机器学习人才?老生常谈,能将模型应用于专业领域的人,也就是跨领域让机器学习落地的人。我们需要并将长期需要这样的人才,这样的需求不会是昙花一现,这就跟web开发是一个道理,从火热到降温也经过了十年的周期。一个领域的发展有特定的周期,机器学习的门槛比web开发高而且正属于朝阳期,所以大家致力于成为“专精特定领域”的机器学习专家并不过时。

能写代码、构建模型的人千千万,但理解自己在做什么,并从中结合自己的领域知识提供商业价值的人少之又少。

调侃一句,哪个方向的机器学习人才最紧缺?答:每个领域都需要专精的机器学习人才,你对特定领域的理解就是你的武器。

基本功

需要了解基本的数学统计知识即可,再一次重申,我对于算法的看法是大部分人不要造轮子,不要造轮子,不要造轮子!只要理解自己在做什么,知道选择什么模型,直接调用API和现成的工具包就好了。

  • 回归模型(Regression)
  • 分类模型(Classification)
  • 神经网络(Neural Networks)
  • 数据压缩/可视化(Data Compression & Visualization)
  • 无监督学习和半监督学习(Unsupervised & Semi-supervised Learning)

基本功的意义是当你面对具体问题的时候,你很清楚可以用什么武器来处理

秘密武器

学生朋友们可以更多的关注自己感兴趣的领域,思考如何可以把机器学习运用于这个领域。而已经有了工作/研究经验的朋友,要试着将自己的工作经历利用起来。举例,不要做机器学习里面最擅长投资的人,而要做金融领域中最擅长机器学习的专家,这才是你的价值主张(value proposition)。最重要的是,机器学习的基本功没有大家想的那么高不可攀,没有必要放弃自己的本专业全职转行,沉没成本太高。通过跨领域完全可以做到曲线救国,化劣势为优势,你们可能比只懂机器学习的人有更大的行业价值。

对特定领域的深刻理解往往就是捅破窗户的那最后一层纸,只理解模型但不了解数据和数据背后的意义,导致很多机器学习模型只停留在好看而不实用的阶段

没有什么不会改变,这个时代的科技迭代速度很快。从深度学习开始发力到现在也不过短短十年,所以没有人知道下一个会火的是什么?以深度学习为例,这两年非常火的对抗生成网络(GAN),多目标学习(multi-lable learning),迁移学习(transfer learning)都还在飞速的发展。有关于深度学习为什么有良好泛化能力的理论猜想文章在最新的NIPS听说也录了好几篇。这都说明了没有什么行业可以靠吃老本一直潇洒下去,我们还需要追新的热点。

技术总会过时,热点总会过去,但不会过去的是我们不断追求新科技的热情和对自己的挑战。

  • 物理就是物理,不分中华物理和美国物理。
  • 数学就是数学,不分希腊数学和中华数学。

绝大部分基础学科的知识都是不分国界的,如果不是因为德语普及程度不高,某些学科用德文教材也可以。

学知识,切忌就是追求无意义的形式,而抛弃了学习的本质。计算机领域一大禁忌就是重复造低质量的轮子,教科书同理。只要用外文书对于学习内容效率的提升大于语言障碍的影响,就该大力推崇。通过使用原版书和观看公开课,也是对于英语的一种锻炼。至少在理工科领域,大部分教材的阅读门槛没有想象中的高,且有助于提早训练学生进行学术写作,熟悉相关专业术语

“评价一个艺术家的成就,你得先看看他/她的东西有没有形成风格,没风格、没有独立思考的作品一文不值。”

人生有两个重要时刻:一是意识到自己只是普通人,二是意识到自己的孩子只是普通人。评论区也读到两句有意思的话,大意是人生有两个重要时刻:一是发现自己不是普通人,二是发现自己是普通人

坚持不是问题的核心,当然需要慢慢雕琢。思考频率,广度和深度。

我们学习到的新知识其实是一件件工具,不断用学到的新工具去重新思考以前的旧问题,往往新工具就能解决旧问题。我的一个建议不如把自己遇到的各种科研问题,不论多么不成熟都记下来在本子上,每过一阵子去翻看一遍学到的新知是否能够解决新问题。比如没学数据结构前,你总在想为啥我实现的机器学习模型这么慢,学了以后才知道搜索近邻可以用kd-tree,要是可并行的任务可以分解成小任务在多个core上运行。很多问题的答案其实非常朴实无华,但当你知道答案时,往往连问题都忘了,所以你总是没有好点子。因此要不断的记录,不断的回溯。随着你不断重复这个过程,思考的广度和深度都会上升。

人最终的问题就是想太多而做太少。绝大部分学术新星一开始的点子也是老板给的,或者一开始的工作也并非特别惊艳。但做的多了,质量总是会上升的。务实的说,有了尚可的点子就先做实验,有了尚可的实验结果就写论文,今天发不了CVPR就先发ICIP,迭代式上升才是符合普通人的路线。如果想要奔着搞大新闻的目标做科研,往往会卡很久很久很久…很久很久很久。但也不能总恰烂文章,必须逐步提高对自己的要求。

只有对自己的内容认可,才能做出让大家接受的内容。你最好能找到自己觉得有意思且重要的课题,而非是能发XXX会议的课题。只有这样你的内心才有动力,而非迷茫与功利。**而这一切的前提,也还是要有一定的思考和观察,毕竟好的点子不会从天上掉下来。而当你的工作质量上去了,得到关注与发表到好的期刊/会议只是水到渠成而已。

去做一些至少自己感兴趣且可以感到满意的工作

需要不断提高自己的思考能力和执行力。再务实一点说,从就业角度看做机器学习不一定比学软件开发性价比更高,毕竟后者岗位多需求大不易过气。所以在投身机器学习科研前,或者任何科研领域前,不如先想想自己的目的是啥,是为了找工作?发大财?当科学家?还是?没了解清楚前,不要给自己定一个虚无缥缈的的目标,也不要读了大牛的成功故事就感到自惭形秽。日子是我们自己的,你被感动、被激励只是说明人家文章写得好,和我们关系不大。你学学写作技巧后,最好赶快回到现实世界里来比较重要。不要给自己加戏,自怨自艾、感动、受鼓舞,都大可不必,务实就好。

我的工作内容到底是啥?我告她就是修自行车。一个新点子就像是个骨架,初期修修补补先上路再说,叮叮哐哐咱慢慢修它,先能骑就行。你沿路捡个轮胎,随手淘个发动机(找到了新的工具),再一改装,或许就成摩托车了。搞科研的,别看见人家有摩托车就焦虑,就眼红,就着急,其实大家都是一路捡破烂过来的。

大家出门都是一双脚,你要啥自行车啊?

社交

social networking

社交其实是一种投资本质上寻求一种交换

职场社交的重点是真诚与简洁,不要绕太多弯,说人话说明白话。你跟比你资深/地位高的人接触时,对方很清楚你想的是什么,所以有内心铺垫来帮助你(即使并非义务)。所以你只要真诚的说明白自己的需求即可,不要绕太大的圈子,毕竟每个人都很忙。

丰富阅历

  1. 知识积累
  2. 经验积累
  3. 素养积累
  • 掌握好必备的数学基础,掌握好一些基础的计算机核心课程,至于编程方面的技巧,我倒觉得不是需要做到特别厉害。如果能力有限的话,可以放低对操作系统,计算机结构这种比较偏底层的课程人生要学会抓大放小,不要苛求自己样样精通,胶水语言Python的知识还是可以有很大的帮助。学好英语,至少打下阅读和听力的基础。
  • 尝试尽早接触科研,进实验室。进实验室有两个明显的好处,一是深入了解,二是是否适合。
  • 要有自己的“坚持”和“品味”,多读不同领域的书,比如社科类、经济类、人文类。因为数据科学的起点是以数据为基础,终点提取见解提供反馈。放低身段,多和别人交流。其实这一点有一点牵强

独立思考的能力,和去伪存真的勇气。生活中并不存在绝对的浪费,只是因为当下社会弥漫的焦虑感让我们希望任何投资都能马上变现。很多知识点互相交织,当你慢慢可以连点成线时,就可以对曾经困扰自己的问题有更深一层次的领悟,也就是渐进式学习。

如果现阶段某个知识点卡住了你无论如何都跨不过去。你不如先放下,或许过一阵子法门就会在别的地方出现,你甚至会有更上一层的理解。但在那之前,你要学会“跳过”,也要记得“回来”

所以眼界大一点,你暂时连不起来的点可能只是时候未到,而非是浪费,每个人都是一座矿,你采的越猛,枯竭的也就越快。

学习本身就是对自身训练的过程,我们接受那么多知识,留下的应该是学习方法,而非一个个枯燥的公式。你该学习如何高效采矿,而非大力开采。

教育最大的意义不是让你记住细节,而是教会我们面对新知如何快速分解、消化,并从中创新。这些都不是靠苦工(拼死)能解决的,你终究要建立自己的框架,而非储存内容

一个合理的学习态度在我看来是这样的:致力于训练自己可以快速内化新知识,遇到跨不过去槛先放下,但要记得回来。既不必啥都想学,贪多嚼不烂,也不必实用主义当先,要求任何付出都要马上变现。学习这事需要、也必须放松一点。你即使是座金矿,也怕矿难不是?拿我自己来说,我花了好几年做各种和学习、工作毫无关联的事情,甚至刚毕业时选了一份和知识背景完全垂直的工作并干了三年。我一个工科生,每天被要求西装革履写ppt,此处拜访客户卖咨询产品,这算是一种浪费吗?

某个时间突然失去了购买的欲望。仔细一算,上次认真去购物应该已经是16年的事情了。可能还是因为这样的快乐太廉价,连快乐都算不上了。毕竟生活中还有那么多求而不得的事情,做不完的工作,写不完的代码,发不出的论文,得不到升职。对于我们不曾拥有过的东西,幻想总是最美好的。当你有能力获得,甚至不需要任何代价就可以得到某种资源时,就会失去了获得它的乐趣。

喜欢好看的人或者事物,但往往美丽下隐藏着的除了平庸,还有风险。因此从成事的角度来看,长相普通,智力较高,有很强性格与执行力的人可能有更大的优势

机器学习包含哪些学习思想?

不仅仅是机器学习,大部分理工科的思想都可以从文史学科的角度去理解。正所谓大道至简,很多道理是共通的

  • 教条主义的危害,优化模型的评估问题。
  • 少即是多,“ 如无必要,勿增实体”。
  • 三个臭皮匠的智慧:若一件事情不能证实,也不能证伪,就要存疑。个体学习的准确性和多样性本身就存在冲突,一般的,准确性很高后,要增加多样性就需牺牲准确性。事实上,如何产生并结合好而不同个体学习器,恰是集合学习的研究核心
  • 不可知论,频率学派相信参数是客观存在的,虽然未知,但不会改变。而贝叶斯学派相信参数不是固定的,我们需要发生过的事情来推测参数。
  • 妥协、矛盾与独立思考,算法思想的精髓是无处不在的妥协永远保持怀疑,当机器学习模型很轻松就达到很好的效果时,比如百分之百的正确率,你要警惕。
  • 最小预测单元,避免追求通过一个模型预测多个目标。
  • 数据比模型更重要,但数据不是越多越好。

保持独立思考的能力,不要别人说什么/书上说什么/论文里写什么,你就相信什么。毕竟在机器学习的世界里,我们每个人都是“民科”。

很多程序员只写代码,不写文档,不写案例,不做宣传。那么很自然的,你写的东西也就没人用。因此写好文档与示例非常重要的。我建议至少花和写代码一样长的时间写文档,其中主要有三个构件:

ReadMe文档最好是用rST语言来写,因为Read the Docs的语言也是rST,统一语言可以减少大量的开发成本。rST的编写指南可以参考:https://thomas-cokelaer.info/tutorials/sphinx/rest_syntax.html

  • 人类是视觉动物,一个好的图文实例远远好于干巴巴的长篇大论.
  • 人类是懒惰的。因此建议早早采用PyPI和conda来分发你的工具库,这样使用者就可以轻松使用pip和conda来安装啦。

Sustainable Development(可持续开发)

写好几个模型容易,但保证工具库是可持续和可扩展是很难的。假设维护5个模型很简单,那么维护200个呢?所以在开发工具时就要考虑到这一点,有几个点非常重要:

  • 首先是必须有单元测试(unit test),每个对应的模型如无例外都应有对应的测试,保证代码的覆盖度。
  • 其次是善用集成测试工具(continuous integration),它们可以在多个平台与Python版本下自动运行你的单元测试。
  • 相似的,维护代码的可读性和测试覆盖度(code coverage)也很重要,对应的工具有:
  • 最后要写好开发指南(contribution guide)与如何反馈问题,如何参与开发,为其他感兴趣的人提供一个模板,如何反馈问题,一个标准issue report该有哪些部分,后续开发计划是什么?新模型的添加标准(inclusion criteria)是什么。
  • 在这个阶段的重点是如何把一个项目做成真正的开源项目,一个持久的项目。到达这个阶段以后,项目本身已经比个人更加重要,我们必须为了可持续性而牺牲掉一些便携性。
  • When Possible, Optimize! (优化)。所以当你的工具库有了一定的规模后,建议多考虑重构和效率提升。

One more thing ,know why to do it(保持初心)

写工具库的最终目的是为了锻炼自己,回馈社区。如果一开始的目的就是要出名,做个大新闻,有大概率只会铩羽而归。我开发过特定领域的通用库,同时也和很多优秀的开源贡献者有过探讨交流,包括scikit-learn的核心作者Alexandre Gramfort。Gramfort带给我的最大震撼不是工程与学术能力超强,而是超乎常人的认真—在一篇工具库论文中他给我们写了满满4页的评语,甚至运行了我们大部分案例与测试,这种精神让人肃然起敬。

写库不必太在意成功是否,自己努力过坚持过就好,只有真正的热情才能让我们一直持续维护与更新。只有几个用户却一直不放弃的开发者。这可能才是开源的真正意义吧。

大学学习计算机专业真的很差吗?

  • 希望能成为一个独特的人,而不是别人希望成为的那种人。
  • 做艺术要先有自己的思考,才会有自己的风格

毕业以后想做什么。我说不知道,大概去读博吧。他难得地严肃起来,说:“建议你先读一个硕士,完整的接受一个研究训练,或者去工作几年,明白自己喜欢的方向是什么。如果你依然很喜欢现在的研究方向,实验室欢迎你回来。

随着年纪逐渐增长,愈发感到人生是你自己的,不要被舆论裹挟着前进。无论今天别人告诉你计算机完美、生物“优秀”,还是金融有钱赚,你都不能照单全收。你要在可能的情况下收集尽量多的信息,要有自己的判断。拿最简单的经济学原理举例**,一个行业门槛很低但利润很高,就会涌入了大量竞争者,从而使得利润回归到应有的水平上去。所以,如果想要在一个领域做出成绩,就一定要尽早学会收集信息、独立思考,并综合做出合理判断。即使是一个高中生,在综合互联网信息、周围学长学姐以及亲戚长辈的建议后,你应该可以做出一个对自己负责的决定。即使选择不算完美,只要掌握了这样思维方式,你可以不断的修正自己的目标,从而实现自己的想法。

开始接触到更真实的世界了。真实的世界有很多个维度,不再是单纯的做题考试升学。这里你可以有各种各样的选择,甚至选择多到把你淹没**。你会听到各种各样的建议,来自老师、学长学姐、家里的长辈,每个人似乎都说的对,每种未来都那么熠熠生辉。在无数种“光明”的未来中,你会怎么选择自己的路呢?

明白每个阶段自己的能力边界在哪里,勇敢放弃边界外的机会,并在边界中最大化自己的价值。迈入大学最大的冲击就是周围的选项与诱惑突然以爆炸的形式出现在你眼前,很多人要不会迷失于诱惑,或者迷失于如何选择。全都要[哈哈哈]

世间风景万千,唯有错过才会取得。

做一个算法工程师,代码能力,整合能力,学术基础,沟通能力每个都很重要,但都不是绝对的条件。谋而后动,多思考,少抱怨,方法总比困难多。

开放一个别人可以与我互动的渠道,人总要有一定的出现频率,才能形成圈子。

教育的本质,应该是让每个受教育者能过得更好一些。

参考文档(API Reference)对于使用API的重要性,而大部分参考文档其实是自动生成的。而我的第一份实习主要就是做一件事,修复自动文档生成中的error和warning。举个简单的例子,下面是一个简单的求两数之和的函数,并加上了字符串介绍函数的功能以及相关变量和返回值。API参考文档的意义是什么?

代码覆盖的重要性就是提高我们对于新代码的信息,让我们知道这些新的代码是有保证和重复测试的。

对着代码看了整整一上午都没看出问题,直到后来原来负责这个模块的工程师看过才发现了我们的代码少处理了一个特例(corner case),而单元测试也没有写逆向测试,所以无法通过软件的编译。那个时候我才知道,测试不仅要看是否按照预期运行,还要检测失败后应该是什么情况,并让它失败

后来我就彻底告别了软件开发行业,也基本不用C++了,学了两天Python就开始一招走遍天下。我以为曾经给过我教训的这些软件工程知识估计用不上了,而编程经验对于我最大的帮助就是可以短时间上手Python。

去年在机缘巧合下开始参与了一些开源软件开发,也开发了一些自己的算法工具库。当时完全摸不着头脑,但从网上一搜如何做开源工具库,发现都是我很熟悉的概念:

  • 写好测试,并使用自动测试模块,关注代码覆盖率
  • 写好参考文档,使用字符串和文档生成工具
  • 注意版本控制,做好regression testing

作为一个完全没做过开源的工具库的人,我只花了一周就完成了我的第一个算法工具包,文档、测试、代码覆盖一应俱全,也获得了一些小同行的关注。如果我不曾学习软件工程,那我肯定无法快速开发出可用的工具库,可能空有好点子却无法实现

编程它就是个工具,它可以帮助你很快实现各种你看到的新点子。从这个角度来看,不管你是机器学习、优化以及其他方向,多学点编程肯定不吃亏。即使你最后没能做机器学习,这编程能力是你的谁也拿不走,还有广阔的就业市场。**

编程能力对于机器学习即使不是雪中送炭,也一定可以锦上添花。有大概率我们最终当不了科学家,而学好编程做个工程师是很好的替代选择。

现实一点看,少跟数学死磕,多花时间动手实现,拥有良好的编程能力,可以是就业的一道保障。找不到机器学习岗位,还可以去写JAVA去做手游嘛。

你可以选择跳槽,但工作也会筛选你。动机很重要,如果你的目标是赚个“快钱”,可能很快工作就会把你逼离这个岗位因为初级的工作不仅没有高薪,还有很大的挫败感。你可能会觉得什么都不懂,什么都不做好,然后后悔自己要转行。而转行中最难得的,就是能感觉到“有意思”**。这不仅仅是鸡汤,你对一个领域的热情可以反映在写论文、玩博客、出书,也可以体现在主动揽活,业余时间自学。热情是骗不了人的。

我的天哪,做着自己喜欢的事情,还有钱拿。还有比这更爽的事情吗?

每个人都有转行的权利。但建议转的步子小一点,别一口吃成个胖子。这不仅仅是给自己一个余地,也是对公司负责。胡言乱语说了一堆,诸君就当个段子就好。

调整心理期待,明白网络是找乐子的地方。

笔记应该是“索引”,而不是摘要。索引是你自己的,摘要是作者的。作为一个普通人,想要记住所有的paper内容和精髓是不现实的。

深度学习、机器学习的论坛

躺平就完事了

我们大部分人这辈子就是混口饭吃,能够一步步计划并实施的人真的太少了,大部分时候就是头脑一热。这种冲动,尤其是是年轻时候的冲动是非常值得尊重的。科技迭代是一轮一轮的。如果你今天以较低的成本赶上了这一轮热潮,也一定要赶快补足深度,不然下轮死在沙滩上的就是你。

数学作用

规范表达,具体问题抽象为数学问题后,往往信息得到了压缩,仅仅是最重要的部分得以保留,这是非常适合信息交换与流通的。

  • 数据储存与安全
  • 明白的数据的价值
  • Break the loop(打破循环)

没有学历,没有技能,没有人脉,也没有财产,最终沦为底层。需要打破循环,但往往需要借助外力,当你感到困扰,需要突破时,不妨多多向外求助,比自我纠结效果会好很多。

成功的开源项目

  • 核心代码群,且必须有合适的docstring和注释,用于生成文档。
  • 配套的单元测试,以及自动测试(比如travis ci)和代码覆盖率(code coverage)
  • 配套的文档以及例子,比如托管在readthedocs上,以及在binder上做一个jupyter notebooks。
  • 封装并上传到pypi和conda上,方便大家下载更新。
  • 写一个吸引人的README,使读者有兴趣使用你的工具。最好在Stack Overflow等网站上宣传。

上面每一点都有无数的坑需要趟,绝不是想的那么容易。大部分所谓的开源工具连个介绍文档都没有,怎么可能吸引别人来用呢?更别提被人star了。很多人仅仅是做了第一点,只做了核心模型,但其他部分全部都是缺失的,那么这种“所谓的硬核”工具库其实真不如资源收集贴更有实际意义

至少应该等同于开发时间精力在写文档和宣传上,这样才算是个合格开源工具。从这个角度看,资源repo获得更多star也不奇怪,因为它的阅读门槛低,内容是可自解释的(self-explanatory & self-contained),所以读者没有阅读障碍。

其实退一步来看,开源项目的初衷是分享,被别人star/fork/watch是一种肯定,这没错。但也不必凡事都论成就大小,那就有点舍本逐末的意思了。

找实习

  • 根据往届情况进行精准定位
  • 调整心理预期,放宽搜索域
  • 找到你的“闪光点
  • 先进实验室,再去实习
  • 大部分简历都活不过人事那一关,你有再强的技术也走不到面试官面前
  • 埋首故纸堆不是错,但你要相信条条大路通罗马。
  • 了解算法,但不死抠算法

越往前走,我就越发现“磨练技术”和“培养软实力”并不矛盾,一个好的工程师或者科学家也需要“讲故事”和“混圈子”。说了这么多,只是想在一贯的技术分享以外,提供一些容易被我们这些书呆子忽略的事情。