找回密码
 立即注册
查看: 1179|回复: 20

如何看待「机器学习不需要数学,很多算法封装好了,调个包就行」这种说法?

[复制链接]
发表于 2021-7-4 14:35 | 显示全部楼层 |阅读模式
如何看待「机器学习不需要数学,很多算法封装好了,调个包就行」这种说法?
发表于 2021-7-4 14:38 | 显示全部楼层
写在前面,虽然本答案观点可能会让很多同行难受,但希望大家能够认真思考后再喷。另外,爪机录入,排版请大家多包涵。
先说答案:从趋势上看,大多数人工智能工作者会是这样,并且只有这样,行业才能迈向成熟。下面分别从道理上和现状上分析。
首先,从人工智能的目的来看,我们认为什么样的算法是一个好的人工智能算法?对于一个具体问题,是用高度定制的算法解决符合人工智能思想,还是用高针对性数据加通用算法符合人工智能思想?任何一个从业者都应该清晰的知道是数据驱动的算法才是真正的人工智能算法吧!那么我要多问一句,为什么?为什么我们应避免用定制算法来提升性能?(诚然,这其实是多数要发论文的朋友最常干的事情,通过针对某一问题精调算法和参数来得到一流的实验结果)因为,任何形式的定制算法,本质上说,都是在增加算法的先验假设,而这一过程其实就是我们使用传统算法时所做的,用设计者的猜想来建立系统模型解决问题的经典流程,区别只不过是我们建立模型时使用了一些更新的算法罢了。这样做的问题非常典型,就是算法〔人为的〕过拟合,虽然在数据集上测试效果好,但实用性会大度降低--懂过拟合的朋友一定明白我在说什么,不理解的朋友看结论就好了。但显然,在这样一个弱人工智能的时代,我们不可能全靠数据解决问题,必须还是要考虑算法的设计,而我的建议是,如果你的研究方向不是算法本身而是在某一背景下的应用,那理想的工程实践还应该是〔数据驱动优先,参数为辅配合,避免订制算法〕。
其次从产业发现看,一个对所有从业人员都要求学习大量的、内在的、复杂的技术理论的行业绝对是一个市场空间极其有限的行业。其主要负面性体现在两个层面,第一,大量项目成本的不可行,从业人员门槛越高,价格自然越高,资源也越稀缺:所谓资源稀缺,就是指只要脱离行业核心应用领域,需求方就很难接触到技术提供方,以至于很多很好的应用点很难被发现。第二,则是本文读者要反思的问题了:深入理解技术细节的人,对市场、应用背景的理解和投入的精力往往有限。从业人员会把应用点和方法模式的制定扔给产品部门,并且很容易对这些工作表示不懈。我们来思考任何一个成熟行业,比如就说是离我们最近的软件行业,如果一个软件公司绝大部分程序员都每天只关注软件底层和内部原理,只让一些不太懂软件开发的人去弄跟用户有关的需求相关的功能、体验,这样一个公司在现代还能存货么?现在哪个公司不是要把需求、体验放在首位?那么,在看本文的诸位大神,请你们考虑一下,在实际的开发中,会不会真的有些孤芳自赏?所以说,如果我们的行业不能形成像软件开发行业那样大多数从业人员只需适量的学习就可以胜任大部分工作的状态,那么咋们就永远不是个正经的 行业,无论多高的关注度投入,咱们永远就是个 泡沫!
顺便一提,各位做智能的朋友,你们在指责一些人只是会用库的同时,有没有想过,自己的编程水平,如果用你们自己的逻辑审视的时候,大部分人其实也是不合格的?编译原理、体系结构什么的都不懂也在写程序?话说到此,愿意思考的朋友肯定就有所反思了,下面我们谈谈实战。
首先,我相信,即使是强调理解算法的朋友,也少数是自己真正实现算法的,为什么这样说?因为现在主流算法要不是什么Spark实现,就是Cuda实现,这两个想写出高效的程序都非常不容易,说句不客气的话,这比学AI难多了。所以真的擅长这两个工具的人,比AI工程师收入高,很多就不搞AI了。(所以我现在也鼓励很多学生,学实现可能比学算法前途更好)所以,我们这里主要还是讨论理解算但不设计算法的情况~大家都清楚,这样的人在行业占主流。当然,本文也不谈大神,只说还在学习的平民。
我这里首先要谈的是学习的收益,而我的观点是,与其把时间都花在深入理解算法上,不如去横向的多学习算法。这里我们要针对两类不同背景的朋友来说,第一是应用数学出身,对优化类问题有充分的理解。这里我劝各位一句,只要您不是要在纯理论上有跨越式的突破,您的基础已经对现在的所有典型应用绰绰有余了,出于专业背景习惯去大量思考的那些点,说实话我很少很少遇到真的对您的项目产生了实质性影响的。所以对于这样背景的朋友,应该做的事情主要有两件,了解需求和了解惯用法。需求不多说,放下架子世俗一点就是了。惯用法很重要,你要清楚的不仅是算法的原理,还有在哪些情况下,哪些算法大约可以取得哪些效果,这绝对不是仅仅减少些无意义实验的时间这样简单的事情,而是培养理科背景的朋友工科思想的问题,这个问题太大,有机会再说,这里只说重点,AI绝对是一个工程问题,也就是说是一个考虑误差,考虑成本,考虑实践,考虑维护,考虑各种各样事的问题,如果只用理科思想考虑,你做的永远是一个玻璃模型。下面说说非数学专业的朋友,恩,那你们该补的功课还是要补的,不要看了我的题目就开始堕落了,但是,我这里还是要说说你要补什么。绝大部分学科,尤其是工程技术学科,你都可以把你的知识分成〔观点〕〔理论〕〔实践〕,如果你想和某个学科的人合作,或者管理某个学科的人,那你需要理解的是观点,也就是说,拿到一个问题他们会怎么看,怎么分析,基础假设是什么,自己最重要的,什么叫一个好的设计。如果你想开始从事一个领域,你需要的是学习实践或是说惯用法,从具体工作开始,从简单工作开始,先实践,后理解。如果之后你想在领域有所深入的理解,那你需要的是回归理论。现在人工智能领域的问题之一就是缺少足量的中层工程精英,无论是学习还是项目都严重缺乏方法论,一味最求高大上(然后在交付时改成传统方法,别跟我说你团队没干过这事)。我的建议是,我过你想成为行业中的一员,那你要做的就是先理解什么是人工智能,方法是学一些最经典的理论,理解这个学科的人怎么看问题,然后直接学习结论,也就是用库把实验做出来,因为你干的任何问题,其实都有高手解决过,只要你观点正确,就能看到你的问题其实就是某些已有问题,或者反过来说,你抽象问题的能力越强,代表你的理解越深,只有菜鸟和装X的人才看什么问题都是不同。在这样的背景下,你每多学习一种(一类)算法,你能解决的问题就多一种,这绝对比你用其它算法猛调参数有效。(还是那个前提,如果你不是论文灌水为目的,如果是,那用本身不是最优的算法调出最优的效果更容易发表,当然,个人并不赞同和鼓励)唯一要提醒的是,当你能解决一堆问题的时候,不要自大,永远记得,有比你厉害的人存在,而最厉害的,是搞理论的。

