深度学习NLP四步公式解析

本文详细解析了自然语言处理领域的四步深度学习框架:嵌入、编码、注意和预测,包括双向RNN编码器、注意力机制的技术实现,并通过自然语言推理和文档分类案例展示其应用效果。

嵌入、编码、注意、预测:最先进NLP模型的新深度学习公式

过去六个月中,自然语言处理领域形成了一种强大的神经网络新方法。该新方法可概括为一个简单的四步公式:嵌入、编码、注意、预测。本文解释了这种新方法的组成部分,并展示它们如何在两个近期系统中组合使用。

更新(2018年1月):某工具v2.0现在具备基于本文所述架构的深度学习模型,用于命名实体识别、依存解析、文本分类和相似性预测。现在还可以使用某标注工具为这些模型创建训练和评估数据。

当人们思考机器学习改进时,通常考虑效率和准确性,但最重要的维度是泛化性。若需要编写程序标记社交媒体平台上的滥用帖子,应能将问题泛化为“需要接收文本并预测类别ID”。无论是标记滥用帖子还是标记提议会议的电子邮件,若两个问题具有相同类型的输入并产生相同类型的输出,应能重用相同的模型代码,并通过插入不同数据获得不同行为。

实现示例:已使用某NLP库和某深度学习框架实现了用于自然语言推理的可分解注意力模型。

假设有一种出色的技术,可以从实值密集向量预测类别ID。若确信可以解决具有该特定输入/输出“形状”的任何问题。另外,还有一种出色的技术,可以从向量和矩阵预测单个向量。现在有了三个问题的解决方案,而不是两个。若从矩阵和向量开始,并需要类别ID,显然可以组合这两种技术。大多数NLP问题可以简化为以一个或多个文本作为输入的机器学习问题。若能将文本转换为向量,就可以重用通用的深度学习解决方案。以下是具体方法。

文本深度学习的四步策略

嵌入词表示(也称为“词向量”)现在是使用最广泛的自然语言处理技术之一。词嵌入允许将单个词视为相关的意义单元,而不是完全不同的ID。然而,大多数NLP问题需要理解较长的文本片段,而不仅仅是单个词。现在有一种简单灵活的解决方案,在广泛的问题上实现了优异的性能。将文本嵌入到向量序列后,使用双向RNN将向量编码为句子矩阵。该矩阵的行可以理解为词元向量——它们对词元的句子上下文敏感。最后的拼图称为注意力机制。这允许将句子矩阵缩减为句子向量,以便进行预测。以下是其工作原理。

步骤1:嵌入

嵌入表将长、稀疏、二进制向量映射为短、密集、连续的向量。例如,假设文本作为ASCII字符序列接收。有256个可能的值,因此可以将每个值表示为256维的二进制向量。值a将是一个0的向量,在第97列有一个1,而值b将是一个0的向量,在第98列有一个1。这称为“one hot”编码方案。

大多数神经网络模型首先将文本分词为单词,并将单词嵌入为向量。其他模型使用其他信息扩展词向量表示。例如,除了词ID之外,传递词性标签序列通常很有用。然后可以学习标签嵌入,并将标签嵌入连接到词嵌入。这允许将一些位置敏感信息推入词表示中。然而,有一种更强大的方法可以使词表示具有上下文特异性。

步骤2:编码

给定词向量序列,编码步骤计算一种表示,称为句子矩阵,其中每行表示每个词元在句子其余部分上下文中的含义。

用于此目的的技术是双向RNN。LSTM和GRU架构都被证明对此很有效。每个词元的向量分两部分计算:一部分通过前向传递,另一部分通过后向传递。为了获得完整向量,只需将两部分连接起来。以下是计算内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def encode(fwd_rnn, bwd_rnn, word_vectors):
    fwd_out = ndarray((len(word_vectors), fwd_rnn.nr_hidden), dtype='float32')
    bwd_out = ndarray((len(word_vectors), bwd_rnn.nr_hidden), dtype='float32')
    fwd_state = fwd_rnn.initial_state()
    bwd_state = bwd_rnn.initial_state()
    for i in range(len(word_vectors)):
        fwd_state = fwd_rnn(word_vectors[i], fwd_state)
        bwd_state = bwd_rnn(word_vectors[-(i+1)], bwd_state)
        fwd_out[i] = fwd_state
        bwd_out[-(i+1)] = bwd_state
    return concatenate([fwd_state, bwd_state])

