Cosine 余弦相似度并行计算的数学原理与Python实现

news2024/11/18 2:12:08

背景

Cosine 我在LLM与RAG系列课程已经讲了很多次了,这里不在熬述,它在LLM分析中,尤其是在语义相似度的计算中至关重要,在dot attention机制中,也会看到他的身影。这里讲的是纯数学上的运算与python是如何运用相关库进行并行计算的原理及实践。完全掌握了他,在看vector db 里面的语义相似度,你可能会豁然开朗。实现总是如此的优雅。

Cosine的定义,两个向量(A, B), 他们的余弦相似度为:

Cosine(A,B) = (A * B)  /  (len(A) * len (B))

其实就是距离在M维坐标系的分别投影,前面也说了很多次了,不明白可以参看LLM与RAG系列课程。下面举个例子,很简单的初中数学,两个二维向量A,B,如果他们维度所包含的分量都相等,那么Cosine = 1, 很好理解:A(x, y), B(x, y)

A  *  B =  (x, y) * (x, y)= x^2 + y^2

len(A) = sqrt(x^2 + y^2)

len(B) = sqrt(x^2 + y^2)

最后答案就是 Cosine(A, B) = 1

如果是N维向量,很显然,相同。

Cosine(A,B) = (A * B)  /  (len(A) * len (B))

问题来了,我如果给你很多个A,很多个B,要你求所有A,B之间的 Cosine,要怎么处理?最笨的办法就是写个  def cosine(A,B)   return  (A * B)  /  (len(A) * len (B)),  然后写一个二层for循环,case by case,这样的代码交给CPU 做AI,肯定是不合适的。怎么优化呢?那就是线性代数的魅力来了,Matrix 运算。我们看看怎么做。

向量内积

向量内积,不要总想着二,三维,那是初中,高中的东西。在LLM的世界,高维向量普遍存在,在Choma vector db 提供的基础 embedding中,嵌入向量为 384 维度。那还算比较小的。大一点的上千维度都很正常。向量的内积,很简单,就是M维向量的M维度分别相乘后相加,放到Matrix 的指定位置就对了,python 实现更简单,就是 A dot B, 一个 dot 解决了(M , N)与 (N , J)维度的matrix 乘法。有点线性代数功底的都知道:(M , N)* (N , J) = (M, J)。 可是问题来了,在LLM的世界中,因为嵌入向量都是 M维,表达方式都是 (M , N), (J, N) 这种是没办法做 向量内积的,怎么办?很简单,转置一下,(M , N)* (J, N)T = (M, J)。 以前总觉得现线性代数没啥用,现在看到了它的魅力,你要用它的时,如果你概念基础扎实,马上就上手了。讲到了这里,看下 python 的例子:

arr1 = np.array([[1, 2, 3], [2, 3, 5], [1, 4, 3]])
arr2 = np.array([[4, 5, 6], [1, 2, 3]])
print(np.dot(X, Y.T))

非常简洁的代码,看下输出:

nice。不要小看他,它相当于是将将arr1的三个二维向量与arr2的两个二维向量在 O(0)同时完成了计算结果。而且 python 的 numpy 底层是经过 compiler 优化的,性能还是非常出色。

向量外积 

是一个线性代数中的概念,指的是两个向量的张量积(tensor product),其结果是一个矩阵。

具体来说,假设 X_norm 是一个形状为 (m,) 的一维数组(向量),而 Y_norm 是一个形状为 (n,) 的一维数组(向量)。那么,np.outer(X_norm, Y_norm) 将返回一个形状为 (m, n) 的二维数组(矩阵),其中第 i 行第 j 列的元素是 X_norm[i] 和 Y_norm[j] 的乘积。

用数学符号表示,如果 X_norm = [x_1, x_2, ..., x_m] 和 Y_norm = [y_1, y_2, ..., y_n],那么(X_norm, Y_norm)的外积 将产生一个矩阵,其元素为:

python 代码实现:

import numpy as np 
X_norm = np.array([1, 2]) 
Y_norm = np.array([3, 4, 5]) 

result = np.outer(X_norm, Y_norm)
print(result)

向量的长度

就是 2-范数或称为欧几里得范数,各维度平方相加开根号。

就是上面说的 len