所以,我的观点是,对行业绝大部分人来说,应该是有限的学习理论,大量学习和实践工程应用。对一个具体的学习者来说,抱有成为业界尖端的信心是好的,但还没达到基本从业者水平就盲目深入绝对有害,就好像一个人非要从编译原理开始学编程一样的不可理喻。对已经有所成的朋友来说,则应该更多的考虑行业如何更为健康,而不是透过强调你已经掌握的知识的重要性来自我肯定。

~~~~~~~~~~~~~~
写在后面,这是我离开知乎1年后回归的首个答题,期间我在私信看到了大量的交流和求助,由于时效性未知,所以之前的就不回复了,但今后还是欢迎大家一起多多交流,更希望大神能多多指教。
发表于 2021-7-4 14:48 | 显示全部楼层
我在学术圈和工业界都有过一些经验,讲讲我的看法。
我认为大部分机器学习从业者不需要过度的把时间精力放在数学上,而该用于熟悉不同算法的应用场景和掌握一些调参技巧。好的数学基础可以使你的模型简洁高效,但绝非必要的先决条件。原因如下:
1. 即使你有了一定的数学功底,还是不知道怎么调参或者进行优化。这话说的虽然有点自暴自弃,但扪心自问在座的各位,当你发现accuracy不好、loss很高、模型已经overfitting了,你唰唰唰列列公式玩玩矩阵就知道问题出在哪里了吗?不一定。诚然,懂得更多的统计原理可以帮助推测问题出在了哪里,你可能换了一个loss function或者加了新的regularizer,但结果不一定会更好:(
数学基础之于机器学习从业者很像debugger之于码农,它给了你方向,但不能保证你一定可以解决问题。那怎么能解决问题?只有经验经验经验,别无他法,有时候甚至靠的是直觉。数学基础是好的内功基础,但你调包调多了,其实也慢慢能抓到一些感觉,不必看不起“调包侠”。
2. 工业界可以应用的模型是很有限的,可调的参数也是有限的。工业界选择模型非常看重可解释性,效率,以及和整个系统的整合能力。举例,在我的工作中,大部分时间都在使用Regression和Decision Tree相关的算法(如 Random Forests)。是因为这两个算法最好么?不,恰恰是因为这两个算法稳定及高效,而且容易解释。对于这样的模型,你即使数学能力很强,能调整的参数也是有限的。根据网上的例子和经验,大量的工程师可以在数学基础稍弱的情况下做到很好的效果。
3. 数学/统计知识已经成了既得利益者刻意为外来者建立的一道壁垒。不知道大家有多少人是从事过ML研究的。我个人的观察是做出成绩的ML研究人员是有限的,科班出身的researcher更是远远无法工业界的空缺。所以大家没有必要担心会被转行者抢了饭碗,也没有必要刻意鼓吹一定要懂矩阵,凸优化,等数学知识才配做机器学习。大家都是出来卖的,不必互相为难。说来惭愧,在工作中我常常跟老板说这个人不能用,你要用我这种科班出身的人,但我内心是不赞同的。
每当我看到知乎上有人问机器学习怎么入门,结果大家立马推荐第一本就看PRML和Statistical Learning以及一大堆公开课和数学课的时候,我的内心是崩溃的。各位答主的目标是把所有人都吓回去还是秀一下优越感?
4. 理论模型和实际应用分的是两块不同的蛋糕。承接第2,3点,做理论研究的发力于突破,提出新的模型或者优化方法,做应用的致力于把模型应用于数据上,攫取商业价值。这两者不存在利益冲突,做理论的人有自带正统光环的优势,所以更该显得大度一些。只有“调包”的人越来越多,这个行业才会繁荣,因为证明技术落了地,可以带来实际价值
5. 行业的发展趋势是降低工具的使用难度,这让我们不必反复造轮子。亚马、逊谷歌、微软等各大平台都开放了他们的机器学习工具。以前人们还需要自己写各种模型,好一些的调一下sklearn,但现在Azure ML Studio已经方便到零代码了。年初的时候,我试了一下ML studio,简直方便的可怕,完全是图形拖动连接就可以建立模型,那一刻我仿似看到了自己即将失业。
6. 文艺一点说,我们需要更包容的心态,切勿文人相轻。想要接触了解一门学科,应该先有兴趣,才有探索的积极性。就像我们第一次看到Hello word出现的样子,很多刚入行的人第一次看到机器学习能解决实际问题时,会产生浓厚的兴趣。
我怕的就是所谓的圈内人都说你必须要会矩阵分解,必须要会用trace算导数,必须会优化,才能开始学习机器学习。这个周期太长,很多人连开始的勇气都没有~我觉得不管怎么样,要先动手做起来,发现自己的不足,再去补充需要的东西。
既然学术是自由的,我们就打开大门,欢迎大家都进来坐坐。如果他/她不喜欢,欢迎到隔壁串门。但我们不要给自己家门垒了高高的台阶,说闲人勿进。久而久之,难免门可罗雀。
<hr/>综上,我觉得应用机器学习模型和技巧既不能完全不懂数学,两眼一抹黑,也不该要求每个从业者都要精通各种数学理论。模型应用者要长存对理论的敬畏之心,不要总想搞个大新闻说“机器学习也不过如此”,但做理论的也不必觉得高人一等,别人都是二等公民。
发表于 2021-7-4 14:53 | 显示全部楼层
总的来说,当不同的人说起机器学习的时候,虽然都是用的同一个词,但是他们实际上指的是完全不同的东西。
发表于 2021-7-4 15:01 | 显示全部楼层
机器学习被发明的目的就是为了让更多的人享受到它所带来的科技进步。致力于做到让小白点个按钮就能用。
如果非要人为的设置一个数学门槛值,只能说明这个技术还没有成熟到可以给小白用的地步,还需要继续发展。
从这个角度说,题目中的这句话没错。说不懂数学就调不好参的,那还是因为技术发展不到位。到位的话,根本连参数都不用调。你看微波炉,各种参数贴门上,谁调参了?
发表于 2021-7-4 15:06 | 显示全部楼层
我做过两场相关的 Live,第一场是「如何成为当下合格的算法工程师」,第二场是「机器学习入门需要哪些数学基础」,在 Live 中,我的大部分观点和高票的 @阿萨姆 内容相同。一直以来,我都把数学相关知识点当做是我们的「内功」,把算法应用当做是我们的「外功」。「外功」的高低决定了我们是否能把手头的活干得出色,「内功」的高低决定了我们能爬升到多高的 level。
其实这就是一个和时代相关的问题,如果我把这个问题换成「编程不需要懂计算机原理,很多接口都封装好了,调个包就行」,是不是看起来就没什大毛病了?如今的绝大部分程序员,还会去关心内存和缓存中存放数据的顺序,去关心磁盘是怎么查询数据,去关心 CPU 是怎么调度任务,去关心一次网络通信中有哪几个环节吗?你会跟我说,有病啊这些东西只有面试的时候才会去准备,平时谁来关心这些?那为什么面试官需要注重这些知识点呢,意味着你可以不用,但你得明白大概是怎么回事。我们已经不需要自己去手写各种排序算法了,但对原理完全不懂,怎么确定应用场景呢?
所以同样情况发生在数学对于机器学习上,恰好也是这么个道理。我们已经不需要自己去手写各种梯度下降了,但对原理完全不懂,怎么调参呢?在这里,一些经典的统计学思想,还是每一个机器学习从业者必须掌握的,其它还有不少情况,就不一一列举了,我在 Live 中给过一个比较简单的数学基础学习框架,有兴趣的同学可以了解一下。
跑个题,在我看来,机器学习各种模型的入门的确简单,上手也容易,但并不是任何数据拿来调个包就能做出优秀的训练结果的,在这当中有一个巨大的坎就是特征工程。特征处理得好,一个简简单单的 LR 就能给你满意的结果;特征处理得不好,任凭你上多高级的模型,好的结果往往也是overfitting。对于各技能在工业界数据挖掘应用,如果硬要排个序的话,我认为是特征工程 > 模型理解 > coding能力 > 数学基础。如果是做 research,那就另当别论了。
发表于 2021-7-4 15:08 | 显示全部楼层
谢邀。

用个库函数调个参就行?

来,大胸弟,告诉我,怎么调?

现在我们有个模型的accuracy不达标。

如何知道自己现在是该调bias还是variance?

你想加一个regularization,但是你不知道加了以后会变好还是变坏,重新训练一次的时间成本两个星期,接下来怎么办?

你看着那一堆可以调的参数一脸懵逼,你不知道什么时候L1 loss更好什么时候L2 loss更好,也不知道softmax和cross entropy有什么区别。

你想玩点花样,对数据跑了PCA或者用了kernel(可能还不清楚该怎么选kernel然后随大流挑了个Gaussian),你看到论文上说用这些技巧好啊balabala......然而实际跑下来可能并不理想。

最后你出坑了,出去之前和别人说说:机器学习并不像人们说的那么牛逼,就是下个模型调库函数fine tune一下调调参而已。
 楼主| 发表于 2021-7-4 15:13 | 显示全部楼层
结合我在工业界三年的经历以及初入博士学术圈的感受来看,调包时代早已一去不复返,对于数学的基本掌握已经是新时代的标配,根据不同的情况,需要掌握的程度与关注方向也不同。
    如果你想找到工业界的机器学习岗位,面试官会从项目经历、代码能力以及基本数学素养三个方面考察你。我在奔驰与OPPO都做过面试官,我会在提问项目经历时深入考察候选人在项目里涉及到的数学部分,比如候选人用到了logistics regression, 我会给他一个实际简单的数据让他当场手推整个计算与优化过程,考察他在自己拿手的算法上研究地有多深在提问数学基础时会进行一些具有广度但整体比较简单的问题,譬如cross-entropy loss是什么,SVD大概过程是什么,考察他在应用数学领域知识的宽度。 所以如果你想要在工业界开始职业生涯,那么你需要对自己做过的ML项目背后的数学了如指掌,对其他的经典ML算法背后的数学大概了解。如果你想在工业界完成落地项目,必须具备分析数据的能力,还要通过阅读大量文献吸取别人的精华组合到自己的算法里。分析数据需要基本的数学素养,比如训练集与测试集的分布差别是怎样的,feature之间关联性等等。工业界不要求你创造出什么全新的算法,最常见的是针对问题把不同论文的方法结合到一起使用,这就要求你至少能够理解ML论文里的数学思想,并且能够做到代码复现。如果你想进军学术界,申请ML PHD,或者发表顶级论文,毫无疑问,你必须对你的研究方向有着很深的数学理解,否则教授面试你的时候你基本很快就会被挂掉。另外,显而易见,没有强大的数学基本功做支持,你很难发表任何的顶级论文。
所以按照目前的形势来看,无论你想进入工业界,在其中大展手脚,或者进入学术圈深造,只会调包注定会被淘汰不过对于数学的追求也不必过于苛刻,如果你身处工业界,做到可以很好的理解问题以及算法背后的数学模型基本就OK,代码能力更为重要。如果你身处学术界又偏向理论,那么就需要把你所研究的领域里的数学吃透,对其他领域广有涉猎基本就没有问题了。
发表于 2021-7-4 15:14 | 显示全部楼层
======================2017.11.02补充========================
更变态的来了,基本上把神经网络都封装了,更不用说算法了:
keras项目:Keras中文文档
tensorflow的tf.estimator:  tf.estimator Quickstart
=======================2017.10.22补充==============================
最近在玩TensorFlow,基本验证了原答案,举几个简单的例子:
tf.sigmoid:  sigmoid算法实现
tf.nn.softmax:  softmax算法实现
tf.squared_difference:差平方
tf.train.GradientDescentOptimizer:梯度下降算法优化器
tf.nn.relu:relu算法
tf.tanh:双曲正切函数
tf.nn.conv2d:卷积层
tf.nn.max_pool:池化层
一行简单代码:

=======================以下是原答案================================
我记得我刚毕业的时候,老师学长谆谆教导:计算机体系结构很重要,8086指令、段地址、寄存器、内存寻址、指针、深入浅出MFC、冒泡排序、快速排序、链表。。。。。。很重要,如果不懂,肯定不能成为好程序员,就算是同样调用API完成任务,你要是懂这些,关键时刻就你会懂,老板不给你加薪给谁加薪?
然而,毕业后我没有去做嵌入式、没有去做驱动、没有用汇编,以上这些全部都没什么卵用,用MFC也只是调用API,没有自己手写冒泡,后来用Java,HasMap、List等都是调API,也没见老板因为我不懂降我工资,因为我老板也不懂这些,他只看我有没有完成任务,有没有给它赚钱,他不会管我是调用API还是写汇编完成的;也没见哪位同事因为懂这些加薪了,因为工作中根本用不上!
相反,我发现Java虚拟机垃圾回收原理、MySQL索引设计技巧、tcp网络编程模型、CAP、BASE。。。。。。等非常有用,不但解决了业务问题,老板还给我加薪,公司还给我升级,还可以到外面给别人演讲!
所以,回到题主的问题,你应该先问一下自己几个问题:
1)你是做什么专业的
是机器学习理论研究么? -> 如果不懂数学,还是尽早转行吧!
还是将机器学习应用到业务中去?-> 不一定要懂很多数学,确实算法封装好了,应用就可以了,至于说调优,也是调参数,不是调算法,要开创一个新算法,那就属于机器学习的理论研究范畴了。
2)现在机器学习发展是什么阶段?
相当于50年代的纸带编程,还是60年代的汇编?还是70年代的C语言?还是90年代的Java?
我理解机器学习现在类似于70年代的C语言,虽然写起来很方便了,但还是要和指针内存打交道,这里的指针和内存就是机器学习的算法中的数学知识,所以我觉得即使算法封装好了,也要理解基本原理,不然这么多算法,你怎么知道选哪个算法?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-7-4 15:15 | 显示全部楼层

