大厂算法应用实践 — 搜索

less than 1 minute read

Published:

早期接触 DaTaFun Talk 时就发现他们有很多不错的工业界的算法实践分享, 且都有高质量的公众号推文, 当时就想着有时间把这些文章理一理, 但可惜一直没有行动. 这次查询相关方案时发现了不少很有价值的文章, 顺带着把看到的记录一下😁

这里记录的文章大部分是来自 DataFun 的, 也有一些是来自其他地方的, 比如知乎等.

1. XGBoost在携程搜索排序中的应用

这个应该是携程早期的排序模型了, 如 XGBoost排序实践流程 所示.

XGBoost排序实践流程

这篇文章主要从特征工程实践, 模型工程实践进行了介绍. 里面重点可以参考的是其模型调优的过程:

  • Step 1:选择一组初始参数;
  • Step 2:改变 max_depth 和 min_child_weight;
  • Step 3:调节 gamma 降低模型过拟合风险;
  • Step 4:调节 subsample 和 colsample_bytree 改变数据采样策略;
  • Step 5:调节学习率 eta;

2. 知乎搜索排序模型的演进

一次搜索流程主要包括 Query 解析、召回、排序几个阶段. 用户输入 Query 之后, 首先要进行 Query 解析, 生成查询 Query Tree 和语义表示向量. 之后进入多队列的召回模块, 召回阶段从召回方式上说可以分为倒排召回和向量召回, 在这一环节会筛选出前400的文档进入到排序阶段. 排序阶段又分为精排和重排序两个环节, 精排阶段通过模型对多召回源的文档进行统一打分, 之后将 Top16 的文档送入重排序模型进行位置的微调, 最终呈现给用户. 如 知乎搜索架构 所示.

知乎搜索架构

该文主要分享精排和重排序阶段两部分的模型演进, 如 知乎的搜索算法发展 所示. 可以看到其团队采用的技术从树模型过渡到了深度模型. 主要体现在 L2R 模型的演变.

知乎搜索算法发展历程

知乎的 DNN 排序模型整体是在谷歌的 TF-Ranking 框架的基础上开发的. 整体的代码结构根据训练流程可以拆分成: 特征输入, 特征转化, 模型打分和损失计算等几个独立的模块.

  • 特征输入模块, 将 Query特征、相关性特征、文档质量特征和历史点击特征等输入模型;
  • 特征转化模块, 做一些常见的特征处理工作, 比如取 log、归一化、onehot 和类别特征转 Embeding 等;
  • 模型主体结构部分包括主网络部分、 End2End 部分, SeRank 部分,Unbias tower 部分和 MOE 方式实现的多目标排序部分;

文中介绍了一些常见的排序模型, 大部分都是 PointWise 类型的, 但是并没有过多的介绍其实现、工程化时的细节, 例如具体选择什么目标来进行建模.