p.linalg.norm 是 NumPy 中的一个函数,用于计算向量或矩阵的范数。具体来说,np.linalg.norm(X, axis=1) 是在 NumPy 数组 X 上沿着指定的轴(在这里是 axis=1)计算向量的 2-范数(或称为欧几里得范数)。

假设 X 是一个形状为 (m, n) 的二维数组(或矩阵),其中 m 是行数,n 是列数。那么 np.linalg.norm(X, axis=1) 会返回一个长度为 m 的一维数组,其中每个元素是 X 中对应行的 2-范数。

还是上面那个例子,看下代码与运行结果:

arr1 = np.array([[1, 2, 3], [2, 3, 5], [1, 4, 3]])
arr2 = np.array([[4, 5, 6], [1, 2, 3]])

X_norm = np.linalg.norm(arr1, axis=1)
Y_norm = np.linalg.norm(arr2, axis=1)

发现维度没变,还是之前的,shape 都相同。只是做了平方求和开根号的处理。

LLM中的应用

到了这里,我们发现,如果我们使用:

X = np.array([[1, 2, 3], [2, 3, 5], [1, 4, 3]])
Y = np.array([[4, 5, 6], [1, 2, 3]])
similarity = np.dot(X, Y.T) / np.outer(X_norm, Y_norm)

他就是关于X的每个二维的分量与Y的每个二维分量之间的 Cosine。因为它同时完成了对应每个位置的 (A * B)  /  (len(A) * len (B))

我们看看结果:

数学含义也很明确,比如在 X的 [1,2,3] 对 Y的 [1,2,3]时, Cosine = 1,非常完美的三行代码。不要看不起它,他在vector db 中起着举足轻重的作用。今天介绍到这里,如果你对LLM感兴趣,可以读下我的其他专栏,同步更新中。

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

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

相关文章

鸿蒙开发Ability Kit(程序访问控制):【向用户申请单次授权】

申请使用受限权限 受限开放的权限通常是不允许三方应用申请的。当应用在申请权限来访问必要的资源时,发现部分权限的等级比应用APL等级高,开发者可以选择通过ACL方式来解决等级不匹配的问题,从而使用受限权限。 举例说明,如果应…

代码随想录算法训练营第55天(py)| 单调栈 | 42. 接雨水*、84.柱状图中最大的矩形

42. 接雨水* 力扣链接 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 思路1 暴力 按列来计算。每一列雨水的高度,取决于,该列 左侧最高的柱子和右侧最高的柱子中,…

【记录】IDEA2023的激活与安装

前言: 记录IDEA2023的激活与安装 第一步:官网下载安装包: 下载地址:https://www.jetbrains.com/idea/download/other.html 这个最好选择2023版本,用着很nice。 安装步骤就不详解了,无脑下一步就可以了…

09 - matlab m_map地学绘图工具基础函数 - 绘制区域填充、伪彩色、加载图像和绘制浮雕效果的有关函数

09 - matlab m_map地学绘图工具基础函数 - 绘制区域填充、伪彩色、加载图像和绘制浮雕效果的有关函数 0. 引言1. 关于m_pcolor2. 关于m_image3. 关于m_shadedrelief4. 关于m_hatch5. 结语 0. 引言 本篇介绍下m_map中区域填充函数(m_hatch)、绘制伪彩色图…

C++多态~~的两个特殊情况

目录 1.多态的概念 2.简单认识 (1)一个案例 (2)多态的两个满足条件 (3)虚函数的重写 (4)两个特殊情况 1.多态的概念 (1)多态就是多种形态; …

某腾X滑块验证码

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识,欢迎私信共享学习心得。 如有侵权,联系博主删除。 请勿商用,否则后果自负。 网址 aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9wcm9kdWN0L2NhcHRjaGE= 1. 先整体分析一下 1_1. 验证码信息下发接口 cap_union_prehandle ua:…

AI绘画工具Midjourney:和Discord互相成就

前言 提到文生图,很多人都会想到植根于根植于Discord社区的Midjourney,本篇文章就基于作者的使用体验思考,并结合了Discord来对Midjourney进行探讨,感兴趣的朋友一起来看看吧。 如果要说现在最火的文生图,不得不说到Mi…

openmetadata1.3.1 自定义连接器 开发教程

