机器学习中的第一性原理(一)

803 阅读9分钟
       最两年随着人工智能的大火,越来越多的朋友想往往这个领域发展。人工智能这波热潮不同于早几年云计算和移动互联网不同,人工智能技术起点较高需要精深的专业知识,学习曲线过于陡峭,快速学习比较困难。同时,随着这波热潮,很多非本专业的人才也想深入了解这个领域,一探究竟它到底在讲什么。百度出了一门关于机器学习的课程,用户画像数据显示关注量最高的岗位竟然是HR。但如果要要想真的了解机器学习的精髓,其实需要在这个领域通过:理论学习->实践->思考->理论学习->实践->思考,这个循环中,至少做两到三年。
       从我自己的个人经历来说,我研究生方向是软件架构,非机器学习科班出身。我觉得可以给转型想从事这个方向的非专业人士,一些学习方面的建议,以便快速的入门。同时也想了解这个领域深入原理的人士,谈一谈我在从事这个领域中的一些思考。个人浅见,欢迎指正(拍砖)。
       由于时间仓促,这篇博文,我会分两部分来完成。第一部分我根据自己的经验,总结的机器学习的方法论。第二部分,将机器学习中运用到的基础学科的基本原理,及其应用场景,在延伸在其他领域的应用(也就是我这篇博文为什么叫《机器学习中的第一性原理》的原因)
第一部分:算法人才需要什么样的素质?算法人才从初级到高级成长的路线。
我这里的算法是指机器学习的算法,具体细分领域如知识图谱、nlp、ocr等。 主要对比服务端程序员,据我了解,大部分想转型的是前后端出身的朋友。这一部分内容是给想入门的朋友,提供一个系统性学习路径的建议,以便学习起来事半功倍。
第二部分:机器学习中的一些基础性原理,应用场景,与基础科学数学、物理学、信息论的联系。并从基础原理中衍生出与其他领域的联系。
这一部分内容主要是为了非该领域的朋友,为你想更深入的了解其中原理,提供思考的方向。

一、算法人才需要什么样的素质?

个人总结服务端技术人才和算法人才的核心能力如下图所示。
服务端人才的核心能力我总结为以下三点。在这三个能力里面,我觉得系统性思维是最底层的能力,我们谈到以工程师视角来看待世界,就是系统性思维。把一个大的系统分解成一个个模块,每个模型保证其可移植、解耦、可扩展。类似一个组织系统中,分解成各个模块,让其高效运转,各司其职,局部最优化达到集体最优化。另外,体现系统性思维的是软件架构里讲的分层,分层的目的是在大用户量产品比如上亿用户数产品中,如何实现分流、负载均衡等。严密的逻辑思维和较强编码能力是后端工程师的法宝,代码不出bug,靠的就是这个。
而算法技术人才,最基础的思维方法,是大数据思维,就是我说的纵向思维(逻辑思维是横向思维)。所有机器学习的算法不过是纵向统计计算概率值。而深度学习为什么需要大语料,因为少量语料统计出来的概率分布与实际情况有所偏差。
       对算法人才来说,纵向思维是基础,而深度思考能力、抽象能力、数学基础是决定能走多远的能力。深度学习大部分模型较为复杂且抽象,至于他为什么这样好,那么不好,在于你思考的角度。比如transformer中加入attention,为什么要加入attention,很多时候不是靠灵光一动,而是你层层剖析,一步步在深度思考中往下探求其本质。
       关于数学能力,我写的是"对数学的理解以及数学建模的能力"。不是我们应试教育所学的数学,应试教育数学强调的是计算。证明、推导能力。因此,我不建议重温大学数学教材。对数学的理解以及数学建模的能力具体讲,对于做算法的人才,并不要求你成为一名数学家,写出黎曼猜想的证明,更多情况,你的工作可能面对的是需要给城市交通公交车路线规划一套算法,更实际的,产品的推荐系统中设计一套新的算法,实现PV,UV的增长,与组织一起承担商业目标。这时候,需要你基于现实情况和应用场景,把问题抽象为数学模型的能力。
       那如何培养这样的数学能力呢?一方面看看国外教材和教学视频。优秀的国外教材更强调一个原理它是如何发明的,这个过程非常重要,其目的是培养一种思考问题的方法。另一方面,结合现实情况多思考,建立起这样的心智模式和思维惯性。比如你听网易云音乐的时候,想想如何生成一个歌单推荐的算法;打滴滴的时候,想想它的溢价算法有什么变化,在不同情况下,如何定价。这样思考的目的,不是为了得到所谓正确答案,而是你如何在你的大脑里,把现实情况与理论模型联系起来,培养这样的思维惯性。
       最近看了一篇博文《如何像爱因斯坦那样加倍提升自己的脑力》,听到研究员罗伯特在他的著作《天才的火花》中提到:"年轻的爱因斯坦全面接受了现代科学家所说的“思想实验”的教育:观察和感受一个物理环境,操纵其中的各个元素,观察它们的变化,所有这些都是在头脑中想象出来的。"任何思维方式的培养,离不开平常有意识的训练。
       大部分人会以为工程(后端、前端)转算法岗会比较容易,从我个人经历的角度来说,其实两者岗位要求的核心能力相差较大。可以说如果你铁了心想深入的做算法,并不太容易。话又说回来,如果你认识到两者能力要求相差较大,并愿意以归零的心态来对待,也不是那么难。看到很多热门博客提到,较强的编码能力也是算法人才必须掌握的。因为我之前写过几年代码,它不会成为困扰我的问题。但从发展潜力来考虑,我个人认为:数学>编码。试想数学能学的好的话,学习基础的编码能力根本不成问题。

