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

很多朋友都会发现,修改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

weixin.qq.com/r/XSjP1zr (二维码自动识别)

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

  1. 推荐系统炼丹笔记:RecSys2020-SSE-PT解锁序列数据挖掘新姿势

    作 者:一元 公众号:炼丹笔记 背景 现在诸多的推荐算法在处理时间信息上, 除了在自然语言常用的RNN,CNN等模型, 就是基于Transformer的模型,但是和SASRec类似, 效果不错,但是缺 ...

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

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

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

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

  4. 推荐系统炼丹笔记:用户评论在推荐中的应用

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

  5. 推荐系统炼丹笔记:令人着迷的时间动态CF算法

    作 者:一元 公众号:炼丹笔记 背景 本文是一篇较老的文章,是Yahoo的研究员关于协同过滤中时间动态建模的最为细致的讨论. 顾客对产品的偏好随着时间的推移而变化.随着新选择的出现,产品的认知和受欢迎 ...

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

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

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

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

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

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

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

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

最新文章

  1. arcgis xml 下载 切片_vue/cli3整合Cesium,加载离线arcgis 切片
  2. Eclipse无法连接真机 并非ADB被占用 原因 很2 已解决 记录之
  3. ERROR: Could not read unit serial number!
  4. LeetCode 6039. K 次增加后的最大乘积(优先队列)
  5. 引用类型和原始类型的对比(java)
  6. 8个成语接龙首尾相连_成语接龙(至少8个)
  7. 音视频开发(31)---H.264格式分析
  8. 刚刚,华为发布全球首款 5G 基站核心芯片!
  9. 你是否理解js的Object与Function与原型链
  10. JSP技术之JavaBean
  11. 单片机C语言的编译模式,手把手教你学单片机的C语言程序设计六编译预处理.pdf...
  12. 计算机识别外设原理,车牌识别系统的识别原理及触发方式
  13. 几何画板椭圆九种画法_详解椭圆的五种画法,很全面!!!
  14. 数据库设计-简化字典表
  15. Ajax传递二维数组至后台ThinkPHP控制器
  16. win10如何安装多个jdk并实时进行切换【建议收藏】
  17. Ali-Perseus(擎天):统一深度学习分布式通信框架 [弹性人工智能]...
  18. 对接应用宝SDK(YSDK)QQ能登录微信无法登陆的一些解决方法**
  19. 【GraphVisual】画节点与线以及移动节点线随着移动
  20. 通过一个例子快速上手矩阵求导

热门文章

  1. Oracle SQL语句执行过程
  2. weevely-------linux中的菜刀(转载)
  3. ASP.NET定时调用WebService 运行后台代码
  4. Enterprise Library: Configuration Application Block类设计分析篇
  5. JavaWeb(四)——在IDEA中配置Tomcat、pom文件
  6. 机器人学习--ROS/AMCL实现初始化粒子撒满整张地图和分步收敛
  7. 光流 | 光流交流群
  8. EM算法matlab和Java实现
  9. php data 算出差几天,出差天数一般怎么算。。。
  10. GetLastError()和FormatMessage()