前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >推荐系统embedding过大如何压缩?

推荐系统embedding过大如何压缩?

作者头像
张小磊
发布2023-09-22 21:33:51
5740
发布2023-09-22 21:33:51
举报

嘿,记得给“机器学习与推荐算法”添加星标


作者:王小新 链接:zhihu.com/people/xiaoxinwang

大模型理念伴随着深度学习发展似乎成为了大数据建模的银弹思路。搜广推场景的模型近几年的迭代也不例外,通过做大做复杂的迭代思路,在提升模型效果同时,也带来了高存储成本和高服务消耗的问题,给训练性能和推荐成本都来了严峻挑战。

作为应对,模型压缩等一系列效能优化技术开始作用到推荐模型,与模型压缩广泛应用的CV或NLP模型不同,推荐场景有其独特性:

(1) CV模型主要分布在网络层,而推荐模型体积大头在Embedding部分,也就是题主所需要解决的问题; (2) 推荐模型的训练实时性要求更高,并且有着千分位对齐的高精度要求,导致已有技术难以复用。

利益相关:正好做过这方面的技术迭代。下面按问题分析和3个技术方向讨论一下。

1. 问题分析

考虑到搜广推场景的特殊性,模型离线指标的千分位微小下降会给业务线上效果带来明显指标下降,因此在做推荐模型压缩时要保持模型精度不下降,这是个不小挑战。推荐大模型本身具有庞大参数,不同参数对模型预估的贡献更是明显趋于长尾分布,实践表明移除模型未被训练充分的低频key特征还能进一步提高表现,大模型比如存在过参数化和信息冗余的部分,这里面应该存在”模型效果不下降,模型大小显著压缩“的优化空间。

推荐模型结构拆解

搜广推模型主要由Embedding部分和网络层构成,由于稀疏特征数目可达到千亿级别使得超99%参数量分布在Embedding部分,网络层参数占比虽小但代表着模型计算复杂度。通常来说,Embedding层大小主要影响服务内存使用率,模型复杂度FLOPs主要影响了服务侧CPU使用量。要压缩单套机器成本,即需要从Embedding部分和网络层参数分开进行优化。从上图看出,Embedding部分构成可看作是一张三维表,各个维度分别代表:

(1) 行维度(Feature Key),即特征key空间压缩,可达到一个数量级收益; (2) 值精度(Value),从fp32格式压缩成int8或int4量化,最高可达到8倍压缩收益。 (3) 列维度(Embedding Size),即Embedding size维度压缩,通常有1~2倍压缩收益;

沿着这三个方向的思路,工业界其实都有了一些探索和落地,下面简单介绍下相关技术。

2. 行精度压缩

推荐模型中特征key数量服从二八分布,实际情况更为夸张是10%特征往往占到了模型中超过95%体积。这10%特征通常是ID特征以及相关交叉特征,比如user_id和item_id等往往规模很大,且在训练过程中动态更新非常频繁,是模型效果的重要支撑。为了控制模型规模,通常会利用单hash取模来限制某个特征的key数量,具体为对每个特征值的hash id进行取模,再把取模后的余数作为embedding索引,这样虽然压缩了模型体积,但会使得不同特征值映射到相同索引值取了相同embedding向量,进而损失模型效果。这类大特征的常用解决思路是引入一定程度的有冲突表达。

有冲突表达方面,在一定程度上舍弃一部分信息独特性,即通过设计合理的共享模式来达到模型体积和效果的平衡,设计模式可分成人为和随机。人为冲突设计一般是以特征在训练样本的频次作为阈值,高于阈值部分仍然保持无冲突映射关系,而低于阈值部分则统一冲突到某个默认值。人为冲突方式往往需要一定专家知识,且与特征淘汰相结合后往往切换得不够平滑。随机冲突设计一般是应用Hash函数,控制Hash空间来控制特征key数量。Hash技术通常不需要数据驱动,实现方式比较简单,在合理冲突率下达到模型压缩率和模型效果之间的不错平衡。

(1) Double Hash (NIPS 2017)

Double Hash方法 [1],开始是用在NLP领域来对单Hash嵌入方法的扩展,用多个互相独立的hash函数(T∈{1,...,B},有N个)来近似表征原有的更大hash空间(T∈{1,...,B^2})。该方法总结为如下二步:

① 定义k个互相独立的不同Hash函数,Hash空间均为T∈{1,...,B},对于任意一个输入key,从k个预定义好的B空间向量池里分别选择出一个唯一确定的向量vector; ② 把这k个向量vector进行结合,组合方式有sum、multiply或是concat等,或是接一个小DNN进行组合。

单hash方法和double hash技术的对比

(2) Hybrid Hash(RecSys 2020)

