简介这是关于如何使用神经网络进行自然语言处理(NLP)的最佳实践的集合,随着新见解的出现会定期更新,提高我们对如何使用神经网络的知识用于NLP对深度学习的理解。在NLP社区中有一种说法,带有注意力的LSTM在所有任务上都达到了最先进的性能。虽然这在过去两年中确实如此,但NLP社区已经慢慢从LSTM转移注意力,转而关注更有趣的模型。然而,NLP社区并不打算再花两年时间独立(重新)发现下一个LSTM。我们无意重新发明已经奏效的技术或方法。尽管现有的深度学习库通常编码了神经网络的最佳实践,例如初始化方案,但许多其他细节,尤其是特定任务或特定领域的细节,尚未被实践者解决。本文无意成为当前最佳的盘点,而是与大量任务相关的最佳实践的集合。换句话说,本文不描述特定的架构,而是旨在收集构成成功框架的那些特征。其中许多功能对于推动当前的技术水平最为有用,因此我希望对它们的更广泛理解将带来更强有力的评估、更有意义的基线比较,以及更多发现可能有效方法的灵感。本文假定您已经熟悉神经网络在NLP中的应用(如果不熟悉,我建议您阅读YoavGoldberg撰写的《APrimeronNeuralNetworkModelsforNaturalLanguageProcessing》:https://www.jair.org/media/4992/live-4992-9623-jair.pdf),并且对一般NLP或特定任务感兴趣。本文的主要目标是让您快速了解相关的最佳实践,以便您尽快做出有意义的贡献。我将从与绝大多数任务相关的最佳实践概述开始,然后概述与最常见任务相关的最佳实践,尤其是分类、序列标记、自然语言生成和神经机器翻译。免责声明:将某事定义为最佳实践极其困难:最佳标准是什么?如果出现更好的做法怎么办?这篇文章是基于我个人的理解和经验(当然不全面)。在下文中,我将仅讨论已被证明对至少两个不同的群体有益的做法。对于每个最佳实践,我将至少提供两个参考。最佳实践词嵌入词嵌入可以说是最近NLP发展中最著名的最佳实践,因为预训练嵌入的使用对我们非常有帮助(Kim,2014年)[12]。词嵌入的最佳维度在很大程度上取决于任务:较小的维度在句法任务上效果更好,例如命名实体识别(Melamud等人,2016年)[44],或词性标注(POS)(Plank等人)al.,2016)[32],尽管更大的维度对于更多语义任务更有用,例如情感分析(Ruderetal.,2016)[45]。深度虽然我们无法在短时间内达到计算机视觉的深度,但是NLP中的神经网络已经向更深的方向发展。目前最好的方法通常使用深度Bi-LSTM,通常包含3-4层,例如词性标注(Planketal.,2016)和语义角色标注(Heetal.,2017)[33].一些任务的模型甚至更深。谷歌的NMT模型有8个编码器层和8个解码器层,(Wuetal.,2016)[20]。然而,大多数时候,超过2层的模型的性能提升很小(Reimers&Gurevych,2017)[46]。这些观察结果适用于绝大多数序列标记和结构化预测问题。对于分类,深度或超深度模型仅在字符级输入上表现良好,浅层词级模型仍然是最先进的(Zhangetal.,2015;Conneauetal.,2016;Leetal..,2017)[28,29,30]。在训练具有层连接的深度神经网络时,可以使用一些核心技巧来避免梯度消失问题。因此提出了不同的层和连接,这里我们将讨论3点:i)高速公路层,ii)残差连接,iii)密集残差连接。Highway层:它的灵感来自于LSTM的门控机制(Srivastavaetal.,2015)[1]。让我们首先假设一个单层MLP将非线性g的仿射变换应用于其输入x:Highway层然后计算以下函数:其中t=σ(WTx+bT)称为变换门),(1-t)称为进位门。我们可以看到Highway层类似于LSTM门,因为它们自适应地将输入的某些维度直接传递到输出。Highway层主要用于语言建模,取得了最好的效果(Kimetal.,2016;Jozefowiczetal.,2016;Zillyetal.,2017)[2,3,4],但它也是也用于语音识别等其他任务(Zhangetal.,2016)[5]。有关更多信息和代码,请查看Sristava的主页(http://people.idsia.ch/~rupesh/very_deep_learning/)。残差连接:残差连接的第一个提议(Heetal.,2016)[6]应用于计算机视觉,也是计算机视觉在ImageNet2016夺冠的最大助推器。残差连接更直接比公路层。我们将前一层输出h增加一个代表当前层的指数L。然后,残差连接学习到以下功能:只有一个快捷连接,残差连接可以将上一层的输入添加到当前层。这个简单的改变缓解了梯度消失的问题,因为层次结构不能变得更好,模型可以默认使用恒等函数。DenseResidualConnections:DenseResidualConnections(Huangetal.,2017)[7](CVPR2017BestPaperAward)从每一层到所有后续层添加连接,而不是从每一层到下一层AddingLayers:Denseresidualconnections有已成功应用于计算机视觉,并且还被证明在神经机器翻译中始终优于残差连接(Britz等人,2017年)[27]。Dropout尽管批量归一化已经使其他正则化器在计算机视觉的大多数应用中变得过时,但dropout(Srivastaetal.,2014)[8]仍然是NLP深度神经网络设备中使用的正则化方法。0.5的dropout率表明它在大多数情况下仍然有效(Kim,2014)。近年来,自适应dropout((Ba&Frey,2013)[9])和进化dropout(Lietal.,2016)[10]等dropout的变体被提出,但都没有在应用领域得到广泛普及。NLP社区应用程序。这个问题的主要原因是它不能用于循环连接,因为聚合丢弃掩码会使嵌入归零。Recurrentdropout:Recurrentdropout(Gal&Ghahramani,2016)[11]通过在层ll的时间步应用相同的dropoutmasks解决了这个问题。这避免了放大序列中的dropout噪声,并为序列模型带来有效的正则化。Recurrentdropout在语义角色标记(Heetal.,2017)和语言建模(Melisetal.,2017)[34]方面取得了最先进的成果。多任务学习多任务学习(MTL)通常可用于在给定额外数据的情况下提高目标任务的性能。辅助目标:我们经常可以找到对我们关心的任务有用的辅助目标(Ruder,2017)[13]。虽然我们已经预测了周围的词来预训练词嵌入(Mikolovetal.,2013),但我们也可以在训练过程中将它们用作辅助目标(Rei,2017)[35]。我们也经常在序列到序列模型中使用类似的目标(Ramachandranetal.,2016)[36]。任务特定层:虽然将MTL用于NLP的标准方法是硬参数共享,但允许模型学习任务特定层是有意义的。这可以通过将任务的输出层置于较低级别来完成(S?gaard&Goldberg,2016)[47]。另一种方法是引入私有和共享子空间(Liu等人,2017年;Ruder等人,2017年)[48、49]。AttentionmechanismAttentionmechanism是sequence-to-sequence模型中最常用的方法,用来关注encoder的状态,也可以用来回溯sequence模型过去的状态。利用注意力机制,系统可以获得基于隐藏状态s_1,...,s_m的上下文向量c_i,可以与当前隐藏状态h_i一起预测。环境向量c_i可以由前一个状态的加权平均得到,其中加在状态上的权重就是注意力权重a_i:注意力函数f_att(h_i,s_j)计算当前隐藏状态h_i和之前状态的差值隐藏状态s_j之间的非归一化分布值。在下文中,我们讨论了四种注意力变体:加法注意力、乘法(点积)注意力、自注意力和键值注意力(key-valueattention)。Additiveattention是最经典的attention机制(Bahdanauetal.,2015)[15],它使用带有隐藏层的前馈网络来计算attention的分布:其中学习到v_a和W_a的attention参数,[*;*]代表级联。类似地,我们也可以使用矩阵W_1和W_2分别学习h_i和s_j的单独变换,可以表示为:Multiplicativeattention(Luongetal.,2015)[16]通过计算以下函数简化了注意力操作:additiveattention和multiplicativeattention在复杂性上相似,但是multiplicativeattention在实践中往往更快,更节省内存,因为它可以更有效地使用矩阵运算来完成。两种变体在低维d_h解码器状态下的表现相似,但附加注意机制在更高维度上表现更好。缓解这种情况的一种方法是将f_att(h_i,s_j)缩放为d_h^(-1/2)的一个因子(Vaswani等人,2017年)[17]。注意力机制不仅可以用来处理编码器或前面的隐藏层,还可以用来获取其他特征的分布,比如阅读理解任务中作为文本的wordembeddings(Kadlecetal.,2017)[37]。然而,注意力机制并不直接适用于分类任务,因为这些任务不需要额外的信息,如情感分析。在这些模型中,我们通常使用LSTM的最终隐藏状态或像最大池化和平均池化这样的累积函数来表示句子。自注意力机制(Self-attention)通常不使用其他附加信息,但它可以利用自注意力来关注自身并从句子中提取相关信息(Linetal.,2017)[18]。Self-attention,也称为内部注意力,在阅读理解(Chengetal.,2016)[38]、文本继承(textualentailment/Parikhetal.,2016)[39]等许多任务中都有出色的表现,自动文本摘要(Paulus等人,2017年)[40]。我们可以通过计算每个隐藏状态h_i的非归一化分配来简化附加注意力:在矩阵形式中,对于隐藏状态H=h_1,...,h_n,我们可以计算注意力向量a和最后的句子表示c:我们不能只提取一个向量,还通过用v_a代替V_a矩阵来执行一些其他的注意力特征,这允许我们提取注意力矩阵A:在实践中,我们可以执行以下积极的惩罚计算冗余并鼓励注意力向量的多样性Frobenius范数的平方形式:Vaswani等人。(2017)也使用了类似的多头注意力。最后,key-valueattention(Daniluketal.,2017)[19]是最近的一种注意力变体机制,它将形式与功能分开,从而为注意力计算维护单独的向量。它还在各种文本建模任务中发挥着重要作用(Liu&Lapata,2017)[41]。具体来说,key-valueattention将每个隐藏向量h_i分成一个key-valuek_i和一个向量v_i:[k_i;v_i]=h_i。Key-value使用additiveattention来计算attentiondistributiona_i:其中L是attentionwindow的长度,I是一个向量,所有单位都是1。那么环境表示c_i可以通过attentiondistribution值得到:环境向量c_i将结合当前状态值v_i进行预测。优化优化算法和场景通常是模型的一部分,通常被视为黑盒操作。有时算法的微小变化,例如减小Adam算法中超参数β2的值(Dozat&Manning,2017)[50]会导致优化行为发生较大变化。Adam方法(Kingma&Ba,2015)[21]是使用最广泛和最常见的优化算法,也经常被NLP研究人员用作优化器。Adam方法明显优于vanilla随机梯度下降法,收敛速度也非常快。然而,最近的研究表明,具有微调和动量的梯度下降法优于Adam方法(Zhang等人,2017)[42]。作为一种优化方案,我们可以使用Adam方法精确地执行SGD式退火,因为它们自适应地调整每个参数的学习率(Ruder,2016)[22]。具体来说,我们可以通过重启来进行学习率退火:即设置一个学习率,对模型进行训练,直到模型收敛。然后我们可以平分学习率并通过加载之前最好的模型重新开始优化过程。在Adam中,这会导致优化器忘记预训练参数的学习率并重新开始。Denkowski&Neubig(2017)[23]表明,具有两次重启和学习率退火的Adam算法优于具有退火的SGD算法。集成方法通过平均多个模型的预测将多个模型组合成一个集成模型已被证明是提高模型性能的有效策略。尽管在测试时使用集成进行预测非常昂贵,但最近在提取方面取得的一些进展使我们能够将昂贵的集成压缩成更小的模型(Hinton等人,2015年;Kuncoro等人,2016年;Kim和Rush,2016年)[24、25,26]。如果评估模型的多样性增加,集成是确保可靠结果的重要方法(Denkowski&Neubig,2017)。尽管集成模型的不同检查点已被证明是有效的(Jean等人,2015年;Sennrich等人,2016年)[51、52],但这种方法牺牲了模型的多样性。循环学习率有助于减轻这种影响(Huang等人,2017年)[53]。但是,如果资源可用,我们更愿意集成多个独立训练的模型以最大化模型多样性。超参数优化我们可以简单地调整模型超参数以显着提高基线,而不是仅仅使用预定义或现有超参数训练模型。贝叶斯优化的最新进展可用于优化神经网络黑盒训练中的超参数(Snoek等人,2012年)[56],这比广泛使用的网格搜索更有效。LSTM的自动超参数调整在语言建模方面取得了最先进的性能,远远优于其他更复杂的模型(Melis等人,2017年)。LSTM学习初始状态的技巧:我们通常将LSTM状态初始化为零向量。但是我们可以将初始状态作为参数进行优化,而不是人为地调整它来提高性能。Hinton强烈推荐这种方法。有关此技巧的TensorFlow实现,请参阅:https://r2rt.com/non-zero-initial-states-for-recurrent-neural-networks.html尝试输入和输出嵌入:在LSTM中拟合输入和输出嵌入案例其中模型占参数数量的绝大部分。如果LSTM预测语言建模中的词汇,则可以共享输入和输出参数(Inan等人,2016年;Press&Wolf,2017年)[54、55]。这种技术在不允许学习大参数的小数据集中很有用。梯度范数裁剪:降低梯度消失风险的一种方法是裁剪它们的最大值(Mikolov,2012)[57]。但这并没有持续提高性能(Reimers&Gurevych,2017)。截断梯度的全局范数(Pascanu等人,2013年)不是独立截断每个梯度,而是导致更显着的改进(这里是Tensorflow实现:https://stackoverflow.com/questions/36498127/how-to-在张量流中有效应用梯度裁剪)。向下投影:为了进一步减少输出参数的数量,可以将LSTM的隐藏状态投影到更小的尺寸。这对于具有大量输出的任务特别有用,例如语言建模(Melis等人,2017)。特定任务的最佳实践接下来,我们将描述特定任务的最佳实践。大多数模型在特定类型的单一任务上表现良好,部分模型可以应用于其他任务,但在应用前需要对其性能进行验证。我们还将讨论以下任务:分类、序列标记、自然语言生成(NLG)以及NLG的特例神经机器翻译。分类由于更高效的卷积运算,近来CNN的应用范围不断扩大,成为NLP中处理分类任务的通用方法。以下最佳实践与CNN相关,可选择多个最优超参数。CNN过滤器:使过滤器尺寸接近最佳过滤器尺寸,例如(3,4,5)表现最佳(Kim,2014;Kimetal.,2016)。特征图的最佳数量范围为50~600(Zhang&Wallace,2015)[59]。聚合函数:1-maxpooling优于averagepooling和k-maxpooling(Zhang&Wallace,2015)。序列标注序列标注在自然语言处理中非常常见。许多现有的最佳实践是模型架构的一部分,以下指南侧重于模型输出和预测阶段。标记方案:对于将标记分配给文本分隔的任务,可以采用不同的标记方案。例如:BIO,separation的第一个symbol用B-tag标注,其他symbol用I-tag标注,separation以外的symbol用O-tag标注;IOB和BIO类似,不同的是如果前面的符号属于同一个Classes,但不属于同一个division,用B-tag来标记;IOBES,也需要在单个符号实体处标注S-tag,在每个分区的最后一个符号处标注E-tag。IOBES和BIO的性能相似。Conditionalrandomfieldoutputlayer(CRFoutputlayer):如果输出之间存在依赖关系,比如在命名实体识别(namedentityrecognition)中,最后的softmax层可以用linear-chainconditionalrandomfield代替。这种方法已被证明可以持续改进需要建模约束的任务(Huang等人,2015年;Max&Hovy,2016年;Lample等人,2016年)[60、61、62]。约束解码:除了条件随机场输出层外,约束解码还可用于排除错序,即不产生有效的BIO转换(He等人,2017)。约束解码的优点是可以强制执行任意约束,例如特定于任务的约束或语法约束。自然语言生成大多数现有的最佳实践都可用于自然语言生成(NLG)。事实上,今天出现的许多技术都植根于语言建模的进步,这是典型的NLP任务。建模覆盖率:重复是NLG任务的主要挑战,因为当前的模型不能很好地记住它们已经产生的输出。直接在模型中设置建模覆盖率可以很好地解决这个问题。如果事先知道哪些实体应该出现在输出中(如食谱中的调味料),则需要使用清单(Kiddon等人,2016年)[63]。如果使用注意力,我们可以跟踪覆盖向量c_i,它是过去时间步长的注意力分布a_t的总和(Tuetal.,2016;Seeetal.,2017)[64,65]:向量可以捕获我们对源语言中所有单词的注意力。我们现在可以在覆盖向量上设置附加注意力以鼓励模型不要重复关注相同的词:此外,我们可以添加一个辅助损失来捕获我们想要关注的特定任务注意行为:我们希望神经机器翻译可以实现一对一对齐;如果最终的覆盖向量大于或小于每个索引上的覆盖向量,则该模型将被罚分(Tuetal.,2016)。总之,如果模型重复处理相同的位置,我们会对模型进行惩罚(参见etal.,2017)。神经机器翻译虽然神经机器翻译只是NLG的一个分支,但NMT已经获得了很多关注,并且有许多专门为此任务开发的方法。同样,许多最佳实践或超参数选择只能应用于NMT领域。嵌入维度:2048维嵌入表现最好,但很少这样做。128维嵌入的性能出奇地好,几乎比以前快2倍(Britz等人,2017年)。编码器和解码器深度:编码器的深度不需要超过2?4层。深度模型优于浅层模型,但解码器不需要超过4层(Britz等人,2017年)。方向性:双向编码器的性能略好于单向编码器。Sutskever等人。(2014)[_67_]提议颠倒源语言的顺序以减少长期依赖的数量。使用单向编码器反转源语言顺序优于未反转的词序(Britz等人,2017)。波束搜索策略:长度归一化惩罚为1.0的中型波束,大小为10(Wu等人,2016年)表现最佳(Britz等人,2017年)。分词翻译:Senrichetal.(2016)[66]提出基于字节对编码(BPE)将词分成子词。BPE迭代地合并高频符号对,最后将高频的n-gram合并为单个符号,从而有效地去除词汇表外的单词。该技术最初用于处理稀有词,但子词单元的模型性能超过了整个词系统,32000个子词单元是最有效的词数(Denkowski&Neubig,2017)。结论我确信此列表中一定缺少最佳实践。同样,还有很多我不熟悉的任务,比如解析,信息抽取,我无法做推荐。我希望本文对开始学习新的NLP任务有所帮助。即使您熟悉这里列出的大部分内容,我也希望您能学到一些新东西或掌握一个有用的技巧。
