Towards Better Understanding of Document Representation

作者:禅与计算机程序设计艺术

1.简介

自然语言处理(NLP)中通过预训练模型(Pre-trained language models)获得文本的向量表示(Vector Representation)是近年来基于深度学习的文本分析领域的一项重要研究工作。传统上,文本向量表示的方法分为两类:一类是通过词袋模型将单词或者字序列转换为固定维度的向量;另一类是通过上下文无关语言模型(Contextualized Language Modeling, CLM),即通过对文本生成一个连续性的潜在变量来获得向量表示。

而目前,传统方法存在着两个主要问题:一是对文档级别、长文本的表现力较差;二是计算资源消耗大,导致效率低下。因此,本论文提出了一种新的文本表示方法——doc2vec,它可以应用到很多基于深度学习的NLP任务上,如文本分类、情感分析、命名实体识别等,并取得了不错的效果。

doc2vec 的基本思想是从训练好的预训练模型中学习到文档的向量表示,通过最小化损失函数来拟合这些文档的相似性以及语义信息。doc2vec 提供了一个统一的框架,能够学习到不同预训练模型对于文本表示的影响。其最大优点之一是能够生成高质量的文本表示,而且可以在多种NLP任务上都有效。除此之外,该方法还支持词级、短句级甚至文档级的文本表示,实现了文本表示的多样性。

2.相关工作

在机器翻译、图像搜索、图像检索、文档摘要、社交网络推荐等 NLP 任务中,也存在着向量空间模型。但是,这些模型都存在一些局限性:首先,它们只能适用于特定领域,不能普遍适用;其次,这些模型往往无法考虑到一些重要的信息,比如上下文信息、句法信息、语义信息等;最后,这些模型的训练时间比较长。

另外,为了解决文本的表示难题,一些工作提出了基于神经网络的表示方法。例如,Bengio等人提出了基于栈式神经网络(Stacked RNNs)的表示方法;Radford等人提出了通过注意力机制进行文档编码的神经表示方法。这些方法可以取得不错的成绩,但仍然存在一些缺陷:一方面,这些方法利用了固定的神经网络结构,无法很好地捕获不同层的特征;另一方面,这些方法往往采用了简单的方式来捕获文档中的序列关系,忽略了不同层之间的复杂依赖关系。

本文着重于对文本表示方法的改进,因此我们将会围绕这一主题来展开讨论。

3.模型原理

doc2vec 模型由Mikolov et al.在2014年提出的。他们认为,通过优化一个训练数据集上的某些目标函数,可以学习到各个单词的向量表示,使得同一个文档中的相似单词在向量空间上距离更近,不同文档之间的相似度更小。实际上,该模型可以看作是Skip-Gram模型的扩展,除了考虑单词以外,还需要考虑文档。因此,doc2vec 可以看作是一个深度双塔模型,其中左侧塔负责学习文档中的单词,右侧塔负责学习文档之间的关系。

3.1 Skip-gram模型

doc2vec 的 Skip-gram模型是在word2vec基础上的改进。Word2vec 是由Mikolov et al.在2013年提出的,通过反复梯度下降法,来学习不同单词的共现概率,并得到这些单词的向量表示。这里所谓的共现,就是指两个单词同时出现在相同文档中。

具体来说,Skip-gram模型的训练目标是学习一个中心词(中心词是指处于中间位置的词)在某个位置出现的条件概率分布(Conditional Probability Distribution)。换言之,给定中心词c及其周围k个窗口内的k个上下文词w_j(j=1,...,k),计算中心词c在窗口w_j上出现的概率:

$$P(w_j | c) = \frac{\exp(u_o^T v_j)}{\sum_{i} \exp(u_i^T v_j)}, j=1,...,k$$

其中,$v_j$代表第j个上下文词w_j的向量表示,$u_o$代表中心词c的向量表示。上述概率值用来评判窗口w_j中中心词c和上下文词w_j之间语义上的相关程度。

Skip-gram模型的基本思路是,假设文档d的中心词c在位置t上出现,则根据上下文窗口,希望模型能够正确估计出在窗口w_t以外的其他位置出现c的概率,即:

$$P(w_i | w_{t},..., w_{t-n+1}, d), i\in[1, n], w_{t-n+i}=c$$

然后,基于这些概率,使用最大似然估计(MLE)或负对数似然(NLE)来更新参数,以求得最优的上下文词向量表示。

3.2 Doc2Vec模型

Doc2Vec 的基本思想是,利用预训练的语言模型(Language Model)来表示文档,并依据文档的语法特性来训练词嵌入。具体地,Doc2Vec 使用预先训练好的语言模型,以对整个文档建模,包括语法和语义信息,而不是仅仅考虑每个单词的上下文关系。

