自然语言处理中的深度学习技术:从词嵌入到LSTM
自然语言处理中的深度学习技术:从词嵌入到LSTM
自然语言处理(NLP)是人工智能领域的重要分支,它让机器能够理解、解释和生成人类语言。近年来,深度学习技术在NLP领域的突破性进展,使得机器翻译、情感分析、问答系统等应用取得了显著成效。本文将深入探讨深度学习在NLP中的核心技术,包括字词嵌入、循环神经网络(RNN)及其改进型长短期记忆(LSTM),帮助读者理解这些技术如何让机器更好地理解人类语言。
了解用于自然语言处理 (NLP) 的深度学习技术
统计技术在文本分类等自然语言处理(NLP) 任务中表现相对较好。 对于翻译等任务,仍有很大的改进空间。
最近,深度学习技术推动了自然语言处理(NLP) 领域在翻译等任务方面的发展。
当你要翻译文本时,不应只将每个字词翻译为另一种语言。 你可能还记得多年前的翻译服务,它们翻译的句子过于直白,常常导致有趣的结果。 相反,你希望语言模型能够理解文本的含义(或语义),并使用该信息在目标语言中创建语法正确的句子。
了解字词嵌入
将深度学习技术应用于 NLP 时引入的一个关键概念是字词嵌入。 字词嵌入解决了无法定义字词之间的语义关系的问题。
在字词嵌入之前,NLP 的一个普遍挑战是检测字词之间的语义关系。 字词嵌入会表示矢量空间中的字词,以便可以轻松描述和计算字词之间的关系。
字词嵌入是在自我监督学习期间创建的。 在训练过程中,模型会分析句子中字词的共现模式,并学习将它们表示为矢量。 矢量可在多维空间中用坐标表示字词。 然后,可以通过确定相对矢量之间的距离来计算字词之间的距离,并描述字词之间的语义关系。
假设你要使用大量文本数据集训练一个模型。 在训练过程中,该模型发现字词“
bike
”和“
car
”通常用于相同的字词模式中。 除了在相同的文本中发现“
bike
”和“
car
”之外,你还可以发现它们都用于描述类似的事物。 例如,有人可能会驾驶“
bike
”或“
car
”,或者在商店购买“
bike
”或“
car
”。
模型了解到,这两个字词通常位于类似的上下文中,于是它会在矢量空间中将
bike
和
car
的字词向量绘制得靠近彼此。
假设我们有一个三维矢量空间,其中每个维度对应一个语义特征。 在本例中,假设维度表示车辆类型、运输方式、活动等因素。 然后,我们可以根据字词的语义关系将假设的矢量分配给字词:
2.
Boat
[2, 1, 4] 靠近“
drive
”和“
shop
”,表示你可以驾驶船只和游览水域附近的商店。
4.
Car
[7, 5, 1] 离“
bike
”比“
boat
”更近,因为汽车和自行车都用于陆地而不是水上。
6.
Bike
[6, 8, 0] 在活动维度中更靠近“
drive
”,在车辆类型维度中靠近“
car
”。
8.
Drive
[8, 4, 3] 靠近“
boat
”、“
car
”、“
bike
”,但远离“
shop
”,因为它描述的是不同类型的活动。
10.
Shop
[1, 3, 5] 离“
bike
”最近,因为这些字词最常一起使用。
注意
在本示例中,三维平面用于通过简单的术语来描述字词嵌入和矢量空格。 矢量空间通常是多维平面,用矢量表示该空间中的位置,类似于二维平面中的坐标。
尽管字词嵌入是检测字词之间的语义关系的一种很好的方法,但它仍然存在问题。 例如,具有不同意向的字词(如
love
和
hate
)通常会显示为相关,因为它们用于类似的上下文中。 另一个问题是,模型对每个字词只使用一个条目,导致具有不同含义的字词(例如
bank
)会在语义上与大量字词相关。
将记忆添加到 NLP 模型
理解文本不仅仅是理解单独呈现的单个字词。 字词的含义可能有所不同,具体取决于它们所处的上下文。 换句话说,字词周围的句子会影响字词的含义。
使用 RNN 包含字词的上下文
在深度学习之前,包含字词的上下文是一项过于复杂且成本高昂的任务。 在包含上下文方面的第一个突破是循环神经网络(RNN)。
RNN 由多个连续步骤组成。 每个步骤可接受一个输入和一个隐藏状态。 假设每个步骤中的输入是一个新字词。 每个步骤还会生成一个输出。 隐藏状态可用作网络的记忆,用于存储上一步的输出并将其作为输入传递给下一步。
假设有一个句子是这样的:
Vincent Van Gogh was a painter most known for creating stunning and emotionally expressive artworks, including ...
要知道下一个词是什么,你需要记住画家的名字。 该句子需要补全,因为最后一个词是缺失的。 NLP 任务中缺失或掩盖的字词通常用
[MASK]
表示。 通过在句子中使用特殊的
[MASK]
标记,可以让语言模型知道它需要预测缺失的标记或值是什么。
简化示例句子后,可以为 RNN 提供以下输入:
Vincent was a painter known for [MASK]
RNN 将每个标记作为输入,对其进行处理,并使用该标记的记忆更新隐藏状态。 将下一个标记作为新输入进行处理时,将更新上一步中的隐藏状态。
最终,最后一个标记作为输入传递给模型,即
[MASK]
标记。 指示缺少信息,并且模型需要预测其值。 然后,RNN 会使用隐藏状态来预测出输出应类似于
Starry Night
在示例中,隐藏状态包含信息
Vincent
、
is
、
painter
、
know
。 使用 RNN 时,每个标记在隐藏状态下都同等重要,因此在预测输出时它们会得到同等的考量。
RNN 使得在解读字词相对于完整句子的含义时能够包含上下文。 但是,随着 RNN 的隐藏状态随每个标记而更新,实际的相关信息(或信号)可能会丢失。
在提供的示例中,文森特·梵高的名字在句子的开头,而掩码在末尾。 在最后一步,当掩码作为输入传递时,隐藏状态可能包含大量与预测掩码的输出无关的信息。 由于隐藏状态的大小有限,相关信息甚至可能会被删除,以便为新的和更近期的信息腾出空间。
当我们读到这句话时,我们知道只有某些字词对于预测最后一个字词是必不可少的。 但是,RNN 会包含处于隐藏状态的所有(相关和不相关的)信息。 因此,相关信息可能会在隐藏状态下成为弱信号,这意味着它可能会被忽略,因为有太多其他无关的信息在影响着模型。
通过长短期记忆改进 RNN
针对 RNN 的弱信号问题的一个解决方案是一种更新型的 RNN:长短期记忆(LSTM)。 LSTM 能够通过维护在每步中更新的隐藏状态来处理序列数据。 使用 LSTM 时,模型可以决定要记住的内容和要忘记的内容。 这样一来,可以跳过不相关或不提供重要信息的上下文,并且可以将重要信号保存更长时间。