我与NLP的故事
趁着自己还有点记忆,趁着自己还有点想法,想写一篇文章,讲述我与NLP的故事。这是一篇迟到两周的文章。
两周前,在安徽芜湖的一幢楼中,是二楼,我记得当时我正和同事商量实体抽取的一些细节,突然接到携程HR的电话。说是突然,其实我期待已久,因为平时我的手机都是静音,那天特地开了声音和振动。电话那头,HR向我介绍了offer的各种细节,我现在不记得很多了,只记得那时天色昏暗,我的头贴着手机想听得更清楚一点,我的眼睛望着窗外的石楠树,内心无比狂喜,但她听到的只有我嗯嗯点头的声音。
晚上回到酒店,望着窗外的高速公路,我对我的同事说,我感觉像在做梦,两年多来一直在追求而得不到的东西,今晚竟然变为现实了。公路上灯光耀眼,车流不息,我躺在床上一夜都没睡好。
第二天我们返回上海,我在公司静静等待offer,下午两点多邮箱里收到offer,我顿时感觉如释重负。当天晚上,我就和我的领导提出了离职的想法。领导有点不太能接受,感觉我的离职有点儿突然,但是他不知道的是,我等这一刻,等待了两年多,不是心血来潮,而是期待良久。
记得我刚参加工作的时候,什么都不会,只懂一点点Python。那时在银行,也没有太多项目可做,倒是接触了不少新鲜名词,比如爬虫,数据分析,机器学习,深度学习,Hadoop,SpringBoot之类的。银行里比较闲,所以我有空闲时间学习,当时基本把我听到过的技术都学了一遍,虽然并不精通。
我以为至少在银行能稳定一段时间,但,当时银行出了一些变故,年前部门人心惶惶,不少人想着离职。我们小组一开始有8个人,年后走了6个,我从没见过这种场面,当时慌乱无神。组长她工作十年多了,劝我早点开始找工作。我当时有心理准备,觉得不管再怎么难,都要找工作离开这里。
没想到我一找就找了半年多,那时我想着自己学历还不错,能力也还行,但找工作总是不对劲,无数次被拒绝,无数次被问倒,无次数怀疑自己。那段时间我时不时请假出去面试,去很远的地方,坐很久的地铁,有时都顾不上吃饭,一心只想着要是有公司要我就好了。也是在那段时间,我开始接触深度学习,刚开始碰图像,学习OpenCV,破解验证码,感觉CV挺有趣。无意间开始接触到NLP,初学并无太多兴趣,觉得文字到底枯燥,直至一本书出现在我的世界:《Text Analytics with Python:A Practical Real-World Approach to Gaining Actionable Insights from your Data》。
我对这本书印象很深,它像是我在NLP领域的启蒙书。虽然时至今日我都没有完整地把它看完,但它确实让我了解到了NLP的基本概念,比如分词,词性分析,命名实体识别,文本分类,语义相似度等。当时我还写过不少文章,其中NLP入门(四)命名实体识别(NER)这篇文章让我印象很深,这是第一次,NLP让我真实地感受到模型的魅力,模型与文字互相结合所散发出的神奇力量,后来,我还自己用BiLSTM+CRF模型实现了命名实体识别,这无疑加强了我对NLP的好感。
19年元旦,我从银行离职,当时有百度、拼多多的offer,但都是数据分析岗位。我拒绝了大厂的诱惑,选择了一家小公司DG,因为它给我提供了算法工程师的岗位。之所以选择算法这个岗位,是因为当时有一个模型已经横空出世,横扫NLP领域,直至今日仍被奉为圭臬:BERT。之前我们都是用传统的深度学习模型去实现NLP任务,效果一般都很有限,除非样本量很大,而BERT的出现打破了一切陈旧的观念,很快就占据了统治地位。
我满怀欣喜地来到DG公司,原以为我会去接触NLP,了解BERT,但事与愿违。后来我才知道,我刚进公司,做的是搜索这块,ElasticSearch才是圣经,我只能做些搜索相关工作。偶然的机会,我因为公司的业务需要才接触NLP,做事件抽取这块,但我一直找不到正确的道路,没有人带着我,引导我,我自己到处碰壁,也无法找到学习BERT的正确途径。那时候,预训练模型(PLM)领域人才辈出,BERT已为陈迹,RoBERTa、XLNet、GPT2、ALBERT等新贵崛起。遗憾的是,我一次次与这些模型失之交臂,我望着它们崛起的身影,想瞻仰它们的英姿,无奈缘悭一面,始终不得其法,我只是知道它们的存在,这些模型非常厉害,仅此而已。
我以为我自己与NLP无缘,后来因为同事有个query分类的任务才让我重拾文本分类,他对模型效果的惊讶也让我重拾对NLP的兴趣。后来,他找了xiaohan博士的Bert as service,这是使用BERT,借助消息队列,对文本进行特征向量提取的工具,这算是我第一次接触BERT。后来我经常用这个工具,对文本提取向量特征,作为Embedding,后接传统深度学习模型实现基本NLP任务,但这不是BERT的最佳实践。我老是听说finetune,但却一直不解其意。Github上有个bertNER项目,算是我第一次接触BERT的finetune做法,但我一直没有深入了解过其中的代码,只是用。说白了,我当时脑海中根本没有就这样的概念要怎样去使用BERT,似乎BERT就在身旁,但又远在天边,这让我很痛苦。
在DG的经历无疑是让我极其失望的,我浪费了一年半的时间,放弃了大厂的机会,想学习NLP,但却收获甚微,在PLM领域一事无成,有的只是对公司的失望和对出差的厌恶。唯一值得庆幸的是,当时我们组有个西交的小伙伴,也是中途转NLP,他对NLP的理解让我钦佩,他算是那种标杆人物,也是我后面努力的方向。
20年上半年,恰逢疫情,想换工作,而我对NLP的理解也有限,在选择不多、匆匆忙忙的情况下来到了另一家小公司PD。当时真的是有一种置之死地而后生的感觉,想着不能做NLP索性就自暴自弃了。
果然,我再一次后悔,小公司的管理,方方面面都超出了我的想象,我每天只祈求能学习点NLP相关的知识,但公司事多,项目很烂,同事也不怎么nice,让我静不下心来。
我当时拿着bertNER,就想拿这个模型混日子,但我又不甘心。自学的道路是痛苦的,痛苦之处在于你根本没有方向,无从下手,好像每一个地方都可以下手,但又没有一个地方可以下手;你无数次碰壁,无数次失望,像是在走迷宫,但永远也看不到出口在哪。那段时间,我又想到过放弃。
后来我当了PD的NLP组的小组长,我觉得我需要有点担当,正好当时事情不多,我觉得是时候积累一些自己写的模型了。那时我看了苏神的文章,感觉keras-bert能轻松实现BERT的finetune用法,那一刻有种顿悟的感觉。在那一个月,我像发疯似的,一个月之内写了12个模型,用keras-bert实现了命名实体识别、文本多分类、文本多标签分类、完形填空、抽取式阅读理解等任务,还用keras-bert实现了ALBERT调用。那段时间,GPU很少有空闲的时间,而我对NLP的感觉也在慢慢变好。后来,我又学习了PyTorch,接触到了HuggingFace的transformers这个神奇的工具,感觉到了Torch的强大与灵活。
后来,我终于学会了对PLM进行finetune,实现一些NLP基本任务算是小菜一碟了。但渐渐地,我感觉好像没有了进步空间。在某一天的晚上,我尝试了搜索了关系分类的论文,找到一篇论文:Enriching Pre-trained Language Model with Entity Information for Relation Classification,我把R-BERT用在人物关系分类上,取得了很好的效果,参考文章:NLP(四十二)人物关系分类的再次尝试。我尝试着用一周时间使用keras-bert实现R-BERT模型,实际上三天就完成了,那种复现模型的感觉真的让我久久难以忘记。
也是从那以后,我开始阅读NLP方向的论文,有些论文读起来枯燥无味,有些论文却读起来津津有味,直到去携程面试前一天晚上,我还在读Transformer的论文。慢慢地我感觉只有不断地读论文,才会有新的收获,而仅仅只是用预训练模型无法体会这些模型的神奇之处。
两年多了,在NLP这条道路上走得很辛苦,很多时候想过放弃,但庆幸的是我坚持下来了。记得在大兴的时候,有个领导跟我说,NLP这条路比较窄,以后可能不好走,我当时的回答是,我会坚持的。是的,我坚持下来了,而且NLP这条路好像也没有那么窄。
二面携程的时候,总监问我为什么做NLP。我说,我是学数学的,我希望能做算法,NLP很吸引我,我想继续做NLP,最好能把自己的一些想法加在里面,有一点儿自己的成果。
是的,我的想法很简单,也很难做到。但是有梦想总归是件好事情。
两年前,在银行的电梯里,我和组长一起下去吃饭,她问我百度的offer拿到了吗,我点头。她说我最好去百度,大厂有保障。我说我可能会去小公司做算法,她摇摇头说小公司管理不太好,你会吃亏的。事实验证了她的想法。但我组长最后还跟我说了一句,去小公司也可以,以后上岸比较难,不过你还年轻,有机会上岸的。
这两年多,我一直在想着这番话。我想我现在终于上岸了,那就努力工作吧,好好学习吧,不要辜负了自己这两年多跌跌撞撞的痛苦经历。
这是我与NLP的故事,也许简单,也许曲折,也许励志,也许不值一提,但在我个人身上,这是我人生的一段经历,如此而已,我觉得可以一写,故记录于此。
2021年5月10日夜于上海浦东,此日酷暑难当~