作  者:一元
公众号:炼丹笔记  

很多朋友都会发现,修改embedding的大小能对深度模型带来非常大的影响,往往越大的embedding能带来更佳的效果,但是却因为Embedding内存的问题,没法直接用,或者只能采用Hash Trick的技巧来弥补,真的是遗憾啊,太遗憾了,想哭。不急不急,本文就带大家一起学习一下Embedding的内存问题的一种解法

现代的基于深度学习的推荐系统利用了成百上千种不同的类别特征(Categorical Features),每一种分类都有数百万种,从点击到发布。为了符合类别数据中的自然多样性,Embedding将每个类别映射到嵌入到一个稠密的向量中。由于每个类别特征可能包含上千万个不同的可能类别(例如电商的商品个数很多都是上亿的),因此嵌入表在训练和推理过程中会出现内存瓶颈。

本文提出了一种新的方法,利用探索类别集合的互补划分为每个类别生成一个唯一的嵌入向量。基于每个互补分区存储多个较小的嵌入表,并结合每个表中的嵌入,可以以较小的内存开销为每个类别定义一个唯一的嵌入。这种方法可以解释为使用特定的固定码本(codebook)来确保每个类别的表示的唯一性。实验结果证明了该方法对于减少嵌入表的大小在模型损失和精确度方面的有效性,同时在参数上保留了相似的减少。

商余数技巧

1 问题

每个类别被映射到一个embedding向量表,数学上就是, 我们令

2 解决方法

2.1 Hash Trick

我们的Embedding可以通过下面的方式得到:

对应算法如下:

该方法将原始embedding矩阵的大小从O(|S|D)降低为O(mD), 因为m<<|S|,但这么做会将非常多不一样的类别映射到同一个embedding向量,导致模型的质量大大下降,当然这么做也没法为每个类别变量产出一个唯一的embedding向量。

2.2 quotient-remainder trick

我们令""表示正数除法, 或者是商操作, 使用两个互补的函数:一个正数商,一个余数函数,这么做我们就可以得到两个单独的embedding表,这么做我们就可以对每个类使用唯一的embedding向量进行唯一的表示。

3. 互补分割

注意,给定分区的每个等价类都指定一个映射到嵌入向量的“bucket”。因此,每个分区对应于一个单独的嵌入表。在互补分区下,每个分区产生的每个嵌入通过某种操作组合后,每个索引映射到一个不同的嵌入向量。

3.1 一些例子

更加抽象的, 我们还可以根据应用程序定义更多的互补分割。回到我们的汽车例子,我们可以根据年份、品牌、类型等对其进行定义分区。假设这些属性是唯一规范的,能对应一辆独一无二的汽车,那么这些分区确实是互补的。

4. 使用互补分割构建合成Embedding

对于每个分割,我们构建一个embedding表, 这样每个等价的类被映射到一个embedding向量,这些embedding可以通过一些操作进行组合生成一个合成的embedding或者直接作为一个单独的稀疏特征。特征生成的方法虽然高效,但是也会大大增加参数的量。

为了生成我们的合成embedding,们将给定类别的每个embedding表中所有对应的嵌入进行交互,以获得最终的embedding向量。

4.1 基于路径的合成embedding

生成嵌入的另一种方法是为每个分区定义一组不同的转换(第一个embedding表除外); 特殊地, 我们可以使用一个分区来定义一个初始embedding表,然后通过其他分区确定的函数组合来传递初始嵌入,从而得到最终的嵌入向量.

我们将这种嵌入公式称为基于路径(path-based)的组合嵌入,因为组合中的每个函数都是基于来自每个分区的唯一等价类集来确定,从而产生一个唯一的转换“路径”。这些转换可能包含参数,这些参数也需要与网络的其他部分同时训练。

1. 合成特征

  • 当使用阈值化时,结果更加细微,性能的提高取决于所考虑的操作。特别是,我们发现元素级乘法最适合DCN,而级联操作更适合Facebook DLRM。
  • 对于DLRM,我们能够观察到相对于基线的0.7%的误差到0.5%的误差的改善,同时保持了大约4倍的模型尺寸减小。

2. 基于Path的合成Embedding

使用较小的网络可能更容易训练,但可能无法充分转换Embedding,而较大的网络可能具有更大的能力适应更复杂的转换,但需要学习更多的参数。

3. 权衡的讨论

  • 商余trick可以对类别数据施加任意的结构,这会在内存和效果上产生一个trade-off。一个更大的embedding表可以带来更好的效果, 但也会增加非常多的内存消耗。大多数模型的性能随着参数的数量呈指数级下降
  • 这两种类型的合成嵌入通过在生成每个类别的嵌入时隐式地强制执行由互补分区定义的某些结构来减少参数的数量。因此,模型的质量应该取决于所选的划分反映范畴集及其各自嵌入的内在属性的紧密程度
  • 基于路径的组合嵌入也可以产生更具计算性的模型,其优点是模型复杂度较低,但是基于路径的组合embedding不能取代基于operation的组合embedding;

小结

本文采用quotient-remainder的技巧降低高基数类别在Embedding表中出现的内存瓶颈。缓解了Hash Trick等技术带来的冲突问题,使得我们每次都可以得到一个唯一的embedding表示。

这种技巧虽然可以令每个类别获得唯一的embedding向量表示,但是中间存在多个约束(相乘,取余等必然会导致拆解的多个embedding之间出现共享),所以这种约束会对模型最终的影响是多少,仍然是一个值得思考的问题。比如拆解为两个embedding矩阵表示和10个embedding矩阵表示,虽然节省了内存,但是最终的效果也会下降很多,如何设计既能缓解冲突又能尽可能维持效果是一个值得探讨的问题。

