使用LSH 进行特征提取

news2024/10/7 10:24:02

局部敏感哈希(LSH)通常用于近似最近邻算法(ANN) 操作(向量搜索)。LSH的特性也可以在以矢量为输入的神经网络模型中得到利用(例如,各种的音频、视频和文本嵌入等内容信号)。

通常情况下,特定领域模型中输入的流形是复杂的(非i. i. d)。这种复杂性使得使用计算密集型操作的多层感知机来分离这些流形非常困难。学习复杂映射的经典方案是记忆结果,而不是学习函数。如何记忆向量图?最直接的方法就是嵌入向量。但是我们需要离散的对象来计算嵌入,而向量不是离散的。那么怎么把向量嵌入算法应用到向量输入中呢?对向量进行哈希运算,在哈希运算后,附近的点必须保持“附近”状态。这就是LSH的做法,所以我LSH运算顶部的嵌入可以作为浅层特征提取器。

“局部敏感哈希”(Locality Sensitive Hashing,简称LSH)是一种用于解决这类问题的近似搜索技术。它的主要思想是将相似的数据点映射到同一个"哈希"桶中,从而可以在特定的桶中进行搜索,而不必对整个数据集进行线性搜索。虽然这种方法不保证找到确切的最近邻,但它在高维数据中提供了一种高效的近似搜索方法。

LSH的核心概念如下:

  1. 局部敏感性函数(Locality Sensitive Function):这是一个函数,它能够将相似的数据点映射到相同的哈希桶中,但也不是那么严格,因此即使有些数据点被映射到相同的桶中,它们也不一定是真正相似的。局部敏感性函数的设计取决于所处理的数据类型和相似性度量。
  2. 哈希桶(Hash Bucket):数据点通过局部敏感性函数映射到不同的哈希桶中。相似的数据点可能被映射到相同的桶,从而提供了搜索的起点。
  3. 哈希表(Hash Table):哈希桶构成了一个哈希表,通过在哈希表中进行搜索,可以快速定位具有相似性的数据点。

LSH的性能取决于局部敏感性函数的设计和哈希桶的构建。这涉及到在保持相似性的同时,将数据点映射到不同的桶,以及在哈希表中组织和检索数据。LSH通常用于解决近似最近邻搜索(Approximate Nearest Neighbor Search,ANN)问题,其中目标是在给定查询点的情况下,找到与其相似度较高的数据点。

选择LSH算法和将LSH桶转换为嵌入的方式非常重要。所以这里只介绍一种只有方向感知的算法(忽略向量的大小),它基于这个简单的LSH算法:

 import torch
 import torch.nn as nn
 import torch.nn.functional as F
 
 
 class CosineVectorEmbedding(nn.Module):
     """
     LSH based vector indexer for highly non-linear ops
     """
 
     def __init__(self, inp_dim: int, emb_dim: int, n_proj: int = 16, num_bins: int = 20):
         super().__init__()
         self.register_buffer(
             'projection_mat',
             F.normalize(torch.randn((inp_dim, n_proj)), p=2.0, dim=0),
             persistent=True,
         )
         resolution = 2.0 / num_bins
         self.register_buffer(
             'grid',
             torch.linspace(-1, 1, num_bins + 1)[:-1] + 0.5 * resolution,
             persistent=True,
         )
         self.register_buffer(
             'pos_offset',
             ((num_bins + 1) * torch.arange(0, n_proj, dtype=torch.long)).long().reshape(-1, 1, 1),
             persistent=True
         )
         self.emb = nn.EmbeddingBag((num_bins + 1) * n_proj, emb_dim)
         self.emb_dim = emb_dim
         self.n_proj = n_proj
 
     def forward(self, x):
         bs, seq_len, emb_dim = x.size()
         z = F.normalize(x, p=2.0, dim=-1) @ self.projection_mat
         z = torch.bucketize(z, self.grid).transpose(0, -1)
         z = (z + self.pos_offset).transpose(0, -1).contiguous()
         return self.emb(z.view(-1, self.n_proj)).reshape(bs, seq_len, self.emb_dim)

