七、变种
7.1 Item2Vec
在传统的推荐算法中,协同过滤
CF
算法是利用item2item
关系来计算商品中的相似性:通过user-item
矩阵来计算item1
和item2
的相似性。受到
word2vec
算法的启发,可以将用户在一个session
内浏览的商品集合作为一个句子,每个商品作为一个word
。出现在同一个集合内的
商品对
视作正类,设商品集合为 ,所有商品的全集为 。
定义目标函数为:
类似
word2vec
,采用负采样和降采样,使用SGD
学习模型则得到每个商品的embedding
。一旦得到了商品的
embedding
,两两计算cosine
即可得到item
之间的相似度。下图为Item2Vec
和SVD
分别得到的词向量经过t-SNE
可视化的结果哦。
7.2 sentence2vec
获得
sentence
的表达的最简单的方式是:基于句子中词的embedding
来取简单平均或者加权平均,权重为单词的tf-idf
值。研究表明这种简单的方式足以提供一个良好的
sentence embedding
。
7.2.1 Skip-Thought
论文
《Skip-Thought Vectors》
根据word2vec
的思想提出了一种通用的、分布式的sentence embedding
方法:通过当前sentence
来预测前一个sentence
和下一个sentence
。最终语义和语法属性一致的sentence
被映射到相似的向量表示。设句子 , 为句子长度。 为句子 的第 个单词,其
embedding
为 。给定一组句子 ,模型分为编码encoder
、解码dcoder
部分。encoder
:对 进行编码,得到其上下文向量:这里采用
GRU
,也可以采用其它编码方案(LSTM
,双向GRU
等)。decoder
:根据输入序列的上下文向量分别解码两次,然后分别和 和 比较。两个
decoder
拥有不同的参数,除了 共享之外。第一个
decoder
:第二个
decoder
:整体损失函数为:
其中 为句子 第 个位置单词 的输出概率。
模型将训练集的所有句子组合加入训练,在测试时将句子所有单词的
embedding
输入到encoder
即可得到句子的embedding
。
如果测试时某些单词未在训练时见过(未登录词),则可以通过一些广义词向量来解决。如:假设 为更大规模的、通过
word2vec
训练得到的词向量, 为本模型训练得到的词向量。我们学习线性映射 ,然后对于模型的未登录词 ,得到模型的词向量 : 。改进思路:用更深的
encoder
和decoder
网络;用更大的窗口,而不仅仅是预测前后两句;用其它的encoder
,如引入attention
。
7.2.2 Quick Thought
论文
《An efficient framework for learning sentence representations》
提出了一种新的sentence vector
方式Quick thought Vector
,相比较《Skip-Thought Vectors》
而言它的训练速度更快。Quick thought Vector
通过分类器来区分句子的前后句和其它句子,模型结构如下图所示。这将生成问题视为从所有可能的句子中选择一个句子,因此可以看作是对生成问题的判别近似。- 判别模型仅仅会捕捉
sentence embedding
之间的相对关系(是否相近),因此可忽略每个句子与embedding
无关的信息。 - 生成模型会捕捉
sentence embedding
的绝对位置,因此生成模型约束更强,同时可能捕获了与embeding
无关的很多信息。
- 判别模型仅仅会捕捉
设句子 , 为句子长度。 为句子 的第 个单词,其
embedding
为 。令句子 附近窗口大小 的句子集合为 、句子 的候选样本句子集合为 ,其中满足 。即: 不仅包含了句子 附近的句子,也包含了很多其它句子。
使用编码器 对 编码、编码器 对候选句子 编码,模型预测候选句子 的概率:
模型训练的目标函数为:尽可能的识别所有的近邻句子:
其中:
- 中 为一个打分函数(或者分类器),在论文中 简单定义为 。如此简单的分类器是为了迫使编码器学习到更加丰富的
sentence representation
。 - 编码器 和 使用不同的参数,这是借鉴了
word2vec
的结构:中心词通过 编码(输入向量)、目标词经过 映射(输出向量),二者点积得到得分。 - 在测试时给定句子 ,其表示是两个编码器输出的拼接: 。
- 中 为一个打分函数(或者分类器),在论文中 简单定义为 。如此简单的分类器是为了迫使编码器学习到更加丰富的
7.2.3 InferSent
论文
《Supervised learning of universal sentence representations from natural language inference data》
通过监督学习来获取句子的reprensentation
,该模型被称作InferSent
。相比Skip Thought Vector
,该模型的训练速度要快得多并且效果更好。论文采用
Stanford Natural Language Inference Datasets
(简称SNLI
),包含了57万个人类产生的句子对。每个句子对已被人工标记,标签为:蕴含emtailment
、矛盾contradiction
、中立neutral
。模型。论文假设SNLI
的作用类似ImageNet
,它学到的句子表达能捕获通用的sentence feature
。模型有两种训练方式:输入的两个句子采用
encoder
分别独立编码,然后获得独立的sentence embedding
;采用类似attention
的机制来同时对两个句子进行编码,分别获得各自句子的sentence embedding
。考虑到论文的目标是获取句子的通用表示,因此采用方式一的结构,并且两个
encoder
参数共享。
给定一对句子 ,假设其编码结果分别为 。有三种方式来提取这两个句子的关系:向量拼接 ,元素级相乘 ,元素级距离: 。
提取结果作为一个
softmax
输出单元的输入,最终得到3个类别的输出概率。作者研究了7种不同的编码架构:
LSTM
、GRU
、BiGRU
(采用前向、后向最后一个隐单元的拼接)、BiLSTM-mean
(所有隐向量的均值)、BiLSTM-max
(所有隐向量的最大池化)、BiLSTM + self-attention
、分层卷积模型。最终BiLSTM-max
编码器在SNLI
和迁移任务上表现效果最好。有些编码器如
BiLSTM+self-attention
在NLI
上比BiLSTM-mean
表现更好,但是在迁移任务中反而表现更差。这是因为attention
机制捕捉到了更多的关于具体数据集的信息,导致学到的sentence representation
是有偏的(而不是通用的)。作者在多种任务上比较了
InferSent
模型和其它模型的结果,下表中下划线表示迁移学习中最佳的模型,† 表示本论文提出的模型。虽然
Skip Thought Vector
模型的表现效果也比较好,但是该模型是在非常大的有序句子集上训练。如SkitpThought-LN
训练了 6400万句子,训练时间一个月。而InferSent
模型只需要训练 57 万句子,训练时间不到一天(单个GPU
)。
7.2.4 多任务联合 sentence-vec
论文
《LEARNING GENERAL PURPOSE DISTRIBUTED SENTENCE REPRESENTATIONS VIA LARGE SCALE MULTITASK LEARNING》
提出了一个简单、有效的通用句子representation
多任务学习框架,它在多个弱相关任务中共享同一个sentence encoder
。其背后的思想是:具体任务训练得到的句子表达编码了具体任务的信息,因此是有偏的。如果在多个弱相关任务中训练,则这种偏差会相互减弱,因此能得到更通用的句子表达。
设句子 , 为句子长度。 为句子 的第 个单词,其
embedding
为 。设句子 对应的输出为 。encoder
为一个双向GRU
,没有采用attention
机制。因为一旦采用attention
机制,随着attention
权重的不同(该权重与具体任务有关)句子 的表达就不同,因此无法给出通用表达。句子 的表达为 ,其中 和 分别表示两个方向的最后一个隐向量。
decoder
为一个单向GRU
,其中 作为decoder
每个时间步的输入。论文采用一对多模型:同一个双向
GRU
将不同任务的输入句子编码成摘要向量 ,然后不同任务采用不同GRU
来解码。
根据论文
《A model of inductive bias learning》
的结论:- 共同学习多个相关任务会产生良好的泛化,这种泛化效果与每个任务的训练样本规模相关。
- 在足够多的训练任务中学习到的偏差有助于来自相同场景下的新任务的学习。
因此论文中选择的多任务满足的条件是:任务的多样性足够多、每个任务的训练数据集足够大。
多个任务训练有两种任务切换方式:
在每个任务之间周期性的均匀切换。
在每个任务之间周期性的按比例切换,其中比例因子就是任务的训练集的大小。
此时训练集越大的任务其参数更新的次数越多。
论文中选择后一种方式切换:
输入:
- 个任务
- 所有任务共享的
encoder
- 每个任务各自的
decoder
: - 任务参数 ,其中 为第 个任务的参数
- 每个任务的切换概率 ,其中
- 每个任务的训练集
- 总的损失函数
任务切换算法步骤:
- 以概率分布 采样一个任务
- 从训练集 中采样一个样本
- 通过编码器编码:
- 获取预测值:
- 更新参数:
下表中是一组模型对十种任务的句子进行评估,评估方式为:将模型输出的句子
representation
经过简单的线性模型来输出结果。其中:STN, Fr, De, NLI, L, 2L, STP & Par
表示联合了skip-thought next
,French translation
,German translation
,natural language inference
,large model
(隐单元的维度更高),2-layer large model
(隐单元维度更高,同时encoder
有多层),skip-thought previous
,parsing
等任务。- 最后一列给出了我们的模型相比
Infersent
在所有任务上的平均提升。
实验结果表明:
- 相比较于其它迁移学习模型,我们的模型在大多数任务上取得最佳效果。
- 增加更多的任务可以提高模型的迁移学习能力(表格中
+L
的行)。 - 增加编码器的隐单元数量和层数也可以提高模型的迁移学习能力 (表格中
+2L
的行)。
下表中比较了我们的迁移学习方法和几种使用注意力机制的、复杂的监督学习方法。
通过将
sentence representation
作为简单的MLP
模型的输入,我们的方法就能产生一个足够竞争力的结果。而且我们的模型使用原始训练集的一个很小比例就可以取得很好的效果。
7.2.5 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 个训练样本就能够得到很好的效果。采用
Transformer
编码器的通用句子编码模型的计算复杂度为句子长度 的 复杂度,内存消耗也是 复杂度。采用
DAN
编码器的通用句子编码模型的复杂度分别为 和 。但是当句子长度很短时,由于DAN
编码器需要考虑unigram
和bigram
,DAN
的内存消耗可能会超过Transformer
的内存消耗。下图中
b
表示batch size
。
7.3 doc2vec
论文
《Distributed Representations of Sentences and Documents》
提出了无监督的Paragraph Vector
算法,用于从可变长度的文本(如:句子sentence
、段落paragraph
、文档doc
)中学习固定维度的representation
。它不仅可以编码句子,还可以编码一个段落、整篇文档。Paragraph Vector
算法将每个段落映射到一个唯一的向量,由矩阵 中的一行表示。有两种段落向量模型:
PV-DM
、PV-BOW
,如下图所示。其中 为训练集段落数量, 为词汇表的大小, 为Paragaph Vector
维度, 为词向量维度, 为窗口大小。Distributed Memory Model of Paragraph Vectors:PV-DM
模型:类似word2vec CBOW
思想,联合利用段落向量和词向量来预测窗口单词的下一个单词。其中联合可以采用两个向量的平均或者拼接。- 每个样本取自段落的一个滑动窗口,通过段落向量和窗口内单词预测窗口的下一个单词。
- 段落向量在该段落生成的所有样本中共享,但是不在段落之间共享。
- 在该模型中段落
id
被认为是另类的单词,它起到记忆的作用,用于记住当前上下文的主旨。 - 该模型同时也可以生成词向量,词向量在段落之间共享。
Distributed Bag of Words version of Paragraph Vector: PV-DBOW
模型:通过段落向量来预测窗口内的单词。- 每个样本取自段落的一个滑动窗口,通过段落向量来预测窗口内的单词。
- 段落向量在该段落生成的所有样本中共享,但是不在段落之间共享。
- 该模型无法生成词向量,不需要存储词向量矩阵 ,因此模型更小。
对于测试样本,由于不同的段落分配到了不同的段落
id
,因此测试样本的段落向量是未知的。此时需要固定网络的其它参数,仅仅训练矩阵 ,其中 为测试集的大小。
然后将段落向量作为段落的一个
representation
来作为后续模型的输入。实验结果表明:仅仅使用
PV-DM
得到的段落向量的效果就比较好,但是联合使用PV-DM
和PV-DBOW
的段落向量效果更佳。
论文在
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 之间选取。
- 虽然测试阶段段落向量的计算代价较大,但是可以并行执行来降低代价。