Embedding压缩之基于二进制码的Hash Embedding

news2024/12/23 20:27:48

推荐系统中,ID类特征的表示学习(embedding learning)是深度学习模型成功的关键,因为这些embedding参数占据模型的大部分体积。这些模型标准的做法是为每一个ID特征分配一个unique embedding vectors,但这也导致存储embedding table需要消耗巨大的内存。

在上一篇文章中 Embedding压缩之hash embedding,介绍了几种常见的hash embedding方法来对embedding进行压缩,实现模型的瘦身。今天继续介绍一种阿里在CIKM 2021的论文中提出的方法:基于二进制码的hash embedding,该方法兼具了调整embedding存储的大小的灵活性和尽可能保留模型的效果

算法流程

Binary code based Hash Embedding的算法流程如下图,主要分为了3步:特征hash、embedding索引生成、embedding向量生成。

Binary Hash Embedding

特征Hash

ID类特征的来源是多种类型,比如字符串或者整型,实际中的做法分为两种:

  1. 提前创建映射表,即将不同的特征值映射到对应的unique id,这种做法的缺点是不灵活,难以应对特征值的动态扩展,并且需要保存映射表;
  2. 另一种做法则是使用特征Hash,可以直接将原始特征值映射到Integer,如上图[Binary Hash Embedding-Step1],称为Hash ID:

h i = H ( f i ) h_i=\mathcal{H}(f_i) hi=H(fi)

其中, H \mathcal{H} H为hash函数(如Murmur Hash), h i h_i hi为特征值 f i f_i fi的Hash ID。为了尽量降低 h i h_i hi之间的冲突, H \mathcal{H} H的输出通常是一个比较大的数值,比如64位的Integer。

embedding索引生成

如上图[Binary Hash Embedding-Step2],Embedding索引生成分为3步:Binarization、Code Block Strategy和Decimalization。

Binarization

在特征Hash之后,每一个特征值可以认为是拥有一个对应的唯一(没有冲突)的Hash ID。

在这一步,会将Hash ID转化为一个二进制码 b i ∈ { 0 , 1 } S b_i \in \{0,1\}^S bi{0,1}S,S为二进制码的长度,如上图[Binary Hash Embedding-Step2.1],比如13的二进制码是 110 1 2 1101_2 11012

因为10进制转2进制这个过程是不包含任何参数,并且计算逻辑是固定的,因此二进制码 b i b_i bi是可以与特征值 f i f_i fi一一对应的。

Code Block Strategy

前面提到基于二进制码的hash embedding在调整embedding存储大小上具备灵活性,这个灵活性在这一节就会得到体现。论文提出了一种策略 code block strategy:

  1. 将二进制码 b i b_i bi的每一个0-1值切分到不同的块(blocks),每一个block中有序的0-1码可以来表示 K = 2 n K=2^n K=2n 个不同的整数,其中n是每个block中0-1值的个数,如上图[Binary Hash Embedding-Step2.2]。
  2. 接着,再将每一个block的0-1码转换成10进制的整数,作为每一个block的embedding table W ∈ R K × D W \in \mathbb{R}^{K \times D} WRK×D的索引

比如,当n=1时,每个block的0-1值个数为2,embedding table的存储大小为 O ( 2 D ) O(2D) O(2D)。而当所有的0-1值放在同一个block的时候,此时就相当于full embedding。因此,embedding table的大小可以通过n来控制,这也正是这个策略的灵活性体现。

用表达式来看,定义 B i = [ B i , 0 ; B i , 1 ; . . . ; B i , m ; . . . ] B_i=[B_{i,0};B_{i,1};...;B_{i,m};...] Bi=[Bi,0;Bi,1;...;Bi,m;...]为code block strategy产出的block序列, ∣ B i ∣ |B_i| Bi是block的数量,那么第m个block B i , m ∈ { 0 , 1 } n B_{i,m} \in \{0,1\}^n Bi,m{0,1}n可以表示为下式:

