前排声明:本文为CSDN年度之“战”征文稿,笔者文笔平平,仅以此文抛砖引玉,博君一笑。
序言
黄梅雨,旧时曲,来日何遇,默而不语。
萍水逢处谈笑来,高腔如叹拂袖去。
南柯一梦浮生尽,繁花落,新灯起。
这是笔者作于今年6月26日毕业离校日的小词,三个室友与我逐一道别,行向不知名的远方,直到寝室里只剩下最后一人。适逢黄梅雨季,又遇瘟疫流行,甚至连毕业照都未曾留下一张的我,想不到落幕收场竟是如此凄凉,只得将无尽的遗憾化为对未来的期盼。
其实书写一篇简洁凝练的年度总结对于笔者来说并非易事,笔者手写十年日记,一年时光的厚重非一本软抄所能承受,更不用说是一篇很快就会被网络洪流湮没的平常博文。而今年又是非常特殊的时期,可以分享的事情很多,上半年困于毕业实习,以算法工程师的身份在职场上设法解决客户的各种项目需求;下半年又回归学生生活,疲于软件工程课程项目的开发,并初步从事自然语言处理方向的工作。
事实上关于这些话题笔者今年已经撰写相当数量的博文来记录,而两个月前的1024节还特意水了一篇回顾截至当时所有博客内容的“软文”【1024两年祭】溯流光 觅杳杳 ,在这篇文章中故技重施实属下下策。
好在难得这次征文活动CSDN并不限制博文内容,允许博主畅所欲言。而笔者也不过一介布衣,学过的一些末流技术拿出来显摆未免显得班门弄斧,贻笑大方。因此笔者试图用另一种方式来书写自己的2020年。
正文
今日周末,是研究生入学考试的第一天,也是本学期教学周结束的第一天。两天前刚刚完成了高级软件工程期末项目汇报,昨天又肝了十几个小时把自己投稿PIC2020会议的论文修改好交付给导师,而右膝抽痛和左脚血泡也已经完全恢复了,之前担心的半月板应该并无大碍,如释重负的我兴致勃勃地到操场上进行跑步锻炼。
我已经坚持跑步整整一年了,今年最好的两个成绩是11月29日用时46’42"的10km长跑(此后左脚磨出鸡蛋大小的血泡),以及12月10日用时26’38"的6km中长跑(此后右膝严重抽痛),还连续两天在雨夜坚持跑完30圈(分别用时58’50"和58’49")。今天是恢复日常跑步后第四天,在前几日的跑步中我已经明显发觉这段时间体能下降得厉害,10圈就已经触及上限了,自然是非常的不甘心,很想迅速恢复到之前的水平。
下午3点整进场,看到一个约莫四五十岁的中年人(不妨简称他为A)已经开始在内道跑了,目测配速4’30"以内,还有一个粉衣肌肉男(不妨称他为B)在外道非常平稳地在慢跑,目测5’00"配速;难得遇到一个配速比较快的同好,我心想跟在A后面跑是个不错的主意,于是什么准备也没有做就赶紧扔下背包追了上去。
一圈后明显发现体力亏损的厉害,三圈之后我已经渐渐跟不住A的节奏,瞄了一眼手机发现竟然是4’15"的配速,最后咬牙坚持跟了五圈实在是喘不过气来了,右腿似乎也隐隐作痛,打了退堂鼓回到长椅上稍事休整。
不盲目跟风。这是笔者今年第一个感触。以目前“大火”的机器学习为例,其实它的入门门槛非常低,因为前人已经将算法都封装成包,学习者需要做的就是调用现成的方法,十几行代码就可以轻易跑通一个机器学习模型。这极大地满足了“快餐时代”人们对知识的需求:学起来快,用起来有逼格,因此许多人趋之若鹜,都投身到这个领域中来——原本做计算机的开始转到这个方向,原本不做计算机的也千方百计的将自己的工作或研究往机器学习上靠,美其名曰“跨学科交叉”,计算机设计大赛的WEB开发组里几乎每个入围项目中都包含了所谓“人工智能”的元素,而究竟有多少“人工”,又能有多少“智能”,各自何尝又不是心知肚明。人们看得到的是2016年AlphaGo战胜李世石,2017年横扫柯洁,2018年BERT横空出世制霸各大NLP竞赛榜单,但是却看不到这背后所付出的硬件,人力和算力的代价。
有人说人工智能在不远的将来就会取代大部分人的工作,但是你翻几篇ACL,EMNLP的会议论文就会发现,至少在自然语言处理这个领域,机器学习取代人类的可能性微乎其微,且不说一些复杂的NLP任务如英文语法改错(Grammatical Error Correction,GEC),最先进的GEC模型也只有不过60%左右的查准率和40%左右的查全率,一些其他更高阶的任务如Text2SQL(给定一句自然语言的查询文本,要求生成对应的SQL语句,目前最新的模型是IRNet,相关paper下载链接https://arxiv.org/abs/1905.08205 )仅仅只有46.7%的准确度,五成不到的可用性,距离工业应用还差得很远。即便是现在已经看似非常完备的双语翻译任务,英汉翻译模型应该算是最成熟的模型之一了,但是仍然无法避免歧义错误的发生,现在仍然有大批学者在语义消歧领域进行研究,师兄WM去年发表在ACL上的paper就是关于语义消歧的,此外英汉翻译中语句流畅通顺性仍然不足,至于其他小语种连语料库都很难人工编纂出来,迁移学习在没有数据的情况下效果也是不尽人意,就拿百度翻译的中日翻译为例,笔者反正是觉得百度的中日翻译准确度差得很,最多用来查一些日文单词短语的意义。
再回到工业界中的现状,就笔者今年上半年的实习经历以及下半年几次组会中从毕业师兄的讲述所闻而言,工业界中机器学习仅仅只是辅助手段。除非是Google这类巨无霸公司有这种财力进行机器学习模型研发(其实今年一场交大那边的人工智能峰会上主讲人谈到今年Google一个主管投诉某人工智能研发部门耗电太多,要削减他们的电费预算,可以想象进行这类研发仅电费可能就是一笔不菲的开销),机器学习在其他公司可能仅仅只是流于表面的事物,笔者的实习项目是一个MARS的库存管理计划,事实上机器学习在项目中的用途很少,可能仅仅只是基于销量曲线的产品类型分类以及DP预测,即便如此,客户还经常提出各种业务逻辑规则(如促销囤货或减量停产等外部因素)来制约,还提供了MARS内部的DP部门提供的DP预测给我们参考,然后我们就发现机器学习预测出来的结果跟MARS提供的DP预测值所差甚远,导致实际上到最后机器学习基本没有用武之地,产品分类全靠符号规则,DP预测值就直接套用MARS内部的预测值(虽然我们并不知道他们是怎么预测出来的)。无独有偶,今年11月份交大人工智能峰会主讲人分享一种将正则表达式转化为RNN进行训练的模型RE2RNN , 就提到目前工业界针对文本分类任务主要就是基于人工编纂的正则表达式,也许可以认为现在的人们还是太保守,不愿意接受解释性较差的人工智能,但是其实关于人工智能的未来根本没有人能说得清,到底是演变成“有多少人工就有多少之智能”?还是会达到能使人类陷入灭亡危机的“创世机器人”的程度?谁知道呢,别太高估人类的智慧,但也别因此停滞不前了。
因此不要盲目跟风,目前各大平台(如CSDN)都推出机器学习课程,一波又一波的造神运动让人趋之若鹜。就像我在操场上看到了A,感觉他跑得很不错,便想跟上他的步伐,其实A后来以4’15"的配速跑了整整10km,而我的10km最好成绩的配速仅仅只有4’40",昨天试了一下4’20"以内的配速,结果12’58"跑了3km就熄火了,完全坚持不下去。而在外道慢跑的B后来了解到其实是跑步协会的主席,他一直连续跑到将近5点,差不多是两个小时,至少是20km以上的里程。因此我在跟了A三组五圈的间歇后,选择跟着B的节奏又跑了一会儿,感觉非常舒适。你两年前开始听说BERT,可能到现在还没完全整明白BERT到底是怎么训练出来的,但是这两年Google提出的新模型又何止两只手能数的过来,与其“学废了”,不如好好巩固基础。
稳固基础,循序渐进,这是笔者今年的第二个感触。机器学习应该怎么“学习”?有人说不就是调用sklearn
,pytorch
,tensorflow
这些package中的代码就可以了吗,然后调调参数就完事了。以前笔者也是这么觉得的,所以本科相关课程的结课项目汇报时对那些模型评估结果好的团队嗤之以鼻,觉得不过是运气好罢了,这学期笔者详细学习了统计学课程,结合之前学过的运筹学知识,以及实际项目经验,来谈谈机器学习中到底有多少基础可以学。
首先笔者想要说模型评估和调参,这里笔者推荐一本非常好的英文教材:Computer Age Statistical Inference: Algorithms, Evidence and Data Science,翻译过来是《计算机时代的统计推断:算法,依据与数据科学》,英文版直接可以在斯坦福官网免费下载PDFhttps://web.stanford.edu/~hastie/CASI/ , 中文版也有实体书卖,这本书的前半部分主要是偏基础性质的统计学知识,但是从Chapter 17开始画风突变(如下图目录截图所示),开始涉及随机森林为什么效果会很好(关于BootStrap采样的参数估计),深度学习中的优化策略,支持向量机的核函数方法,以及关于如何挑选合适的模型。值得注意的是这些关于机器学习的内容都是从统计上给出了切实的证明,像机器学习中常见的给损失函数添加正则项,怎么给正则项的系数赋值?难道就简单写成1,或是0.1,0.001?其实这都是有统计理论可以支撑的(如常见的 C p C_p Cp准则,以及比较高阶的 B I C BIC BIC准则都是用来进行正则项系数估计的)。
如某节课授课老师李卫明讲的是交叉K折验证的估计和精确性分析,课后笔者有所思考觉得统计这块应该是可以与NLP相结合的,未必是模型上的融合,比如用贝叶斯或者像SMT(统计机器翻译)这种方法,笔者觉得是否可以用理论对模型的性能进行评估?至少笔者看了一些paper后发现很少有学者会做这方面的工作,不论是国内还是国外的NLP工作者,更多的是在考虑怎么设计出一个新颖的层,而很少去论证模型的性能,仅仅依靠一些多次实验取平均指标的方法来评估模型,这是否太局限,或者说过于flat?能否将统计理论应用到模型评估中,笔者似乎也不知道具体该怎么做,但是那晚关于交叉验证,包括 A I C AIC AIC, B I C BIC BIC, C p C_p Cp准则取惩罚项系数的方法是非常值得借鉴的,像大多数人取惩罚项系数很多时候就直接当成超参数来调参了,调参很盲目,是否能用统计方法来论证参数应该取在什么范围内比较好?总之在这块许多paper总是有意回避复杂的数学论证,可能对于我们来说好的结果比好的过程更重要,只要结果变好了,不管过程怎么样你都是对的;而论证过程严密,数据集上得不出好的结果也是百搭,似乎听起来有些悲哀。
其次笔者要说的是损失函数的优化。怎么优化损失函数?有人说现在不是大部分都用Adam吗?跟着别人用就行了,而且pytorch和tensorflow里都已经封装好了许多诸如SGD,Adagrad等优化器了,根本不需要我们去操心。笔者本科主业是运筹学,学院中有一批以葛冬冬,江波为代表的运筹学巨佬级别的老师,在他们的课上,笔者听到得最多得一句话就是:“求解器很难做”。什么是“求解器”?其实就是这里的优化器,给定一个规划问题后,我们需要找到目标函数求得最优解,事实上很多时候实际问题可以很容易的抽象成线性规划,凸规划或者很困难的非凸规划,但是实际上即便是最简单的线性规划,在参数众多的情况下也存在难以解决的问题(线性规划的单纯形法大约是 O ( n 6 ) O(n^6) O(n6)的复杂度,椭圆法和内点法相对要简单一些,虽然是多项式时间,但是在实际工程应用中其实 O ( n 6 ) O(n^6) O(n6)已经是极其庞大的天文数字了),更不要谈非常困难的非凸规划(如整数规划,也是现在的热门研究)。事实上深度学习网络中的参数数量也不亚于实际问题抽象出来的规划问题中的变量数量,百万千万乃至上亿都是稀松平常的,这么多的参数,又怎么能快速的求得最优解呢?其实不管是Adam,还是SGD都是一种随机优化算法,当真每次迭代优化所有参数根本就不可能,因此本质上来说优化器其实是有很大的提升空间的,像优化理论中的ADMM算法等都是值得去学习和了解的,笔者认为就科研这条路,多学基础知识一定是更有利于之后的创新突破的。
最后我选择吃完晚饭回来,坚持自己的节奏跑了一次6km,用时27’30",配速4’34",基本恢复到11月中旬的成绩。由于有之前受伤的经历,没有敢贸然直接上10km,欲速不达,与其跑伤休养,停滞不前,不如持之以恒,循序渐进。机器学习也是一样,机器学习的知识浩如烟海,不可能一一掌握,抛开sklearn,pytorch和tensorflow,还有mxnet,dgl,tensorly各种各样的机器学习库,去pypi清华镜像 上瞅两眼,光是以tensorflow为开头的命名的库就有不下数十个,所谓那些十天带你玩转机器学习,人工智能的造神课程连皮毛都触及不到,扎扎实实按照自己的节奏跑,别被别人带乱了罢。
结语
本文可能语言稍显激进,一定会有人与笔者持不同看法,笔者欣然接受,本身对于机器学习这块就是见仁见智,笔者仅仅以自己的一分拙见,抛砖引玉。
另外更新预告,笔者近期准备更新关于本文中提到了Text2SQL的论文摘要以及代码理解,有兴趣的也可以看看那篇paper一起交流交流。
分享学习,共同进步!如果觉得有所收获,可以帮忙点个小小的赞吗?虽然笔者也无意在这次活动中取得什么奖(好像最高奖项也就一个水杯),不过本文确实是笔者的肺腑之言,希望能够对你们有所帮助,万一得个奖也能快乐两天,毕竟以后走上科研路,快乐的日子就真的不多了…