作者 | 梁唐
大家好,我是梁唐。
今天和大家聊一个老生常谈的话题,学算法需要多少数学能力。
谈到这个话题,估计很多同学会说,学算法啊,对数学的要求应该很高吧?
甚至之前还在知乎里看到这么一个问题,有人提问:我想学算法,我到底是应该报数学系呢,还是计算机系?我想估计也有不少同学有这样的困扰。
这里面其实误区非常大,好像提到算法提到编程就想到数学。后来机器学习、深度学习兴起了之后,大家又把算法和数学扯上了关联,这固然是一种自然而然的反应,但其实挺没有道理的,毕竟这是两个不同的领域,两者之间是没有包容关系的。看起来有再多的共性,也是两个领域,不能混为一谈。
我们再来举一个实际一点的例子,如果你研究过计算机和数学系的课表的话,会发现两者的差距相差非常大。数学系学习的几乎都是实打实的数学理论或者是数学在各种领域的应用、分析,属于实打实的理科。也就是以理论为主,几乎不涉及应用实践。
所以很多数学人的痛点就是理论学了一大堆,但如果不去进一步学习理论的应用,那么学到的东西几乎全无用武之地,甚至找工作也很困难,因为别人总不会招你去做题或者是讲这些数学理论。所以很多数学人自嘲,学了四年数学, 上能算天体引力、黑体辐射,下能算各路微分方程,但就是找不到工作。
而计算机呢,除了必须的理论课,如高数、概率论、线性代数等之外呢,也有很多偏实践的课程,比如C语言、面向对象、软件工程等。像是这些课程就几乎和数学没什么关系了,几乎不存在需要什么数学功底才能听懂。考察的完全就是对程序的理解以及单纯的逻辑思维能力了。
说了这么多,结论也就很明显了,学算法需要一定数学能力,但不是需要数学家,够用即可。如果你想看从事算法方向的工作,纠结选数学还是选计算机的话,那我建议你还是选计算机吧。
应用数学是给那些不知道以后要干嘛,准备读研了之后再想的人准备的。
澄清了误区之后,咱们再来盘点一下用到的数学内容。
我按照从重要到不重要的顺序依次来说,我个人觉得其中最重要的就是线性代数。线性代数这门课很神奇,同样是程序员也几乎只有算法工程师用得到。
线性代数当中的内容其实不少,行列式的计算,矩阵的各种变换以及性质,但其实真正的工作当中这些几乎也都用不到。用的最多的说出来你可能不信,就是矩阵的乘法和矩阵的变形。因为在日常工作当中,所有的数据都是以矩阵或者向量的形式被处理和计算的。
在这种情况下,矩阵乘矩阵,矩阵变换维度是常规操作。当然除了这些之外还有一些其他的知识,比如行列式的计算,矩阵特征值等等。不过基本上也是在一些特殊的算法(SVD、PCA等)当中用到,随着时代的发展,这些算法现在用得也不是那么多了,也不是必学的内容。
另一个常规操作就是矩阵求导,有点线性代数和高数交叉的意思。实际上矩阵只是表现形式,真正核心的精髓还是高数里的求导。
对于矩阵表达式的求导主要出现在我们使用梯度下降法进行模型更新的时候,计算参数的梯度需要计算各个参数关于损失函数的的偏导数。因为这其中既有矩阵,也有求导的内容,如果对这两点都不熟悉的话,看起公式来估计会觉得像是天书。
但矩阵求导的原理和普通函数是类似的,本身并没有特殊之处。只要学过高数当中链式求导法则的同学应该都能看明白,虽然说是用到高数,其实主要还是用到高数中求导的部分,其他的内容像是极限、积分,几乎不会涉及。
除开上面两个内容之外,就是概率论。
概率论使用范围其实并不大,主要是一些基于统计原理的模型。比如朴素贝叶斯、隐马尔可夫等,但遗憾的是这些模型现在并不占主流。主流的模型还是以神经网络为主,基于统计的模型已经越来越少了。
概率论当中的内容也不少,各种概率分布模型、条件概率等内容,真正用得比较多的我感觉也只有两个部分。一个是条件概率,另外一个就是贝叶斯定理。并且这两个内容也是基于具体模型的,除了几个特定的模型,其他模型其实也几乎用不到。
才疏学浅,几乎没有用到。
其实看到这里,估计大家应该也都心中有数,做算法的确需要一定的数学知识,但真要盘算下来内容其实并不多。本科阶段的数学课就已经绰绰有余了。
不知道大家看到这里会不会有幻灭感,觉得和自己想象中差得很远,觉得算法好像一下子没那么高端了。但实际上,这才是实际。本身算法和数学就是两个不同的范畴,我们要做的是算法工程师,而不是数学研究员,肯定主要的难点和知识储备不在数学上。
另外一方面其实也是好事,做了这个澄清也可以让大家少一点注意力在数学上,多一些关注在算法本身上。多一些切实的了解,少一些人云亦云和盲目跟风。
好了,就聊这么多吧。