神经网络检索方法与一种结合local和distributed文本相似度算法

by joeyqzhou

基于频次的信息检索方法

信息检索(IR), 简单说,就是给一个query, 返回与其最相关的doc. 传统的IR方法有tfidf, BM25, 它们主要考虑的是query中词语的确定性匹配(不能匹配到类似词)。即词在某篇候选doc中出现的次数(term frequency)和在所有doc中出现的频次(idf)。这种方法的局限有: 不能把词语的相似性考虑进来,比如搜索"iphone",苹果手机不会命中的

基于向量表达的信息检索方法

简单的稀疏表达

由于上述局限,一个term(词或字,后面简单用词表达term.)需要用向量来表达。简单的方法如

  • onehot:词表数量是向量长度,这个词的位置为1,其他为0
  • 出现在doc表达: 向量长度是doc的数量,值是该词在每个doc中出现的次数
  • 词语共现表达: 词表数量是向量长度,值是该词与每个位置词的共现次数

等其他方法,但是这里方法局限是高维稀疏,长度不定,不方便接后续神经网络计算

Embedding表达:

又经常被称为: 隐语义、潜语义表达等。其含义是用低维稠密的向量来表达每个词. 这类方法根据有无标注数据,又可区分为无监督、有监督方法. 我们先简述无监督方法.

主题模型方法PLSA, LDA

PLSA: 每篇文章d都有多个主题c服从p(c∣d)p(c|d)p(cd), 每个主题c在每个词语上符合分布p(w∣c)p(w|c)p(wc) , 那么对于现有的文档及其词语的联合分布为:
p(w,d)=p(d)p(w∣d)=p(d)∑cp(c∣d)p(w∣c)p(w,d) = p(d)p(w|d) = p(d) \sum_c p(c|d)p(w|c) p(w,d)=p(d)p(wd)=p(d)cp(cd)p(wc)
设置 topic数目为KKK, PLSA就是求解参数p(c∣d)p(c|d)p(cd) (参数个数:文档数 x KKK),p(w∣c)p(w|c)p(wc)(参数个数:词典数xKKK) ,来使得这个联合分布的最大.

LDA 是在PLSA的基础上,认为参数不应该是fixed and unkonwn的,而是符合一个分布,该分布是Dirichlet Distribution

word2vec方法

划分一个固定长度的窗口,利用中心词预测周围词(skip-gram),或周围词预测中心词( cwob). 以skip-gram为例, 其目标函数为:
J(θ)=−1T∑t=1T∑−m≤j≤m,j≠0P(wt+j∣wt)J(\theta) = - \frac{1}{T} \sum_{t=1}^T \sum_{-m\le j \le m,j \ne 0 } P(w_{t+j}|w_t) J(θ)=T1t=1Tmjm,j=0P(wt+jwt)
其中:
P(o∣c)=exp⁡(uoTvc)∑w∈Vexp(uwTvc)P(o|c) = \frac{\exp(u_o^T v_c) }{ \sum_{w \in V} exp(u_w^T v_c)} P(oc)=wVexp(uwTvc)exp(uoTvc)
注意uuuvvv 是两套向量体系,一般 $ v $ 是用来代表词向量在后续中使用。值得注意的点,word2vec目标使得周围词语相似的词语更相似,而主题模型是使得相同文档内的词语更相似。word2vec有如下两个优势:

  • 窗户的文档长度的区别。一篇文档可能很长,距离很远的词关系并没有那么大
  • Word2vec 使得“周围”词语相似的词语更相似。同义的词语可能很少共现。比如 “计算机, 电脑" 类似的近义词语共现比较少,但是周围的词语很相似

glove方法