谢谢邀请,不过貌似来晚了啊,补充一下作为一枚在读小硕的一点点看法吧

    这句话大概说的是未来的图景吧:当所有AI/ML/DL算法都非常成熟,且在工业界下已经形成相应的标准(类似于视频编解码中,AVS,MPEG那种标准)之后,的确如此;在这之前,既然需要工业界形成标准,那么应该少不了大公司的技术研发、产品设计、市场运营,这需要一个周期,可能还比较长;在这之前,公司需要招聘和培养人才,需要招聘什么样的人呢?基本上两种吧:①对相关算法理解比较深,应用比较娴熟的算法工程师;②开发能力和工程经验比较丰富的程序员;在这之前,也就是我这个时候了。作为一枚不再继续读博、准备找工作的AI/ML/DL硕士生,想要找到一份满意的工作,需要怎么样呢?—— ①不懂数学,讲不清算法原理?哼,你猜一流公司的面试官会不会屌你呢?②只懂调参,调包,写paper?哼,你以为你是科学家,底下一帮小弟帮你干活?别做梦了,你就是小弟!!③你以为只会调用PyTorch、TensorFlow、MxNet的那些package,人五人六地架构各种网络就行啦?T Y T N!!LeetCode没刷爆,动态规划C++/Java/Python 写不出来,哪凉快哪待着去吧!……
各位且行其珍惜呦。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-21 04:37 , Processed in 0.075632 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表