前沿重器[13] | 知乎query改写思路启示
【前沿重器】
栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。
往期回顾
最近在看datafun的一些分享材料,正好看到了一篇知乎搜索对query理解、召回等方案的分享,觉得改写这块非常有收获,特此总结一下。
query改写的背景和现状
搜索中之所以要进行改写,是因为在下游的检索模块,需要这对特定的文本,搜索效果才会足够好,传统的文本匹配需要比较明确的文本词汇信息,而语义召回则需要明确的语义信息,这个角度看没有足够好的改写,很可能就无法召回需要的内容,所以这个时候,query的改写就显得非常重要了。
由于用户输入的多样性,改写本身也应该是一个多样性的策略方案组合,因此改写出来的可能是多个query,这些query都要进行搜索,性能压力不说,和大一部分内容其实是重复的,意义不大,虽然有检索语法树的支持,但是不见得就能解决所有问题。
机器翻译处理query改写
知乎的思路很简单,用简单粗暴的机器翻译的思路来将query正式化,使query更加标准,例如:苹果手机价格多少->苹果手机售价,于是这个问题就变得比较规范了,机器翻译问题,不外乎就是样本的构造和模型训练。
在工业界相比模型本身,样本应该才是更为关键的问题,尤其还是可靠的标注样本,但其实搜索的好处在于有很多用户行为可以挖掘,这里给出几种常见的平行样本挖掘的手段:
query-用户点击title。 同一个点击title的不同query。 用户在一个session下的检索query。
这些都是用户视角认为比较相似的内容了,这些都是非常有利于进行训练的材料。当然,仅靠这些也是不够的,还需要清洗和筛选:
改写是希望长尾回答能映射到高频的,而高频的通常是我们比较容易处理好的。 噪音的问题可以通过语义相似度等方式直接过滤。 需要注意未登录词的处理,甚至是一些错别字导致的未登录词。
强化学习处理query改写
机器翻译虽然能直接对query进行改写,但并不代表改写出来的东西一定有利于召回,这两者之间存在gap,为了让这个翻译更加明确地向有利于召回的的方向走,知乎提出一种gap的处理方式——强化学习,简单地说就是把检索结果作为reward反馈给机器翻译模型,整个强化学习体系是这样的:
组件 | 内容 |
---|---|
state | query |
agent | 机器翻译模型 |
action | 改写 |
environmet | 搜索系统 |
reward | topk召回率 |
在训练的流程里,改写前后的query都会进行召回和排序,我们希望改写后的query能召回更多好的结果,于是这个topk召回率就可以成为reward。另外有意思的是,有了强化学习,机器翻译模型就可以通过这种方式训练,对平行样本的依赖就没那么强了,或者说,强化学习可以是机器翻译模型的fine tuning。
然而在实践的时候发现,机器翻译改写query召回的内容topk召回率会很低,导致训练缓慢,这时候知乎借鉴了alphago中策略网络、价值网络、蒙托卡罗树搜索的结构,策略网络是机器翻译模型,价值网络用改写后的reward评估,这块的收益非常高,有兴趣可以结合alphago的结构详细了解一下。
title更进一步
召回的本质是希望通过query能更容易找到对应的title,除了通过query改写到queey来贴近,还可以通过title改写到query来贴近。
这种思路经过知乎的实验,可以解决点击query存在偏置的问题(那些搜了但是没有点击的query很多时候才是我们需要解决的query),思路是这样的,未召回的query可能和有点击的query相似但和目标title不接近,此时title能映射到query,就有利于未召回query后续的召回,这个逻辑其实就有点像给title做泛化,问答系统里面叫拓展问。
值得注意的是,从泛化的角度来看,这个泛化是定向的,往解决现在的召回逻辑无法召回目标query方向。
小结
有关query的改写,我还停留在比较初步的水平,这次的文章阅读,打开了思路不少的思路,感觉还可以继续品读,用在更多的地方,