如何理解深度学习就是一个“积木游戏”,浅谈深度学习的创新点与实验

如果你是刚考研上岸的科研小白,大概率问老师的第一个问题是:研究生期间研究什么?

通常老师会告诉你一个大概的方向,比如说自监督学习现在很火,去关注一下。

 

如果再进一步问老师,那我具体怎么做呢?老师可能会让你先去充分调研一下,先看论文。或者让某个学长先带带你;而学长很可能也会告诉你多看论文

这可能是很多同学的现状。

所以又回到最开始,怎么去做文献调研呢?

这里我总结了一些方法。

读论文——入门

中文期刊综述+中文博客+Github资源

如果我们是刚刚入门某个领域,这个时候建议先从中文期刊综述开始,这样阅读起来比较轻松,更能够理解,还可以看一些中文博客,比如知乎,经常刷知乎的同学,可能会发现知乎上有一些号主,会经常分享一些干货,比如对论文的详细解读;还有一些公众号博客等。当然在我们读论文的时候,我们还可以通过Github获得关于论文开源代码、公式等等的信息。

读论文——深入了解

顶会survey+顶会tutorial+Paper-with-code

如果我们对某一个领域已经有了一定的了解,希望做一些深入的研究,深入去了解一下这个任务到底是什么?这个时候我们可以看一些顶会顶刊的survey、综述,因为通常这些文章都是国外的大牛写的对某个领域总的研究历程的总结回顾,或者对未来的研究方向的展望。我们看完之后,对整个发展脉络会有一个比较清楚的了解。

 

其次,我们还可以看一些顶会的tutorial,一般每个会议都会“讲习班”,之前线下会议的时候我们需要去现场参与,最近两年因为疫情的原因,很多是通过线上直播的方式去做一些分享,我们还可以在b站上找到相关的回放,通过类似“讲习班”的分享,是非常好的深入了解一个领域的方式,还有一个网站叫Paper-with-code,会有一些公开了代码的paper,我们可以直接找到它的代码进行学习。

读论文——定点突破

Follow领域内做得最好的学者和机构

如果我们对研究领域已经有一些深入的了解,可能就需要定点出突破了,这个时候我们可以直接follow这个领域做的最好的学者或机构,我们可以发现他们的一些idea,或者关注一下他们做了哪些问题,比如现在比较受关注的何恺明大神,他提出了一个什么新东西,这些知乎上都会有解读。最直接的就是我们去关注他的主页,去看一下他最近的工作。

 

如果你研究自然语处理的话,清华大学的刘智源老师,孙茂松老师,他们团队有一些非常强的研究者,他们组经常会推出一些工作。或者关注一些比较强的机构,对于研究方向的最前沿的信息,能够及时获取,做到知己知彼,百战不殆。

文献调研tips——

