一瓶Tezgüino在桌子上。Tezgüino让你喝醉了''。换句话说,即使你不知道tezgüino的含义,它的上下文背景也澄清了它的含义。


当文字嵌入在大约十年前出现时,他们永远改变了自然语言处理(NLP)。正如Ronan Colobert等人,在2008年使NLP"几乎从头开始"重新开发。几年后,2013年,随着发布的word2vec库,它们很快成为矢量化文本数据的主要方法。
已经基于传统方法(如LSI和TF-IDF)进行了充分研究的NLP模型正在针对单词嵌入进行测试,并且在大多数情况下,单词嵌入排在首位。从那以后开发了许多嵌入方法。此外,主要的深度学习(DL)软件包包含一个嵌入层,可以学习特定于任务的嵌入。
很少有专门比较预训练词嵌入的性能和嵌入层性能的文章。然而,这是我们开始实施新深度学习模型时首先要问自己的问题之一。
为了回答这个问题,我们进行了几个实验,以便比较预训练的单词嵌入和嵌入层对DL模型在两个语义任务(即情感分析和问题分类)上表现的影响。但首先,让我们回顾一下嵌入词的基本思想,并简要介绍一下它们的历史。
由上下文判断一句话
单词嵌入比传统的单词向量更好地工作,这是基于20世纪50年代设计的语言学中丰富的理论。该理论通过查看其上下文来定义单词的语义。
"你可以通过上下文来知晓一个词。"  - 弗斯(John R. Firth,英国语言学家,20世纪语言学的主导人物)
用Tezgüino这个词来举例说明这个概念,这是一个罕见的专有名词,对许多人来说并不熟悉。然而,一旦我们在上下文中看到它就变得容易推断:"一瓶Tezgüino在桌子上。Tezgüino让你喝醉了''。换句话说,即使你不知道tezgüino的含义,它的背景也澄清了它的含义。
Word嵌入简史
传统上,提出了许多基于统计和规则的模型,试图模拟分布语义。主要地,为语料库中出现的所有单词创建并发矩阵,然后使用诸如LSA的方法将该矩阵投影到更小的空间中。传统模型的详细讨论超出了本文的范围,但是,它可以为单词和短语的语义以及无监督单词向量的基本概念提供有价值的见解。
直到2003年,研究了学习半监督词嵌入的想法。在他们的工作中,作者提出了一个神经网络,学习单词序列的概率函数(语言模型的主要目标),同时学习每个单词的分布表示。它们将输入的权重作为单词嵌入引入神经网络的隐藏层。
然而,他们的模型在计算上非常耗时并且不实用,主要是由于Softmax输出层。
该模型的目标是学习一个函数,该函数在给定观察到的单词序列的情况下预测的条件概率分布:


网络架构如下所示:

用于学习单词表示的体系结构


其中C(i)是词汇表第i个单词的表示。输出层计算每个单词的整个词汇表的条件概率分布, - 导致模型不切实际:


其中N是Softmax层之前的网络。解决了该模型的计算复杂性问题提出了一个使用不同目标函数的卷积神经网络。他们主要关心的不是语言建模,而是学习好的嵌入词。因此,他们有更多自由来实现这一目标。他们受益于学习表示的单词之前和之后的上下文。
尽管该模型产生了包含语义和句法信息的(第一个)无监督词嵌入,但它仍然是计算上昂贵的。由于之前模型的高计算成本,直到2013年才展示他们简单而有效的模型,并推广词嵌入,开始渗透NLP。
他们提出了两种计算字嵌入的架构:连续词袋(CBOW)和Skip-gram(SG)模型。上下文(w_ {i-2},w_ {i-1},w_ {i + 1},w_ {i + 2})用于预测目标词(w_i)的CBOW模型如下所示数字:

CBOW词嵌入模型的体系结构


