向量空间模型 VSM
- 向量空间模型主要用于文档的表达。
- 向量空间模型假设单词和单词之间是相互独立的,每个单词代表一个独立的语义单元。实际上该假设很难满足:
- 文档中的单词和单词之间存在一定关联性,单词和其前面几个单词、后面几个单词可能存在语义上的相关性,而向量空间模型忽略了这种上下文的作用。
- 文档中存在很多的一词多义和多词同义的现象,每个单词并不代表一个独立的语义单元。
文档-单词 矩阵
相似度
LSA
潜在语义分析latent semantic analysis:LSA
的基本假设是:如果两个词多次出现在同一篇文档中,则这两个词具有语义上的相似性。
原理
应用
性质
LSA
的本质是将矩阵 D 通过SVD
进行降维,降维主要是由于以下原因:- 原始的
文档-单词
矩阵 D 太大计算机无法处理,通过降维得到原始矩阵的一个近似。 - 原始的
文档-单词
矩阵 D 含有噪音,通过降维去掉原始矩阵的噪音。 - 原始的
文档-单词
矩阵 D 过于稀疏,通过降维得到一个稠密的矩阵。
- 原始的
LSA
的降维可以解决一部分同义词的问题,也可以解决一部分二义性的问题。- 经过降维,意义相同的同义词的维度会因降维被合并。
- 经过降维,拥有多个意义的词,其不同的含义会叠加到对应的同义词所在的维度上。
LSA
的缺点:产生的主题维度可能存在某些主题可解释性差。即:它们并不代表一个人类理解上的主题。
由于
Bag of words:BOW
模型的局限性,它无法捕捉单词的前后顺序关系。一个解决方案是:采用二元词组或者多元词组。
LSA
假设单词和文档形成联合高斯分布。实际观察发现,它们是一个联合泊松分布。这种情况下,用pLSA
模型效果会更好。
Word2Vec
CBOW 模型
CBOW
模型(continuous bag-of-word
):根据上下文来预测下一个单词。
一个单词上下文
在一个单词上下文的
CBOW
模型中:输入是前一个单词,输出是后一个单词,输入为输出的上下文。由于只有一个单词作为输入,因此称作一个单词的上下文。
一个单词上下文的
CBOW
模型如下:其中:
参数更新
多个单词上下文
Skip-Gram
Skip-Gram
模型是根据一个单词来预测其前后附近的几个单词(即:上下文)。
网络结构
参数更新
优化
分层 softmax
负采样
原理
参数更新
降采样
subword embedding
论文
《Enriching Word Vectors with Subword Information》
中,作者提出通过增加字符级信息来训练词向量。下图给出了该方法在维基百科上训练的词向量在相似度计算任务上的表现(由人工评估模型召回的结果)。
sisg-
和sisg
模型均采用了subword embedding
,区别是:对于未登录词,sisg-
采用零向量来填充,而sisg
采用character n-gram embedding
来填充。单词拆分:每个单词表示为一组
character n-gram
字符(不考虑顺序),以单词where
、n=3
为例:- 首先增加特殊的边界字符
<
(单词的左边界)和>
(单词的右边界)。 - 然后拆分出一组
character n-gram
字符:<wh, whe,her,ere,re>
。 - 最后增加单词本身:
<where>
。
为了尽可能得到多样性的
character n-gram
字符,作者抽取了所有3<= n <= 6
的character n-gram
。以单词mistake
为例:<mi,mis,ist,sta,tak,ake,ke>, // n = 3 <mis,mist,ista,stak,take,ake>, // n = 4 <mist,mista,istak,stake,take>, // n = 5 <mista,mistak,istake,stake>, // n = 6 <mistake> // 单词本身
注意:这里的
take
和<take>
不同。前者是某个character n-gram
,后者是一个单词。- 首先增加特殊的边界字符
一旦拆分出单词,则:
- 词典V 扩充为包含所有单词和
N-gram
字符。 - 网络输入包含单词本身以及该单词的所有
character n-gram
,网络输出仍然保持为单词本身。
模型采用
word2vec
,训练得到每个character n-gram embedding
。最终单词的词向量是其所有character n-gram embedding
包括其本身embedding
的和(或者均值)。如:单词
where
的词向量来自于下面embedding
之和:- 单词
<where>
本身的词向量。 - 一组
character n-gram
字符<wh, whe,her,ere,re>
的词向量。
- 词典V 扩充为包含所有单词和
利用字符级信息训练词向量有两个优势:
有利于低频词的训练。
低频词因为词频较低,所以训练不充分。但是低频词包含的
character n-gram
可能包含某些特殊含义并且得到了充分的训练,因此有助于提升低频词的词向量的表达能力。有利于获取
OOV
单词(未登录词:不在词汇表中的单词)的词向量。对于不在词汇表中的单词,可以利用其
character n-gram
的embedding
来获取词向量。
应用
模型、语料库、超参数这三个方面都会影响词向量的训练,其中语料库对训练结果的好坏影响最大。
根据论文
How to Generate a Good Word Embedding?
,作者给出以下建议:模型选择:所有的词向量都是基于分布式分布假说:拥有相似上下文的单词,其词义相似。根据目标词和上下文的关系,模型可以分为两类:
- 通过上下文来预测目标词。这类模型更能够捕获单词之间的可替代关系。
- 通过目标词来预测上下文。
通过实验发现:简单的模型(
Skip-Gram
) 在小语料库下表现较好。复杂的模型在大语料库下略有优势。语料库:实际上语料库并不是越大越好,语料库的领域更重要。
- 选择了合适的领域,可能只需要
1/10
甚至1/100
的语料就能够得到一个大的、泛领域语料库的效果。 - 如果选择不合适的领域,甚至会导致负面效果,比随机词向量效果还差。
- 选择了合适的领域,可能只需要
超参数:
词向量的维度:
- 做词向量语义分析任务时,一般维度越大,效果越好。
- 做具体
NLP
任务时(用作输入特征、或者网络初始化),50
维之后效果提升就比较少了。
迭代次数:由于训练词向量的目标是尽可能精确地预测目标词,这个优化目标和实际任务并不一致。因此最好的做法是:直接用实际任务的验证集来挑选迭代次数。
如果实际任务非常耗时,则可以随机挑选某个简单任务(如:情感分类)及其验证集来挑选迭代次数。
word2vec
还有一些重要的超参数:- 窗口大小:该超参数通常和语料库中句子长度有关,可以统计句子长度分布来设置。
min-count
:最小词频训练阈值,词频低于该阈值的词被过滤。- 降采样率
subsampling_rate
:降采样率越低,高频词保留的越少低频词保留的越多。
word2vec
结果评估:- 通过
kmeans
聚类,查看聚类的簇分布。 - 通过词向量计算单词之间的相似度,查看相似词。
- 通过类比来查看类比词:
a
之于b
,等价于c
之于d
。 - 使用
tsne
降维可视化查看词的分布。
- 通过
GloVe
- 学习词向量的所有无监督方法最终都是基于语料库的单词共现统计,因此这些模型之间存在共性。
- 词向量学习算法有两个主要的模型族:
- 基于全局矩阵分解的方法,如:
latent semantic analysis:LSA
。- 优点:能够有效的利用全局的统计信息。
- 缺点:在单词类比任务(如:
国王 vs 王后
类比于男人 vs 女人
)中表现相对较差。
- 基于局部上下文窗口的方法,如:
word2vec
。- 优点:在单词类比任务中表现较好。
- 缺点:因为
word2vec
在独立的局部上下文窗口上训练,因此难以利用单词的全局统计信息。
- 基于全局矩阵分解的方法,如:
Global Vectors for Word Representation:GloVe
结合了LSA
算法和Word2Vec
算法的优点,既考虑了全局统计信息,又利用了局部上下文。
原理
应用
FastText
fastText
是Facebook AI Research
在2016
年开源的文本分类器,其提出是在论文《Bag of Tricks for Efficient Text Classification》
中。目前fastText
作为文本分类的基准模型。fastText
的优点是:在保持分类效果的同时,大大缩短了训练时间。在 8个 数据集上,不同模型的测试误差:
单个
epoch
的训练时间(char-CNN
、VDCNN
和fastText
):
fastText
的网络结构与word2vec
的CBOW
非常相似。区别在两个地方:- 输入:单篇文档的所有单词都作为网络的输入。因此这里的参数
C
是动态的,它等于当前文档的单词数量。 - 输出:这里网络的输出是各类别的概率。通常文本分类的类别 K远小于词典大小 V,因此可以不必进行分层
softmax
和负采样。
- 输入:单篇文档的所有单词都作为网络的输入。因此这里的参数
ELMo
1.ELMo:Embeddings from Language Models
引入了一种新的单词表示方式,该 表示方式的建模目标是:对单词的复杂特征建模(如:语法特征、语义特征),以及能适应不同的上下文(如:多义词)。
ELMo
词向量是由双向神经网络语言模型的内部多层向量的线性加权组成。LSTM
高层状态向量捕获了上下文相关的语义信息,可以用于语义消岐等任务。如下图中的左图为语义消岐任务的结果,第一层、第二层分别表示单独使用
biLM
的representation
的效果。结果表明:越高层的状态向量,越能够捕获语义信息。LSTM
底层状态向量捕获了语法信息,可以用于词性标注等任务。如下图中的右图为词性标注任务的结果,第一层、第二层分别表示单独使用
biLM
的representation
的效果。结果表明:越低层的状态向量,越能够捕获语法信息。
ELMo
词向量与传统的词向量(如:word2vec
)不同。在ELMo
中每个单词的词向量不再是固定的,而是单词所在的句子的函数,由单词所在的上下文决定。因此ELMo
词向量可以解决多义词问题。下图中,
GloVe
无法区分play
这个单词的多种含义。而ELMo
由于引入了上下文,因此可以区分其不同含义。实验表明,
ELMo
在多个任务上取得了广泛的提升。
Item2Vec
sentence2vec
获得sentence
的表达的最简单的方式是:基于句子中词的embedding
来取简单平均或者加权平均,权重为单词的 tf-idf
值。
研究表明这种简单的方式足以提供一个良好的sentence embedding
。
Skip-Thought
Quick Thought
InferSent
多任务联合 sentence-vec
Universal Sentence Encoder
论文
《Universal Sentence Encoder》
提出了两种encoder
模型的变体,它们可以在准确性和计算资源之间平衡。Transformer
编码器:模型复杂度更高,准确率更高,但是资源消耗更大。DAN:deep averaging network
编码器:模型复杂度更低,资源消耗更低,但是准确率稍低。DAN
编码器首先将word
和bi-gram
的embedding
取均值,然后送入一个DNN
网络中来计算sentence embedding
。
Transformer
编码器和DAN
编码器采用多任务训练的方式。其中包含了:类似
Skip Thougt vector
的无监督学习任务,但是将该模型的LSTM
编码器替换为Transformer
编码器/DAN
编码器。其训练语料来自
wiki
百科语料、网络新闻语料、论坛的讨论语料、网页上的问答语料。包含了解析好的对话数据的对话
input-response
任务。有监督的文本分类任务。
其训练语料来自
Stanford Natural Language Inference:SNLI
。
已训练好的
Transformer
编码器和DAN
编码器可以在Tensorflow hub
上访问。一个简单的使用方式为:
import tensorflow_hub as hub embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/1") embedding = embed(["The quick brown fox jumps over the lazy dog."])
模型输入一个英文字符串,输出该字符串的固定维度的
embedding
。输出
embedding
可以直接使用,如计算句子的语义相似度;也可以在大型任务中进行微调。迁移学习的效果判断是在一组任务上进行。其中包括:
MR
:电影评论片段的情感分析(5个情感等级)CR
:客户评论的情感挖掘SUBI
:电影评论和情节摘要中的情感分析MPQA
:来自新闻的短句的观点极性分析TREC
:来自TREC
的细粒度问题分类SST
:二元短语情感分类STS Benchmark
:文本语义相似度(结果与人工判定的相似文本对进行比较)Word Embedding Association Test:WEAT
:词向量偏差测试,用于评估模型的偏差。
对于分类任务,将
DAN
和Transformer
的句子编码送入与任务相关的简单神经网络中(如:卷积神经网络CNN
或者另外一个DAN
)。对于语义相似度任务,将DAN
和Transformer
的句子编码直接计算arccos
角度:
- 模型的表现如下表所示。其中:
USE_T
为采用Transformer
编码器的通用句子编码模型,USE_D
为采用DAN
编码器的通用句子编码模型。w2v w.e.
表示采用了word2ve
预训练模型,lrn w.e
表示随机初始化词向量。这两种方式是结合了
sentence embedding
和word embedding
,将这两个embedding
拼接在一起。其区别在于:w2v e.e.
的word embedding
来自于预训练的word2vec skip-gram
模型并在训练中微调。lrn w.e
的word embedding
是随机初始化的,并在训练中调整。
迁移效果可以在少量训练样本上获得更好的效果。
在 SST
任务上(全量训练样本 67.3k),采用Transformer
编码器的通用句子编码模型仅仅使用 1k 个训练样本就能够得到很好的效果。
doc2vec
- 论文在
sentence representation
和paragraph representation
的效果都较好。
Stanford Sentiment Treebank Dataset
情感分析数据集包含 11855 个样本,每个样本就是一个句子。其中训练集 8544 个样本、验证集 1101 个样本、测试集 2210 个样本。- 第二列给出了二元情感分析的错误率,最后一列给出了细粒度多元情感分析的错误率。
- 一个有意思的现象是:简单的对句子的词向量取平均并不能得到一个较低的分类错误率。
IMDB
情感分析数据集包含 100k 个样本,每个样本包含多条句子。其中训练集 25k 个样本、测试集 25k 个样本、以及 50k 个未标记样本。论文使用 75k 个样本(25k 个标记样本和 50k 个标记样本)来训练词向量和段落向量,然后测试剩下的 25k 个标记样本。
- 论文给出一些结论来指导实践:
PV-DM
模型通常要比PV-DBOW
模型更好。单独使用PV-DM
的效果已经足够好,但是联合二者的效果更好。PV-DM
段落向量和PV-DBOW
段落向量拼接的效果通常优于二者相加。- 最佳窗口大小通常需要通过交叉验证来选取。论文建议窗口大小在 5 到 12 之间选取。
- 虽然测试阶段段落向量的计算代价较大,但是可以并行执行来降低代价。