①找导师或学长推荐5-10篇必读的经典论文:新手入门,通常是从几篇必读论文起步的。清华大学NLP组维护了一个自然语言处理的阅读列表(https://mp.weixin.qq.com/s/UmkISRyTrAhUW1eG4VFrRA),其中有必读论文。建议先读一下。

②ACL Anthology:网址:https://aclanthology.info/ ACL Anthology是自然语言处理的论文库,涵盖了绝大部分的自然语言处理国际期刊、 会议和Workshop的论文。大家可以重点阅读其中的Computational Linguistics、ACL、EMNLP、NAACL等期刊和会议的论文。

③NIPS Proceedings:网址:https://papers.nips.cc/ NIPS Proceedings 包含了机器学习顶级会议NIPS历年的论文集。

④PMLR:网址:http://proceedings.mlr.press/index.html PMLR包含了非常多的机器学习方面的期刊、会议和Workshop的论文。大家可以重点阅读其中机器学习顶级会议ICML的论文集。 

⑤OpenReview:网址:https://openreview.net/ OpenReview是一个非常有开创性的网站,可以看到公开的论文评审意见以及作者的回复意见。覆盖了机器学习非常多的会议,其中最重要的是ICLR的历年论文集。OpenReview也把NIPS和ICML纳入进来,但是只包含了近年来的几届会议。

⑥arXiv:网址:https://arxiv.org/ arXiv是由康奈尔大学维护的一个论文预印版的网站。所谓预印版,就是指尚未正式发表。由于每天都有来自全世界的学者发布他们的论文预印版,所以arXiv是获取学术界最新动态最重要的渠道。但是这里的论文由于没有经过严格的同行评议,鱼龙混杂,质量参差不齐,阅读时需要有所甄别。通常阅读cs.CL和cs.LG两个频道。

⑦微信公众号:机器之心、新智元, PaperWeekly,专知、AI Time等媒体经常会发布很多介绍最新科研进展的文章,都是用中文撰写,也是获得论文的重要渠道。

⑧学者个人主页:可以定期访问本领域著名学者的个人主页或者Google Scholar页面。

⑨搜索引擎:在搜索引擎输入研究方向的名称,并可以获得大量该方向的论文。推荐使用Google和Google Scholar,可以通过引用数来判定论文的质量。

第二个问题——调研完成之后,怎么去读论文?

·Definition部分——明确问题的描述,这到底是什么任务

我们在总结一篇论文的时候,要定位到核心,解决情感分析任务、解决分割任务这些都太笼统了,我们要明确它具体解决了一个什么小问题,把它具体化。

·Movtivation部分——了解动机是什么?为什么要做这种工作,本任务中别人解决不了或者解决不到位的是什么?

这里要呈现的是这篇工作的贡献,作者用了什么技术,为什么要用这个技术,为什么要解决这个工作等等。

我们自己在写论文的时候,可以说明一下A做了什么,B做了什么,但是有一些局限性,然后我是怎么做的。一定要总结出别人解决不了或解决不到位的是什么来突出你的贡献。

·Related Work部分——掌握本领域中目前最常用的方法,直接相关的方法,别人怎么做的,前人工作的优缺点。

·Challange部分——知悉本领域有什么挑战,必须做有意义的工作。

·Proposed Method部分——了解别人提出了哪些方法,提出的方法详细描述出来,尽量用数学公式。

要看懂数学公式中每个字母是什么意思,这样才能有利于理解作者提出的方法。

·Discussion and Analysis部分——掌握本篇论文研究发现的总结,与其它研究的对比,哪些是已经知道的,哪些是新知道;与其它研究对照有何不同,研究的优势和不足之处。研究的结论有什么提示。

我认为论文中很难的部分之一就是Discussion and Analysis部分;很多人写这个部分的时候,只是简单的描述结果,但是实验的讨论分析写的非常不到位。我们可以多关注别人是怎么写的,顶会的论文是从哪几个角度去讨论这些问题的,我们通过别人论文的讨论部分,也有利于我们自己去提出一个新的问题。

·Idea/创新点——我读了这些论文,调研了本领域后自己的感想,我应该做一下哪方面的工作比较好,也就别人尚未得到解决或者解决的不太理想的是什么工作等等。

·Risk——如果我做这个工作,估计会遇到的问题是哪些?比如:我的想法不太能work /我的方法实验周期长,或者我做不出来等/存在的冒险……

创新点——这里提供一些创新的思路

·数据集创新

这篇文章EMNLP2021的最佳论文,这篇文章就是提出来一个数据集的问题,他发现现在数据集的一个痛点是好多图像类的任务,如果没有做一些语言类的预训练工作的话,会对结果产生很大影响;现有数据集也存在偏见,因为很多数据集都是欧美人整理的,

这篇best paper就提出了一个视觉和语言的数据集,而且是通过不同的语言去标注,做了一个基于视觉语言多元图文推理的数据集。

(这是一个NLP的会议,但是他提出了一个多模态的问题,所以在知乎上就出现了这个搞笑的评价……)

回到正题,我们能不能类似的去发现一下数据集中的问题,去做些改进?

咱们不再看一个例子。

 

这是清华大学提出的一个多轮对话的数据集,它发现多轮对话之中一些回答其实不是很准确,由于缺少知识标注,其实涵盖在多轮对话中的知识交互会有一些限制,他们就通过对每个话语多加一个标注(其实就是一个知识图谱),去提高他们回答的能力,这也是一种解决数据集创新的方式。

比如我们可以运用不同的数据增强去在我们的任务上做测试,看一下哪一种数据增强方式更有利于我们的工作,去报告一下这些实验结果。

·模型创新

我们不会提出新的模型那么怎么办呢?我们就可以用组装积木的方式来组装别人的模型

 

比如这篇文章,做了一个说话人识别的问题,创新点之一,首先是多层特征的聚合相加,在这方面就是一个很好的创新,这个这方面他其实没有提出一个新的模型,所以在你的任务上能不能这样用一些多层的聚合或者相加这方面的工作呢?

第二个创新点是1-Dimensional Squeeze-Excitation Res2Blocks模块,但是这里面的东西其实也都不是他提出的,他只是做了一个组合。第三个创新是Context-dependent statistics pooling。它其实就是对于模型做了一个串联的工作。

·Pooling创新

 

·损失函数创新

比如Triple Loss、AM-Softmax、AAM-Softmax

第三个问题——怎么去编程实现?

·渐进式编程:

不要尝试一步到位就实现完整的idea,而是要采用渐进式的策略。首先实现一个功能完整但是各个模块都简化的版本,经测试无误后再增加新的功能),这样“添砖加瓦”直至所有的功能都实现。