也是划分窗口,统计任意两个词语的频次 XijX_{ij}Xij , 任意一个词语由 viv_ivi 向量和一个bias bib_ibi 表示,其目标函数是:
J(θ)=∑ijf(Xij)(viTvj+bi+bj−log(Xij))J(\theta) = \sum_{ij} f(X_{ij}) (v_i^T v_j + b_i + b_j - log(X_{ij})) J(θ)=ijf(Xij)(viTvj+bi+bjlog(Xij))

其中f(Xij)f(X_{ij})f(Xij)是根据频次给的一个权重

更复杂的embedding表达

最近几年由 LSTM, GRU这种有序的RNN网络 -> Elmo(也是时序的) -> transformer(基于attention, 不需要时序) -> bert 。 由对词语的表达, 单一的表达(上述的方法词的embedding都与上下文无关), 到针对句的表达(不需要分词),或词语根据上下文其embedding有变化。 网络不断变得复杂,输入的数据越来越大,表达能力越来越强。当然,针对计算量无论是训练、预测都是极大的挑战(最近也有针对bert网络进行蒸馏来优化效率的文章)

上面总结了无监督的常见embedding表达,词语或query/doc拿到了embedding表达,就可以通过cos相似度或类似方法,计算相似度了。这种基于向量表达的相似度计算,比tfidf这种传统方法的泛化能力更强,召回能力更强.

有监督的表达

一般情况下,无监督的效果是没有有监督的效果好的。所以最好的还是利用检索场景的反馈数据来进行有监督的训练。针对文本相似度(还没有考虑到个性化,点击率等因素),有监督训练的样本是(query, 点击/曝光, doc), 目前doc使用的是doc标题。

DSSM[1](distributedf方式相关模型)

word-hashing

原文中采用word-hashing方法,来对输入的词语进行处理。举例有输入词语"#good#", 那么"#good#“就被trigram分为”#go, goo, good, od#", 这样做的好处是避免覆盖的词语更全,避免出现out of vocab的情况,比如goooood job, 这种口语化的词语. 另外,减小了特征字典的大小,从500k, 将为30k.

因为trigram会出现碰撞,但是这种碰撞完全是可以接受的,另外模型训练会根据数据做一定适应。甚至对"goooood job"这种例子反而带来一种迁移的效果。

但是我们训练的场景是中文分词,所以就不采用该技术了。而是在分词的时候,结合了分词+bigram对中文进行全面的切割

模型

query和doc共享参数,都是走若干层全连接,最后一层是一个128维的向量。相似度由cosine计算:

R(Q,D)=cos⁡(yQ,yD)=yQTyD∣∣yQ∣∣∣∣yD∣∣R(Q,D) = \cos(y_Q, y_D) = \frac{y_Q^T y_D}{||y_Q|| ||y_D||} R(Q,D)=cos(yQ,yD)=yQyDyQTyD

那么doc D与query Q的相关的概率是:
P(D∣Q)=exp⁡(rR(Q,D))∑D′∈Dexp⁡(rR(Q,D′))P(D|Q) = \frac{\exp(rR(Q,D))}{\sum_{D' \in \bold D} \exp(rR(Q,D'))} P(DQ)=DDexp(rR(Q,D))exp(rR(Q,D))
r是经验参数,该参数设置也比较关键。如果该参数设置比较小,比如1,loss收敛的很慢,甚至不会收敛。原因是R这个相似度是(-1,1)的,如果限制在(-1,1)那么正负样本的预测值的softmax无法拉开差距,所以r需要设置的较大,我们设置的是20.

其中D\bold DD 可以代表和这个Q相关的所有doc集合。这个集合可能很大,可以采取随机采样.

其目标函数最大似然正样本的概率乘积,负样本在分母起作用:
J(θ)=−log⁡∏(Q,D+)P(D+∣Q)J(\theta) = - \log \prod_{(Q,D^+)} P(D^+|Q) J(θ)=log(Q,D+)P(D+Q)

DSSM的后续优化

DSSM在2013年发表,产生了不错的效果。后续也有陆续的其他优化,如把DSSM后的全连接网络加入CNN层(CDSSM),或结合LSTM把时序信息也加入进去,对效果有进一步提升。