openmetadata自定义连接器开发教程 一、开发通用自定义连接器教程 官网教程链接: 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector (一&…

本周波动预警!7月将一路上涨,牛市“复苏“?低于6万美元的比特币,是熊市陷阱吗?

比特币在第三季度伊始发出了一些积极信号。随着上周末的涨势,BTC/USD最高一度达到63818美元,这让人对比特币能否重拾牛市信心满怀希望。不过,在冲破关键阻力位64000美元之前,市场参与者仍保持谨慎态度。比特币要想维系开头的牛市态…

掌握React与TypeScript:从零开始绘制中国地图

最近我需要使用reactts绘制一个界面,里面需要以中国地图的形式展示区块链从2019-2024年这五年的备案以及注销情况,所以研究了一下这方面的工作,初步有了一些成果,所以现在做一些分享,希望对大家有帮助! 在这…

使用Qt制作一个简单的界面

1、创建工程 步骤一: 步骤二: 步骤三: 选择 build system,有qmake、CMake 和 Qbs 三个选项。 CMake 很常用,功能也很强大,许多知名的项目都是用它,比如 OpenCV 和 VTK,但它的语法繁…

heic格式转化jpg如何操作?heic转jpg,分享6款图片转化器!

随着苹果iOS 11系统的推出,HEIC格式作为一种新的图片格式逐渐走进大众视野,heic格式在保证照片质量的同时,能显著减少系统存储空间的占用。然而,这也给非苹果用户带来了一些困扰,因为HEIC格式的图片在Windows系统上并不…

深入理解C# log4Net日志框架:功能、使用方法与性能优势

文章目录 1、log4Net的主要特性2、log4Net框架详解配置日志级别 3、log4Net的使用示例4、性能优化与对比5、总结与展望 在软件开发过程中,日志记录是一个不可或缺的功能。它可以帮助开发者追踪错误、监控应用程序性能,以及进行调试。在C#生态系统中&…

探秘 Django 专业之道

一、Django项目开发 1.web框架底层 1.1 网络通信 注意:局域网 个人一般写程序,想要让别人访问:阿里云、腾讯云。 去云平台租服务器(含公网IP)程序放在云服务器 先以局域网为例 我的电脑【服务端】 import sock…

无法访问指向的web服务器(或虚拟主机)的目录,请检查网络设置

微信公众平台,进行业务域名、JS接口安全域名、网页授权域名配置时,遇到的问题中有:无法访问指向的web服务器(或虚拟主机)的目录,请检查网络设置,这里简单记录一下处理过程。 关于这个问题首先保证下载…

基于PHP技术的校园论坛设计的设计与实现08586

基于PHP技术的校园论坛设计的设计与实现 摘 要 本项目旨在基于PHP技术设计与实现一个校园论坛系统,以提供一个功能丰富、用户友好的交流平台。该论坛系统将包括用户注册与登录、帖子发布与回复、个人信息管理等基本功能,并结合社交化特点,增强…

2023软考中级《软件设计师》(备考冲刺版) | 数据库系统

目录 1.数据库的基本概念 1.1 数据库体系结构 1.2 三级模式结构 1.3 数据仓库 2.数据库设计过程 2.1 概念结构设计 2.1.1 概念设计过程 2.1.2 E-R图 2.2 逻辑结构设计 2.2.1 关系模式相关概念 2.2.2 E-R图转关系模式(涉及下午题) 2.2.3 关系…

SysML与MBSE的关系

SysML与MBSE的关系 对于任何基于模型的系统工程 (MBSE) 方法,推荐的最佳实践是基于模型的语言、基于模型的工具、基于模型的流程和基于模型的架构框架的协同应用,如下图所示 系统架构四元组 图。经过十年将SysML应用于棘手的系统…

海思NNIE部署yolov5-shufflenet

1.简要说明 由于NNIE上transpose支持的顺序是固定的,shufflenet那种x=torch.transpose(x,1,2).contiguous() 的操作一般是不支持的。需要进行调整。 2.使用工程以及修改 使用的是开源工程:GitHub - Lufei-github/shufflev2-yolov5: shufflev2-yolov5:lighter, faster and ea…

基于“香港世界”的SLAM技术介绍

在视觉感知技术中,理解和描述复杂的三维室外场景至关重要,尤其是自动驾驶技术的发展要求对陌生环境具有更强的适应能力和鲁棒性。传统上,使用“曼哈顿世界”和“亚特兰大世界”模型来描述具有垂直和水平结构的城市场景。 当遇到像香港这样地形…