自然语言处理介绍
我所就读的博士专业是计算机科学,具体方向是自然语言处理。
自然语言处理、计算机视觉和机器学习是目前人工智能领域中最火热的三个方向。
机器学习方向主要研究机器学习算法,设计更好的模型,让计算机能够从大量数据中学习到有用的知识,进而优化模型中的参数。
自然语言处理和计算机视觉则是机器学习最常见的落地应用。
自然语言处理的目标是让计算机理解人类所说的语言,然后去执行一些任务,比如信息检索、回答问题等。
而计算机视觉则是理解图片中的内容,然后再执行下一步任务,比如物体检测、人脸识别等。
自然语言处理(NLP)是一个非常有意思的方向。
一般一门语言的常用词汇是非常有限的,中文和英文常用的字词不过数千个,但是依靠不同的排列组合,这几千个字词可以表达出无穷多的意义,这使得只会执行固定指令的计算机很难理解自然语言。为此,NLP的研究人员研发了许多算法来对自然语言建模。这样一来,计算机只需要根据训练的语料来拟合模型中的参数,就可以在一定程度上实现对语言的理解。
过去的NLP主要基于概率和统计。
这些方法主要对词与词之间的关系进行概率和统计建模。
以我所研究的主题模型为例,主题模型主要用来发现文档隐含的主题(比如体育、政治等等),它的基本假设是如果两个词经常在同一个文档中出现,那么这两个词有很大的概率是近义词。
比如在关于体育的文档中,“比赛”、“裁判”、“胜利”这一类的词经常一起出现,那么算法就会认为这些词的意思比较接近,可以归入同一个主题下。
这类基于概率和统计的NLP方法对数学,尤其是概率论的要求比较高。
由于我研究的主题模型需要大量的推导,所以我在发表论文时往往会附上一篇补充材料。
补充材料中包含了我的方法完整的推导过程。这些推导过程有时甚至比论文原文还要长。
近十年来,随着深度学习的兴起,NLP领域开始大量应用深度学习的方法。
最著名的方法包括循环神经网络(RNN)和词嵌入(word embedding)。
RNN可以逐词地读入单词,生成新的隐含状态,在读取整句之后就可以生成对整个句子的理解。
词嵌入则是将每个单词用一个固定维数的向量表示,而且所有词的向量都是基于同一个语义空间的。有了向量化的表示之后,计算机可以用向量的各种方法来对词义进行理解和比较。
到了最近几年,随着算力的不断增强,参数量在十亿甚至百亿级的模型不断被提出。
谷歌发布的BERT模型可以说是一招鲜吃遍天,靠着一个模型刷新了大量公开任务的排行榜。而最近OpenAI发布的GPT-3语言模型包含了1700亿个参数,号称人类史上最强语言模型,可以生成能以假乱真的新闻稿。
自然语言处理读博体验
读博是一件带有风险的事情,因为读博的目的是通过科学研究拓展人类的知识边界(哪怕只有一点点)。
探索未知的世界就意味着有可能会失败,但是成功地打开新的世界则更令人兴奋。
不过在实际的读博过程中,这样的大起大落只占少数,更多的是日复一日地读论文、见导师、写代码和跑实验。
读博的头两年,我还有课程要修,所以经常要在课程作业和科研项目之间来回切换。
不过好在课程的老师们都比较体谅博士生,课程的作业量一直比较有限,这使得我能有更多的时间做科研。
做科研的过程大部分并没有太多的波澜。
开始一个新的科研项目时,我一般会阅读大量相关的论文,这样可以了解这个方向常用的方法和最新的进展。
然后我会根据以往的方法存在的缺陷设计新的方法,这个过程中我和导师们一般会进行多次讨论。两位导师会用他们的经验来考察我的方法是否在理论上充分地解决了过去的问题,以及我的方法是否存在一些其它的缺陷。
经过多次讨论和修改后,我们会确定初始的模型设计,之后我就用代码实现模型并调试。
接下来我会把实现的模型应用在一些数据集上来检测效果,然后根据实验中出现的问题再去修正我的模型。这其中也会有多轮和导师们的交流。
在获得更好的实验结果之后,我就会开始撰写论文,在和导师一起修改之后投稿给NLP领域的会议。
上面这个过程看似平顺,实际上每一步都可能出现意想不到的情况。
在阅读论文时,我经常会发现过去的方法存在的问题,然而随着阅读数量的增加,我发现我的想法已经被人实现了。
更让我无奈的是,有时候我读了大量论文,然后设计出了新的方法去和导师交流,导师甩给我一篇我没读到的论文,而这篇论文已经实现了我的方法。
更多的困难来自实验。
在设计完新方法并和导师们交流通过后,我会用代码实现我的方法并在数据集上验证效果。但是大多数情况下,理论上应该效果不错的方法往往比不过以往一个经典且简单的方法。于是我需要去检查方法各个步骤的结果,分析可能出问题的环节并进行改进,然后重复之前的实验过程。
在经历多次失败并最终获得好的实验结果之后,写论文也是一道坎。
一开始写论文时,我对论文的写作习惯和要求都不太了解,大量的篇幅集中在我的算法上,忽略了对这个方向的介绍和对实验结果的深入分析。
我还记得当我写完我的第一篇论文的初稿时,导师看了之后表示“写得不错,我给你改改”。当我拿回修改稿时,我的第一反应是导师给错了稿子,因为我写的句子好像都不见了,最后靠着几幅插图我才发现这确实是我的稿子。
导师的“改改”几乎就是重写了整篇论文。
我拿着导师的修改稿和我的初稿进行比对,慢慢地领悟了论文的写作方法并在之后的论文撰写过程中加以应用。后来的几篇论文中,虽然导师也会做修改,但修改的篇幅逐渐地减少了。
在计算机领域读博的一个独特好处是这个领域有大量的会议。相比期刊,会议的审稿周期更短(一个月 vs. 六个月以上),论文篇幅也更短(8 – 10页 vs. 20 – 30页)。
NLP领域的顶级会议每年会召开二到三个。最著名的国际计算语言学会年会(ACL)、自然语言处理经验方法会议(EMNLP)和国际计算语言学会北美分会年会(NAACL)。
这些会议一般都会在风景优美的城市举办。如果投稿的论文被会议录用,那么就可以在导师科研项目的差旅经费支持下,去参加相应的会议。
所以论文录用通知不仅代表着一篇论文可以正式发表,还意味着一次“公费旅游”。
读博期间,我发表了四篇会议论文,分别去了葡萄牙里斯本、德国柏林、丹麦哥本哈根和中国香港参加了会议。
会议期间,我可以和来自世界各地的同行交流,结交新的朋友,见到传说中的大佬,了解NLP最新的进展,还可以在闲暇的时候领略当地的风土人情。
会议由于其日程固定,所以都设有截稿日期。
投稿前的日子压力是最大的。每当临近截稿日期时,实验室的服务器便挤满了任务,大家都在争抢硬件资源运行自己的实验。
在我读博的最后两年,深度学习已经成了NLP的主流方法,所以大家都在争着用GPU运行实验。而我的方法只要用CPU就可以运行,所以幸运地躲过和其他同学抢资源的尴尬。
写论文时,反复的修改是最让人头大的事情,因为我既要完整地介绍我的方法和分析我的实验结果,同时还要制作精美的插图和表格。此外我还要将论文长度控制在会议要求的页数之内,经常要一寸一寸地调整插图大小、表格字号,还要一个词一个词地删减,期待着能减少一行。
这期间,导师们也亚历山大,因为他们一般有好几个学生要投稿,少则两三篇,多则七八篇,都需要在最后一周的时间内进行多轮的修改。
毕业论文的写作期间是我压力最大的一段时间。那个时候,我一边要写毕业论文,一边还要写最后一篇会议论文和运行相关实验。
毕业论文是对博士期间所做工作的综述。除了复制粘贴发表过的会议论文的内容之外,我还需要大量展开背景介绍和实验分析,同时加入更多技术细节。每写完一版,我还要将稿子发给导师们审阅,然后根据导师们的意见再做修改。
定稿后,我还要制作幻灯片和准备口头报告,用于在答辩会上展示。准备口头报告的过程中,我反复练习了几十遍整个报告的过程,同时不断改进我的语言表述和幻灯片的内容,力争让答辩会上的观众更容易地理解我所做的工作和我的创新点。
通过答辩后,我就成了真正意义上的博士,但答辩委员会也给我的毕业论文提了不少意见和建议。之后我又花了几天的时间按答辩委员会的要求修改了论文,并在截止时间前提交了最终版。
毕业典礼上,两位导师亲自为我进行了hooding仪式,祝贺我顺利毕业。
离开学校前,我和导师们最后见了一面,我们交流了读博时的一些心得,我也告诉了他们我未来的去向,并感谢了他们五年来对我的指导。