其中,Alloc是一个分配函数,将每一个0-1值分配到不同的block。Order则是将每个block的0-1值变为有序的函数。

论文提出了两种code block strategy的形式:

  • Succession. 如下图[code block strategy-a],succession策略从左往右遍历,Alloc函数会会将每t个0-1值放入到同一个block。而Order函数则是保持 b i b_i bi中每一个0-1值的原有顺序。
  • Skip. 如下图[code block strategy-b],skip策略将间隔为t的0-1值放入同一个block。Order函数与succession策略相同。
  • 当最后剩余的0-1值不够t时,则会将剩下的所有0-1值放入到同一个block中。

code block strategy

通过code block strategy,对于每一个 b i b_i bi可以获得唯一的 B i B_i Bi。但其实如果Hash ID长度空间超过 2 S 2^S 2S,那么还是会产生冲突的。

Decimalization

每一个block的embedding索引 k i , m k_{i,m} ki,m则通过 B i , m B_{i,m} Bi,m的十进制得到,如上图[Binary Hash Embedding-Step2.3]:

k i , m = D e c i m a l i z e ( B i , m ) k_{i,m}=Decimalize(B_{i,m}) ki,m=Decimalize(Bi,m)

其实就是将block中的0-1二进制码转化为10进制,作为embedding索引。

embedding向量生成

Embedding Lookup. 如上述提到,每一个block B i , m B_{i,m} Bi,m可以得到一个embedding索引 k i , m k_{i,m} ki,m,那么就可以将 k i , m k_{i,m} ki,m映射到一个embedding向量

e i , m = ε ( W m , k i , m ) e_{i,m}=\varepsilon(W_m,k_{i,m}) ei,m=ε(Wm,ki,m)

W m W_m Wm是第m个block B i , m B_{i,m} Bi,m对应的embedding table, e i , m e_{i,m} ei,m则代表 B i , m B_{i,m} Bi,m的embedding,而 ε \varepsilon ε是embedding lookup函数。

Embedding Fusion. 通过上面的流程,可以得到 ∣ B i ∣ |B_i| Bi个embedding,最后需要将 ∣ B i ∣ |B_i| Bi个embedding进行组合得到特征值 f i f_i fi 最终的embedding x i x_i xi,组合形式一般包括Sum Pooling、LSTM、Concatenation。

实验结果

不同Hash Embedding效果

不同Hash Embedding的存储大小

不同code block strategy对比

总结

优势

  • 确定性。embedding索引的计算是一个确定性的无参数的过程,对于新的特征值是友好的。
  • 灵活性。embedding的存储大小是靠超参数n来调整的。
  • 唯一性。无论embedding缩减到什么程度,每一个特征值 f i f_i fi都有唯一的 B i B_i Bi(在Hash ID长度空间不超过 2 S 2^S 2S的前提下)
  • 压缩率高。假如Hash ID的长度空间为 2 24 2^{24} 224,那么full embedding的存储大小为 2 24 × D 2^{24} \times D 224×D。而如果选择策略为succession,且t=12,即block的数量为 24 / 12 = 2 24/12=2 24/12=2,每个block的0-1个数为12,那么基于二进制码的hash embedding存储大小为 2 × 2 12 × D 2 \times 2^{12} \times D 2×212×D,压缩率高达 1 / 2 11 1/2^{11} 1/211

对比

  • Full Embedding:Full Embedding与论文方法都很好区分不同的特征值,该论文方法能够很好减少embedding的存储;
  • Hash Embedding:是论文方法的一种简化形式,即code block strategy是Succession,且仅取前t个0-1值来计算embedding索引;
  • Multi-Hash Embedding:都可以创建多个embedding索引,但论文方法对这些索引的唯一性约束更好;
  • Q-R Trick:可以看作是论文方法的一种特例,code block strategy是Succession,前t个0-1码作为quotient,剩余的0-1码作为remainder。

