心法利器
本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。
2022年新一版的文章合集已经发布,累计已经60w字了,获取方式看这里:CS的陋室60w字原创算法经验分享-2022版。
往期回顾
最近又和朋友们聊起了有关NLP的学习问题,随着NLP的逐步发展和成熟,学习思路好像也和之前的有所不同了,因此今天我就来聊聊,现阶段我理解的NLP,该怎么入门和进阶,并且持续学习。
就单纯聊聊,可能会有不严谨的地方,大家可以在评论区补充吧。
虽然环境依旧困难,但是仍有很多萌新想要入行NLP算法,新鲜血液的输入对这个跨领域始终是好事,但是和我那时候入门相比,现在的NLP知识体系已经比原来扩大很多,内容也比原来丰富了很多,还像以前那样的学习肯定是不合适的,所以想给大家整理一下现阶段新手入门最好掌握的东西,新手可以按需整理自己的学习计划。
这应该是一些和算法无关但是仍旧需要掌握的东西,虽说已经过了很久,但是最基础的东西仍旧不变,逃课的短期可能没什么事,但是长期来说,始终会受到影响,如果是在校学生,空余时间比较多还是希望能花点时间学起来,已经工作的,还是希望日常能抽空补回来吧。不要以为逃了能省时间,最后始终要花时间还回来的。
这块因为内容仍旧比较稳定,所以原来写的东西好像还是能用的,直接放这里了,不展开聊了:
当然,这里有些补充的内容,我直接列举在这:
pytorch深度学习框架,要求能完成模型搭建和存取、训练预测评估pipeline等能力。
transformers(huggingface)整套预训练库的使用。
其他的,好像和原来的基本都一样了,这块的技术好像已经基本稳定了,没有很大的变化。
相比之前,现在NLP入门需要的基础知识,厚度比原来高了很多,之所以说厚度,是因为其实不是量的问题,而是取决于后续自己的工作来进行选择了。如果是只是考虑简单应用,掉个包,其实已经有很简单直接的工具,或者是开源的代码能直接搬,不论效果,实现一些基础算法的难度相比以前门槛确实低了很多,而如果是要考虑深度,考虑对业务进行一些进一步的优化,确实是需要比较深的基础功底。这里聊聊选择的学习内容以及对应的背景。
首先是科研向,大部分开始学NLP的人,都是从学校开始,既然是科研,学习的内容,当然是要从比较前沿的基础部分开始,首先需要考虑的就是把预训练模型整套知识体系学明白,包括模型结构、主要的预训练任务以及常用的预训练模型,毕竟现在的科研现状,论文里不出现BERT,基本上是发不出来的,所以这个基础必须学会,而且因为huggingface的存在,预训练模型的实现难度已经大大降低。
其次,是找工作方向的。放在2022年秋招的时间线,现在无论是社招还是校招其实否非常卷了,而正因为后续工作过程要用到很多基础的东西,所以即使是招聘,也要求基础的东西不能出错。一方面,涉及科研的部分肯定是要熟悉的,另一点方面,自己要有一些能拿得出手的任务,简单到文本分类,复杂到机器翻译、文本生成之类的东西,自己多少都要有能拿得出手的,所谓能拿得出手,是指自己能对这个领域的常用方案和前沿方案都有一定了解,不仅是八股级别的知识点,还有各个方案之前的理解和区别,优缺点,要能讲的出来,挺重要的。
再者,就是工作后的新人,有关这块其实有专门写过文章聊过的:心法利器[30] | 算法新人如何在工作中成长。不过还是想额外聊点,我分点说吧:
起初的工作,不要因为简单而感到苦恼,简单的工作是为了给你更多心思理解现有的工作环境和业务,人物本身简单,但是涉及一些背景,包括技术栈之类的,是需要时间适应的,一下子给复杂的工作,扎心地说真不一定能接受得了,你不仅要花时间适应,还要花时间来攻坚的话,项目可就把控不住了。
很多人可能会接触到工程成分很高的工作,很正常,后续你会发现,算法工作确实是需要工程的,不是说有工程同事,你就完全不需要管工程了。
结合现有工作,去深入理解和你的工作相关的任务的前沿和基础方案,依次为契机提高深度。
学习思路有了,那怎么学习呢。说实话,刀耕火种时代,这些东西压根没什么资料,最多就是论文,运气好的就是有源码。但是现阶段,大部分基础方案,多少都是有人准备的,所以,只要大家明确了要学什么,其实就可以学起来了。我分两个思路来给大家介绍下吧。
如果是希望能系统学习的,我最推荐的材料还是CS224N,是斯坦福的NLP课程,网上各种资料其实都有,至少能让你有个比较完整的全貌的理解吧,当然这里可能会有一些比较前沿的东西,加上是英文,难度可能就会比较大。中文的话,推荐两本书,一本是《自然语言处理从入门到实战》中国铁道出版社的,另一本是车万翔老师的《自然语言处理基于预训练模型的方法》,这两本书是我目前看着内容还不错的书,大家跟着看跟着学就好了。
如果是想快速入门的,有一个目标,例如你想做什么任务,就直接去看就好了,例如想做机器翻译,直接看机器翻译方面现在大家常用的方案,提的比较多的,直接取搜并且尝试重现就好了,注意找好大家比较常用来做例子的数据集,然后动手写就好了,这个效率会很高,属于奔着任务去做的,当然也有缺点,就是细节和基础不扎实,后续有空了就去补吧。多动手,多搜,这些基础,绝对不缺资料。
除了两个思路,另外还推荐一个自己看着还不错的一个开源项目,邱锡鹏老师开源的NLP项目:https://github.com/FudanNLP/nlp-beginner,大家按着这里的基础来做,自己动手做一遍,就能大概理解这些任务主要做的事和一些常见的方案,同时也能洞察一些任务和方案内存在的细节问题,当然这里因为时间原因,可能预训练这块的东西要求不高,自己可以酌情给自己加课。
最后补点必备知识点吧,只针对NLP,看着其实不少,感觉这些能全掌握,其实已经很不容易。
word-embedding,尤其是word2vector,训练与使用。
常见的NLP任务,尤其是文本分类、NER和句子相似度(交互式和非交互式)的baseline方案,即非预训练模型的方案,要了解并且能实现。
Transformer和预训练模型bert,基础结构、常见预训练任务和finetuning的baseline方案,最好是能自己实现,训一个预训练模型可行性有些低,但是finetuning应该还是可以的。
技术的进阶其实之前有写过文章了,而且感觉隔得不是很久:心法利器[43] | 算法工程师的晋升思考,而不少人后台说希望我聊聊有关NLP这块的进阶,我就和大家多说点吧。
首先,自己要有一两个,甚至是一个体系下知识点的完善,也就是“能拿出手的能力”,为了这个能力,你需要多了解目前的常用方案,而且非常自信地随时能用起来,可以说能如数家珍吧。当然,这点对科研同学要求更高,毕竟要是研究这个方向结果这方向还不熟,怎么做科研创新,而对于职场的人来说,也是需要花心思重点打造的,这优先级比广度优先级高那么一点点。
说到方法,我觉得就是这么几个途径:
多看论文,两个方向,一个是对应领域的经典论文,包括baseline,业界常用的方案,另一个是前沿方案,就是最近的研究动向,甚至是SOTA,能有了解,甚至还能评判出各自的优缺点。
多看数据,洞察各种方法在数据体现上,有什么优缺点和特点,甚至发现一些现有的领域关键问题,最好还能有些自己的解决方案。
多看源码,最近在翻simcse,感觉收获还不小,另外用于句子表征的通用任务工具SentEval也有拜读,感觉也是受益匪浅,后续有机会和大家聊聊。
多动手尝试。自己可以动手试试看前沿或者常见的方法,有时候自己写会发现很多坑,多解决了,其实对问题的理解也有好处。
看论文可以说是科研人和算法人的必修课了,这个我在很久的一篇文章里有聊过,是刚毕业趁热写的:我从研究生生活中得到的经验。这里再和大家挑重点说下。
首先要明确读论文的目标,是专项调研还是日常泛读,是为了研究算法还是为了了解研究现状,甚至是不是为了看论文结构和写作手法(最终写论文的时候,这个也是可以从别的论文里参考的)。
明确后看自己关注的部分就好了。例如了解研究现状,看intro或者review就好了。
看完后及时做笔记,建议不要在论文上做,单独摘录总结出来。
至于论文的来源嘛,主要是这几个:
arxiv,“AI领域”很常见的读论文途径了。
要搜索,谷歌学术和百度学术。
有时候,CSDN或者知乎有论文解读和翻译,读论文可以参考的。
各大顶会,NLP的也有几个自己专门的顶会,建议自己多百度查查有哪些。另外知乎也有写博主会快速进行分类的,大家可以关注下。
媒体吹的多的,还是要关注下的,但是只跟媒体肯定不合理。
这句话有点扎心,但还是要说,有些时候不是不知道途径,只是懒得学罢了,但是如果还想要进步,还是得看得学,没那么多理由。
这个其实是职场人很容易犯的错,尤其是老人,老人一般已经深挖特定场景业务了,但问题在于,前沿和业务并不是齐头并进的,业务的速度总会比技术发展慢,业务深耕多了,技术上可能会落后,很多新的方法可能就没有关注了,毕竟很多时候,我们能通过很多trick把效果做的很高,但新的技术可能直接碾压老技术了,此时确实要刷新自己的技术栈,这也要求我们仍需要持续关注新的技术,例如预训练模型的来袭让预训练和非预训练有了技术的“代差”,后续又有了对预训练模型进一步的调教和优化。
当然,新技术我们是需要了解,但不是说非得用,有个说法叫“掉书袋”,就是指喜欢卖弄才学的人,我们作为技术人,更讲求实用性,一方面不能看啥新就用啥,要因地制宜实事求是,另一方面也不能忘本,只会新技术,老技术直接抛弃也不可取。学习是为了让我们在解决问题的时候多一个可以选择的方案,积累的多了,自然能力就上去了。