1. 问题背景
商品检索的主要的问题还是在于用户query和商品描述之间存在GAP,特别是中长尾query。把问题分成以下几种类型:
- 多种描述:划痕笔/补漆笔/修补笔/点漆笔
- 信息冗余: 冰箱温控器温度控制==冰箱温控器
- 属性检索: 118冰箱、60寸液晶电视机4k高清智能60曲面
- 宽泛意图: 超美吊灯、大容量冰箱
2.所做工作
query改写的目标空间可以分为文本空间和意图ID空间两种类型:文本空间包含词、短语、query,意图ID空间主要包括pidvid、性别年龄尺码等自定义tag、一些语义聚合的标签如:"奢侈","可爱"等。所以我们的工作还是主要基于以下两种形式:
- 向量化改写:query映射到query,主要针对"多种描述"和"信息冗余"类型
- 意图ID改写:query映射到意图ID,主要针对"属性检索"和"宽泛意图"类型
2.1 向量化改写
向量化改写的基本流程仍然是:query向量化⇒向量相似查找⇒相关性判断
2.1.1 query向量化
主要优化点在于通过尝试一些有效的向量化方法,对任意query向量化。下面介绍一下我们的做法:
- seq2seq
- 完全无监督
- i2i扩展
2.1.1.1 seq2seq
这里我们借鉴的是Skip-Thought Vectors[1],这个算法试图通过seq2seq重建句子周围的句子,如下图所示:
模型的目标函数也是两个部分,一个来自于预测下一句,一个来自于预测上一句。如下式:
我们从session中获取训练预料,假设某个session序列是(s1,s2,...,sn),那么一条训练数据就是(si-1,si,si+1),encoder是si词序列的lstm,decoder是分别si-1和si+1的lstm.这样训练下来decoder的上下文向量就学到了这个句子在session中的上下文表示。
其实除了query session,用query来重建其点过的宝贝标题序列同样适用,只不过decoder阶段换成query点过的标题。
2.1.1.2 完全无监督
这里我们主要借鉴的WR方法[2],作者在论文中证明:在维基百科上的非标签语料库中使用流行的方法训练word embedding,将句子用词向量加权平均,然后使用PCA/SVD修改一下 。 这种权重在文本相似性任务中将效果提高了约10%至30%,并且击败了复杂的监督方法,包括RNN和LSTM, 它甚至可以改善Wieting等人[3]的embeddings.
算法如其名,主要分为W和R两个步骤:
- W:就是词向量加权平均的时候的权重。
- R:使用PCA/SVD remove向量中的common部分。
根据query的描述文本的类型,我们产出了两种向量:
(1) 基于query自身的词。
(2) 基于query和query点击的宝贝标题的词。
针对上述第二种类型,在原有算法的基础上,我们做了一些改进:
- 互信息权重
query点了一些标题,并不是对标题中的所有词感兴趣,对于相关性任务来说,理论上我们只关注和query最相关的词,所以在W阶段我们加入词和query互信息的权重MI(q,w),即a/(a+p(w))⇒MI(q,w)*(a/(a+p(w))),对应的|s|也根据MI(q,w)进行了scale.
适当加大query自身词的权重:基于review case发现因为线上已经上了相似query改写/意图改写(标题中可能缺失了一些词),导致原始query自身的某些词被attention的权重偏低。更好的做法是把点击的对象的更多属性参与向量化,比如点击的pidvid,意图id等。
2.1.1.3 i2i扩展
对一些依赖行为的算法,对于一些行为偏少的长尾query通过宝贝的i2i来扩展,可以扩大计算的覆盖率和准确度。这部分我们做了以下工作:
- 直接召回query历史点击宝贝的i2i宝贝
- 协同过滤算法的扩展:q对应的item越多,基于item的CF算法覆盖率越高。针对中长尾query我们用i2i扩展了点击行为。
- 基于点击数据的WR方法:对于点击少于20的长尾query利用i2i扩展点击数据优化embedding
2.1.2 向量相似查找
目前候选query集合设置的500W左右,而需要计算相似的query集合数据量已经到9亿+,相似搜索是一个非常大的计算量。计算步骤如下:
- 1.对候选query集合进行kmeans聚类成C个簇
- 2.遍历C个簇中心查找余弦距离最近的topM个类
- 3.然后遍历topM个簇中的点获取topK个相似
2.1.3 相似判断
这里我们训练一个query相似度的模型。下面介绍下主要部分:
2.1.3.1 样本选取
深度模型依赖大量的样本喂养,而接近于真实分布的样本一直是一个难点。我们主要尝试了以下方式:
- 行为反馈获取样本
query下有不同的改写串rewq,计算出各个rewq所带来的召回和收益情况(点击+成交),通过收益的gap筛选正样本和负样本。 - 从相关性任务中迁移样本
改写和相关性是联动的,query和宝贝相关性的样本可以迁移过来使用。比如:一个宝贝和一个query不相关,那么这个query和点击到这个宝贝的所有query理论上都不相关。 - 弱标签:好处是数据丰富,获取相对容易,比如:
a) q1和q2的相似度我们用(q1,q2点击标题)的bm25或者(q2,q1点击标题)的bm25来构造弱标签。
b) 用q1和{q2下挂宝贝}的相似度来衡量q1和q2的相似度:用q1去attention q2点击doc中的词,然后向量化和q1 attention自身doc的词向量化距离进行比较,选取一些高置信度的作为label.
c) 用简单模型的输出结果来获取样本,用我们已有的GBDT模型来预测,取得分数高于一定阈值或者低于一定阈值的分别作为正样本和负样本。
规则构造样本
比如:使用同义词和冲突词的片段替换分别构造正样本和负样本
2.1.3.2 模型训练
高频词和短语通过语言模型或者点击文档能获取很多扩展的语义,容易获取高质量的embedding。而长尾query由于行为稀少,单存依赖自身信息获取embedding的质量通常不理想。调研了一下基于Skip Convolution或BiLSTM+Self-attention,通过合理设计联合训练网络,把词和短语级别丰富的embedding信息迁移到长尾query上,实现提升长尾字符串embedding质量的目标。
- 网络的左半部分:
主要为了学习query在“session”、“点击”、“query自身”三个维度的融合表示,在相似q任务上我们继续更新和query相关的向量
三个维度主要目的在于学习词,短语粒度的语义信息,泛化到所有query。每个维度的query model可以使用跳跃卷积(skip-cnn),主要是考虑商品搜索的query对term位置的信息较为不敏感,也可以选择双向lstm+attention.
其实这个思路和我们的评测人员的思路很像,评测两个query是否相关,除了一个整体判断,更多的是把query拆解成一些‘短语’去判断。
- 网络右半部分
第二部分主要是为了解决相关性判定的问题,用了一个二分类的模型;这里把q-q pair的特征也作为网络的一部分输入
2.2 意图ID改写
对于意图比较宽泛的query,比如畅销手机,大容量冰箱,虽然在query向量改写中会有所体现,但是对于行为较少的query改写的还是不太理想。我们采取的做法是把他们映射到我们的意图id空间,比如价格,销量,pidvid,年龄,性别,尺码,季节,新品等,知识图谱的数据在这里得到了应用。
3 展望
上述的query改写给我们的目标带来了较大的提升。可以想象query改写的空间依然是巨大的。
对于深度模型我们会继续做,考虑query生成的思路特别是强化学习选词,Query向量的表征空间扩展到属性空间,图像空间甚至是用户空间。关于改写的目标,相关性是基础,但绝不是最终目标,后续会考虑目标改写query的价值甚至是个性化改写。
"相似"对应衡量query之间的关系还是太粗了,后续我们要把query改写的类型明确化,比如同义和蕴含(上下位),对于query之间的关系我们正在尝试一些方法[4]来挖掘。后续我们计划挖掘更多的知识,并考虑如何把知识融入到模型之中。
参考文献:
1.Ryan Kiros, Yukun Zhu, Ruslan Salakhutdinov, Richard S. Zemel, Antonio Torralba, Raquel Urtasun, Sanja Fidler. Skip-Thought Vectors
2.Sanjeev Arora, Yingyu Liang, Tengyu Ma. A Simple but Tough-to-Beat Baseline for Sentence Embeddings
3.John Wieting, Mohit Bansal, Kevin Gimpel, and Karen Livescu. Towards universal paraphrastic sentence embeddings
4.Ruiji Fu , Jiang Guo , Bing Qin.Learning Semantic Hierarchies via Word Embeddings