对应大多数人而言,做机器学习等各种算法,最难突破的就两个点,一个是计算机能力,另一个是数学能力,由于现在有关技术逐渐成熟,教程和课程都逐渐完善,另外这个领域多半是计算机专业出身的同学,因此计算机能力慢慢变成了基操,大家都觉得还合适,但是数学,从本科各位同学学高数就开始嗷嗷叫了,然而要吃算法这碗饭,不得不迈过这座山,所以,还是得生啃。
而我,是从比高数更难的数分,比现代更难的高代过来,走过实变复变出来的一个普通的数学系同学,跌跌撞撞的走来感觉有些经验可以和大家分享,结合着我昨天收集的信息,给大家谈谈在这个领域,数学的作用以及一些学习方法吧,如有补充可以看看评论。
懒人目录
- 擅长数学的好处
- 算法领域对数学的要求
- 需要掌握哪些知识
- 学习方法
- 部分资料推荐
- 有关数据结构与算法
- 部分问题专题
擅长数学的好处
在知乎里很多人把数学系的人干其他事情称为“猛虎下山”,因为了解了基本的方法论后对于具体问题会有着独特的角度和更为严谨的思维方法。那么在算法领域,擅长数学会有什么好处,我来简单讨论一下。
首先,擅长数学的人,会对模型有更加深入的理解。虽然现在在技术上,tf、sklearn之类的已经能够支持基本算法的操作,但是,对于不理解模型的人,那终究是积木,只能通过搭积木+实验的方法,上限明显,理解了理论,你能针对问题给处更为细节的方案,更加敢于大刀阔斧的进行修改,大幅提升性能。
第二,数据敏感性与分析诊断能力。这个是来源于常年看着数据和进行计算后得到的经验,不少职场老司机同样也有,在进行分析的时候经常能发现边缘但是关键的问题,并在实施前就想好策略解决,另一方面对于出现的问题,能迅速通过计算和分析得到结果,之前的文章“评价指标设计”里面的自己设置评价指标,其实就依赖这种能力。虽说这种能力前辈都能有,但是一进职场就有,这个就和你的数学能力有关了。
第三,更加精准的理解和表达。对于模型你能写出足够精细的伪代码,或者是能用公式表达,那你对这个模型的理解才真正的到家,可以参考现在科研的论文,公式已经是交流的基操了。
第三,就是笔面试了,笔面试常常会问你一些有关模型推导方面的问题,这就一定会涉及数学了,手写支持向量机,推导BP的反向传播,这都是最基本的,然后是一些方向专精的,推荐系统里面的FM,NLP中的W2V等等,最最功利的,我们要理解这些模型并在面试中说个所以然来,那就肯定要懂数学。
算法领域对数学的要求
那么问题来了,算法领域需要数学到什么程度呢,个人的理解,你越做的深入,需要的就越多,到后面很可能就成为你突破的瓶颈,再者,很多人把数学基础理解为简单的计算方法上,矩阵、求导等,而实际上远远不止如此,那在算法领域,具体是什么要求。
入门阶段,这个阶段大部分人在过类似《统计学习方法》之类的基础,而这本书事实上需要一定的数学基础,尤其是一些基本的数学概念,因此在此阶段,要达到的水平应该是大一数学的水平,知道基本的概念即可。
进阶阶段,这时候会有些人发现即使懂这些基础,但是有些细节还是不懂“为什么”,例如SVM为什么要求对偶,SGD为什么能找最优解等,这时候需要一些在原本数学概念基础上的一些理论,前面两个例如对应的都是运筹与优化方向的知识细节。当然了,这阶段其实很多人就止步了,毕竟我使用SVM并不需要知道SVM是什么也能去用,但是你要是能迈过这关,你会发现你对数据本身特点与联系模型提出方案的能力会有质的提升,你所谓的“经验”可能有了更加扎实的理论保证,有的时候可能只是模糊的感觉,但是就感觉在你的三观下某个模型的结果就是不好,那你可以避开了。
在进一步,你能根据自己的理解去设计模型了。你能分析损失函数是否合适,你能找到交叉熵和MSE做损失的差别,你能根据预测性能指标加bad case分析,来诊断模型的缺陷,根据模型的缺陷提出改进建议,甚至是创新,在科研上,你就能做一些理论创新,在技术上,你能针对独一无二的问题提出个性化方案,这就是专家了。
很多人可能会说,工业界很多时候用的都是基线,不需要多高端,有了数据就怼模型就好了,为什么需要这么高端的东西。我只想说,可能大部分内容确实是所谓的low的东西,但是你在进行迭代的时候,有自己的思路终究能给出更为合适的方案,LR万能,但是万能的代价是性能不会突出,相信大家都能理解。
有时候也没有必要分的那么清,我用人话来表达一下吧,无论科研还是工程,都是这三个角度判断:
- 看得懂公式
- 能把具体的模型演绎理解后转化为代码
- 在一定条件下你可能要下手改进,以更好地解决你的问题
- 必要的沟通交流,写论文也好,文档也好,需要公式支持你的解释
你的数学水平,能在你的职业状态下满足上面需求,我觉得就完全足够了,毕竟数学对绝大多数人来说就和英语一样是工具。
需要掌握那些知识
要说数学知识本身,其实并不是很多,我结合着需要的程度和大家聊一下。
数学学科角度
首先是最基础的数学,这个对大部分大学理工类专业而言就是基础课吧。个人建议要进这行下面的都要掌握。
- 数学基础:
- 高数(数分):微积分,多元微积分(甚至会涉及矩阵求导之类的内容)
- 线代(高代):线性方程组,矩阵变换,行列式,线性空间,特征值特征向量
- 概率论:期望方差,古典概型,全概率贝叶斯,各种常见分布
然后是一些比较进一步的内容,可能会涉及不同的学科说法,我这里以我自己接触的为例,大家听名字应该都会了解一些。不需要全部掌握,有需要或者有兴趣看看无妨。
- 基础进阶:
- 最优化方法:最速下降法,牛顿法等,包括KKT条件以及有关理论,先序知识是高数和线代,尤其是求导,实质上求最优值的核心就在于求导
- 矩阵论:花式矩阵分解,尤其是SVD等,在embedding等方面具有非常重要的地位
- 运筹学:尤其是在对偶理论一块,有些时候最优化问题可以通过对偶能求出更好的数值解甚至精确解,例如SVM中的SMO求解方法
- 数理统计:重点在矩估计、极大似然估计等,至于假设检验,可能会在模型评估阶段会用到,如果有必要可以了解,有时候类似单侧检验之类的在AB实验真的用过
- 多元统计分析:这个和机器学习有巨大重合,k-means之类的甚至都会谈,包括PCA等
- 数值分析:从计算机角度考虑一些计算,因为很多数学理论都是看的连续型问题,如何让计算机利用离散迭代的方式计算,都是数值分析里面讲的,举个例子,求导,定义上是一个极限,数值求导怎么整,可以了解一下
- 离散数学:计算机类专业必修,目标和数值分析类似,但是探索广度更大,图论、因果逻辑之类的都在这里面谈及,尤其图论,划重点
- 随机过程:个人认为这里面难度最高的一块吧,HMM之类的都在这里面,后面衍生就是概率图模型,或者说随机过程某种程度就算概率图,我的理解不是很深,有错误可以指正
- 信息论:尤其是决策树有关理论,很多都来自信息论,信息熵之类的,就是从香农的理论来的,前面几块可以看看,当然了,只求理解的话,统计学习方法里面谈的也足够
再深入的,实际更加用不上了,要上面喂不饱你,实变函数、复变函数、微分方程、抽象代数、混沌学、实分析等内容可以了解一下,这些东西个人感觉至少领先时代100年,保守估计的,我们活不到的未来会发挥很大作用,但是具体是哪个我们不知道,毕竟历史大浪淘沙,至于目前数学最难的部分是类似陶哲轩做的调和分析之类的,有兴趣可以继续挑战哈哈哈。
知识点角度
知识点角度去谈可能会非常零散,遍布很多细节学科,但是很多学科下其实有些东西用的并不是特别多,我简单谈一谈吧。
- 有关矩阵方面的计算。线性方程组、矩阵基本计算、特征值特征向量都是基操,建议看看矩阵分解的内容,对embedding理解有很大好处。
- 微积分。一元微积分是基操,至少要会求吧,推荐想深入学习的人还是理解一下概念,尤其到极限的部分,当然了,有关一些理论证明其实可以跳过。多元微积分会在一元的基础上稍微复杂一些,但一元的扎实了其实二元甚至多元理解起来不会太难。微分一定要懂,积分可以根据自己的需求。
- 基本的概率统计知识。古典概型开始,到基本的分布,数学期望方差,条件概率,甚至到一些常见的分布,二项、泊松、正态等等,然后是后面有关参数估计的东西要理解,尤其是点估计里面的矩估计和极大似然估计。假设检验,可以考虑基本的有关两个样本总体的均值方差之类的对比,可以看看,在现实中有用,亲测。
- 最优化方法里面有关梯度的内容,最速下降法——梯度方法的代表方法,然后是牛顿法、共轭梯度法,这些都是求解机器学习模型里面重要的方法,另外有关KKT条件之类的,建议了解一下。
- 离散数学建议全部拿下,没有理由。计算机内一个非常重要的计算概念就是“离散”,没有连续,所以这块的理论一定要熟练掌握,划重点,图论。
- 对底层计算方法有兴趣的,数值分析了解一下,例如导数求导在离散角度是怎么做的,这个在自己手写算法的时候很有用,至于什么时候要求导,想想梯度下降法。
- 多元统计分析,主要是聚类分析、判别分析、主成分分析、因子分析等,都可以看看,在实现处理、特征工程方面都有很大用处,有的甚至就已经是所谓的机器学习模型了。
学习方法
不知道有多少人跳过上面的看过来,我直接说建议吧。
- 跟着课本的样子去推导(不是抄书!要理解理论细节)
- 应试,就需要背点定理、做点题目
- 记住的难度很大,时间长就忘记,如果你硬是要记住,那就用吧,找些渠道用,例如学点更加深度的东西
- 尤其是做算法开发的,虽然工作需要你调包就能完事,但是还是建议多看看资料,论文博客之类的,不要跳过理论部分,否则你迟早会忘记(前几天我居然忘了特征值和特征向量怎么求)
- 多换几本书看,有时候一本书不够,你就多看几本书比对着看
- 针对数学类本身,个人其实不太建议开视频,看书会比视频效果好。原因有下面几个:
- 讲的快慢影响个人理解的节奏,书能自己控速
- 讲过了就过了,很难照着他的样子做,会产生“你已经会了”的错觉
- 有时候有些人会因为自己会了而用“显然”跳过正好你不知道的部分
- 数学敏感性没起来之前,尽量找集中的大块时间去学习,足够的时间才能够让你有一些突破性理解,而数学需要经历那个突破的过程
往后说,对于做算法的同学,尤其是已经入了行的,我其实不建议单独花时间恶补数学,而是面向需求看,他不会为你的工作进展带来困难时,其实必要性不大,除非是这几种情况:
- 找工作,需要了解自己平时调的包的具体细节,但自己受限于数学能力,需要提升
- 模型创新时,需要读懂别人的论文时
至于做科研的同学,尤其是奔着顶会去的同学,建议建议好好扎实数学:
- 别人的论文你要看懂
- 你的模型具体怎么计算,一来知道过程,二来要知道表达方式,来举个栗子吧
- 写出卷积计算的表达式(评论看看有多少人第一反应写不出来)
所以综合起来,最好是根据自己的需求来补充即可,除非你真的学不下去,看不懂,否则不建议从头开始补,成本高收益小。
部分资料推荐
很多人找我要资料,或者问具体问题啥的,我想说——现在的资料收集门槛其实特别低,网络上还是图书馆,都建议大家多去看看,不缺学习材料。
咳咳恩,我简单推荐一些比较关键的,其他的,我不建议大家全都学,部分内容和学科也不需要全部掌握,我建议的学习方法是在一定基础get后,根据需求去学和看,有高数线代概统3剑客在手,其他的东西基本不会在知识上卡住你了,除非想不开要去弄抽代甚至更高级的东西。
首先,高数看同济大学的,基本是业内首推吧,我自己是看华东师范的数分,高数更倾向于教大家怎么去计算,对原理的探索其实不是很多,而数分相反。至于针对算法的同学,弄懂高数足够,知道怎么求微积分足够。
线代的话,我首推是我一位很好的朋友的文章,点击这里直达。这两个是我非常建议单独拿来过一遍的材料,精推,所以少给一下,但是按照个人的习惯,在这些材料看不懂的情况下,我非常建议大家多去图书馆之类的看看相关书籍对你不懂得这块的解释,多读几遍比对后,会慢慢理解。
概率统计方面,就推一本吧,概率论与数理统计,前面有关概率的建议全看,后面有关数理统计的,点估计+一些假设检验看一下无妨。有些人希望我讲讲,额,一两句话讲不完,讲完了估计也是一本书了,所以吧,自己去看可能比我来讲更加合适吧,这个事情需要有耐心,真急不来。
再推荐一个口碑无敌好的视频,就是李宏毅老师的
上面的是建议系统自学的,也是本科大一的基本水平,做算法的各位更要好好掌握。
其他的,建议大家根据需求学习,对于不懂的概念进行补充,然后对有兴趣的内容可以专题学习,说白了,这些掌握《统计学习方法》看起来理应不会太困难。
数据结构与算法
这是一个数学专业也会学,计算机专业也会涉及但是多少有点不懂,且笔试面试经常考的东西,所以想单独拿来聊一下。
首先,对于做科研的同学,有关时间和空间复杂度的理论,要求不是很高,除非你尝试通过提升某个算法的性能,例如GBDT到XGBOOST、LightGBM等,否则,可以不用学太深,你的目标只是,有一个思路,能翻译为代码,足够。
对于要找工作的同学,尤其是工程上的,那就要求你是个老司机了。
首先,这个是大多数计算机类专业和部分数学类专业的基础课,如果是没有上过,其实可以考虑get起来。
- 慕课网、牛客网之类的网络课程挺不错的,不做广告哈
- 一些课本其实看看也很适合入门
另一方面,大部分人是需要面对实战和面试笔试的,所以还是要多做一些练习,重点是要动手!
- letcode、剑指offer还是经典
- 大厂面经笔经,好好看看
很多时候,希望代码能够在性能上有进一步提升,非常建议大家做一些专题的进阶。
- 算法导论,最近在看,感觉打开了新的大门,不过感觉有些同学可能看不下去
- 啊!算法 以及 算法,这两本书可能看起来会比较舒服
当然了,很多人会问设计计算机语言的问题。
- python的给一本——史世强老师翻译的高效算法,感觉是python有关算法的一本不错的书
- c++和java,我建议大家至少会一个,github上有很多教程,感觉都不错,可以考虑找一个,完整的过一遍
部分问题专题
有些人通过后台等方式问了我一些问题,我这里集中回答一下。
Q: 有关数据科学和具体深度学习之间的关系。数据科学到什么程度算是掌握。
A: 我本身对数据科学本身没有明显的概念,甚至感觉有点类似统计学的概念额,所以我不太敢说。至于掌握到什么程度,额,说一本可能有些偏差但是还挺好的书——数据挖掘导论,这本书看完,感觉数据科学也能理解怎么回事了。
结束语
呃呃呃,看着字数已经接近6k了哈哈哈,不知道对大家有没有帮助吧,今天不打算谈太多有关理论上的东西,只是希望大家能对数学更有信心,把数学学会,突破自己前进的瓶颈吧。最后强调几个点。
- 数学决定了上限,计算机能力决定了下限,两个都很重要,如果希望持续进步,那数学关迟早要破。
- 看什么材料,都要看完!!行百里者半九十,能看完,你就有质变
- 材料一方面,多找一些是另一方面,不要做伸手党,自己多在各个领域里面查,最适合自己的才是最好的
- 不要害怕,迎难而上,不难的东西,大家都会,那还能分出高下吗
最后祝大家加油吧!