另一方面,SG模型试图从给定的单词预测上下文。如上所述,CBOW模型与先前的工作相比,具有更简单的架构,这导致该模型的低计算成本。
word2vec的实现促进了NLP中不同区域的词嵌入的广泛实验。结果表明:使用单词嵌入的实验导致了大多数NLP任务的改进。在过去几年中,提出了许多其他嵌入方法,如GloVe,ELMO,以及许多其他模型。
那么,是使用嵌入层,还是预先训练词嵌入?
今天,我们可以通过fastText等高效工具立即创建特定于语料库的单词嵌入。我们还可以在我们的网络中使用嵌入层来针对手头的问题训练嵌入。
然而,每当我必须为特定的NLP任务构建新模型时,首先想到的问题之一是我是否应该使用预先训练的词嵌入或嵌入层。
虽然类似于人工智能中的大多数问题,但对于在每种情况下都有效的问题,可能没有普遍正确的答案,在这里,我尝试凭经验回答这个问题。
本文研究了两个受到词嵌入影响的两个语义NLP任务,即情感分析和问题分类,并提供预训练的字嵌入和嵌入层之间的比较。
模型架构
我创建了一个带有两个卷积层的CNN,并在以下实验中使用了这种架构。对于预先训练的嵌入实验,我用预先训练的嵌入替换该层的参数,维护索引并冻结该层,防止在梯度下降过程中更新它。
class CNN(nn.Module):
def __init __(self,one_hot_dim,embedding_dim,output_dim,kernel_size,stride_size):
super(CNN,self).__ init __() #仅适用于具有嵌入层的模型
self.embedding = nn.Embedding (one_hot_dim,embedding_dim)
self.maxpool1 = nn.MaxPool1d(kernel_size = kernel_size,stride = stride_size,padding = 1)
self.conv1 = nn.Conv1d(embedding_dim,out_channels = embedding_dim,kernel_size = kernel_size,stride = stride_size,padding = 1 )
self.relu1 = nn.ReLU()
self.maxpool2 = nn.MaxPool1d(kernel_size = kernel_size,stride = stride_size,padding = 1)
self.conv2 = nn.Conv1d(embedding_dim,out_channels = embedding_dim,kernel_size = kernel_size,stride = stride_size,padding = 1)
self.relu2 = nn.ReLU()
self.fc1 = nn.Linear(in_features = size_after_conv,out_features = output_dim )
def forward(self,x): #仅适用于具有嵌入层的模型
x = self.embedding(x)
x = x.transpose(0,1).transpose(1,2)
x = self.conv1(x )
x = self.relu1(x)
x = self.maxpool1(x)
x = self.conv2(x)
x = self.relu2(x)
x = self.maxpool2(x)
x = x.reshape(x.size (0),-1)
x = self.fc1(x)
return x
超参数
为了能够仅控制嵌入类型,我修复了以下超参数并使用完全相同的超参数进行实验:
embedding length = 300
kernel size (Conv Layer 1 and 2) = 3
stride size (Conv Layer 1 and 2) = 2
fixed sequence length for sentiment analysis (IMDB data) = 500
fixed sequence length for question classification (TREC data) = 25
数据
情感分析:IMDB数据集
问题分类:TREC数据集
预先训练的矢量
1. GloVe (glove.42B.300d):在42B共同爬行语料库上训练的300维向量
2. fastText WIKI (wiki-news-300d-1M):在16B维基百科2017转储上训练的300维向量
评估
用(i)训练损失,(ii)混淆矩阵,(iii)精确度(宏观平均值),召回(宏观平均值)和不同类型嵌入的F1得分来评估。
任务1:情绪分析
情感分析(也称为极性检测和意见挖掘)意味着识别给定文本的情绪。情绪通常由正面,负面和中性标签量化。我正在试验来自torchtext.datasets的IMDB数据集,其中情绪用0和1表示。不同模型的训练损失和混淆矩阵的结果如下图所示。
嵌入图层


具有嵌入层的模型的混淆矩阵和训练损失


预先训练的Word嵌入


具有预训练IMDB向量的模型的混淆矩阵和训练损失




具有预训练Glove词量的混淆矩阵和训练损失




具有预训练WIKI向量的模型的混淆矩阵和训练损失


