为什么科技互联网公司越来越重视数学？
应邀来答。各位前辈已经讲了非常多大方向上的深入见解了，我来从更偏细节的角度分享个例子。 先说我的观点：从帮助实际应用的角度来说，懂基础数学，同时愿意上手尝试的人，是最好的综合性人才。具体的说有两点： 在最近人工智能的科研和实践当中，很不为大家所知的一点是计算的加速，因此我就举一个计算加速的例子。在卷积神经网络当中，最花时间的一个计算就是卷积计算：它耗费的时间是如此之多，以至于在一个图像识别模型当中，绝大多数（超过90%）的计算量，都是花在卷积上面的。非常多的框架软件，硬件芯片设计，等等，都在解决这样一个问题：我要算一堆乘法和加法，我怎么让每个乘法和每个加法算得更快？更直白点讲，就像用算盘拨算珠，我怎么把我手指头弄得更快？ 但是从数学的角度来说。。。我为什么不能索性少算一点呢？ 这个正是在2015年的时候，Andrew Lavin和Scott Gray做的一件事情：他们通过一个称作Winograd的数学方法，证明说，对于3*3的卷积（这是绝大多数当时模型当中的卷积参数），他们可以将卷积当中的乘法计算量降低到之前的九分之四：也就是说，可以在理论上将计算速度提高2.25倍。 我们辛辛苦苦调了那么多程序，用SIMD，cache locality，等等，都是在挤牙膏，一下子提升2.25倍理论性能，是不是很诱人？ 因为Winograd的具体解释相对比较琐碎，所以我用一个它的前身，Strassen的快速矩阵算法，来解释一下。我们都知道，如果我们需要计算两个矩阵的乘积，我们需要计算一系列乘法和加法： \bm C = \bm A \bm B 最简单的情形，如果我们需要计算两个2*2的矩阵的成绩，那么通过矩阵乘的定义，可以这样计算： \begin{bmatrix} c_1 & c_2 \\ c_3 & c_4 \end{bmatrix} = \begin{bmatrix} a_1 & a_2 \\ a_3 & a_4 \end{bmatrix} \times \begin{bmatrix} b_1 & b_2 \\ b_3 & b_4 \end{bmatrix} = \begin{bmatrix} a_1b_1 + a_2b_3 & a_1b_2 + a_2b_4 \\ a_3b_1 + a_4b_3 & a_3b_2 + a_4b_4 \end{bmatrix} 因此我们需要做8次乘法和4次加法（每一个C矩阵当中的值需要两个乘法和一个加法）。用更加数学的方式来说的话，对于两个n*n的矩阵乘，最简单的算法应该会涉及到n^3次乘法和n^2(n-1)次加法。也即O(n^3)复杂度。也许你会觉得这是个不可思议的事情：这都已经是定义了，那我肯定得把这八个乘法都给算一遍，怎么能省下来呢？ Strassen在他1969年的文章中提到，我们在数学上其实可以做得更好。拿上面的2*2矩阵为例子，我们可以构造一系列很有意思的中间数： \begin{align} m_1 & = (a_1 + a_4)(b_1+b_4) \\ m_2 &= (a_3 + a_4)b_1 \\ m_3 &= a_1(b_2 - b_4) \\ m_4 &= a_4(b_3 - b_1) \\ m_5 &= (a_1 + a_2)b_4 \\ m_6 &= (a_3 - a_1)(b_1 + b_2) \\ m_7 &= (a_2 - a_4)(b_3 + b_4) \\ \end{align} 一共用到7次乘法以及10次加法。 这样，我们的C矩阵就可以这样来算： \begin{bmatrix} c_1 & c_2 \\ c_3 & c_4 \end{bmatrix} = \begin{bmatrix} m_1 + m_4 - m_5 + m_7 & m_3 + m_5 \\ m_2 + m_4 & m_1 - m_2 + m_3 + m_6 \end{bmatrix} 最终，我们用到了7次乘法和18次加法。通过数学的变换方式，我们将乘法的数量成功降低了八分之一：这个是理论上可以证明的。 （当然，一个显然的问题就是，为什么我们要关注乘法，而不是关注加法数量？这个和实际应用有关系：一般而言，我们认为乘法比加法所需要的计算更加复杂，所以我们会关注乘法的数量；另外，上面的所有计算当中，小写的a/b/c/m都可以从简单的数字变成子矩阵：而子矩阵的乘法（O(n^3)复杂度）比子矩阵的加法（O(n^2)复杂度）要复杂很多，所以减少乘法的数量是对于运算更加有效的。） 我觉得这就是基础数学（或者说，也许这个还不是基础，还有点偏向应用）的好处：在我们埋头做工程的时候，有时候抬起头来一看，哇，数学方法的创新可以形成降维打击。这是最让人兴奋的地方。 2. 基础数学和工程实践是一个乘法关系。 如果你觉得今天所有的矩阵计算都在用Strassen算法，那你就错了：在实际应用当中，Strassen算法还面临着很多其他的挑战： 如此种种。Winograd也是类似：今天，Winograd出来以后，在现有的深度学习加速库Winograd在许多新的应用当中，因为越来越多地使用到separable convolution，depthwise convoluiton等等，因此，也不一定是任何的convolution都能用上。 应该说，工程实践经常是一个很”脏“的事情：环境不同，需求不同，不一定每一个很空灵的数学成果都能够实际落地下去。这个时候就特别需要”有手感“ - 一方面需要懂数学，一方面要能够懂需求。不过，最后话说回来，这个问题兴许除了目标导向，“什么有用”之外，还有另一层更长线的原因：数学本身就是一个非常锻炼思维的场景，如果我们需要提升自己的认知水平和技能，那就需要在数学化、逻辑化思维上面多做训练。数学也许没有直接的用处，但是懂数学，触类旁通，这个肯定是有用处的。