看到大佬都在回答,我也凑热闹回答。
我觉得大部分国内公司工作的时候一点都不重视数学,婊子立牌坊说自己卖艺不卖肉罢了,大部分都是拼手速,拼体力,拼牢疫结合而已,上线无脑 lr,模型无脑 resnet,din,fast-xxxx 等,偷偷抄人家的方案说成是自研,结果系统架构都被抄成了巴拿赫不动点。大部分人做完也不管对错就上线去邀功,然后有点收益以后,领导巴啦啦说投入产出比不够,降本增效,后期探索全部停止,然后只剩下无穷的部门派系利益内斗
但是,面试时候倒是恨不得对方学过各种奇怪的数学技巧,然后以小学生都看得懂的方式解出来
前一阵子被人考了一道数学题,我死活做不出来,然后挂了,觉得自己好蠢,但又感觉人家是来坑我的,看起来题目好简单的样子
假设你有一堆长短不一,而且不重复的 string,数目不清楚,每天都不断有新的 string 进来,但是总数目肯定小于 1 亿,如何给这个 string 分配一个 1 亿以内的唯一 id,并且分配过程,不需要知道上一轮的分配结果,数学上来说,就是找到一个映射 R(s) = id,且 id < 100000000, (提示,不知道上一轮分配结果,会有概率碰撞,但是控制到千万分之一以内可以接受)
我感觉这道题有可能很简单,是我够蠢根本想不出来,有一定概率爆难
这题目如果只是分布式唯一签名的话,sha1,MD5 都凑合,一亿以内肯定不会碰撞,但是 md5 这些变成 int 以后,都是非常巨大的整数,起码是 16^32 量级的大小,要把这些数拉回到一亿以内,看起来求:
int(md5, 16) % 100000000
就可以,然而这是肯定不对,我验证了一下,1 千万个 string,映射以后,碰撞率高达 0.04526349119393813,压根没法满足要求。
我就是想不出来碰撞如此低的,不带状态的hash to bucket方案,查了一些资料,tensorflow自带一些无状态string to bucket函数,尝试了一下,碰撞仍然md5那一套差不多,达不到千万分之一
目前靠一些敏感hash和层级分桶才勉强达到万分之几的碰撞率,千万分之一是不是来耍我的?
这大抵就是互联网要的数学
他们宣传自己重视“基础”数学是因为他们根本不知道什么是基础数学。。
他们真正需要的,是工业数学,典型的比如数值PDE,统计,运筹,优化,控制论,信息论等等。我之所以不说应用数学是因为应用数学的含义太模糊了。我感觉应数的每一个子学科都有人说“这不是应数”。比如,计算数学不是应用数学;运筹学有自己独立的协会;信息论自认为是工科或者CS下的学科,等等等等。不知道为啥大家这么排斥应数这个称号(斜眼)可能是觉得数学太穷了所以都不想跟数学这个穷亲戚沾上关系吧233
说到底是企业界对数学的认识不足。以前可能是模仿为主,不怎么需要研发;那现在需要自主研发了,理所当然会用到应用数学,欧美的科技企业也是这么走过来的。但是国内一提起数学就是数学研究,就想起陈景润,很多人脑子里数学=基础数学,所以宣传的时候就自然而然这么说了。应数在国内太没存在感。即使是香农,维纳这种大师,非业内人士也没怎么听说过,知名度远不及哥德巴赫(滑稽)。其实应数与产业界结合,这并不是什么新玩意,欧美几十年前就是这么做的而且非常富有成效。国内技术企业是近几年才意识到应数在技术研发中的重要性,观念的转变还需要一段时间。
应邀来答。各位前辈已经讲了非常多大方向上的深入见解了,我来从更偏细节的角度分享个例子。
先说我的观点:从帮助实际应用的角度来说,懂基础数学,同时愿意上手尝试的人,是最好的综合性人才。具体的说有两点:
在最近人工智能的科研和实践当中,很不为大家所知的一点是计算的加速,因此我就举一个计算加速的例子。在卷积神经网络当中,最花时间的一个计算就是卷积计算:它耗费的时间是如此之多,以至于在一个图像识别模型当中,绝大多数(超过90%)的计算量,都是花在卷积上面的。非常多的框架软件,硬件芯片设计,等等,都在解决这样一个问题:我要算一堆乘法和加法,我怎么让每个乘法和每个加法算得更快?更直白点讲,就像用算盘拨算珠,我怎么把我手指头弄得更快?
但是从数学的角度来说。。。我为什么不能索性少算一点呢?
这个正是在2015年的时候,Andrew Lavin和Scott Gray做的一件事情:他们通过一个称作Winograd的数学方法,证明说,对于3*3的卷积(这是绝大多数当时模型当中的卷积参数),他们可以将卷积当中的乘法计算量降低到之前的九分之四:也就是说,可以在理论上将计算速度提高2.25倍。
我们辛辛苦苦调了那么多程序,用SIMD,cache locality,等等,都是在挤牙膏,一下子提升2.25倍理论性能,是不是很诱人?
因为Winograd的具体解释相对比较琐碎,所以我用一个它的前身,Strassen的快速矩阵算法,来解释一下。我们都知道,如果我们需要计算两个矩阵的乘积,我们需要计算一系列乘法和加法:
最简单的情形,如果我们需要计算两个2*2的矩阵的成绩,那么通过矩阵乘的定义,可以这样计算:
因此我们需要做8次乘法和4次加法(每一个C矩阵当中的值需要两个乘法和一个加法)。用更加数学的方式来说的话,对于两个n*n的矩阵乘,最简单的算法应该会涉及到n^3次乘法和n^2(n-1)次加法。也即O(n^3)复杂度。也许你会觉得这是个不可思议的事情:这都已经是定义了,那我肯定得把这八个乘法都给算一遍,怎么能省下来呢?
Strassen在他1969年的文章中提到,我们在数学上其实可以做得更好。拿上面的2*2矩阵为例子,我们可以构造一系列很有意思的中间数:
一共用到7次乘法以及10次加法。
这样,我们的C矩阵就可以这样来算:
最终,我们用到了7次乘法和18次加法。通过数学的变换方式,我们将乘法的数量成功降低了八分之一:这个是理论上可以证明的。
(当然,一个显然的问题就是,为什么我们要关注乘法,而不是关注加法数量?这个和实际应用有关系:一般而言,我们认为乘法比加法所需要的计算更加复杂,所以我们会关注乘法的数量;另外,上面的所有计算当中,小写的a/b/c/m都可以从简单的数字变成子矩阵:而子矩阵的乘法(O(n^3)复杂度)比子矩阵的加法(O(n^2)复杂度)要复杂很多,所以减少乘法的数量是对于运算更加有效的。)
我觉得这就是基础数学(或者说,也许这个还不是基础,还有点偏向应用)的好处:在我们埋头做工程的时候,有时候抬起头来一看,哇,数学方法的创新可以形成降维打击。这是最让人兴奋的地方。
2. 基础数学和工程实践是一个乘法关系。
如果你觉得今天所有的矩阵计算都在用Strassen算法,那你就错了:在实际应用当中,Strassen算法还面临着很多其他的挑战:
如此种种。Winograd也是类似:今天,Winograd出来以后,在现有的深度学习加速库Winograd在许多新的应用当中,因为越来越多地使用到separable convolution,depthwise convoluiton等等,因此,也不一定是任何的convolution都能用上。
应该说,工程实践经常是一个很”脏“的事情:环境不同,需求不同,不一定每一个很空灵的数学成果都能够实际落地下去。这个时候就特别需要”有手感“ - 一方面需要懂数学,一方面要能够懂需求。
不过,最后话说回来,这个问题兴许除了目标导向,“什么有用”之外,还有另一层更长线的原因:数学本身就是一个非常锻炼思维的场景,如果我们需要提升自己的认知水平和技能,那就需要在数学化、逻辑化思维上面多做训练。数学也许没有直接的用处,但是懂数学,触类旁通,这个肯定是有用处的。
重视,是因为有用。应用数学和数学应用,显然有用,就不谈了。谈谈基础数学吧。
可能有些人觉得,基础数学因为太理论,所以无用。的确,有很多基础数学,一开始被当作既无聊又无用甚至荒谬的研究。但后来却发现,它们在很多领域发挥着不可替代的作用:
负数广泛用于科学、计分、财会中;
复数是电子科学和量子科学的基础;
图论是化学、生物、互联网、计算机科学的核心工具;
拉东变换诞生几十年后成就了CT成像;
基于数论的加密通讯让我们可以安全的网上购物和支付。
……等等等等
所以,在今天,要想做好应用研究,无论是统计、机器学习、还是人工智能,要想把它们用在实际中用好,都需要了解和学习相关的纯数学基础。
基础数学之美,在于多处开花。
比如,一种赌博机的玩法可以推广到个性化教育、广告投放问题上,因为它们都属于“序列决策类问题”。
当我们抽去事物的表象,看清问题的本质,就能解决同质的一大类问题。
数学给予我们的抽象化思维,让我们可以专注在解决核心问题上,进展往往是根本性的,能大大加速科技创新。
我们也不能忽视在实际应用之外,纯数学帮助我们提高思考、分析、解决问题的能力。
即使没有合适的实际应用,基础学科也能带来乐趣,给我们智力和精神上的满足感。——这也是我理解的,数学的「无用之用」。
综上所述,数学是基础,在许多应用领域,发挥着不可替代的作用。基础数学的「无用之趣、无用之美」,本身也是它存在的意义之一。
—— 达摩院科学家
借用一下德国的观点,我觉得非常合理。
我记得一个德国UP主关于纳粹暴行的言论,让我觉得德国部分民众是对历史有敬畏之心的。
1.不支持纳粹的德国民众不应当承受纳粹的战争暴行罪责,因为他们不支持纳粹。如果将来纳粹复辟,他们也拒绝成为纳粹的帮凶,他们出生在战后也没有事实性的帮助纳粹。
那么谁来承受纳粹的战争暴行的罪责呢?新纳粹应该承受,那些叫嚣这纳粹无罪的人应该承受,那些试图将法西斯在德国复辟的人应该承受,他们是纳粹的后继者。
二战的德国民众有罪责么,有的,他们有的真心诚意帮助纳粹,有的事实性的帮助纳粹。
2.德国人民即使不支持纳粹,也应当承担传递历史真相的使命。
不支持纳粹的德国民众不会去给也不需要给奥斯维辛,屠杀等行径洗地或者否认,因为他们本身不是罪人,但是他们理应告诉后代,在1939-1945年发生了什么,德国做了什么,万恶的法西斯分子做了什么丧尽天良的龌龊事情。
正是因为这样,德国人才有如此资格挺起腰来对历史的受害者正视,我不支持纳粹,我也没支持过纳粹,纳粹干的坏事赖不到我头上,但是我仍然告诉你们当年纳粹丧尽天良的事。
正视历史,反思历史,肩负历史,这是德国人的优良品质。
回到日本法西斯这边。
相信很多人已经看过了小约翰可汗最新一期的日本变态“鸟”,其实这就是日本战后的写照。
战犯一个劲地说不是我,我没有,文化差异,试图逃避自己的罪行,似乎忘记了就在几个月前还在满脸狰狞的虐待战俘营里的战俘。
民众们有的不能接受自杀殉道,有的遮遮掩掩地说不是我不是我不是我与我无关。
是的,这群人要么畏畏缩缩地求原谅,要么装的楚楚可怜,要么假惺惺的说自己是被上级逼迫的。
施加暴行的时候笑得比谁的猖狂,接受惩罚的时候哭的比谁都可怜。
在1970—80年代,日本经济高速发展,似乎那个战败国日本已经一去不复返,他们开始让军国主义和右翼抬头,因为自己是世界第二经济体,自己有权说不。
那些躲起来的军国主义者们又威风地穿着军服走上了街头,带着军刀的老不死们走过街头,脸上洋溢着得意的神情,忘了十几年前自己如何装成一个可怜的良民丑态。
他们堂而皇之的把战犯放在神社里面供奉。他们小人得志地嘲笑那些被侵略的国家。
他们求饶只是因为弱小。
他们凌虐只是因为强大。
他们支持右翼,却说自己并无罪责。
他们声称自己并无罪责,却不敢承认犯下的战争暴行。
相比之下我甚至还觉得德国的新纳粹也算好东西,至少他们从不遮掩,他们极端排外,他们也不洗地,直接说杀的好。
坏,坏到了极致也至少敢作敢当。
而某些民族,明明是自己犯下了战争暴行,明明是自己侵略其他国家,却支支吾吾不敢承认,却明里暗里洗地,却一个劲的支持右翼,还对中国的dislike率直飙90%以上,不知道的还以为是日本被中国侵略了。
也不是说这是劣根性,人民从来没有什么劣根性支撑,只是麦跑跑当初的清算似乎并不彻底,让大正时期的龌龊国风传递到了现在还能生根发芽。
共产主义政党长期治理的喀拉拉邦在印度处于人类发展指数的前茅,这就是共产主义对印度的影响。
另外,南亚人是非常非常喜欢取经名的。这也是一个地域特色了。