好想哭!微信视频号推荐大赛,居然输在了内存问题上!
Posted Wang_AI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了好想哭!微信视频号推荐大赛,居然输在了内存问题上!相关的知识,希望对你有一定的参考价值。
文章来自:炼丹笔记
作者:一元
背景
微信大数据挑战赛,已经进入复赛阶段,近亿级别的数据带来了很多挑战,很多暴力的方式去跑GBDT类的模型都产生了瓶颈,有些NN模型也是在暴力之下出现了很多训练问题。
很多朋友都会发现,修改embedding的大小能对深度模型带来非常大的影响,往往越大的embedding能带来更佳的效果,但是却因为Embedding内存的问题,没法直接用,或者只能采用Hash Trick的技巧来弥补,真的是遗憾啊,太遗憾了,想哭。不急不急,本文就带大家一起学习一下Embedding的内存问题的一种解法。
现代的基于深度学习的推荐系统利用了成百上千种不同的类别特征(Categorical Features),每一种分类都有数百万种,从点击到发布。为了符合类别数据中的自然多样性,Embedding将每个类别映射到嵌入到一个稠密的向量中。由于每个类别特征可能包含上千万个不同的可能类别(例如电商的商品个数很多都是上亿的),因此嵌入表在训练和推理过程中会出现内存瓶颈。
本文提出了一种新的方法,利用探索类别集合的互补划分为每个类别生成一个唯一的嵌入向量。基于每个互补分区存储多个较小的嵌入表,并结合每个表中的嵌入,可以以较小的内存开销为每个类别定义一个唯一的嵌入。这种方法可以解释为使用特定的固定码本(codebook)来确保每个类别的表示的唯一性。实验结果证明了该方法对于减少嵌入表的大小在模型损失和精确度方面的有效性,同时在参数上保留了相似的减少。
商余数技巧
01
问题
每个类别被映射到一个embedding向量表,数学上就是, 我们令
表示 的枚举。我们令 为对应的Embedding矩阵, 是Embedding的维度。
我们将每个类别( 都有一个索引 , 然后我们将其映射到一个dense向量中, ,
存储Embedding的空间复杂度为: 。
02
解决方法
2.1 Hash Trick
为了降低embedding表的存储代价,最为常用的策略就是使用简单的hash函数。例如求余函数,hashing trick ,给定一个embedding表, , 我们有 , 我们可以定义一个hsh矩阵,
我们的Embedding可以通过下面的方式得到:
对应算法如下:
该方法将原始embedding矩阵的大小从