不过针对,零售搜索领域,query一般比较简短一到两个词语,doc也经常是词语的拼接,不是完整的一句话。通过离线实验,所以增加了CNN, LSTM层对DSSM在零售的语料离线提升有限。

DRRM(local interaction方式)

文本相似度建模一般有如下两种方式,(a) 先分别计算query和doc的embedding, 再计算相似度, (b) 先计算query和doc的local interaction, 然后数据神经网络计算相似度,参考[2]一般匹配方式:
Match(T1,T2)=F(ϕ(T1),ϕ(T2))​\text{Match}(T_1,T_2) = F(\phi(T_1),\phi(T_2)) ​ Match(T1,T2)=F(ϕ(T1),ϕ(T2))

T1,T_1,T1,T2T_2T2 表示等待对比两句话

A: distributed方式, (ϕ\phiϕ 复杂,FFF 简单)

两句话先拿复杂的网络表示为(ϕ\phiϕ), 最后一层简单结合(FFF)。DSSM 即属于distributed方式, 其ϕ\phiϕ 由若干层全连接表示,FFF 是cosine相似度

B: local interaction方式。ϕ\phiϕ 简单,FFF 复杂

简单组合两句话,输入复杂的模型计算。

代表方法: DRRM

为什么DSSM等distributed相关方法取得了不错的效果,还需要local interaction的方法呢?【2】中说明,“distributed are not a typical ad-hoc retrieval setting”, 【3】文章中说明,distributed方式针对一些长尾的query表现的不如local方式好,所以local方式是仍然需要的。下面简单介绍下Deep Relevance Matching Model(DRRM)【2】

这个方法的特点:

  1. 其输入层是query word embed和doc word embed的相似度的直方图。举例[2],query是car, doc的标题分词是:(car, rent, truck, bump, injunction, runway), query词语car和doc的每个词语的相似度分别是((1, 0.2, 0.7, 0.3, −0.1, 0.1)), 假设直方图的分桶是这样的:bins {[−1, −0.5), [−0.5, −0), [0, 0.5), [0.5, 1), [1, 1]} , 那么直方图为:[0, 1, 3, 1, 1], 这个直方图就是神经网络的输入。 (针对 tensorflow批量直方图快速计算,tf.histogram_fixed_width不支持批量的直方图计算,我的思考了一种方法供参考)

这里的直方图,可以用计数的,也可以”计数+归一化“, 也可以log(1+计数)。文章说最后一种log的方法效果最好

直观感觉,就是如果query与doc的词语越相似,在直方图的右边值越大,模型结果一般就越大。

  1. 区分了query中不同的词语的权重。一个词语一个网络,因为query中的词语重要性不同,在最后一层通过一个gig_igi 加权得到最后的分数

我们的实验,针对DRRM模型做了离线实验,效果并没有超过DSSM. 正如[3]中所有,DRRM是对长尾的query表现的更好,对热门的query表现一般,综合起来离线没有beat DSSM.

local + distributed 实践

[3]中做了local + distributed 的尝试,但是其local部分,只能记录exact match(确定性匹配)和match的位置, 而不能对相似的词语起作用,所以我们的实践中local的方式借鉴了DRRM的直方图的方式,并对其进行了优化。distributed部分,[3]使用了CNN层, 我们认为对于检索场景的query,CNN或RNN反而过于复杂, 准确率提升有限。所以仍然沿用了之前的DSSM. 所以我们的网络结构最终如图, 其中左侧是

local部分:

参考DRRM,表达query与doc直接计算内积相似度,以直方图输入神经网络.

注意我们同样对不同的query进行了加权,但与DRRM不同的是,这里不是简单的用一个常量权重来代表一个query词语。单一个常量权重不能衡量query中每个词语在整个query中的重要性, 即一个词语的权重不仅和这个词语本身有关,还和它所在query的整体有关。