最后,再总结下基于二进制码的Hash Embedding原理。

  1. 将特征值的Hash ID转化为二进制码;
  2. 然后将二进制码的0-1值切分到不同的block,每一个block对应一个embedding table;
  3. 而每一个block中的0-1二进制码转换回10进制作为embedding索引;
  4. 最后,将从每一个block得到的embedding进行组合作为最后的embedding表征。

代码实现

git

包括二进制码的Hash编码算子实现、二进制码的Hash Embedding的Python实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1306417.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Openlayers 加载 Geoserver 图层以及查询条件过滤

Openlayers 加载 Geoserver 图层以及查询条件过滤 查询条件过滤核心代码完整代码:在线示例 Openlayers 加载 Geoserver 图层,在实际项目中常常会遇到,需要对图层进行过滤,这里介绍一下过滤方法。 其实就是利用 Geoserver 的 CQL_…

2024SIA上海国际轴承工业展览会 ▎参行业盛会 展轴研风采

2024SIA上海国际轴承工业展览会 内容:1、轴承制品展区:2、轴承设备展区:3、轴承零件展区: 国际轴承展丨轴承工业展丨轴承装备展丨上海轴承展丨上海轴承工业展丨上海轴承装备展 2024上海国际轴承工业展览会将会于2024年7月24-26日…

C语言—每日选择题—Day46

第一题 1. 下列程序段的输出结果是&#xff08;&#xff09; #include <stdio.h> int main() {int x 1,a 0,b 0;switch(x) {case 0: b;case 1: a;case 2: a;b;}printf("a%d,b%d\n", a, b);return 0; } A&#xff1a;a2,b1 B&#xff1a;a1,b1 C&#xf…

面试必备的Linux常用命令

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 Linux常用命令 1、文件及内容2、网络3、进程服务4、…

binlog+mysqldump恢复数据(误删数据库或者表)

表删除恢复 1、准备数据 首先准备数据库环境&#xff0c;测试数据库为speech1&#xff0c;如下&#xff1a; 为test数据表添加3条记录&#xff0c;如下&#xff1a;三行为新加的记录&#xff0c;添加后将test表删除。 2、恢复数据 查看binlog日志状态 SHOW MASTER STATUS…

【FPGA】综合设计练习题目

前言 这是作者这学期上的数电实验期末大作业的题目&#xff0c;综合性还是十分强的&#xff0c;根据组号作者是需要做“4、篮球比赛计分器”&#xff0c;相关代码会在之后一篇发出来&#xff0c;这篇文章用于记录练习题目&#xff0c;说不定以后有兴趣或者有时间了回来做做。 …

逆变器的防孤岛测试保护方案

逆变器的防孤岛测试保护方案是为了确保逆变器在发生故障或停电时能够及时停止供电&#xff0c;避免孤岛现象的发生。孤岛现象指的是当电网停电或发生故障时&#xff0c;逆变器仍然继续供电&#xff0c;可能会对电网维护人员和设备造成安全隐患。逆变器会通过监测电网的状态来判…

深入理解网络 I/O 多路复用:Epoll

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

Visual Studio调试技巧合集

Visual Studio调试技巧合集 1 如何同一个项目运行不同main文件&#xff1f; 1 如何同一个项目运行不同main文件&#xff1f; &#xff08;1&#xff09;移动鼠标到需要关掉调试的文件&#xff0c;点击右键属性–常规–从生成中排除–是–确定&#xff0c;即显示“-”号排除&am…

python实现形态学建筑物指数MBI提取建筑物及数据获取

前言 形态学建筑物指数MBI通过建立建筑物的隐式特征和形态学算子之间的关系进行建筑物的提取[1]。 原理 上图源自[2]。 实验数据 简单找了一张小图片&#xff1a; test.jpg 代码 为了支持遥感图像&#xff0c;读写数据函数都是利用GDAL写的。 import numpy as np import …