如上所述,与基于嵌入层的模型相比,对于所有三个预训练的基于嵌入的模型,训练损失衰减得更快。此外,对于1类,预训练的基于嵌入的模型的精度始终较高。整体精度和召回以及F1得分如下表所示。如图所示,预先训练的基于嵌入的模型始终优于基于嵌入层的模型,尽管边缘很小。
| Model | Precision (Macro) | Recall(Macro) | F1 ||------------------|-------------------|---------------|-------|| Embedding Layer | 85.6% | 85.8% | 85.6% ||------------------|-------------------|---------------|-------|| IMDB vectors | 86.1% | 86.1% | 86.1% || Glove 4B vectors | 86.4% | 86.4% | 86.4% || FT WIKI vectors | 86.0% | 86.0 % | 86.0% |
任务2:问题分类
问题分类是为问题分配语义类标签的任务,以便更容易找到该问题的答案。我使用了来自torchtext.datasets的TREC数据集,其中包含来自6个TREC类的问题,即缩写,实体,描述,位置和数值。
下图说明了不同模型的训练损失,以及混淆矩阵的测试集性能:
嵌入图层


具有嵌入层的模型的混淆矩阵和训练损失


预先训练的Word嵌入


具有预训练TREC向量的模型的混淆矩阵和训练损失




具有预训练Glove矢量的模型的混淆矩阵和训练损失




具有预训练WIKI向量的模型的混淆矩阵和训练损失


基于嵌入层的模型和预先训练的基于嵌入的模型的训练损失相对快速地衰减并且没有很多波动。训练损失之间没有相当大的差异。另一方面,除了在TREC问题数据集上训练的嵌入之外,所有预训练嵌入模型的整体精度,召回率和F1得分都有所提高。
这是预期的,因为TREC是一个具有短问题的小数据集,因此,在该数据集上训练的矢量可能不会带有太多的语义信息。对于其他预先训练的基于嵌入的模型,即Glove 4B和fastText WIKI,几个类别的性能大大提高。例如,参见ABBR,其中正确分类的实例的百分比从82%增加到92-93%。或者LOC,正确分类的实例的百分比从84%增加到90-96%。不同模型的整体精度,召回率和F1分数如下表所示。
| Model | Precision (Macro) | Recall(Macro) | F1 ||------------------|-------------------|---------------|-------|| Embedding Layer | 87.2% | 83.2% | 84.8%86.1%82.4%83.8%88.0%86.7%86.7%87.0%87.3%87.0% ||------------------|-------------------|---------------|-------|| TREC vectors | | | || Glove 4B vectors | | | || FT WIKI vectors | | | |
解释
观察IMDB情感分析任务的结果,似乎预训练的单词嵌入可以带来更快的训练和更低的最终训练损失。可以解释为,模型可以从预训练的嵌入中获取比通过嵌入层从训练数据获得的更多语义信号。
我们从TREC问题分类任务的结果中看出,在 小型语料库上训练的向量将具有比嵌入层更差的性能。然而,在大的语料库上训练的矢量在精确度和召回率方面以相当大的余量击败了嵌入层。
始终如一 为这两项任务, 当我们使用预先训练字的嵌入(培训了足够大的语料库)准确率和召回改善。但是,对于情感分析任务,这种改进很小,而对于句子分类任务,这种改进要大得多。
这可能意味着,为了解决某些NLP任务,当手头的训练集足够大时(如情感分析实验中的情况),最好使用预先训练的单词嵌入。但如果它们不可用,您仍然可以使用嵌入层并期望获得可比较的结果。然而,我的训练集很小,上述实验强烈鼓励使用预训练的单词嵌入。
总结
与根据实数值直接获取的图像数据不同,因此可以通过机器学习模型直接解释,文本数据需要转换为表示,使得每个单词所承载的至少部分广泛知识可以被带入这个表示。只有到那时,我们才能期望拥有在某种程度上理解人类语言的智能模型。
学习单词的语义表示具有较长的历史,是语言学和NLP的核心研究课题。Word嵌入提供了一种表示单词的有效方式,但是,它们当前的能力在捕获每个单词所承载的语义、句法和搭配信息方面仍然有不少需要改进之处。