文章目录
前言
在前面一篇文章中,我总结了Representation-Based文本匹配模型的改进方法,其中在一篇论文中提到了使用Pre-train方式来提高效果,论文连接如下:
Chang, W., Yu, F.X., Chang, Y., Yang, Y., & Kumar, S. (2020). Pre-training Tasks for Embedding-based Large-scale Retrieval. ArXiv, abs/2002.03932.[PDF]
论文中提到的预训练数据均为,relevant positive Query-Doc 对:
训练的目标为最大化当前Postive Query-Doc的Softmax条件概率:
论文中提到,softxmax分母中的 D \mathcal D D为所有可能的文档集合,这样的话候选文档集合非常大,所以论文中做了近似,训练时使用当前batch中文档这个子集来代替全集 D \mathcal D D,这种方法称为Sample Softmax
。 TensorFlow中也有这个方法的API实现,但是我一直不是很能理解代码中到底应该怎么实现,突然这几天读到了文本匹配的开山之作 DSSM,我发现DSSM的训练方法与上面那篇论文非常类似,于是研究了一下源码,有一种豁然开朗的感觉,所以想分享一下,我对这种训练方式的理解。DSSM论链接如下:
Huang, Po-Sen et al. “Learning deep structured semantic models for web search using clickthrough data.” CIKM (2013).[PDF]
DSSM论文中的训练数据也是Query-Document对,训练目标也为最大化给定Query下点击Doc的条件概率,公式如下,和上面说的Pre-train任务基本一致:
极大似然估计的公式基本一样,训练都是Point-wise loss,具体各个符号我在下面仔细介绍。
DSSM框架简要介绍
作为文本匹配方向的开山之作,已经有非常多的博客介绍了这个模型,这里我就简单介绍一下,重点放在后面训练源码的阅读。
模型结构
DSSM也是Representation-Based模型,其中Query端 Encoder 和 Doc端 Encoder都是使用 MLP实现,最后Score计算使用的是cosine similarity,后续模型的改进很多都是使用更好的Encoder结构。
输入
DSSM中输入并不是单纯直接使用 bag-of-word,从上面结构图可以看出,输入的时候做了Word Hashing,在进行bag-of-word映射,目的主要如下:
- 减少词典的大小,直接使用原始word词典非常大(500K),导致输入向量的维数也非常高,使用Word Hashing做分解后,可以减少词典大小,比如letter-trigram(30K)
- 一定程度解决OOV问题
- 对拼写错误也有帮助
Word Hashing的做法类似于fast-text中的子词分解,但是不同点在于
- fast-text中会取多个不同大小窗口对一个单词进行分解,比如2、3、4、5,词表是这些所有的子词构成的集合
- Word Hashing只会取一个固定大小窗口对单词进行分解,词表是这个固定大小窗口子词的集合,比如letter-bigram,letter-trigram
比如输入的词为#good#
,我们选tri-gram,则Word-hashing分解后,#good#
的表示则为#go,goo,ood,od#
,然后就是输入的每个词都映射为tri-gram bag-of-words 向量,出现了的位置为1,否则为0。假设数据集进行tri-gram分解后,构成的词表大小为N,那么Query输入处理方式如下:
- 首先将每个词进行Word Hashing分解
- 获得每个词的表示,比如 [0,1,1,0,0,0…,0,1] ,维数为N,其中在词表中出现了的位置为1,否则为0
- 将Query中所有的词的表示向量相加可以得到一个N维向量,其实就是bag-of-word表示(只考虑有没有出现,并不考虑出现顺序位置)
Doc端输入的处理也类似于上面Query端的处理,获得Word-Hashing后的向量表示,作为整个模型的输入。
Encoder层
Query端和Doc端Encoder层处理很简单,就是MLP,计算公式如下:
可以看出就是标准的全连接层运算
相似度Score计算
DSSM中最后的相似度计算用的是 cosine similarity,计算公式如下:
模型训练好之后,给定一个Query我们就可以对其所有Doc按照这个计算出来的cosine similarity进行排序。
训练方式解读
训练数据
DSSM的训练方式是做Point-wise训练,论文中对于训练数据的描述如下:
The clickthrough logs consist of a list of queries and their clicked documents.
给定的是Query以及对应的点击Document,我们需要进行极大似然估计。
训练目标
DSSM首先通过获得的semantic relevance score
计算在给定Query下Doc的后验概率:
其中 γ \gamma γ为softmax函数的平滑因子, D \bold D D表示所有的待排序的候选文档集合,可以看出这个目标其实和我们一开始提到的Pre-train那篇论文的目标是一样的。我们的候选文档大小可能会非常大,论文在实际训练中,做法如下:
- 我们使用 ( Q , D + ) (Q,D^+) (Q,D+)来表示一个(Query,Doc)对,其中 D + D^+ D+表示这个Doc是被点击过的
- 使用 D + D^+ D+和四个随机选取没有被点击过的Doc来近似全部文档集合 D D D,其中 { D j − ; j = 1 , . . . , 4 } \{D^-_j;j=1,...,4\} { Dj−;j=1,...,4}表示负样本
上面就是训练时候的实际做法,对于每个 ( Q , D + ) (Q,D^+) (Q,D+),我们只需要采样K个负样本(K可以自己定), ( Q , D j − ) (Q,D^-_j) (Q,Dj−),这样softxmax操作我们也只需要在 D ^ = { D + , D 1 −