双向RNN将随着时间变得显而易见。然而,RNN最直接的应用是读取文本并从中预测某些内容。这里做的是计算中间表示——特别是每个词元的特征。关键的是,返回的表示代表上下文中的词元。可以学习“pick up”与“pick on”具有不同的含义,即使将两个短语处理为单独的词元。这一直是NLP模型的一个巨大弱点。现在有了解决方案。

步骤3:注意

注意步骤将编码步骤产生的矩阵表示缩减为单个向量,以便可以传递给标准的前馈网络进行预测。注意力机制相对于其他缩减操作的特征优势在于,它接收辅助上下文向量作为输入:

通过将矩阵缩减为向量,必然会丢失信息。这就是为什么上下文向量至关重要:它告诉要丢弃哪些信息,以便“摘要”向量适合消费它的网络。最近的研究表明,注意力机制是一种灵活的技术,其新变体可用于创建优雅而强大的解决方案。

例如,某研究引入了一种注意力机制,接收两个句子矩阵并输出单个向量。

另一研究引入了一种注意力机制,接收单个矩阵并输出单个向量。不是从输入的某些方面派生的上下文向量,“摘要”是参考作为模型参数学习的上下文向量计算的。这使得注意力机制成为一种纯粹的缩减操作,可以替代任何求和或平均池化步骤。

步骤4:预测

一旦文本或文本对缩减为单个向量,就可以学习目标表示——类别标签、实值、向量等。也可以通过使用网络作为状态机(例如基于转换的解析器)的控制器来进行结构化预测。

有趣的是,大多数NLP模型通常偏爱相当浅的前馈网络。这意味着计算机视觉的一些最重要近期技术,如残差连接和批量归一化,迄今为止在NLP社区中的影响相对较小。

示例1:用于自然语言推理的可分解注意力模型

关于SNLI语料库:SNLI语料库中的陈述是作为某图像语料库一部分收集的众包标题。换句话说,被标记为蕴含的句子是由众包工作者输入的。这使得数据相当人工化,因此任务的绝对准确性很少表明这些技术的“准备就绪”程度。听到最先进的技术达到88%时,既不应印象深刻也不应失望。重要的是标准的词袋技术表现差得多。

自然语言推理是预测一对句子类别标签的问题,其中类别代表它们之间的逻辑关系。某自然语言推理语料库使用三个类别标签:

  • 蕴含:若第一个句子为真,则第二个句子必须为真。
  • 矛盾:若第一个句子为真,则第二个句子必须为假。
  • 中性:既非蕴含也非矛盾。

某研究提供了来自语料库的以下示例:

文本 假设 标签
一名男子检查某个东亚国家人物的制服。 男子正在睡觉 矛盾
一名年长和一名年轻男子微笑。 两名男子微笑并嘲笑在地板上玩耍的猫。 中性
一辆黑色赛车在人群前启动。 一名男子正在一条孤独的道路上驾驶。 矛盾
一场有多名男子参与的足球比赛。 一些男子正在进行一项运动。 蕴含

语料库的动机之一是为开发将句子编码为向量的模型提供一个新的、合理大小的语料库。例如,某研究描述了一种有趣的基于转换的模型,该模型顺序读取句子以构建树形结构的内部表示。

某研究能够达到83.2%的准确率,较之前工作有显著改进。不到六个月后,某研究提出了一个模型,达到86.8%的准确率,参数量约为某研究的10%。不久后,某研究发布了一个系统,表现更好——88.3%。最初阅读某研究的论文时,无法理解他们的模型如何表现如此出色。答案在于模型使用其新颖的注意力机制混合两个句子矩阵的方式:

关键优势是句子到向量的缩减是联合操作句子的,而某研究将句子独立编码为向量。记住某原则:

当解决感兴趣的问题时,不要将更一般的问题作为中间步骤解决。 — 某学者

