为什么科技互联网公司越来越重视数学

下面是贾清扬的回答, 文末会PO出原文链接, 只传递最有价值的idea, 看了大佬的回答, 受益匪浅:
先说我的观点:从帮助实际应用的角度来说,懂基础数学,同时愿意上手尝试的人,是最好的综合性人才。具体的说有两点:
(1) 基础数学可以提供可以证明的方法突破。
(2) 基础数学和工程实践是一个乘法关系,可以相互放大它们的影响。
在最近人工智能的科研和实践当中,很不为大家所知的一点是计算的加速,因此我就举一个计算加速的例子。在卷积神经网络当中,最花时间的一个计算就是卷积计算:它耗费的时间是如此之多,以至于在一个图像识别模型当中,绝大多数(超过90%)的计算量,都是花在卷积上面的。非常多的框架软件,硬件芯片设计,等等,都在解决这样一个问题:我要算一堆乘法和加法,我怎么让每个乘法和每个加法算得更快?更直白点讲,就像用算盘拨算珠,我怎么把我手指头弄得更快?
但是从数学的角度来说。。。我为什么不能索性少算一点呢?
(1) “我可以证明我能少算一点“
这个正是在2015年的时候,Andrew Lavin和Scott Gray做的一件事情:他们通过一个称作Winograd的数学方法,证明说,对于33的卷积(这是绝大多数当时模型当中的卷积参数),他们可以将卷积当中的乘法计算量降低到之前的九分之四:也就是说,可以在理论上将计算速度提高2.25倍。
我们辛辛苦苦调了那么多程序,用SIMD,cache locality,等等,都是在挤牙膏,一下子提升2.25倍理论性能,是不是很诱人?
因为Winograd的具体解释相对比较琐碎,所以我用一个它的前身,Strassen的快速矩阵算法,来解释一下。我们都知道,如果我们需要计算两个矩阵的乘积,我们需要计算一系列乘法和加法:
C = AB
最简单的情形,如果我们需要计算两个2
2的矩阵的成绩,那么通过矩阵乘的定义,可以这样计算:
在这里插入图片描述
因此我们需要做8次乘法和4次加法(每一个C矩阵当中的值需要两个乘法和一个加法)。用更加数学的方式来说的话,对于两个nn的矩阵乘,最简单的算法应该会涉及到n 的3次方次乘法和 n ^ 2(n-1)次加法。也即O(n 三次方)复杂度。也许你会觉得这是个不可思议的事情:这都已经是定义了,那我肯定得把这八个乘法都给算一遍,怎么能省下来呢?
Strassen在他1969年的文章中提到,我们在数学上其实可以做得更好。拿上面的2
2矩阵为例子,我们可以构造一系列很有意思的中间数:
在这里插入图片描述
一共用到7次乘法以及10次加法。
这样,我们的C矩阵就可以这样来算:
在这里插入图片描述
最终,我们用到了7次乘法和18次加法。通过数学的变换方式,我们将乘法的数量成功降低了八分之一:这个是理论上可以证明的。
(当然,一个显然的问题就是,为什么我们要关注乘法,而不是关注加法数量?这个和实际应用有关系:一般而言,我们认为乘法比加法所需要的计算更加复杂,所以我们会关注乘法的数量;另外,上面的所有计算当中,小写的a/b/c/m都可以从简单的数字变成子矩阵:而子矩阵的乘法(O(n3)复杂度)比子矩阵的加法(O(n2)复杂度)要复杂很多,所以减少乘法的数量是对于运算更加有效的。)
我觉得这就是基础数学(或者说,也许这个还不是基础,还有点偏向应用)的好处:在我们埋头做工程的时候,有时候抬起头来一看,哇,数学方法的创新可以形成降维打击。这是最让人兴奋的地方。

2. 基础数学和工程实践是一个乘法关系。

如果你觉得今天所有的矩阵计算都在用Strassen算法,那你就错了:在实际应用当中,Strassen算法还面临着很多其他的挑战:
(1) 实际的浮点数是有比特数限制的,Strassen算法因为使用多次加法,数值的稳定性会差。也就是说,“算不准”。
(2) 理论上的加速,还需要和硬件关联起来。现在的硬件因为乘法和加法在指令集层面的结合(fused multiplication and addition, FMA)以及指令流水线的缘故,最底层的乘法和加法如果不平衡,反而会造成减速.
(3) 在通过Strassen算法做矩阵的乘积的时候,还需要考虑具体实现当中的cache locality的问题
如此种种。Winograd也是类似:今天,Winograd出来以后,在现有的深度学习加速库Winograd在许多新的应用当中,因为越来越多地使用到separable convolution,depthwise convoluiton等等,因此,也不一定是任何的convolution都能用上。
应该说,工程实践经常是一个很”脏“的事情:环境不同,需求不同,不一定每一个很空灵的数学成果都能够实际落地下去。这个时候就特别需要”有手感“ - 一方面需要懂数学,一方面要能够懂需求。
不过,最后话说回来,这个问题兴许除了目标导向,“什么有用”之外,还有另一层更长线的原因:数学本身就是一个非常锻炼思维的场景,如果我们需要提升自己的认知水平和技能,那就需要在数学化、逻辑化思维上面多做训练。数学也许没有直接的用处,但是懂数学,触类旁通,这个肯定是有用处的。

作者:贾扬清
链接:https://www.zhihu.com/question/376741737/answer/1059438493
来源:知乎
著作权归作者所有。

发布了48 篇原创文章 · 获赞 29 · 访问量 3023

猜你喜欢

转载自blog.csdn.net/weixin_35894210/article/details/104972062
今日推荐