Embedding-based Product Retrieval in Taobao Search背景在大型电商平台比如淘宝中产品搜索已经成为用户购物的核心入口。搜索引擎通常分成多个阶段Match召回从海量商品中快速找出候选集合Pre-Rank / Rank / Rerank逐级提升候选商品的质量与排序召回阶段候选商品的质量直接决定了后续整个搜索流程的效果。传统倒排索引基于词匹配在短 query 和商品 title 之间很难理解语义关系。电商搜索的 query 通常极短仅几词难以仅靠词匹配充分表达用户意图。个性化需求不同用户即使问相同 query真正感兴趣的商品也不同。例如有人更偏好鞋子的品牌或风格另一人则更关注价格。传统检索方法难以满足这种个性化需求。在淘宝的长期实践中传统 EBREmbedding-based Retrieval系统具有两个明显问题召回结果与 query 的相关性不足尽管向量检索能捕捉语义相似性但在实际工业场景中难以精确匹配查询关键词相关性可控性低导致用户投诉增多以及难以修复的 Bad Case。训练目标与线上推理逻辑不一致许多 embedding 检索模型在训练时采用对比损失如 hinge loss、pairwise loss 等而推理时基于近邻相似度排序目标不匹配导致模型难以有效优化。模型框架MGDSPRMulti-Grained Deep Semantic Product Retrieval是一个 双塔two-tower嵌入模型用于向量检索召回用户塔User Tower• 输入query 及用户行为包括实时、短期和长期行为序列• 输出用户语义向量代表查询意图个性化商品塔Item Tower• 输入商品标题Item title 商品 ID 表征。• 输出商品语义向量检索时采用近似最近邻Approximate Nearest Neighbor, ANN算法查找与用户向量最接近的一组商品向量。用户塔多粒度语义表示由于电商 query 很短切分后平均长度不超过 3因此对每个 query 采用多粒度语义表示。单粒度1-gram将 query 拆分为多个单字表示。双粒度2-gram将 query 中相邻的两个字组合成词元进行表示。词粒度对 query 分词后得到的多个 term 进行向量表示。分词序列建模捕捉顺序关系将词粒度序列输入 Transformer取最后一层的输出向量。历史序列建模使用当前 query 的分词结果q_seg与历史 query 序列进行点积计算。混合表示将前五个表示相加得到一个稳健化表示最终多粒度矩阵: Concat所有的向量表示\begin{align} q_{1\text{-gram}} \operatorname{mean\_pooling}(c_1, \ldots, c_m), \\ q_{2\text{-gram}} \operatorname{mean\_pooling}(c_1c_2, \ldots, c_{m-1}c_m), \\ q_{\mathrm{seg}} \operatorname{mean\_pooling}(w_1, \ldots, w_n), \\ q_{\mathrm{seg\_seq}} \operatorname{mean\_pooling}(\mathrm{Trm}(w_1, \ldots, w_n)), \\ q_{\mathrm{his\_seq}} \operatorname{softmax}\!\left(q_{\mathrm{seg}} q_{\mathrm{his}}^{\top}\right) q_{\mathrm{his}}, \\ q_{\mathrm{mix}} q_{1\text{-gram}} q_{2\text{-gram}} q_{\mathrm{seg}} q_{\mathrm{seg\_seq}} q_{\mathrm{his\_seq}}, \\ Q_{\mathrm{mgs}} \operatorname{concat}\!\left(q_{1\text{-gram}}, q_{2\text{-gram}}, q_{\mathrm{seg}}, q_{\mathrm{seg\_seq}}, q_{\mathrm{his\_seq}}, q_{\mathrm{mix}}\right). \end{align}每个向量表示均需经过 Pooling 操作将其统一映射至固定维度使所有 Token 对最终表示的贡献趋于均衡。历史行为序列表示核心目标基于当前 query 的语义对用户历史行为进行筛选或聚合生成个性化表示同时允许模型在历史行为与当前 query 无关时自动关闭个性化。论文首先将用户在当前时刻之前的历史行为按时间窗口划分为三段。Real-time 序列 R_u紧贴当前时刻 t 的行为论文表述为 “before the current time step”对于实时用户行为序列其演化性较强因此采用 LSTM 建模行为随时间的动态变化获得全部隐藏状态。R^{u}_{lstm}\{h_1^u,\dots,h_T^u\}Short-term 序列10 天内、早于 R 的行为‘before R and within ten days’。短期序列更长但演化性不如实时序列充分因此直接输入 Multi-head Self-attention 以捕获多个潜在兴趣点。Long-term 序列1 个月内、早于 S 的行为‘before S and within one month’。长期行为序列仅包含四个维度Item、shop、leaf category 和 brand每个维度进一步细分为 click、buy、collect 三种行为类型。将各 embedding 直接接后经线性变换得到一个动作向量以降低线上计算开销。论文强调需在每个行为序列向量前插入一个全零向量。降噪赋予模型处理‘历史行为与当前 query 不相关’情况的能力模型可将注意力分配至零向量从而忽略历史行为用户历史往往杂乱而 query 通常简短且意图明确。物品塔该方法将每个商品编码为一个适用于近似最近邻ANN召回的向量 H_{\text{item}}仅利用商品 ID 和标题文本两类信息构建表征。对商品 ID通过查表获取其嵌入向量 e_i对商品标题文本先分词得到词序列再对各词向量进行 Mean-Pooling然后经线性变换和激活函数处理最后与 [其他向量] 相加得到商品表征向量。H_{\text{item}} e_i \tanh!\left( W_t \cdot \frac{1}{N} \sum_{j1}^{N} w_j \right)作者指出商品标题更接近“关键词堆叠”而非自然语言句子因此相比 LSTM 或 Transformer 等上下文建模方法Mean-Pooling 在效果和效率上更为简洁有效。在线服务阶段所有商品向量预先离线计算并构建 ANN 索引召回时以用户塔输出的向量与 H_{\text{item}} 进行内积打分实现高效候选生成。训练目标训练采用 Softmax Cross-entropy交叉熵并且在工程上用 Sampled Softmax 来近似全量 Softmax同时在 Softmax 里加入了 温度 \tau并把生成的 I_{mix}先挑选出一些难度大的负样本 I_{hard}, 再将正样本向量和负样本向量I_{hard}做线性插值, 得到I_{mix}加入分母。1) 概率\hat y(i^|q_u) \frac{\exp(F(q_u,i^)/\tau)} {\sum_{i\in I\cup I_{mix}}\exp(F(q_u,i)/\tau)}其中 F(\cdot) 是用户向量与商品向量的点积, I\cup I_{mix}其作用是让模型学会区分正样本和“正样本附近的相似向量”。2) loss交叉熵L -\sum_{i\in I} y_i \log(\hat y_i)在单正样本one-hot情况下基本就是这样-\log \hat y(i^|q_u)。