某研究将自然语言推理任务视为感兴趣的问题。他们构建问题以直接解决它,因此比单独编码句子的模型具有巨大优势。某研究对一般问题更感兴趣,并相应地构建模型。因此,他们的模型在某研究模型不适用的情境中很有用。例如,使用某研究的模型,可以缓存句子向量,使得计算相似性矩阵效率高得多。

示例2:用于文档分类的分层注意力网络

文档分类是曾经从事的第一个NLP应用。某机构资助了一个项目,爬取某国网站并自动检测金融诈骗。虽然项目有点超前,但文档分类在接下来的十年中变化 surprisingly little。这就是为什么觉得某研究最近发布的分层注意力网络模型如此令人兴奋。这是看到的第一篇论文,提供了对旧词袋模型的真正 compelling 一般改进。以下是其工作原理。

模型接收文档作为输入,文档由句子序列组成,每个句子由词ID序列组成。每个句子的每个词分别嵌入,产生两个词向量序列,每个句子一个。然后将序列分别编码为两个句子矩阵。然后注意力机制分别将句子矩阵缩减为句子向量,然后编码以产生文档矩阵。最后的注意步骤将文档矩阵缩减为文档向量,然后通过最终预测网络传递以分配类别标签。

该模型使用注意力机制作为纯粹的缩减步骤:学习将矩阵作为输入,并将其摘要为向量。它通过学习两个注意力转换的上下文向量来实现这一点,这些向量可以理解为模型认为理想相关的词或句子。或者,可以将整个缩减步骤视为特征提取过程。在这种观点下,上下文向量只是另一个不透明参数。

作者 方法 Yelp ‘13 Yelp ‘14 Yelp ‘15 IMDB
某研究 HN-ATT 68.2 70.5 71.0 49.4
某研究 HN-AVE 67.0 69.3 69.9 47.8
某研究 段落向量 57.7 59.2 60.5 34.1
某研究 SVM+Bigrams 57.6 61.6 62.4 40.9
某研究 SVM+Unigrams 58.9 60.0 61.1 39.9
某研究 CNN-word 59.7 61.0 61.5 37.6

可以在某研究模型和卷积神经网络(CNN)之间进行有趣的比较。两种模型都能够自动提取位置敏感特征。然而,CNN模型既不太通用也不太高效。使用双向RNN,每个句子只需要读取两次——一次向前,一次向后。LSTM编码还可以提取任意长度的特征,因为句子上下文的任何方面都可能混合到词元的向量表示中。将句子矩阵缩减为向量的过程也简单高效。为了构建文档向量,只需再次应用相同的过程。

驱动模型准确性的主要因素是双向LSTM编码器,用于创建位置敏感特征。作者通过将注意力机制替换为平均池化来证明这一点。使用平均池化,模型仍然在所有基准测试中优于之前的最先进技术。然而,注意力机制在所有评估中进一步提高了性能。觉得这特别有趣。含义相当普遍——毕竟在很多情况下,希望将矩阵缩减为向量以进行进一步预测,而不参考任何特定的外部上下文。

后续步骤

已实现了蕴含模型以与NLP库某工具一起使用,并正在实现文本分类系统。还计划提供一个通用的双向LSTM模型以与某工具一起使用,以便轻松在问题上使用预训练的词元向量。

更新(2018年1月):某工具v2.0现在具备基于本文所述架构的深度学习模型,用于命名实体识别、依存解析、文本分类和相似性预测。现在还可以使用某标注工具为这些模型创建训练和评估数据。

参考文献

  • 某研究(2016)自然语言推理的可分解注意力模型
  • 某研究(2016)增强和组合顺序和树LSTM用于自然语言推理
  • 某研究(2016)文档分类的分层注意力网络
  • 某研究(2016)解析和句子理解的快速统一模型
  • 某研究(2015)学习自然语言推理的大型标注语料库
  • 某研究(2015)通过区域嵌入进行文本分类的半监督卷积神经网络

关于作者:某专家是AI技术的领先专家。他于2009年完成博士学位,并花了5年时间发表关于最先进NLP系统的研究。他于2014年离开学术界,编写某工具并创立某公司。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计