Hybrid Hash方法 [2]是Twitter在2020年提出的,是为了解决double hash大压缩率情况下效果损失的问题,并在效果无损前提下进一步提高压缩率。这里利用了长尾key本身训练得不太充分的现象,通过设定频率阈值来区分高频key和低频key,仅对低频key作用了double hash来维持和基线一致的模型效果,高频key仍然保持不冲突的一对一映射关系。这种方式属于在有冲突表达方面结合了人为和随机的一种设计模式。

Hybrid技术示意图

(3) QR Trick(KDD 2020)

QR trick [3] 是Facebook在2020年提出的,升级了double hash方法来提出了互补分区Quotient-Remainder Trick概念,即给定集合S的k个划分方式P1,P2,...,Pk,对于集合S里的任意两个元素a和b,存在一个互补划分方式使得a和b所属的划分结果在b和a分区里是均匀分布的。具体方法为在划分两个hash矩阵时,一个取模,一个取商,来降低hash整体冲突率并确保每个特征key表示的唯一性。文章里还探究更一般的互补划分方式和子空间结合模式,推荐阅读。

QR Trick方法伪代码说明

(4) Binary Code Based Hash (CIKM 2021)

Binary Hash[4]是阿里妈妈在2021年提出的,利用二进制码binary code来替代现有的取模操作方式,来解决embedding存储大的问题 [5],具体为:

① 利用二进制码binary code(比如13的二进制码为1101^2)来唯一对应每个特征值的Hash ID,不论embedding缩减成多大,都能够为不同的特征值赋予唯一的独特索引值,以解决“效果不降”挑战; ② 设计了分组合并策略来灵活调整embedding存储大小,通过提供压缩灵活性来满足不同场景(比如分布式服务器和移动设备)的embedding压缩需求。

Binary Hash方法技术示意图

后面还有一些研究,比如Deep Hash Encoder(KDD 2021),通过one-hot->float vector来保证唯一性,但仍然停留在探究阶段,效果不如one-hot模式。

3. 值精度压缩

深度学习模型在训练过程中的优化结果一般只是达到局部最优,模型参数具备一定的抗抖动性。量化是通过对值精度维度压缩,把神经网络中参数存储格式从FP32-32位浮点降低为更低精度表示(FP16-16位浮点、INT8-8位定点整数、INT4-4位定点整数)数值格式,在线上推理时再通过反量化(恢复回Float32)继续计算。

常用的量化方法分成两类:Post-Training-Quantization(PTQ)和Quantization-Aware-Training(QAT)。

(1) PTQ又称为后训练量化,也就是不修改模型训练,只在模型推送的时候做模型量化。这种方式一定会比原模型损失精度,但是便捷快速,会增加一个反量化的计算代价。 (2) QAT又称为训练中量化,一般是通过在原来模型中插入伪量化(Fake-Quantization)节点,在训练时模拟量化引入的误差,通过梯度下降来微调模型权重,统计并更新量化参数,要修改训练代码。

在推荐模型中的应用:

(1) dense层量化:业界一般不量化dense层,因为推荐系统dense层较浅,参数集中在emb层,量化精度损失大容易影响效果,为了加速,快手有做fp32->fp16的优化,但是也没有推全。 (2) emb层量化:emb层的参数存在比较严重的幂率分布,压缩和量化空间较大,能压缩通信和内存。

业界一般压到int8量化基本无损,内存压缩到原来的30%;量化功能本身十分稳定,进一步的INT4实际上也有很大应用空间。

4. 列维度压缩

列维度压缩,也叫作变长emb size,核心思路是对不同重要度和收敛度的特征分配不同emb size。在实际操作中,有用到梯度方式、强化学习或者优化约束等一系列方法,主要在解决两个问题①转化成连续可导的问题;②引入特征的side information来增强controller信息。

AutoEmb方法示意图

作为典型,可以看下字节的autoemb论文[5],具体为:

①先是把不同特征映射到了不同维度,再利用线性转换层映射到相同维度; ② 再采用soft selection方式,得到的最终embedding值是不同维度embedding的加权和。

要是觉得有用帮忙点个赞~

参考文档

  1. Double Hash: https://arxiv.org/abs/1709.03933
  2. Hybrid Hash: https://arxiv.org/abs/2007.14523
  3. QR Trick: https://arxiv.org/abs/1909.02107
  4. Binary Code: https://arxiv.org/abs/2109.02471
  5. AutoEmb: https://arxiv.org/abs/2002.11252
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-09-19 08:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与推荐算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 问题分析
  • 2. 行精度压缩
    • (1) Double Hash (NIPS 2017)
      • (2) Hybrid Hash(RecSys 2020)
        • (3) QR Trick(KDD 2020)
          • (4) Binary Code Based Hash (CIKM 2021)
          • 3. 值精度压缩
          • 4. 列维度压缩
          • 参考文档
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档