我的小流量“转正”心得 --- 下载下方深度语义重排的实践

2023-10-19 19:20

本文主要是介绍我的小流量“转正”心得 --- 下载下方深度语义重排的实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、背景

二、通过数据分析找到的问题

三、迭代流程

迭代一:

迭代二:

迭代三:

迭代成功的原因:

知识扩展

四、hnswlib调优过程

五、附录

5.1 hnsw 超参选择


一、背景

  1. 在分发中下载带来的收入占比排列仅次于搜索。
  2. 下载资源的分发占比在一半以上。
  3. 下载资源是重要的收入来源之一。
  4. 下载相关推荐现有的策略大部分无法满足用户的需求。

二、通过数据分析找到的问题

  1. 下载资源中一半以上的资源都是曝光搜索词的。
  2. 在所有的下载资源中,有曝光搜索词的资源占比面积小。
  3. 博客和下载的曝光搜索词得分存在不准确性。
  4. 下载资源推荐结果存在无序的情况。

三、迭代流程

迭代一:

迭代方式:下载相关推荐下通过用户点击和下单行为进行重排

迭代失败原因:

  1. 用户在下载相关推荐下产生的点击过少,二级排序是针对于用户点击行为进行的加权处理。经统计,有曝光无点击的占比较高,导致二级排序的影响面很少,最终实验效果不明显。
  2. 为了避免整体收入波动大,实验上线后将策略安排在了2、3槽位,从不同实验相同槽位来看,新策略的收入和用户行为不如老策略,新策略落败。

总结:

  1. 下载相关推荐下无法做到像博客相关推荐一样的策略,下载推荐的点击量过少,而新策略是基于用户点击进行的排序。
  2. 在从槽位上对比发现,老策略召回的结果比较优,下一步打算从老策略调优入手。

迭代二:

迭代方式:下载相关推荐老策略通过ADA语义相似度计算距离,能将相似度最高的进行计算

迭代失败的原因:

  1. 词库中有曝光搜索词的资源只有百万资源,占比33%,覆盖面积较小,再加上实验只是小流量,导致在实验组中看到的召回率非常低。
  2. 老策略内部做排序是会把相同的曝光搜索词计算得分,但会出现结果全是新策略的资源,会把相关的资源挤到后面,导致结果不相关。

总结:

  1. 在现有的资源中做扩覆盖处理不是最优的选择,首先成本较大,并且覆盖面积较小,从实验数据中看出,召回率和收入微乎其微。
  2. 从扩覆盖中得知,扩覆盖是相当于把推荐结果进行了扩充并重排,何必不把原来的推荐结果重排,这是下一个实验的导火索。

迭代三:

迭代方式:下载相关推荐曝光搜索词通过ADA语义进行相似度计算,并根据相似度进行重排

全量上线原因:

  1. 这次挑选实验组时,挑选了一个在空跑期间收入较弱的一组,如果收入落败的组在新策略上线后能跟对照组拉平,则胜出。
  2. 从实验期开始,实验组的收入只有1天落败,在其他的同一天时间不同实验来看,实验组的收入大范围胜出。
  3. 扩量后,实验组的整体收入也高于对照组,并且点击率也有所上涨。

迭代成功的原因:

  1. 经统计下载资源中,推荐结果列表无排序的结果占比较大,下载资源中曝光搜索词得分一半以上较低,说明在现有的推荐结果中,部分推荐结果都是无排序结果。
  2. 首条结果是用户的首要选择,所以排序结果会对收入产生影响,通过语义排序,会提高用户体验。
  3. 吸取了前两个实验失败的原因,总结出对推荐结果进行重排才是重要原因。

知识扩展

语义计算:我们使用的是OpenAI第二代嵌入模型 text-embedding-ada-002将 SA资源的标题进行向量化,借助 hnswlib 完成向量索引库构建,通过余弦距离衡量两段文本之间的相关性。

GPT3采用Transformer的解码器:

text-embedding-ada-002在文本搜索、代码搜索和句子相似性任务上优于所有旧的嵌入模型,并在文本分类上获得相当好的性能,文本检索领域的评测结果: 

GOOD CASE:

 

四、hnswlib调优过程

1. hnsw超参调整,增加连接数量,召回从75.16%提升至80.21% ;详见附录5.1 hnsw超参选择
2. 前五十万样本建索引库召回率在96%,后四十多万建立索引库召回率只有 53%,分析发现24.7w 不同的 title向量存在重复,去除后召回率在96.7%;定位到原因:使用多线程批量访问OpenAI 向量化接口,hnswlib 对文本向量化存储时出现较多异常数据;
3. 重建向量索引库后,跟第一版相比top1 差异率:47.19%,自评 GSB=45:48:7;标注团队GSB=30:68:2;线上小流量实验落败,分析原因可能:query embedding 和 title embedding 分布存在差异,用于召回效果可能不太理想,尝试用于title to title的相似度重排,故尝试在下载下方相关推荐重排实验;
4. 对下载相关推荐中曝光搜索词召回结果使用文本向量相似度重排,胜出;

五、附录

5.1 hnsw 超参选择

  1. 选择 l2 距离还是 cosine 距离对召回率影响不大,但是cosine距离会更好一点;
  2. 扩大 候选list 大小ef 和 连接数M召回率会有提升,对应的创建索引库的时间和检索时间会增加; 

ef - the size of the dynamic list for the nearest neighbors (used during the search).

M - the number of bi-directional links created for every new element during construction.

第一版向量召回优化,recall 对比

recall

l2

cosine

耗时

ef = 100

75.16%

75.35%

37.4s

ef = 500

80.163%

80.21124%

11min36s

ef = 600

80.166%

80.21157%

28min09s

# m = 64

# ef = 500: 10min25s 0.8021080499165129

# ef = 600: 30min27s 0.8021146410053608

# m = 100

# ef = 200: 11min36s 0.8021124439757448

# ef = 600: 28min09s 0.8021157395201687

文章作者:李震 & 卫亮亮 & 李长皓 & 王品

这篇关于我的小流量“转正”心得 --- 下载下方深度语义重排的实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/241843

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

Java 结构化并发Structured Concurrency实践举例

《Java结构化并发StructuredConcurrency实践举例》Java21结构化并发通过作用域和任务句柄统一管理并发生命周期,解决线程泄漏与任务追踪问题,提升代码安全性和可观测性,其核心... 目录一、结构化并发的核心概念与设计目标二、结构化并发的核心组件(一)作用域(Scopes)(二)任务句柄

Java中的Schema校验技术与实践示例详解

《Java中的Schema校验技术与实践示例详解》本主题详细介绍了在Java环境下进行XMLSchema和JSONSchema校验的方法,包括使用JAXP、JAXB以及专门的JSON校验库等技术,本文... 目录1. XML和jsON的Schema校验概念1.1 XML和JSON校验的必要性1.2 Sche