参考文献

  1. Compositional Embeddings Using Complementary Partitions for Memory-Efficient Recommendation Systems:arxiv.org/pdf/1909.0210

推荐系统炼丹笔记:Embedding在内存问题上的一种解法相关推荐

  1. 推荐系统炼丹笔记:好想哭,我居然输在了内存问题上!

    作 者:一元 公众号:炼丹笔记 很多朋友都会发现,修改embedding的大小能对深度模型带来非常大的影响,往往越大的embedding能带来更佳的效果,但是却因为Embedding内存的问题,没法直 ...

  2. 推荐系统炼丹笔记:EdgeRec阿里边缘计算推荐系统

    作者:一元 公众号:炼丹笔记 背景 推荐系统(RS)已经成为大多数web应用程序的关键模块.最近,大多数RSs都是基于云到边缘框架的瀑布式的,其中推荐的结果通过在云服务器中预先计算传送到edge(例如 ...

  3. 推荐系统炼丹笔记:推荐系统Bias/Debias大全

    作者:一元 公众号:炼丹笔记 背景 在实践中,做推荐系统的很多朋友思考的问题是如何对数据进行挖掘,大多数论文致力于开发机器学习模型来更好地拟合用户行为数据.然而,用户行为数据是观察性的,而不是实验性的 ...

  4. 推荐系统炼丹笔记:阿里边缘计算+奉送20个推荐系统强特

    作者:一元 公众号:炼丹笔记 背景 推荐系统(RS)已经成为大多数web应用程序的关键模块.最近,大多数RSs都是基于云到边缘框架的瀑布式的,其中推荐的结果通过在云服务器中预先计算传送到edge(例如 ...

  5. 推荐系统炼丹笔记:大规模推荐Deep Retrieval

    作 者:十方 公众号:炼丹笔记 (1)Why Deep Retrieval? 一个规模较大的推荐系统,需要解决的核心问题就是如何从百万甚至亿级别的候选集中快速找到最相关的top-k个候选.以前的解决方 ...

  6. 推荐系统炼丹笔记:Deep Retrieval

    作 者:十方 公众号:炼丹笔记 (1)Why Deep Retrieval? 一个规模较大的推荐系统,需要解决的核心问题就是如何从百万甚至亿级别的候选集中快速找到最相关的top-k个候选.以前的解决方 ...

  7. 推荐系统炼丹笔记:边缘计算+奉送20个推荐系统强特

    作者:一元 公众号:炼丹笔记 背景 推荐系统(RS)已经成为大多数web应用程序的关键模块.最近,大多数RSs都是基于云到边缘框架的瀑布式的,其中推荐的结果通过在云服务器中预先计算传送到edge(例如 ...

  8. 推荐系统炼丹笔记:阿里推荐算法特征交叉新方式CAN

    作 者:一元 公众号:炼丹笔记 昨天看非常多的群友在讨论该篇文章,很是好奇,今天就读了一下,个人感觉本文的co-action操作还是第一次碰到,但该方案在amazu等数据集上对比的方案还是较为弱的,所 ...

  9. 推荐系统炼丹笔记:多模态推荐之用户评论篇

    作者:一元 公众号:炼丹笔记 目前非常多的推荐系统主要使用用户的一些基础反馈信息来作为最终的标签进行模型的训练,例如点击/购买等,但是却鲜有文章去进一步挖掘用户的其它反馈,例如用户对于该产品的评论,很 ...

最新文章

  1. 自由意志是否受机器控制?
  2. 霸王洗发水经理被指冲击报社殴打记者
  3. Nacos 1.1.4 发布,业界率先支持 Istio MCP 协议
  4. 吴恩达 coursera AI 专项三第二课总结+作业答案
  5. (七)全半角转换(转)
  6. G6 图可视化引擎——简介
  7. SAP 电商云 UI 持续集成里 workflow 触发条件一览
  8. C# 中 Struct 和 Class 的区别总结
  9. 动态修改网页title
  10. 今天的虎兄才跳了过去的飞秋WZ132
  11. 把日志实时写入数据库
  12. php ci的session和php session,php及codeigniter使用session-cookie的方法(详解)
  13. php js 终止,使用Server-Sent Events(和Javascript / PHP)的连接会立即停止
  14. SCRT软件的使用教程
  15. android 功能防抖,Android RxJava 实际应用讲解:功能防抖
  16. 【119天】尚学堂高琪Java300集视频精华笔记(24-30)
  17. 萌娃投票程序php+mysql,PHP+MySql+jQuery实现的顶和踩投票功能
  18. 培训班出来的程序员现在怎么样了
  19. realtek card reader是什么软件
  20. 日均线,60日线,根据60线看行情,什么是多头排列

热门文章

  1. 229. Majority Element II
  2. leetcode Add and Search Word - Data structure design
  3. 记录MySQL下所执行的所有命令
  4. 用extjs4做个登录框
  5. 今週木曜日までの日程表
  6. mysql定位前后端问题_Web 前后端分离的意义大吗?
  7. 刚体运动中变换矩阵的逆
  8. 基于linux智能家居系统设计,基于Linux的智能家居的设计(2)
  9. python文件数据总和计算_python 计算文件夹里所有内容的大小总和
  10. printf不能直接输出string类型