【数据结构(十一·多路查找树)】B树、B+树、B*树(6)

文章目录 1. 二叉树 与 B树1.1. 二叉树存在的问题1.2. 多叉树 的概念1.3. B树 的基本介绍 2. 多叉树——2-3树2.1. 基本概念2.2. 实例应用2.3. 其他说明 3. B 树、B树 和 B*树3.1. B树 的介绍3.2. B树 的介绍3.2. B*树 的介绍 1. 二叉树 与 B树 1.1. 二叉树存在的问题 二叉树…

【FPGA/verilog -入门学习7】 条件判断if与分支判断case语句的语法介绍

需求 使用if 和case 产生格雷码 / /*条件判断if与分支判断case语句的语法介绍 需求 使用if 和case 产生格雷码*/ / timescale 1ns/1ps module vlg_design(input [3:0] i_data, output reg [3:0] o_data,output reg [3:0] o_datac);always (*) begin if (4b0000 i_data) o_d…

ros的slam建图和导航(含工作空间)

工作空间的结构 准备工作 创建工作空间&#xff08;ros_zy&#xff09; mkdir ros_zy进入工作空间 cd ros_zy创建src文件夹&#xff08;放源程序&#xff09; mkdir src编译工作空间 catkin_make打开vscode&#xff08;从终端打开此工程&#xff09; code .进入工作空间的…

如何查看自己的文章是否被数据库收入?【查收查引】

致谢&#xff1a;特别感谢图书馆的蔡老师&#xff0c;告诉我怎么操作&#xff01; 另外&#xff0c;查收查引报告中的文章可以分开开&#xff0c;放在一起开不是必须的。&#xff08;放在一起开大概是院士工作量需要的。不是很了解。&#xff09; 如何查看自己的文章是否被数据…

tomcat部署以及虚拟主机的部署

Tomcat概述 Tomcat是Java语言开发的&#xff0c;服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;Tomcat虽然和…

c语言 词法分析器 《编译原理》课程设计

设计、编制并调试一个词法分析程序&#xff0c;加深对词法分析原理的理解。 针对表达各类词语的一组正规表达式&#xff0c;设计一个确定化的最简的有限自动机&#xff0c;对输入的符号串进行单词划分及词类识别。 要求词法分析器的输入是字符串&#xff0c;输出是源程序中各…

苍穹外卖项目笔记(8)— 缓存商品、购物车功能

前言 代码链接&#xff1a; Echo0701/take-out⁤ (github.com) 1 缓存菜品 1.1 问题说明 【注】很多时候系统性能的瓶颈就在于数据库这端 1.2 实现思路 通过 Redis 来缓存数据&#xff0c;减少数据库查询操作 【注】Redis 基于内存来保存数据的&#xff0c;访问 Redis 数据…

python:五种算法(GA、OOA、DBO、SSA、PSO)求解23个测试函数(python代码)

一、五种算法简介 1、遗传算法GA 2、鱼鹰优化算法OOA 3、蜣螂优化算法DBO 4、麻雀搜索算法SSA 5、粒子群优化算法PSO 二、5种算法求解23个函数 &#xff08;1&#xff09;23个函数简介 参考文献&#xff1a; [1] Yao X, Liu Y, Lin G M. Evolutionary programming made…

JVS物联网、低代码、智能BI本周更新功能已上线

物联网应用更新功能 新增: 1.新增驱动管理功能&#xff0c;可新增、编辑、修改、删除、查看驱动实例&#xff1b; 驱动管理功能主要负责管理物联网设备的驱动实例。这些驱动实例可以新增、编辑、修改、删除或查看。通过这些驱动实例&#xff0c;平台可以与设备进行通信&…

Git 常用命令速查

一、 Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态git commit 提交git branch -a 查看所有的分支git branch -r 查看远程所有分支git commit -am "init" 提交并且加注释git remote add origin git192.168.1.119:ndshowgit push origin mas…