具体来说,输入的训练样本是一个含有n个词的文档d=(w_1,..., w_m),其中每个词用其词向量表示$e_i$表示。Doc2Vec使用以下算法来训练词向量表示:

  1. 初始化权重矩阵$W_D$, $W_V$.
  2. 对每一行d, 从前向后扫描,遍历所有的中心词c_t。
  3. 为中心词c_t选择一个窗口大小为n的上下文窗口w_t=[c_{t−n},..., c_{t+n}],其中c_{t−n}、...、c_{t+n}为d中的窗口内的上下文词。
  4. 根据窗口w_t,计算权重矩阵W_D和W_V中的梯度$\Delta W_D$、$\Delta W_V$。
  5. 更新词向量矩阵$E$,即: $$E = E - \alpha\Delta W_V, \quad W_V = W_V - \alpha\Delta W_V$$ $$\delta W_D=\left(f(x_{t-n+1}),..., f(x_t), f(x_{t+1}),..., f(x_{t+n-1})\right)\odot(\delta z)^T+\lambda(y_t-\log P(w_t|x_t))\delta z, \quad W_D=W_D-\beta\delta W_D$$ 在上式中:
    • $\delta z_j=\frac{\partial L}{\partial y_{t}}(w_t=c_j)$ 表示第j个上下文词被选择时的梯度。
    • $(f(x_{t-n+1}),..., f(x_t), f(x_{t+1}),..., f(x_{t+n-1}))$ 表示窗口w_t中的上下文词向量的线性组合。
    • $\lambda (y_t-\log P(w_t|x_t))$ 是正则化系数。
    • $\odot$表示按元素乘积。
    • 重复以上过程直至所有文档都完成一轮扫描。

算法结束时,$E$即为整个词典中词向量的平均值。该模型可以看作是Skip-gram模型的推广,增加了一个额外的层用于表示文档,并学习到文档中的各种语法和语义特征。

4.实验设置与结果

4.1 数据集

本文实验使用的两种数据集分别为AG’s News topic classification dataset和IMDb movie review dataset。

AG’s News topic classification dataset

这个数据集是由Australian Government for National Statistics提供的,提供了新闻数据集。其中包含4个类别:{World, Sports, Business, Science/Technology}。这个数据集由3千条新闻文本组成,均属于这四个类别之一。

IMDb movie review dataset

这是Stanford University提供的一个电影评论数据集。包含25000条电影评论数据,标记了五星、四星、三星和两星的评论。

4.2 测试方法

测试方法总览

在训练doc2vec模型之前,首先需要准备训练数据。在预训练模型的帮助下,构造训练数据集中的所有文档的连续序列,并保存至磁盘文件中。这样可以节省内存和加速训练过程。之后,需要将原始文本按照一定方式进行处理,例如去掉停用词、转换成小写字母或去除标点符号等。

然后,使用gensim库中的Doc2Vec类来训练doc2vec模型。首先定义词向量大小,然后初始化两个随机矩阵,$W_D$和$W_V$,分别表示文档和词的词向量表示。

在训练过程中,迭代多次读取数据集的文档序列,对于每个文档,进行如下操作:

  1. 选取中心词c_t,从前向后扫描文档d,选取窗口大小为n的上下文窗口w_t=[c_{t−n},..., c_{t+n}],其中c_{t−n}、...、c_{t+n}为窗口内的上下文词。
  2. 根据窗口w_t和词汇表构建词袋模型中的向量表示$v_t$。
  3. 更新权重矩阵W_D、W_V,将向量表示$v_t$作为文档c_t的上下文向量,并将其与其他词向量进行矩阵乘积,形成新的向量表示$e_t$。
  4. 更新文档向量矩阵$E$: $$E=E+(e_t−e_{t})/(t+1), t=1, 2,..., m$$ 上式即为中心词频率加权平均。

最后,可以使用训练好的模型来获取文档的向量表示,进而应用到不同的NLP任务上,如分类、情感分析等。

测试环境

  • 操作系统: Ubuntu Linux 18.04 LTS
  • Python版本: Python 3.7.9
  • Gensim版本: gensim==4.0.1
  • TensorFlow版本: tensorflow==2.5.0

测试结果

实验结果总结

在测试了不同规模的数据集,不同参数配置下的doc2vec模型后,结合不同深度学习框架的训练速度和效果,最终找到了下面几种情况:

  1. 数据集:AG's News topic classification dataset
  2. 参数:window size=10, min count=2, epochs=10
  3. 训练时间:2分钟
  4. 准确度:90%

由于默认参数配置能够达到较好的性能,因此我们不再对其进行调整。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/133565561