为了说明它的有效性,我们将它应用到输入32维的输入内容嵌入的RecSys LLM的训练中。使用从低分辨率到高分辨率的独立级联LSH嵌入(inp_dim = 32,emb_dim = 512,n_proj = 32,num_bins =(1,2,4,8,12,16,20))并将其输出相加。把它与使用一个简单投影进行了对比(使用nn. Linear (32, 512))。

可以看到比简单的线性变换(当然参数更多,计算效率更高),我们的CosineVectorEmbedding是一个更好的特征提取器。

https://avoid.overfit.cn/post/2bab364a679f4b6f8d9a1c0bd3096b9b

作者:Dinesh Ramasamy

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

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

相关文章

免费AI学习文档(二)

国内绘画midjourney网站 http://aijiaolian.chat优质提示词分解教学 https://q3iylvv7qj.feishu.cn/docx/UGMzdPVGjo1fHcxu1kjcuXFcnff?fromfrom_copylink设计图AI实战,如何用AI提高83%的出图效率?https://q3iylvv7qj.feishu.cn/docx/Fsxxd3MncowFUix5…

Java SpringBoot 加载 yml 配置文件中字典项

实际项目中,如果将该类信息放配置文件中的话,一般会结合Nocas一起使用 将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中 Spring Boot 中 yml 配置、引用其它 yml 中的配置。# 在配置文件目录(如&#xff…

windows电脑简单实时tts语音播报wsay;python pyttsx3语言实时播报text-to-speech

1、wsay 参考: https://github.com/p-groarke/wsay 下载安装: https://github.com/p-groarke/wsay/releases/tag/v1.5.0 下载exe文件,并把加入环境变量就可 使用 # Say something. wsay "Hello there."wsay "你好"…

Node.js躬行记——接口管理

在页面发生线上问题时,你要做的事情就是去查接口,响应数据是否正确,查接口的方法有两种: 第一种是在浏览器中打开地址,但是你必须得知道详细的 URL,并且有些页面还需要附带参数。 第二种是打开编辑器&#…

赴日IT培训 你到底适不适合做赴日IT?

有很多正在学习或者已经从事IT行业的小伙伴,问自己到底适不适合做赴日程序员,问什么赴日IT这么褒贬不一,自己内心很纠结。今天小编就来从多个角度为大家分析一下,希望能对徘徊、犹豫的IT工程师们有所帮助。 为什么会有一部分人犹…

九、解析应用程序——分析应用程序(2)

文章目录 一、确定服务器端功能二、解析受攻击面 一、确定服务器端功能 通过留意应用程序向客户端披露的线索,通常可推断与服务器端功能和结构有关的大量信息,或者至少可做出有根据的猜测。以下面用于访问搜索功能的URL为例: 可见,.jsp文件扩…

R语言 列表中嵌套列名一致的多个数据框如何整合为一个数据框

在批量建模后容易得到list&#xff0c;list中的每个元素都是单个的tibble 或者 dataframe&#xff0c;如何将这些数据整合为一张表呢&#xff1f; 载入R包 library(broom) library(tidyverse) 模拟数据 models <- txhousing %>% group_by(city) %>% do(modlm(lo…

ICMP协议报文

1、CMP协议简介 ICMP&#xff08;Internet Control Message Protocol&#xff09;是一种网络协议&#xff0c;它用于在IP网络中传递控制信息和错误消息。它通常与IP协议一起使用&#xff0c;IP协议负责发送和路由数据包&#xff0c;而ICMP协议负责检查网络是否可达、路由是否正…

多传感器融合相关技术

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 多传感器融合定位学习 深蓝-多传感器定位融合 深蓝学院 多传感器融合定位 作业 多传感器融合详解 二、相关介绍 1. 毫米波雷达&#xff08;Radar&a…

mysql数据库设计

一、表关系 二、表结构 1、树状结构图&#xff08;id0表示根节点&#xff0c;parent_id是父节点&#xff09; 2、价格&#xff08;decimal类型&#xff09; 3、订单时间对应每一个订单状态&#xff08;前端展示、方便排查问题、数据分析&#xff09; 4、订单表存储商品信息&a…