所以我们使用一个类attention机制, 这个attention是衡量“一个query词语的embedding输入”与“query在DSSM网络的整体的输出层”的一个相关程度,通过一个attention matrix来连接两者.

LLL 为query的词语长度(不足padding), embedding长度为KKK , DSSM网络最后一层长度为 $ \text{dssm_h3} $

即query从DSSM塔的输出层是attention的”q",即 KaTeX parse error: Expected '}', got '_' at position 14: Q_{\text{dssm_̲h3}} , 而每一个query有L个词语那么输入为$ Q_{L, K} $, 还有一个注意力矩阵 KaTeX parse error: Expected '}', got '_' at position 18: …{K, \text{dssm_̲h3} } , 那么DRRM最后每个的加权向量为
KaTeX parse error: Expected '}', got '_' at position 52: …_{K, \text{dssm_̲h3} } Q_{\text{…

distributed部分

distributed部分和DSSM网络结构一样,区别是cosine值最后需要和local部分合并,可以看local的输出不是(-1,1)的,所以需要给distributed输出乘以一个扩展因子wdssmw_\text{dssm}wdssm ,这样模型可以根据数据来自行调节该权重,从而有效结合两个部分.

融合

这样,模型的输出结果不是(-1,1),和我们之前的DSSM的结果范围不一致。目前的系统,基于DSSM的输出范围(1-,1),后续有一系列基于绝对值的规则,比如相关性绝对值过滤等。所以我们需要把输出放在一个范围内。思路是采用sigmoid对输出进行值域的控制,这样就可以把输出控制在(0,1)。但这样我们遇到前面DSSM说的问题,正负样本的输出拉不开,结果softmax后,loss不收敛,所以在sigmoid的基础上增加了一个扩展倍数的参数,初始化20,所以最终的输出是:
KaTeX parse error: Expected '}', got '_' at position 28: …id} (\text{drrm_̲output} + \text…
现网预测的时候会把wamplifyw_{\text{amplify}}wamplify除掉. 所以最终结果就是0~1了

实验与上线

目前离线证明,该方法的loss(0.010)远远低于DSSM的loss(0.023), 不得不说一方面这得益于网络结果变得更为负责,另一方面该网络针对长尾的词语拟合的更好.

引用

  1. Learning Deep Structured Semantic Models for Web Search using Clickthrough Data
  2. A Deep Relevance Matching Model for Ad-hoc Retrieval
  3. Learning to Match using Local and Distributed Representations of Text for Web Search

神经网络检索方法与一种结合local和distributed文本相似度算法相关推荐

  1. minhash算法检索相似文本_文本相似度算法之-minhash

    在做文本去重任务时其实有很多中方法可供选择,譬如,对文章分词,两两对比词集合的jaccard系数,但是当遇到大规模文本去重时,这种方法的效率就太低了,接下来介绍一种大规模文本去重算法minhash. ...

  2. 积分梯度:一种新颖的神经网络可视化方法

    ©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 本文介绍一种神经网络的可视化方法:积分梯度(Integrated Gradients),它首先在论文 Gr ...

  3. python检索论文_一种基于Python的音乐检索方法的研究

    应用技术 0 前言 最近两年,人们对于流行音乐的追求与需求量日益增 加,但如何保证用户能在不知歌名只知歌词的情况下,完成 自己的全方面多种类的听歌需求呢?于是,电脑工程师就推 出了"听歌识曲 ...

  4. matlab手写字母识别,一种基于MATLAB的手写字母的神经网络识别方法

    文章编号 :1009 - 671X(2001) 10 - 0028 - 03 一种基于 MATLAB 的手写字母的神经网络识别方法 邓铭辉 ,孙 枫 ,张 志(哈尔滨工程大学 自动化学院 ,黑龙江 哈 ...

  5. DL之BP:FFNN(前馈神经网络)结构与BP(一种训练神经网络的方法)算法的简介、训练神经网络的五大方法(RLS/GA/SA/PSO/BP)、FFNNLM对比BP之详细攻略

    DL之BP:FFNN(前馈神经网络)结构与BP(一种训练神经网络的方法)算法的简介.训练神经网络的五大方法(RLS/GA/SA/PSO/BP).FFNNLM对比BP之详细攻略 目录 FFNN(前馈神经 ...

  6. ACL 2020 | 多跳问答的基于对齐的无监督迭代解释检索方法

    ©PaperWeekly 原创 · 作者|舒意恒 学校|南京大学硕士生 研究方向|知识图谱 论文标题:Unsupervised Alignment-based Iterative Evidence R ...

  7. 基于 FCCA 的多特征融合的检索方法

    论文杂记 上一篇 主目录 下一篇 文章结构 1 知识基础 1.1 卷积神经网络 1.2 灰度共生矩阵 1.3 LBP 特征 1.4 特征融合 1.5 典型相关分析算法(CCA) 1.6 Faster- ...

  8. Graph Neural Networks: A Review of Methods and Applications(图神经网络:方法与应用综述)

    Graph Neural Networks: A Review of Methods and Applications 图神经网络:方法与应用综述 Jie Zhou , Ganqu Cui , Zhe ...

  9. BNN领域开山之作——不得错过的训练二值化神经网络的方法

    作者| cocoon 编辑| 3D视觉开发者社区 文章目录 导读 概述 方法 确定二值化以及随机二值化 梯度计算以及累加 离散化梯度传播 乘法运算优化 基于位移(shift)的BN 基于位移的AdaM ...

  10. 图神经网络:方法与应用 | 一文展望,四大待解问题

    在 AI Open 杂志 2020 年第一卷中,清华大学周杰等人发表了综述性论文<Graph neural networks: A review of methods and applicati ...

最新文章

  1. 如何为机器视觉系统选择合适的图像采集卡
  2. Android 5中不同效果的Toast
  3. 【Qt】QModbusRequest类
  4. css加了固定定位就不显示内容_前端开发必备,学好”定位“向菜鸟说拜拜
  5. 三角剖分求多边形面积的交 HDU3060
  6. linux的文件权限前面的东西,linux 文件权限解析
  7. mysql mysqld.log_MySQL mysqlbinlog 读取mysql-bin文件出错
  8. apache http server 停止工作_Tomcat9配置HTTP/2
  9. 海克斯棋开源程序 FutaHex2 编译教程
  10. 如何优化微信小程序排名?
  11. android平板和ipad区别,为什么说买平板必须买ipad?那么安卓平板和iPad到底有什么区别?...
  12. 无奈的我,无奈的C++ Builder
  13. 教你用Python爬取妹子图APP
  14. 微信公众平台官方接口
  15. CSS:设置边框和背景
  16. 类似火车头的采集器-免费任意数据采集器
  17. 2015华为南研所校园招聘笔试面试经历
  18. 程序员到底应该学什么?!
  19. 浅谈大规模红蓝对抗攻与防
  20. android定义全局变量,Android Gradle构建:如何设置全局变量

热门文章

  1. ESP8266 读取MPU-6050数据OLED显示
  2. 哇!大开脑洞!“绿协杯”东莞市第六届绿色建筑设计比赛【往期获奖作品回顾上篇】
  3. 服务器宽带估算及选择
  4. 获取并处理中文维基百科语料
  5. 43. TA镜像文件的签名
  6. .NET程序员不加班——写在《华为工程师猝死,36岁,22月无休》之后
  7. 下载C语言标准库源码
  8. AD里面简易的3d制作
  9. 自制力差的元凶及习惯的养成过程
  10. 【windows下基于Eclipse和GCC搭建stm32开发环境(4)】STM32启动过程详解