Memory-efficient Embedding for Recommendations (WWW21)!

在工业界使用深度学习算法做大规模的搜索推荐问题,不可避免的都会碰到下面的几个问题:

  1. 过大的embedding给机器带来过大内存负担的问题,例如一些成熟的平台,都有上千万的用户,还有上几十亿的商品,这些embedding带来的负担是非常巨大的;
  2. 我们有成百上千的特征字段,每个特征的基数大小不一,而我们经常会将其一起编码为一样的维度,这可能是不合理的,如何根据特征场的重要性和可预测性,为不同的特征场分配不同的Embedding维数是非常重要的。

本文我们重点讨论第二个问题,因为大量的特征Filed以及Embedding维数与特征分布和神经网络结构之间的微妙关系,在实际的推荐系统中手工分Embedding的维数是非常困难的,本文提出了一个基于AutoML的框架AutoDim,该框架能够以数据驱动的方式自动选择不同特征Filed的维数 。

本文提出的框架如上所示,一共分为两个阶段:

1. 维度搜索阶段

它的目的是为每个特征Field寻找最佳的Embedding维数。

更具体地说,我们首先通过embedding lookup 步将具有不同维度的候选嵌入分配给特定的分类特征;然后,我们通过一个变换步骤来统一这些候选嵌入的维数,这是因为第一个MLP层的输入维数是固定的;

接下来,我们通过计算所有变换后的候选嵌入的加权和,得到该分类特征的形式化嵌入,并将其输入到MLP组件中。在训练集上学习DLRS参数,包括嵌入和MLP层,而在验证集上优化候选嵌入的体系结构权重,从而防止框架选择过拟合训练集的嵌入维度[24,29]。

在实践中,在DLRS参数和体系结构权重的替代训练之前,我们首先为所有候选embeddings分配等效的体系结构权重。固定这些体系结构权重并预训练DLRS,包括所有候选embedding。

2. 参数再训练阶段

根据在维度搜索阶段学习到的框架的权重,为每个特征字段选择embedding维度,并在训练数据集上以端到端的方式重新训练DLRS参数的参数(即MLPs和选定的embedding)。注意:

  • 再训练阶段是必要的,因为在维数搜索阶段,模型的性能也受到次优embedding维数的影响,而在实际的推荐系统中,次优embedding维数是不理想的;
  • 由于大多数现有的深度推荐模型通过嵌入向量上的交互操作(如内积)捕获两个特征字段之间的交互,新的embedding仍然统一到同一维度。这些交互操作限制了embedding向量需要拥有相同的维数。

请注意,数值特征将通过bucketing转换为类别特征。

不同的特征域具有不同的基数和对最终预测的不同贡献。所以我们应该为不同的特征域提供不同的embedding维数。然而,由于特征域的数量庞大,以及embedding维数与特征分布和神经网络结构之间的复杂关系,传统的降维方法很难人工选择emebdding维数。

  • 一个直观方法是为每个特征域分配多个不同维数的embedding空间,然后DLRS自动为每个特征域选择最优的嵌入维数。

1. Embedding Lookup Trick

2. 权重共享embedding框架

对一个特征x,我们仅赋予d维度的emebdding,这么做的好处和坏处是:

  • 大大节省了存储空间;
  • 增加了训练时间;

由于现有DLRSs中第一MLP层的输入维数通常是固定的,因此它们很难处理各种候选维数。此处我们使用两种方式来处理

1. 线性变换

通过线性变化,我们将所有不同维度的向量映射到同一维度,然后我们再做BatchNormalization,并最终相加。

2. Zero填充

我们先做BatchNormalization, 然后通过使用0填充,得到相同的维度。

由于维度搜索阶段的次优Embedding维数也会影响模型的训练,因此需要一个只训练最优维数模型的再训练阶段来消除这些次优影响

1. 离散维数的推导

在在此训练的阶段,gumbel-softmax操作就不需要了,

2. 模型再训练

此处我们注意:

  • 现有的大多数深度推荐算法通过交互操作(如内积和Hadamard积)捕获特征字段之间的交互。这些交互操作要求所有字段的嵌入向量具有相同的维数

所以我们仍然需要转化到相同的维度,此处类似的,我们使用:

  • 线性变换:来自一个特征Field的所有嵌入共享相同的权重矩阵和偏差向量;
  • 零填充:不引入额外的可训练参数
  • AutoDim可显著提高推荐性能,并节省70%∼ 80% embedding参数。

本文提出的AutoDim,通过数据驱动的方式自动为不同的特征字段分配不同的嵌入维数。在现实世界的推荐系统中,由于特征场的数量庞大,以及嵌入维数、特征分布和神经网络结构之间的高度复杂关系,很难在可能的情况下将不同的维数手动分配给不同的特征场。因此,我们提出了一个基于AutoML的框架来自动选择不同的嵌入维度。

具体地,本文首先提出了一种端到端的可微模型,该模型以软连续的形式同时计算不同特征域在不同维度上的权重,并提出了一种基于AutoML的优化算法;然后根据最大权值,导出离散嵌入结构,并对DLRS参数进行重新训练。基于广泛使用的基准数据集,我们通过大量实验对AutoDim框架进行了评估。结果表明,我们的框架可以保持或实现稍好的性能,同时embedding空间也小了很多。

AutoDim,如何节省70%的存储空间同时还能大幅提效?

AutoDim:自动Embedding维度寻优,如何节省70%的存储空间同时还能大幅提效?相关推荐

  1. python路线寻优_使用模型预测控制和PID实现自动驾驶的车道保持

    本文为 AI 研习社编译的技术博客,原标题 : Lane keeping in autonomous driving with Model Predictive Control & PID 作 ...

  2. NeuralFinder:集成人工生命和遗传算法自动发现神经网络最优结构

    /* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ 张俊林 黄通文 马柏樟  薛会萍                一.为什么要做神经网络结构自动发现 从16年年中开始,我们开始 ...

  3. libsvm安装使用及网格搜索法参数寻优

    LIBSVM 是台湾大学林智仁( Chih-Jen Lin)教授开发的. 说明:本教程仅针对电脑为64位的计算机,如果是32位的计算机需要下载C语言编辑器进行手动编译. 1.下载libsvm ①下载地 ...

  4. python中算法(sklearn)的最优超参数寻优:skopt贝叶斯搜索

    python中算法(sklearn)的最优超参数寻优:skopt贝叶斯搜索 Jeff Dean在ICML 2019上进行了有关AutoML的演讲,并将自动化分为4个级别 手动构造预测变量,不引入学习的 ...

  5. Keras训练神经网络进行分类并使用GridSearchCV进行参数寻优

    Keras训练神经网络进行分类并使用GridSearchCV进行参数寻优 在机器学习模型中,需要人工选择的参数称为超参数.比如随机森林中决策树的个数,人工神经网络模型中隐藏层层数和每层的节点个数,正则 ...

  6. 【超参数寻优】量子粒子群算法(QPSO) 超参数寻优的python实现

    [超参数寻优]量子粒子群算法(QPSO) 超参数寻优的python实现 一.粒子群算法的缺点     二.量子粒子群算法     三.QPSO算法的python实现     参考资料 一.粒子群算法的 ...

  7. 【超参数寻优】粒子群算法(PSO) 超参数寻优的python实现

    [超参数寻优]粒子群算法(PSO) 超参数寻优的python实现 一.算法原理 1.粒子群算法的名词解释 2.粒子更新 二.PSO算法参数寻优的python实现 参考资料 粒子群优化算法(Partic ...

  8. 基于改进正弦余弦算法的函数寻优算法

    文章目录 一.理论基础 1.基本正弦余弦算法 2.改进正弦余弦算法 (1)基于双曲正弦调节因子和动态余弦波权重的位置更新 (2)基于拉普拉斯分布和高斯分布的动态混合变异 二.算法流程图 三.仿真实验与 ...

  9. 粒子群优化算法的寻优算法——非线性函数极值寻优Matlab

    粒子群算法的起源 1995年,受到鸟群觅食行为的规律性启发,James Kennedy和Russell Eberhart建立了一个简化算法模型,经过多年改进最终形成了粒子群优化算法(Particle ...

最新文章

  1. 10-GLBP Weighting //2.1.5(GNS3版本,后面都是如此注明)
  2. do-release-upgrade do not work
  3. 属于c语言高级参数的,c语言可变参数的取值
  4. USB口的红外条形码扫描器的另类使用
  5. C语言输入函数换行符赋给变量B,C语言程序设计第3章顺序结构程序设计.pptx-资源下载在线文库www.lddoc.cn...
  6. Linq to sql并发与事务
  7. mysql case quchong_处理mysql的查询语句去重案例一则
  8. picker从后台取数据
  9. org.apache.hadoop.fs.ChecksumException: Checksum error
  10. VHDL实验三:一位全加器、四选一多路选择器
  11. Windows 串口驱动下载地址 和 Firefly-RK3399开发板 入手指南
  12. log算子 和dog 算子
  13. 经典信息图表:2013 扁平设计 VS 拟物设计
  14. 7层计算机网络体系结构,【计算机网络7层体系结构】
  15. python绘图库seaborn_Python绘图库:Seaborn 介绍
  16. Python入门之烤地瓜练习
  17. 新浪微博PC端登陆js分析及Python实现微博post登陆
  18. 女性有十大超能力,你知道吗?
  19. 基于微信小程序的todo番茄钟设计与实现源码
  20. jQuery AJAX回调函数this指向问题

热门文章

  1. Vuex-状态管理模式
  2. 八.利用springAMQP实现异步消息队列的日志管理
  3. Python开发基础----异常处理、socket套接字基础1
  4. R语言处理Web数据
  5. spring4.2更好的应用事件
  6. Android 获取外网IP,实测有效
  7. 用c语言实现对n个进程采用“短进程优先”算法的进程调度_为什么Linux CFS调度器没有带来惊艳的碾压效果?...
  8. suparc服务器没信号,[SupARC平台常见问题帮助](2012-09-19更新)
  9. mysql 1046 3d000_老师 出现ERROR 1046(3D000): No Database Selected怎么办
  10. 机器人学习--Robotics 4:Perception(宾夕法尼亚大学COURSERA课程)