例如,假设你想建立一个文本分类器,想到的idea是使用多头自注意力机制。不要马上就去实现多头自注意力机制,而是先实现一个简单的双向LSTM,然后开始做实验。当双向LSTM的实验结果符合预期(与其他论文报的实验结果相当)后,再将双向LSTM替换为多头自注意力机制。这时候,我们预计多头注意力机制肯定能超过双向LSTM。由于双向LSTM的结果是正常的,只是将双向LSTM替换成注意力机制一般有很大的几率成功。如果实验结果不好,可以集中考察将双向LSTM替换成注意力机制替换这一步哪里出了问题。

在写简单版的程序时,也要采用渐进式,也就是说写一部分就调试一部分,而不是都先写完了再调试。以我的经验,渐进式编程可以大幅度减少bug出现的几率,这是因为每次只需要在增量部分查找bug即可。另一个好处是简单的版本本身也可以作为实验中的基准系统。

·快速建立编程与实验的闭环:

一定要在一开始建立起编程与实验的闭环,即编程、做实验、根据实验结果再编程。建立了这样一个闭环之后,就能够从实验中获得反馈信号,根据反馈信号来判断程序是否存在bug。

这里的要点是“快”,要从写第一版程序时就要建立闭环,而不是等到完整的idea都实现后再建立。这个闭环和渐进式编程是相互配合的。

·缩短实验周期:

深度学习从本质上说是一种“trial-and-error”的范式,必须通过不断的实验尝试来确定最优策略。因此,缩短实验周期至关重要,做一个实验要5分钟和要5天之前有着天壤之别。虽然NLP天然就是一个“重量级”的任务,需要很长的实验周期,但是还是可以采用一定的策略来缩短实验周期。我通常区分三个级别的实验数据:玩具例子(不超过1000个训练样本)、小规模数据(十万规模)和大规模数据(百万规模),三个级别的模型:玩具模型(维度不超过10)、小模型(维度是正常模型的1/3)和大模型(正常模型),和两个级别的实验平台:笔记本电脑和GPU服务器。

在起步阶段,重要的是代码的编写和调试。我通常会在在玩具例子上运行玩具模型,仅仅使用笔记本电脑,努力将实验周期控制在30分钟以内。用笔记本电脑编程的好处在于可以随时随地使用,也不用与人抢GPU。当我确认在笔记本上的版本应该正确无误后,我才会在GPU服务器上运行小规模实验,努力将实验周期控制在1天之内。当全部的代码都完成并且在小规模数据上取得了非常好的效果后,我才会在GPU服务器上使用大规模数据训练标准模型,这样的实验可能要跑好几天,但是并不会跑很多次。

在写代码时,调试能力极其关键。我通常采用以下策略:

一、知道什么是正确的:要想发现程序是否出错、哪里出错,首先要知道什么是正确的。通常会采用大家公认的观点,比如Transformer在WMT数据上的BLEU值应该大致在某个范围。如果你跑出来的结果远远低于这个范围,那说明一定有问题。因此,一定要跑一下内部评测。或者说双向LSTM一定优于单向LSTM,如果你跑出来的结果是相反的,说明有问题。如果心里知道程序的正确结果应该是怎样的,那么当实验效果不好时,就不会去怀疑idea的正确性,而是花时间去检查bug。

