作者:老宋的茶书会
来自:AINLP
zenRRan有改动
知乎专栏:NLP与深度学习
研究方向:自然语言处理
https://zhuanlan.zhihu.com/p/90931060
前段时间有朋友询问说NLP领域如何学习,然而一直忙于毕业论文中实在没有时间,两年半真的实在太难受了。昨天刚交了盲审,祈祷顺利毕业呀。
今天刚好有时间讲讲我自己的学习之路,然后谈谈我对自然语言处理领域学习的一些建议。
老宋本科在帝都某211,专业自动化,学的东西乱七八糟,因此翘课3年,挂科两门,侥幸毕业,实在不感兴趣。在本科期间,做过一年的嵌入式Linux,然后在大三之后转做Android,并花费半年之久考研(别问为啥考北科,问就是求稳)。说这些表达的意思是,老宋的基础还行,遗憾的是没有大牛带,一个人摸索的确难受,方向的不确定性也让人很迷茫。不过这也养成了我自学,自查,自己搞的习惯,这大学也没白读不是。
我个人觉得我在大学一个重要的收获就是,学会思考,坏处是经常会睡不着觉,乱七八糟一通思考。后来慢慢思考自己的路要怎么走,其实是一个不断探索的过程,中间自己不仅仅编程吧,其他经济学等方面也都有涉及,对吹牛逼大有益处。
到了研究生阶段,第一学期,懵懵懂懂学习机器学习基础知识,然后到第二学期,开始正式进入自然语言处理领域,开始打算做阅读理解方向的内容(事实证明,没有好老师指导,研究生想在阅读理解领域干点事情,基本不可能)。就这样,看论文,写代码,到了研二第二学期,开始找实习。刚开始,觉得刷题对算法岗不咋重要,然而,事实啪啪啪打我的脸,春招的笔试基本都挂,难受的一批。然后就是自己做的方向太窄了,阅读理解有没有商用,懂的面试官贼少,而你又没有顶会之类的硬货,因此,整个春招找实习算是很失败的。
总结下来就是两大原因:
经过反思之后,我依旧没有把刷题放在首要任务上,这是秋招的一大败笔。
其实还有一点就是,看论文到底有没有用,我个人精读论文不下100,泛读的也不下200篇,可是面试官问不出来呀。很多同学都是看看BERT,Transformer,看看博客,刷刷面经就面过了(刷题需足够多),这也让我本身怀疑看论文的必要性,因为真的没有几个面试官能问出什么高水平的问题,基本就面经上常见的问题。
而今年算法岗还有一个有趣的现象:有的大厂面试官的水平不如应聘者,真实千奇百怪啊。
其实,我个人依旧认为学习自然语言处理领域的最好方式就是看论文,虽然今年不少人都是刷面经过的算法岗(有的在5月份连BERT都不知道),但从学习角度来说还是以论文为主,毕竟目前自然语言处理领域处于高速发展中。
如果我是面试官,我就从:你能不能谈谈最近预训练语言模型的发展 这一问题来评估应聘者的水平,要想说清楚这个发展历程,没有个精读10篇预训练语言模型论文是肯定不行的。而这一问题,也只有百度面试官问过,其他很多厂都是最多问问BERT,还有的大厂问各种数学计算公式,在我看来挺无聊的,背个公式这tm能体现出应聘者水平吗。这也从侧面验证百度技术还是厉害的。
因此,我这里并不介绍秋招准备的东西,而是日常学习中,自然语言处理你应该学习哪些东西,当然这是我按照我个人的学习推荐的,如果你要急于准备秋招,建议去牛客刷面经,对面试帮助极大。
首先,你要对自然语言处理领域有大致的了解,自然语言处理领域有哪些子任务,每个子任务都有哪些特点等。我个人认为这是你进入自然语言处理领域要做的第一件事情。
幸运的是,清华2018出了一篇报告讲述自然语言处理领域的现状,名为:《2018自然语言处理研究报告》。可以在文章结尾的百度云自己下载。
在进入自然语言领域之前,依旧需要你对机器学习以及深度学习有一定的基础,因此我个人推荐先学习这两大内容。机器学习对于自然语言处理来说相对并不重要,因此,可以简单过一遍即可。
我这里分别推荐书籍以及视频资料:
在这之后,你就应该学习自然语言处理领域的内容了,学习自然语言处理最好的方式是以点带面,从一个实际的上层应用出发,比如推荐,搜索,对话等。分析该上层应用中涉及到哪些自然语言处理方面的内容,然后针对性的学习。
就我个人来说,我依旧推荐文本分类作为入门的第一选择,因为文本分类在业界中应用的确最为广泛。我个人也有两个相关的仓库和文章:
由于NLP还在快速发展中,因此还没有那部书能够把内容以往打尽,因为书的周期太长,等出来后,技术都过时了。因此,对于自然语言处理领域来说,最重要的依旧是看论文,我之前写过一篇关于论文大礼包的,你把其中重要的文章看一遍基本就入门了,大概20多篇吧。
对于自然语言处理领域来说,有很多子任务,大多数人都是专注于有限几个领域。尤其是预训练语言模型诞生后,区别更不大了。在前面已经提到过了,那么你首先应该选择一个你感兴趣的上游任务,上游任务往往都比较复杂,融合了很多子任务。 举例来说:对于任务型对话来说,就涉及到文本分类,序列标注,文本匹配等任务。因此,你入门之后,还需要对应的学习多个子任务的内容。这里我推荐两个内容: