当前位置: 首页 > 编程日记 > 正文

应用在大规模推荐系统,Facebook提出组合embedding方法 | KDD 2020

来源 | 深度传送门(ID: deep_deliver)

Facebook团队考虑embedding的存储瓶颈,提出了一种新颖的方法,通过利用类别集合的互补分区为每个类别生成唯一的embedding向量,无需明确定义,从而以端到端的方式减小embedding大小。通过基于每个互补分区存储多个较小的embedding table并组合来自每个table的embedding ,以较小的内存成本为每个类别定义了唯一的embedding 。可以将这种方法解释为使用特定的固定密码本来确保每个类别表示的唯一性。

实验结果表明,该方法比hash技巧更有效,同时也能使参数量减小,可减少模型损失和准确性,减少embedding table的大小。

问题

现有的推荐系统一般将类别特征用embedding表示,对于那种千万维度的特征,将其映射为100维的embedding 向量。这样需要大量的存储空间。

一种常见的方案就是hash,将类别hash到一个embedding index上。这样做的方法会导致很多类别共用一个embedding,这样会损失精度。因此提出一种方法,让特征的每个值都有一个独特的embedding于其对应,还可以减少整体embedding的存储大小。

模型

2.1.QUOTIENT-REMAINDER TRICK(商余技巧)

先来回顾一下embedding的做法,定义对于某个特征的所有取值:

有一个embedding矩阵如下,这里的D是embedding维度:

将特征进行one hot 编码:

然后映射到对应的低维embedding:

这样的一般做法需要的空间复杂度为(一般工业场景下S都特别大,这导致整体的空间复杂度很高):

为了解决S太大带来的空间复杂度个过高的问题,一般可以用hashing trick。就是先给定最大的embedding的行数m,这里的m远小于S,这样embedding矩阵为:

那如何映射特征的某个值到一个embedding向量呢?先定义一个hash矩阵:

取值为:

这样映射过程为:

具体的算法如下:

实际上就是将特征取值 i 来对事先定义好的 m 取模(整除取余),然后用这个余数作为这个特征值的embedding索引。这样空间复杂度就变为了:

这样很容易导致的不同的特征取值映射到相同的embedding,然后就损失信息了。因此提出了quotient-remainder trick方法,使用两个互补函数(整数商和余数函数),可以生成两个单独的embedding table,并以某种方式为每个类别生成唯一的嵌入的方式来组合embedding。具体见下面算法2,/为整除。

给定两个embedding tables,一个为m*D维,一个是(S/m)*D维。对于特征x的取值i,计算两个索引:一个是 i 对m取模,一个是整除(i/m)。然后emebdding look up出来两个embedding,两个embedding逐个元素相乘,获得最后的embedding。这样做,空间复杂度为:

整体的空间复杂度要比常规的那种hash trick要大一些,但是可以获得独一无二的embedding。

2.2.COMPLEMENTARY PARTITIONS(互补分区)

在商余技巧中,每个操作(商或余数)将类别集合划分为多个“存储桶”,通过将商和余数的embedding组合在一起,可以为每个索引生成一个独一无二的向量,同样,可以划分多个embedding,使用基本集理论集成多个embedding作为一个索引的表示,将此概念形式化为一个概念,称之为互补分区。

定义1:

给定集合S的k个分区 P1,P2….PK,这些分区是互补的。即对于集合S中任意两个元素a和b,总是存在一个分区,在这个分区关系下的a和b的等价类集合不同。关于等价类可以参考知乎:离散数学中的等价类是什么意思?- laogan的回答 - 知乎

举个例子:

(我理解就是对于每两个不同元素比如1和4,总有一种分区关系,让1和4存在两个子集中,像1和4在第二种分区关系下,它们就在两个分区子集里)

给定分区的每个等价类都指定一个映射到embedding向量的“bucket”。因此,每个分区P对应于一个embedding table。在互补分区下,在每个分区产生的每个嵌入通过某种操作组合之后,每个索引被映射到一个不同的embedding向量。(上面那个例子就是三个embedding table,第一个embedding table 有三行,后两个embedding table是两行)

2.3.互补分区的例子

a.朴素互补分区

b.商余互补分区

c.一般商余互补分区

d.中国的余数分区

考虑一个大于或等于S的两两互质因式分解

(我理解就是任意两个不同分区size的最大公约数等于 1 )

这种分区可以根据需要自由定义,可以根据年份、品牌、类型等定义不同的分区。假设这些属性的唯一规范生成一辆独特的汽车,这些分区确实是互补的

2.4.COMPOSITIONAL EMBEDDINGS USING COMPLEMENTARY PARTITIONS

为每个分区创建一个embedding table:

分区中每个等价类中的元素映射到同一个embedding 向量上。

对于某个特征取值x,它的embedding为:

可以有很多整合方法:

  • 拼接

  • 相加

  • 追元素相乘(hadamard积)

下面证明一下,这样做对于每个特征取值都可以获得一个独一无二的embedding:

这很简单了,(只要创建互补分区的时候,别让任意两个不同的特征取值在所有分区中的索引都相同就好了)

空间复杂度:

就是:

这里有个图很形象了:

2.5.Path-Based Compositional Embeddings

生成embedding的另一种方法是为每个分区定义一组不同的转换(第一个embedding table除外)。特别是,可以使用一个单独的分区来定义一个初始嵌入表,然后通过其他分区确定的函数组合来传递初始嵌入向量。

W是embedding table , M是传递函数。这里的传递函数,也一起训练。

这样的M可以是:

a.线性的

b.MLP

与基于操作的组合embedding不同,基于路径的组合embedding需要学习函数中的非embedding参数,这可能会使训练复杂化。内存复杂性的降低还取决于如何定义这些函数以及它们添加了多少附加参数。较小的参数情况下可以与基于操作的组合的空间复杂度相同。

结果

3.1.实验设置:

选择两个模型,DCN和Facebook内部的推荐模型。

3.2.数据集:

Kaggle 的 Criteo Ad Kaggle Competition,前6天训练,第7天预测。

优化器adagrad和amsgrad,batch128,无正则,embedding size 16,损失交叉熵。实施了4个哈希冲突,使模型大小减少了约4倍。每条曲线显示了5次试验中验证损失的平均值和标准差。

3.3.基本效果:

可以看到Q-R方法的loss比hash方法小很多,比FULL table的大一些,hash方法和Q-R方法的模型比FULL TABLE小了4倍。

3.4.不同组合embedding的效果:

为了更全面的比较,在每个特征中强制加入了很多hash冲突,得到的结果是5次试验的平均值。总体来说乘法运算的效果最好。

3.5.不同组合embedding的效果2:

因为不同特征,取值数量差别大,所以hash方法的阈值(hash的最大维度)对于效果也有影响,这里分不同阈值测试了效果:

3.6.Path-Based Compositional Embeddings效果

(效果好像一般哈。看来学习的方法不是万能的。)作者最后也提到了这个path based的方法,这种方法是计算密集型模型,模型复杂度低,但效果不太能取代操作base的方法,还需要深入的研究。

读后感:

方法还是很惊艳的,但是没有讨论时间复杂度,只讨论了模型的大小,我感觉时间复杂度还是要高了一些。但是整个思路还是非常好的,特别是最后的path based的方法,虽然效果不好,但是总感觉大有可为。

来源:https://zhuanlan.zhihu.com/p/267375732

论文地址:https://arxiv.org/abs/1909.02107

更多精彩推荐
  • 算力至上?四大AI芯片大对决

  • 韩辉:国产操作系统的最大难题在于解决“生产关系”

  • 直播电商都用上 AI 实时翻译了!歪果仁也能听懂李佳琦

  • 区块链赋能供应链金融|应用优势与四类常见模式

  • 蓝色巨人IBM全力奔赴的混合云之旅能顺利吗?

相关文章:

Android大图裁剪解决办法

某些功能需要拍照或者从相册选择照片后经过裁剪再上传的时候, cropp_w_picpath 可以调用手机自带的com.android.camera.action.CROP这个Intent进行裁剪 通过设置输出大小可以得到图片的大小: intent.putExtra(“outputX”, outputX); intent.putExtra(“…

day03-字符编码与转换

1、编码常识 在python 2中默认编码是 ASCII,而在python 3中默认编码是 unicodeunicode 分为utf-32 (占4个字节),utf-16(占两个字节),utf-8(占1-4个字节),所以utf-16 是最常用的unicode版本,但是在文件里存的还是utf-8,…

Asp.Net下的DataGrid的多层表头

先看下表: 业务员地 区 北京上海深圳张三100200300实际上Asp.Net下的DataGrid只不过是一个HtmlTable,只不过在HtmlTable的基础上添加了很多属性、方法,纳入ViewState机制,来生成、控制它;有了这一点认识,事…

Selenium的延迟等待

2019独角兽企业重金招聘Python工程师标准>>> Selenium的延迟等待分为 显式等待(Explicit Wait) & 隐式等待(Implicit Wait). 1.显式等待 显式等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到…

瞧瞧,这样的代码才叫Pythonic

来源 | Python编程时光(ID: Cool-Python)Python由于语言的简洁性,让我们以人类思考的方式来写代码,新手更容易上手,老鸟更爱不释手。要写出 Pythonic(优雅的、地道的、整洁的)代码,还…

linux基础(一)安装系统Centos6.5

安装有常用有:远程网络安装、U盘安装、光盘安装三种方式,以下为光盘进行安装1.出现引导界面,选择安装或升级现有系统,选择第一个安装系统。Install or upgrade an existing system 安装或升级现有的系统 install system with basi…

使用 .NET 对事件进行编程

作者:Ted Pattison  您可能已经对事件进行编程若干年了,但是迁移到 .NET Framework 仍然需要您重新检查事件的内部工作,因为 .NET Framework 中的事件位于委托的顶层。 对委托的了解越多,对事件进行编程时所具有的驾驭能力越强。 开始使用公…

tomcat项目自动发布脚本.脚本运行效果

./update -------------------------------------------------------------- | 确定特定用户执行,否则退出 | -------------------------------------------------------------- Yes,we are the user of testtomcat --------------------------------------------------…

11.11大促来袭,京东如何保障云安全?

2020年4月,国家发改委首次就“新基建”概念作出正式解释。云计算被纳入信息基础设施中的新技术基础设施。据IDC统计,2019年全球云计算基础设施规模超过传统IT基础设施,占全球IT基础设施的50%以上。云计算发展势如破笋,云计算也成为…

分享Kali Linux 2017年第11周镜像文件

分享Kali Linux 2017年第11周镜像文件 Kali?Linux官方于3月12日发布2017年的第11周镜像。这次维持了11个镜像文件的规模。默认的Gnome桌面的4个镜像,E17、KDE、LXDE、MATE、XFCE桌面的各一个,手机版的包括ARMEL和ARMHF。有最近要安装Kali?Linux系统的&…

实现无刷新DropDownList联动效果

在做一个文章添加功能时,想在选择大类后,自动将其所属二级小类显示出来,使用DropDownList的SelectedIndexChanged事件可以很容易实现,但每次选择后页面总要刷新一次,让人感觉很不爽。为实现DropDownList无刷新二级联动…

偷天换日,逼真的天空置换算法

责编 | 晋兆雨来源 | Jack Cui头图 | CSDN付费下载于视觉中国前言天空,是摄像中的一个关键元素。游戏的天空,我们可以随意调节,可以是晴空万里,也可以是风雨交加。现实的天空,我们也可以使用算法进行调整,算…

office2003/2007/2010版本降低宏安全设置方法

如果在公司内部环境中,因为各种系统对Office环境的要求,需要通过降低Office宏安全性的方法来提高系统访问效率的话,可以参考一下方法设置。 Office2003所需的设置如下: 1、打开Office2003,选择"工具"&#x…

【WEB API项目实战干货系列】- API登录与身份验证(三)

上一篇: 【WEB API项目实战干货系列】- 接口文档与在线测试(二) 这篇我们主要来介绍我们如何在API项目中完成API的登录及身份认证. 所以这篇会分为两部分, 登录API, API身份验证. 这一篇的主要原理是: API会提供一个单独的登录API, 通过用户名&#xff0…

ASP.NET中的页面指示标识

页面指示标识 的功能是用来确定在处理aspx文件的时候&#xff0c;需要系统做一些什么特殊的设定&#xff1f;它的语法是&#xff1a;<% directive attributevalue %> 比如&#xff1a;<%import namespace"System.Data"%> 注意属性之间需要空格&#…

⑨③-不能浪费拥有的年轻资本

⑨③-不能浪费拥有的年轻资本 老男孩语录⑨③-不能浪费拥有年轻资本 万两黄金易得&#xff0c;年轻资本难求&#xff01; 同学们&#xff0c;我们不能浪费比万两黄金还贵重的年轻资本&#xff0c;因为&#xff0c;转眼间你就不再拥有这个资本了&#xff0c; 趁着年轻&#xff0…

滴滴AI语音团队获国际顶尖智能对话系统竞赛世界第一

出品 | AI科技大本营头图 | CSDN付费下载于视觉中国近日&#xff0c;在国际顶尖人工智能竞赛第九届对话系统技术挑战赛&#xff08;DSTC9&#xff09;中&#xff0c;滴滴语音和NLP技术团队参与端到端多领域面向任务型对话系统任务荣获世界第一&#xff0c;充分彰显滴滴公司在自…

RHEL5+PXE+DHCP+Apache+Kickstart安装RHCE5.1 i386实验室环境

此博文出自&#xff1a;http://andrewyu.blog.51cto.com/1604432/1100567 使用RHEL5PXEDHCPApacheKickstart安装RHCE5.1 i386实验室环境&#xff0c;根据文章内容也可批量安装了红帽RHEL系统或CentOS5.x&#xff0c;现阶段&#xff0c;由于需要大规模应用CentOS5.8 x86_64系统用…

用ASP.Net(C#)连接Oracle数据库的方法

今天看了一下asp.net连接oracle数据库的方法&#xff0c;得到了如下代码。这段代码打开了MyTable表&#xff0c;并把操作员的名字列出。字段类型是OracleString。读取的时候用的是字段编号&#xff0c;我不知道怎么使用字段名来读取某字段的内容。下面是代码&#xff1a;//首先…

NLP任务中的文本预处理步骤、工具和示例

作者 | Viet Hoang Tran Duong来源 | DeepHub IMBA头图 | CSDN付费下载于视觉中国数据是新的石油&#xff0c;文本是我们需要更深入钻探的油井。文本数据无处不在&#xff0c;在实际使用之前&#xff0c;我们必须对其进行预处理&#xff0c;以使其适合我们的需求。对于数据也是…

github设置添加SSH

https 和 SSH 的区别&#xff1a; 1、前者可以随意克隆github上的项目&#xff0c;而不管是谁的&#xff1b;而后者则是你必须是你要克隆的项目的拥有者或管理员&#xff0c;且需要先添加 SSH key &#xff0c;否则无法克隆。 2、https url 在push的时候是需要验证用户名和密码…

在asp.net中使用客户端脚本

我们常常在asp.net中需要使用到客户端脚本&#xff0c;在asp.net中使用客户端脚本很容易&#xff0c;使用到Page的RegisterClientScriptBlock方法就行了。下面是我写的一段C#代码,用来打开新窗口&#xff1a; using System; using System.Web.UI; namespace MyBill { …

一个DIV调用多个CSS样式

1使用以上两个CSS样式表对描述同一个DIV的写法class利用class可以对于同一个标签多重定义样式. 比如用1、2两种样式同时控制一个DIV&#xff0c;可以写成以下格式&#xff1a; <div class"1 2"> </div> 使用以上两个CSS样式表对描述同一个DIV&#xff0…

最新!百度首发 OCR 自训练平台 EasyDL OCR

今年以来&#xff0c;人工智能愈发火热。在2020年4月&#xff0c;政府已将人工智能基础设施列入新基建范围。在利好政策引导下&#xff0c;人工智能的应用范围越来越广。以 OCR&#xff08;文字识别技术&#xff09;为例&#xff0c;随着智能手机与各种端边电子产品的增多&…

性能测试初学_loadrunner base64/md5 编码 解码

参考这3篇文章&#xff1a; MD5&#xff1a; http://bbs.51testing.com/forum.php?modviewthread&tid1111323 base64&#xff1a; http://www.cnblogs.com/preftest/archive/2011/06/12/2079178.html http://www.51testing.com/html/41/15103841-3707341.html 主要思路为&…

ASP.NET管理状态的十种途径

HTTP协议是无状态的&#xff0c;ASP.NET提供了丰富的手段在页面之间管理状态。本文列举ASP.NET管理状态的十种途径。 ASP.NET中&#xff0c;从System.Web.UI.Page继承的类里有以下十种管理页面状态的途径&#xff1a; 1. Application对象: this.Application 2. …

sed学习系列---第3/3部分

为什么80%的码农都做不了架构师&#xff1f;>>> ---简介 在这篇 sed 系列的总结性文章中&#xff0c;Daniel Robbins 带您体验 sed 的真正力量。在介绍完几个重要的 sed 脚本之后&#xff0c;他将通过将一个 Quicken .QIF 文件转换成可读文本格式来演示一些基本 s…

11位科幻作家参与,首次AI人机共创写作实验启动

人工智能会怎样影响人类文学创作&#xff1f;人类智慧与机器智慧如何相互激发创作灵感&#xff1f; 10月27日&#xff0c;由传茂文化和创新工场联手打造的华语科幻AI人机共创写作实验项目《共生纪》启动&#xff0c;人类作家与AI算法将围绕环保、人机关系、性别、文化多样性等…

笔记之远程桌面服务(RDS)

Windows默认只能有2个用户同时通过RDP进行连接&#xff0c;非常不方便&#xff0c;于是借此机会学习了下Win2012R2的远程桌面配置。以下我把学习过程记录一下&#xff1a; 1. 最开始我觉得只需要安装“Remote Desktop Session Host”&#xff0c;事实证明这样没错&#xff0c;可…

用Asp.net 传送大文件

Chris Hynes我们在上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题&#xff0c;因为ASP.NET会block直到把整个文件载入内存后&#xff0c;再加以处理。实际上&#xff0c;如果文件很大的话&#xff0c;我们经常会见到Internet Explorer…