二、加强可视化:调试非常类似于探案,必须通过蛛丝马迹去发现隐藏极深的bug。因此,必须要加强可视化来提供“蛛丝马迹”。我在写程序的时候,几乎每一段程序都会增加显示中间结果的功能。通常会定一个变量名叫verbose Level,确定中间结果信息显示的详细程度。当输出结果不正常时,我会打开最高级别的verbose Level,把整个运行过程写到一个纯文本文件中,然后打开文件逐行阅读、观察和分析,试图找到反常之处。此外,也需要和基准系统多做对比。以机器翻译为例,可以把开发集上所有的翻译结果写入一个纯文本文件,每句话依次给出源语言句子、参考译文、基准系统译文和我们方法的译文。通过对比,发现我们方法的问题。 

三、分区定位:调试程序的一个重要方法是分区定位。自然语言处理任务通常是一个流水线,以文本生成任务为例,包括:数据获取、编码转换、全半角转换、大小写转换、长度过滤、分词、BPE、训练、测试、后处理等。任何一个环节出错,都会导致实验结果不好。需要从头到尾一段一段排查问题。在写程序时,也可以按照模块逐个排查。对于复杂的网络架构,可以屏蔽其中的部分模块进行排查。

第四个问题,如何做实验?

·深度学习作为一个应用学科,通过实验来验证所提出方法的正确性至关重要。通常,深度学习的时间周期非常长,而准备论文的时间通常都很短,因此务必要从一开始就做好顶层设计,确保后面少走或者不走弯路。 

·首先要明确做实验的目的。

很多同学一开始不知道为什么要做实验?做什么实验?只是阅读相关的文献,把里面列出的实验都列进来,全部都做。这种做法是错误的,而且会浪费大量的计算资源和个人的时间。以我的经验,做实验与写论文是密不可分的,做实验的主要目的是论证你在论文提出的论点。 p 

·是否选择了学术界公认的标准数据集?所谓标注数据集,是指所有人都可以获取、使用的人非常多的数据集,这样便于别人验证你 的方法,也便于与前人在该数据集上报的实验结果进行对比。在情感分析领域,目前公信度高的数据集有Sentiment140,IMDB数据集等。

·是否选择了合适的且足够强的基准系统? 你所提方法的有效性必须通过与目前世界上在该问题上最好的方法(也就是基准系统)的对比来凸显出来。选哪些基准系统?千万不要只选择模型本身。举个例子,假设要基于Transformer实现一个情感分析方法,那么只超过Transformer是不够的,必要要超过已知的所有的情感分析方法,尤其是大家公认的最好的方法。

如何实现基准系统?有三个策略。

第一个策略是直接报最好的方法原始论文在标准数据集上的结果,这样就不要做实验。第二个策略是使用原始论文作者发布的开源工具包,在你使用的数据集上做实验,要列清楚具体的配置。第三个策略是你重新实现最好的方法,但是要证明重新实现的版本 能够达到原始论文的水平。基准系统的选择至关重要,很多论文被拒都是因为基准系统选择不当。

·是否显著超过了所有的基准系统?最好的结果应该是在所有的评价指标(准确率、时间复杂度、空间复杂度、参数规模等)上都显著超过了所有的方法。如果判定是否显著,要使用开源工具包来做统计显著性检验。所提出的方法相对于基准系统提升得越多,越容易得到大家的认可,越容易引起轰动效果。如果所提出的方法在标准数据集上取得了公开发表的最高性能,也可以在论文里强调一下,这些都是加分项。 

·是否能够重现论文中的实验结果?近年来,为了打击学术不端行为,论文实验结果的可重复性已经越来越受到学术界的重视。每位同学在写论文时都应该尽可能把所有的参数设置列全,便于读者重新实现,这已经成为论文评审中的必备环节了。此外,有些组要求所有论文的源代码都要在论文发表后开源,确保论文实验结果可重复。

·是否对论文中提出所有论点都进行了实验验证? 不要轻易发表观点。一旦发表观点,就要负责,或者引经据典来论证,或者通过实验来验证。轻率地在论文的介绍和方法部分发表观点却不在实验部分呼应,是一个非常糟糕的做法,严重损伤审稿人对论文的认可度。 

