量化数据运算

news2024/12/28 19:03:08

量化数据运算

文章目录

  • 量化数据运算
    • 量化数据乘积
    • 仿射映射量化的矩阵运算
      • 矩阵表示 矩阵C=AB
      • 量化方式表示 矩阵C=AB
    • 代码展示基于仿射映射量化的矩阵乘法
      • 矩阵乘法计算API
      • 通过仿射映射量化形式计算两个矩阵的乘法
      • **欢迎关注公众号【三戒纪元】**

量化数据乘积

使用记号(s, z, q)表示为量化中心 z, 步长为 s 以及量化符号为 q 的仿射映射量化数据

因此2个量化数   ( s a , z a , q a ) \ (s_a, z_a, q_a)  (sa,za,qa)   ( s b , z b , q b ) \ (s_b, z_b, q_b)  (sb,zb,qb) 相乘运算,乘积用   ( s c , z c , q c ) \ (s_c, z_c, q_c)  (sc,zc,qc) 表示
{ a = s a ( q a − z a ) b = s b ( q b − z b ) c = s c ( q c − z c ) \begin{cases} a = s_a (q_a - z_a) \\ b = s_b (q_b - z_b) \\ c = s_c (q_c - z_c) \end{cases} a=sa(qaza)b=sb(qbzb)c=sc(qczc)
根据 c = ab 可以得出

q c = S a S b s c ( q a − z a ) ( q b − z b ) + z c q_c = \frac{S_a S_b}{s_c} (q_a - z_a)(q_b - z_b) + z_c qc=scSaSb(qaza)(qbzb)+zc

其中 ( q a − z a ) ( q b − z b ) (q_a - z_a)(q_b - z_b) (qaza)(qbzb) 使用整数乘法即可完成,对于 S a S b s c \frac{S_a S_b}{s_c} scSaSb需要用到浮点数计算。

通过a和b的量化表示以及它们的格式参数计算c的量化表示一次整数乘法,一次浮点数乘法和一次整数加法

看似运算量没有改进,但应用到量化的矩阵运算就有不同了

仿射映射量化的矩阵运算

矩阵表示 矩阵C=AB

有向量表示A B即为

{ A = [ a ( 1 ) , a ( 2 ) , . . . , a ( N ) ] B = [ b ( 1 ) , b ( 2 ) , . . . , b ( N ) ] \begin{cases} A=[a^{(1)}, a^{(2)}, ... , a^{(N)}] \\ B=[b^{(1)}, b^{(2)}, ... , b^{(N)}] \end{cases} {A=[a(1),a(2),...,a(N)]B=[b(1),b(2),...,b(N)]

C=AB,可以表示为:
∑ n = 1 N a ( n ) b ( n ) \sum_{n=1}^N a^{(n)} b^{(n)} n=1Na(n)b(n)

我们也用仿射映射量化表示
C = s c ( C q − 1 c z c ) C=s_c(C_q−1_cz_c) C=sc(Cq1czc)
可以得出
q c = s a s b s c [ ∑ n = 1 N ( q a ( n ) − z a ) ( q b ( n ) − z b ) ] + z c q_c =\frac{s_as_b}{s_c}[\sum_{n=1}^N (q_a^{(n)}- z_a)(q_b^{(n)}- z_b)] + z_c qc=scsasb[n=1N(qa(n)za)(qb(n)zb)]+zc
算式中间的 ∑ n = 1 N ( q a ( n ) − z a ) ( q b ( n ) − z b ) \sum_{n=1}^N (q_a^{(n)}- z_a)(q_b^{(n)}- z_b) n=1N(qa(n)za)(qb(n)zb)整数减法乘法运算整个计算过程只需要1次浮点乘法,即乘以 s a s b s c \frac{s_as_b}{s_c} scsasb,相比之下,传统向量内积算法需要N次浮点数乘法

量化方式表示 矩阵C=AB

如果对于A和B中的元素,分别用量化步长 S a S_a Sa S b S_b Sb、量化中心 z a z_a za z b z_b zb的仿射映射表示:
{ A = s a ( A q − 1 a z a ) B = s b ( B q − 1 b z b ) ) \begin{cases} A=s_a(A_q− 1_a z_a)\\ B=s_b(B_q− 1_b z_b)) \end{cases} {A=sa(Aq1aza)B=sb(Bq1bzb))
整合上面2个式子
C q = s a s b s c ( A q − 1 a z a ) ( B q − 1 b z b ) + 1 c C_q=\frac{s_as_b}{s_c}(A_q−1_az_a)(B_q−1_bz_b)+1_c Cq=scsasb(Aq1aza)(Bq1bzb)+1c
注意,这里隐含了取整运算:

浮点数 s a s b s c \frac{s_as_b}{s_c} scsasb相乘需要改成“整数运算”,使用整数乘法加上移位实现,降低运算量,并使得运算结果和右侧矩阵的整数数据类型匹配

比如:0.3*x((int)(0.3*256)*x)>>8 ≈ (77*x)>>8,因为256 >> 8 = 1。另外77*x也可以用之前的常整数乘法简化成加减运算

所以,这里计算矩阵 C=AB 的步骤为:

  1. 使用整数加法计算 ( A q − 1 a z a ) (A_q−1_az_a) (Aq1aza)

  2. 使用整数加法计算 ( B q − 1 b z b ) (B_q−1_bz_b) (Bq1bzb)

  3. 前两步结果的相乘 ( A q − 1 a z a ) ( B q − 1 b z b ) (A_q−1_az_a)(B_q−1_bz_b) (Aq1aza)(Bq1bzb)

  4. 上一步运算结果乘以 s a s b s c \frac{s_as_b}{s_c} scsasb,得到 s a s b s c ( A q − 1 a z a ) ( B q − 1 b z b ) \frac{s_as_b}{s_c}(A_q−1_az_a)(B_q−1_bz_b) scsasb(Aq1aza)(Bq1bzb)

  5. 使用整数加法计算 1 c z c 1_cz_c 1czc得到 s a s b s c ( A q − 1 a z a ) ( B q − 1 b z b ) + 1 c \frac{s_as_b}{s_c}(A_q−1_az_a)(B_q−1_bz_b)+1_c scsasb(Aq1aza)(Bq1bzb)+1c

上面步骤3需要** M ∗ N ∗ P M * N * P MNP次整数乘法**,步骤4需要** M ∗ P M * P MP次浮点乘法**(矩阵乘以常数 s a s b s c \frac{s_as_b}{s_c} scsasb),相比之下,非量化算法需要 M ∗ N ∗ P M * N * P MNP次浮点乘法。

代码展示基于仿射映射量化的矩阵乘法

矩阵乘法计算API

import numpy as np

#######################
# 演示使用反射变换实现矩阵
# 乘法的过程
#######################

QMIN,QMAX=0,255 # 量化表示的最大最小值

## 根据numpy矩阵data分析并提取量化参数
def calc_quant_param(data):
    vmin,vmax=np.min(data.ravel()),np.max(data.ravel())
    s=float(vmax-vmin)/float(QMAX-QMIN)
    z=float(QMIN)-float(vmin)/s
    z=int(round(np.clip(z,QMIN,QMAX)))
    return s,z

## 数据量化,计算:dq=round(d/s+z)
def calc_quant_data(d,s,z):
    dq=d/s+z
    dq=np.round(np.clip(dq,QMIN,QMAX)).astype(int)
    return dq

## 数据反量化,计算:d=s*(dq-z)
def calc_dequant_data(dq,s,z):
    return s*(dq-z).astype(float)

## 量化矩阵乘法
# 从Aq、Bq计算C=A*B的量化表示Cq
def quant_matmul(Aq, sa, za, 
                 Bq, sb, zb,
                     sc, zc):
    # 整数乘法
    Cq=np.dot(Aq-za,
              Bq-zb)    
    # 乘以常数系数(浮点数),可以用整数乘法近似,但这里为演示简单,简单使用了浮点乘法
    Cq=(sa*sb/sc)*Cq.astype(float)  
    Cq=np.round(Cq).astype(int)+zc
    return Cq

通过仿射映射量化形式计算两个矩阵的乘法

if __name__ == '__main__':
    np.random.seed(1234)

    # 生成2个随机矩阵
    A=np.random.randn(2,3)      
    B=np.random.randn(3,3)

    # 用浮点运算计算参考答案
    C_ref=np.dot(A,B)

    # 计算A的量化参数sa,za和量化矩阵Aq
    # A=sa*(Aq-za)
    sa,za=calc_quant_param(A)   
    Aq=calc_quant_data(A,sa,za)

    #显示量化结果
    print('sa:%f, za:%f'%(sa,za))
    print('Aq:\n',Aq)
    print('A:\n',A)
    print('recovered A:\n',calc_dequant_data(Aq,sa,za))

    # 计算A的量化参数sa,za和量化矩阵Aq
    # A=sa*(Aq-za)
    sb,zb=calc_quant_param(B)   
    Bq=calc_quant_data(B,sb,zb)

    print('sb:%f, zb:%f'%(sb,zb))
    print('Bq:\n',Bq)
    print('B:\n',B)
    print('recovered B:\n',calc_dequant_data(Bq,sb,zb))

    # 计算C的量化参数sc,zc
    # 注意,实际运算时sc,zc是通过数据统计
    # 事先指定的,不会像这里从答案计算得到
    sc,zc=calc_quant_param(C_ref)   

    ## 使用量化形式计算乘法
    Cq=quant_matmul(Aq,sa,za,
                    Bq,sb,zb,
                       sc,zc)
                       
    ## 比较计算误差,我们将Cq反量化后和参考答案比较
    C=calc_dequant_data(Cq,sc,zc)

    print('sc:%f, zc:%f'%(sc,zc))
    print('Cq:\n',Cq)
    print('C:\n',C)
    print('reference C:\n',C_ref)
    print('relative err:',np.linalg.norm(C-C_ref)/np.linalg.norm(C))

结果:

sa:0.010289, za:116.000000

Aq:
 [[162   0 255]
 [ 86  46 202]]
 
A:
 [[ 0.47143516 -1.19097569  1.43270697]
 [-0.3126519  -0.72058873  0.88716294]]
 
recovered A:
 [[ 0.47329177 -1.19351839  1.43016428]
 [-0.30866855 -0.72022661  0.88484984]]
 
sb:0.013305, zb:169.000000

Bq:
 [[234 121 170]
 [  0 255 244]
 [241  17 144]]
 
B:
 [[ 0.85958841 -0.6365235   0.01569637]
 [-2.24268495  1.15003572  0.99194602]
 [ 0.95332413 -2.02125482 -0.33407737]]
 
recovered B:
 [[ 0.86481115 -0.63862977  0.01330479]
 [-2.248509    1.14421168  0.99785902]
 [ 0.95794466 -2.02232762 -0.33261967]]
 
sc:0.035324, zc:129.000000

Cq:
 [[255   0  82]
 [191  61 100]]
 
C:
 [[ 4.45084753 -4.55682009 -1.66023678]
 [ 2.19009958 -2.4020447  -1.02440142]]
 
reference C:
 [[ 4.4420576  -4.56561002 -1.65261875]
 [ 2.1930554  -2.42287488 -1.01607369]]
 
relative err: 0.0036312932138631597

欢迎关注公众号【三戒纪元】

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

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

相关文章

【Java代码审计】XSS漏洞产生原理及其修复

XSS漏洞代码审计 前言XSS漏洞原理1、反射型XSS反射型XSS漏洞审计 2、存储型XSS存储型XSS审计 漏洞修复 前言 笔者已经很长时间没有写过笔记力,经过一年的摸爬滚打也算是走到了代码审计这一关,这些日子也还在为项目和hw周旋,上周终于面试完&a…

今年是很惨,但有人怒砍一大把Offer...

300万字!全网最全大数据学习面试社区等你来! 今天的主人公是一个应届生,同时也是我在训练营辅导的一名同学,在整体经济下行,互联网见顶的情况拿到包括腾讯、蚂蚁、B站等多家互联网大厂Offer。 下面是我站在求职者角度提…

DDL语句DQL语句

SQL学习笔记 DDL语句--操作数据表 /* 快捷键: insert键 在插入 和 替换模式之间切换 ctrl 字母z 撤销上一步操作 tab 往后缩进(默认4个空格) shift tab 往前缩进(默认4个空格) …

基于Java+SpringBoot+Vue学生信息管理设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

重磅发布:《AI产品经理的实操手册(2023版)》

今天是咱们社群“AI产品经理大本营”六周年活动的最后一天,正式发布这份大家和我都非常期待的重磅干货——《AI产品经理的实操手册(2023版)》 上周发布的“AI季度资料包(2023Q2)”,适合对AI初步感兴趣的产品…

《统计学习方法》——隐马尔可夫模型(中)

概率计算算法 直接计算法 给定模型 λ ( A , B , π ) \lambda(A,B,\pi) λ(A,B,π)和观测序列 O ( o 1 , o 2 , ⋯ , o T ) O(o_1,o_2,\cdots,o_T) O(o1​,o2​,⋯,oT​),计算观测序列 O O O出现的概率 P ( O ∣ λ ) P(O|\lambda) P(O∣λ)。最直接的方法就是…

『python爬虫』23. selenium之窗口切换与iframe(保姆级图文)

目录 1. 窗口切换2. 抓取拉勾网职务信息2.1 拉勾网查看职务详情与价格2.2 完整代码 3. iframe的处理总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 1. 窗口切换 窗口句柄的定义:WebDriver对象有wi…

肝一肝设计模式【八】-- 外观模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 肝一肝设计模式【三】-- 原型模式 传送门 肝一肝设计模式【四】-- 建造者模式 传送门 肝一肝设计模式【五】-- 适配器模式 传送门 肝一肝设计模式【六】-- 装饰器模式 传送门 肝…

Windows本地快速搭建SFTP文件服务器,并端口映射实现公网远程访问

文章目录 1. 搭建SFTP服务器1.1 下载 freesshd服务器软件1.3 启动SFTP服务1.4 添加用户1.5 保存所有配置 2 安装SFTP客户端FileZilla测试2.1 配置一个本地SFTP站点2.2 内网连接测试成功 3 使用cpolar内网穿透3.1 创建SFTP隧道3.2 查看在线隧道列表 4. 使用SFTP客户端&#xff0…

ChatGPT 和 Elasticsearch:使用 ChatGPT 处理 Elastic 数据的插件

作者:Baha Azarmi 你可能已经阅读过这篇关于我们将 Elasticsearch 的相关性功能与 OpenAI 问答功能相结合的博文。 该帖子的主要思想是说明如何将 Elastic 与 OpenAI 的 GPT 模型结合使用来构建响应并向用户返回上下文相关的内容。 我们构建的应用程序可以公开一个…

好久不见,甚是想念

大家好,我是程序员小哈。 一晃停更好久了,之前因为12月份阳了,身体一直感觉没有完全恢复,就一直偷懒了,外加单位的事情比较多,实在是分身乏术,最近总算是告一段落了,咱们的知识分享…

shell脚本——流编辑器“三剑客”之sed命令

shell脚本——流编辑器“三剑客”之sed命令 一、流编辑器“三剑客”二、sed编辑器1、sed的工作流程2、命令格式3、常用选项4、常用操作5、打印内容6、使用地址7、删除行8、替换9、插入 一、流编辑器“三剑客” sed awk grep 二、sed编辑器 sed是一种流编辑器,流编…

手把手项目实战,搞完,直接写在简历上!

大家好,我是田哥 很多没有项目经验,或者没有亮点项目的朋友可以看过来。 最近田哥在搞一个项目:充电桩项目。本文给大家介绍这个项目背景、部分原型图、核心功能、核心模块、技术栈等。 项目背景介绍 随着我国汽车行业的不断发展&#xff0c…

AI绘画-Midjourney基础1-基本操作

Midjourney是一款 AI 绘画工具,可以根据你的提示(本文中称为 prompt)创作出各种图像。你只需要在Discord上和一个机器人聊天,就可以用简单的命令来控制它。目前已不支持免费试用,可以选择付费计划来获得更多功能和优势…

Ae 效果详解:Roto 笔刷和调整边缘

使用 Roto 笔刷工具或调整边缘工具之后,Ae 会向图层应用“Roto 笔刷和调整边缘” Roto Brush & Refine Edge效果。 版本 Version 目前包括 1.0(经典)1.0 Classic和 2.0 两个版本。 品质 Quality 选择围绕边缘的细节质量。 --标准 Stan…

传输时延和传播时延(补充:频段,信道带宽,数据速率的区别,以及帧大小和帧长)

先来看例题,看是否能区分 例题1: 假设生产管理网络系统采用B/S工作方式,经常上网的用户数为150个,每用户每分钟产生8个事务处理任务,平均事务章大小为0.05MB,则这个系统需要的信息传输速率为(68)。 (68)A…

Node接入ChatGPT 的最强对手Claude

由于个人的chatGPT免费版本即将到期, Claude 很火,在网上被说成是 ChatGPT 的最强对手,是 ChatGPT 的替代品。本文我将介绍下 Claude 是什么,以及如何免费使用 Claude. 什么是Claude 看一下它是如何自我介绍的 Slack Slack 是一款流行的团…

在 Transformers 中使用对比搜索生成可媲美人类水平的文本

1. 引言 自然语言生成 (即文本生成) 是自然语言处理 (NLP) 的核心任务之一。本文将介绍神经网络文本生成领域当前最先进的解码方法 对比搜索 (Contrastive Search)。提出该方法的论文 “A Contrastive Framework for Neural Text Generation” 最初发表于 NeurIPS 2022 ([论文]…

目标检测创新:一种基于区域的半监督方法,部分标签即可(附原论文下载)...

关注并星标 从此不迷路 计算机视觉研究院 公众号ID|ComputerVisionGzq 学习群|扫码在主页获取加入方式 论文地址:https://arxiv.org/pdf/2201.04620v1.pdf 计算机视觉研究院专栏 作者:Edison_G 研究表明,当训练数据缺少…

招募:AICG内容联合创作计划 | AIGC实践

AIGC(AI Generated Content,人工智能自动生成内容)必将成为小微创业团队进行低成本内容运营的最佳实践。 你同意这个观点吗? 如果我们恰好想法一致,或许可以一起搞点事情,探索一下商业场景下,应…