二、算法人才从初级到高级成长的路线

       如何系统性的学习一个领域呢?一个很有效的方法,把这个领域的知识点分为初中高级,以及潜在所需具备的能力,组成一个领域的"知识图谱",逐一攻克。当然,结合你平常的一些项目,可能不是直线式学习,而是跳跃式学习。比如,我现在要做ocr,要求我具备的阶段,可能直接从初级跳到高级,但你需要会过头来补充一些初级和中级所必须掌握的知识点。下面是我大概画出的一个成长roadmap,你的可以跟我的不一样,并且在学习实践中不断丰富它。
       我上面灰色文字标明的一些知识点,这里不累述了。下面的软实力,我重点说数据敏感度和跨领域思考能力,其他的我觉得是通用能力,并且很多博文都涉及到过。
        在这里,我认为对算法工程师来说,最基础的软实力是数据敏感度。数据敏感度作用是什么?不知道你工作生活中,是否遇到过这样的伙伴,你觉得他技术一般,但每次模型调出来的效果准确率都挺高的,这种人就是我们一般对数据比较敏感。数据比较敏感的人,能洞见异样数据。发现数据之间的内在规律,能找到关键的特征数据,对模型的选用以及模型调参大有帮助。产品或运营岗位,同样也要学习这样的能力,从大量统计的PV、UV等数据指标中,推测其背后主要因素。如何培养数据敏感度呢?把你自己大脑想像成一个含有快照功能的照相机,snapshot输入输出大量数据,试图从里面找到数据的联系及内在规律,尝试通过改动模型、调节参数、改变特征等手段,判断预想结果是否朝你想要的方向发展。在这条路上一直走的还算顺利,跟入门一年大量的"snapshot"训练有很大关系。


        学习机器学习为什么需要跨领域思考能力呢。深度学习中包含大量抽象概念,比如卷积为什么能做特征提取,可能需要你用物理、信息论等基础学科的理论来解释。而物理这样的基础学科为什么能解释这样复杂抽象的数学模型呢?机器学习中涉及的所有数据,几乎来自互联网、人类语言、图像。而这些数据其实是物理世界的映射,这样的大数据的存在能有效的还原物理世界。机器学习做的事情,就是从大量能映射物理世界的数据中,提取其能真实反应物理世界的本质规律。