·在设计实验时,一定以读者尤其是审稿人为中心,想一下审稿人在看了方法部分的介绍后,心里会产生哪些问题,我们的实验能不能很好地回答这些问题。需要牢记,不要机械地照搬其他论文的实验,该做哪些实验完全是围绕着论证论文的论点而展开。

通常,我们会设计以下类型的实验:

·与基准系统的对比实验:与基准系统进行主要评价指标上的直接对比。一般会用多个数据集、多个语言对。这通常是论文的主实验,也就是决定主要结论的实验。  

·超参数对系统性能的影响:我们的方法通常会用到各种类型的超参数,需要考察超参数不同取值对于系统性能的影响。辅助实验。 

·各种因素对系统性能的影响:通常需要考察语料库规模、句子长度等因素对系统性能的影响,辅助实验。 

·可视化分析:对神经网络的某些部分进行可视化分析,试图找到语言学上的证据。这对于提升审稿人(尤其是偏语言学背景)对论文的认可度非常重要。辅助实验。 

·样例分析:在具体样例上与基准系统进行对比。辅助实验。

在做实验时,一般建议用以下顺序:

·做基准系统的实验。先把最基础的基准系统的实验在一个数据集上跑完,得到它的实验结果。 

·做我们方法的实验。在一个数据集上做我们方法的实验,调各种超参数,直至显著超过基准系统为止。 

·增加更多的基准系统的实验。把所有的基准系统都跑一遍实验。如果其中有系统超过了我们的方法,则需要回到第二步继续完善。 

·扩展到全部的数据集和语言对。确保我们的方法在所有数据集和语言对上显著超过所有基准系统。完成其他辅助实验。完成各种因素的影响、可视化分析和样例分析实验。

做实验一定要成良好的习惯,做好实验数据和实验文档的整理工作。我的个人经验如下:

  • 实验数据主要放在服务器上,应该建立目录分类存放。通常分为代码区、数据区、实验区三个部分。代码区主要存放源代码。数据区主要存放训练集、验证集和测试集。实验区主要存在实验运行的结果问题。每次实验都应该专门建目录,重要的文件(如超参配置文件、模型文件等)要保存,以便恢复。对于不常用的数据,应该进行压缩存储,以便节省硬盘空间。文本文件的压缩比非常高,能够节省大量的存储空间。
  • Linux的命令非常复杂,很多刚入门的同学容易出错。建议写一个文档记录下每一步的命令,之后就容易重复了。熟练了以后,建议全部用Python程序作为脚本来串联,用bash来执行,这样可以最大程度上减少错误输入造成的影响。 三、不要只是简单地用Excel记录实验的最终结果。应该写专门的实验报告进行详细的记录、观察和分析,很多错误和灵感都是在实验分析中发现的。不要因为实验结果不好而气馁,要坚定信心,并且静下心来仔细分析。 
  • 与他人交流时,不要直接拿出原始实验数据来讨论,因为很多命名是不规范的,只有你自己能看懂。在学术讨论时,应该对实验设置、实验结果进行梳理,让不熟悉你工作的人更容易知道你的实验过程和结论。

基本原则——

遵从以下机器学习基本原则

p·汇报Training/Dev/Test数据集如何划分的

 ·在训练数据集上进行训练

p·在验证集上验证

 ·汇报测试数据集的结果

 ·不要在验证集上过度拟合模型并报告它们!

数据原则——

·数据收集过程的完整描述,包括样本量;

·预处理步骤的说明;

·解释如何为训练/验证/测试分配样本;

·如果您使用外部预训练数据(在 NLP 中正常)

 ·讨论数据将如何影响结果

实验设置原则 - 实施细节

 ·超参数

·超参数范围

·选择最佳超参数配置的方法

·评估运行的确切次数

·实验如何进行的描述(随机种子可能会产生巨大的影响)

·明确定义用于报告结果的评价指标或统计数据

·明确定义的error bars

·具有集中趋势(平均值)和变化(标准差)的结果描述

·每个结果的平均运行时间,或估计的能源成本

·计算基础设施的描述

工具安利——实验管理

 

你可能感兴趣的:(深度学习,自然语言处理)