LeetCode.26,27,88三题-双指针的运用

本文将对3道解决方法类似的题目进行逐一分析&#xff0c;这三道题目分别是&#xff1a; LeetCode.26 删除有序数组中的重复项 LeetCode.27 移除元素 LeetCode.88 合并两个有序数组 1. LeetCode.27 移除元素&#xff1a; 题目内容如下&#xff1a; 假设一个数组为&#xff1…

uniapp+vue3+vite+pinia2.0.33项目初始化

目录 准备工作 注意事项 使用vue-cli创建项目 运行 准备工作 下载hbuild开发工具 HBuilderX-高效极客技巧 下载微信小程序开发工具 概览 | 微信开放文档 uniapp uni-app官网 注意事项 1.node.js版本>16#windows查看node版本 C:\Users\22862>node -v v18.16.0 …

02Mysql之多表查询--例题讲解

一、题目详情&#xff0c;以及表的建立 新增员工表emp和部门表deptcreate table dept (dept1 int ,dept_name varchar(11));create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int);insert into dept values(101,财务),(102,销售)…

【数据中台商业化】数据中台微前端实践

一&#xff0c;需求背景 1 业务背景 在以往的业务场景中&#xff0c;用户进入五花八门的菜单体系中&#xff0c;往往会产生迷茫情绪&#xff0c;难以理解平台名称及具体作用&#xff0c;导致数据开发与管理学习成本较高&#xff0c;降低工作效率。为此我们整合从数据接入&…

不知道打仗之害,就不知道打仗之利

不知道打仗之害&#xff0c;就不知道打仗之利 【安志强趣讲《孙子兵法》第7讲】 【原文】 夫钝兵挫锐&#xff0c;屈力殚货&#xff0c;则诸侯乘其弊而起&#xff0c;虽有智者&#xff0c;不能善其后矣。 【注释】 屈力殚货&#xff1a;屈力&#xff0c;指力量消耗&#xff0c;…

掌握Python的X篇_32_使用python编辑pdf文件_pdfrw

本篇介绍利用python操作pdf文件&#xff0c;我们平时也会有合并和拆分pdf的需求&#xff0c;此时我们就可以使用本节内容。 文章目录 1. pdfrw的安装2. 切分pdf文件3. pdfrw官网及实现一版四面的实例 1. pdfrw的安装 pip install pdfrw官网地址&#xff1a;https://github.co…

设计模式之责任链模式【Java实现】

责任链&#xff08;Chain of Resposibility&#xff09; 模式 概念 责任链&#xff08;chain of Resposibility&#xff09; 模式&#xff1a;为了避免请求发送者与多个请求处理者耦合在一起&#xff0c;于是将所有请求的处理者 通过前一对象记住其下一个对象的引用而连成一条…

Mysql中插入数据,并返回自增主键的值

创建数据库和表使用 insert into 进行插入数据使用 RETURN_GENERATED_KEYS 进行返回插入的这条数据 具体方法如下&#xff1a; Testvoid addGetPk(){try{Statement stmt conn.createStatement();String sql String.format("insert into t_students values(null,%s,%s,%d…

Git:在本地电脑上如何使用git?

git 版本&#xff1a; 2.40.1.windows.1 文章目录 一. 使用git之前你必须要理解的几个概念1.1 理解工作区、版本库、暂存区的概念1.2 提交Git版本库的步骤【分两步执行】 二. Git本地库实战2.1 初始化版本库2.2 新建 & 提交 & 状态2.3 查看日志2.4 回退 & 穿梭 &am…

Linux驱动-基于Buildroot构建系统镜像后实现基于QT项目开发之环境配置

Linux驱动-基于Buildroot构建系统镜像后实现基于QT项目开发之环境配置 需求BuildRootUboot的仓库地址和commit idKernel 的仓库地址和commit id BuildRoot已编译库在Windows上的Create上创建项目编译QT项目 需求 基于Build root编译整个镜像后&#xff0c;如何开发自己的基于Q…