减少乘法次数的优化算法(Gauss、Strassen、Winograd)

news2024/11/26 0:27:37

目录

Gauss算法

Strassen算法

Winograd算法

Winograd 1D

Winograd 2D


        在硬件设计中,乘法无论是在逻辑资源的使用上还是组合逻辑的延时上都要比加法高很多。从硬件方面考虑,我们都更倾向于将乘法转换成移位和加法,譬如乘以8,可以转换为左移3位。A*15可以转换为(A<<4) - A,将乘法转换为其他的运算以减少资源消耗和组合逻辑延时。

        但有时候乘以的数值不是定值的时候,我们在硬件上就很难将乘法转化为移位和加法,那么在乘法无法避免的时候,如何减少乘法的次数就显得至关重要。


Gauss算法

Gauss算法优化乘法

                                  (a+bi)*(c+di) = (ac -bd) + (bc + ad )i

计算(a+bi)*(c+di) 时,总共涉及到的乘法次数为四次乘法和三次加法。

使用gauss算法优化:

                                                      \begin{c} \\k_{1} = c * (a+b) \\ k_{2} = a*(d-c) \\k_{3} =b*(c+d)\\ \\Real_{1} = k_{1}-k_{3} \\Imaginary_2 = k_1+ k_2 \end{c}

        经过Gauss算法优化之后,实部为Real,虚部为Imaginar。整个计算量从原来的4次乘法+3次加法,变到了3次乘法+5次加法,减少了乘法次数。


Strassen算法

        上面的矩阵乘法,总共用到了8次乘法+4次加法。

Strassen算法和Gauss算法很相似,优化的方法如下:

                        \\P_1=a(f-h),\ P_2=(a+b)h,\ P_3=(c+d)e\ P_4=d(g-e) \\P_5=(a+d)(e+h),\ P_6=(b-d)(g+h),\ P_7=(a-c)(e+f)

                        results: AB=\begin{bmatrix} P_5+P_4-P_2+P_6&P_1+P_2 \\ P_3+P_4&P_1+P_5-P_3-P_7 \end{bmatrix}   

        Strassen算法应用在2X2的矩阵乘法可以将8次乘法+4次加法,转换为7次乘法 + 18次加法。       

        如果矩阵B是常数,譬如权重矩阵。那么Strassen算法可以将8次乘法+4次加法,转换为7次乘法 + 13次加法,减少了乘法次数

        Strassen算法通过减少乘法数,把矩阵乘法的复杂度从 Θ(N3) 减少到 Θ(N2.807),减少了计算次数的代价就是需要更多的内存。


Winograd算法

        Winograd是一种计算短卷积的快速算法。

        一维卷积运算定义为F(m,r)mOutput SizerFilter Size,则输入信号的长度为m+r−1:  

        卷积运算是对应位置相乘然后求和,输入信号每个位置至少要参与1次乘法,所以乘法数量最少与输入信号长度相同,记为:

                                                     \\u(F(m,r)) = m + r-1

        在行列上分别进行一维卷积运算,可得到二维卷积,记为F(m×n,r×s),输出为m×n,卷积核为r×s,则输入信号为(m+r−1)(n+s−1),乘法数量至少为μ(F(m×n,r×s))=μ(F(m,r))μ(F(n,s))=(m+r−1)(n+s−1)。

Winograd 1D

        输入信号为d = [d_0\ d_1\ d_2\ d_3 ]^T,卷积核为g =[g_0\ g_1\ g_2]^T,输入为1*4矩阵,卷积核为1*3矩阵,两者卷积结果会得到两个值,可以把上述卷积过程写为如下矩阵乘法形式                            ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​            ​​​​​​​F(2,3)=\begin{bmatrix} d_0 &d_1 &d_2 \\ d_1&d_2 &d_3 \end{bmatrix} \begin{bmatrix} g_0\\g_1 \\ g_2 \end{bmatrix}=\begin{bmatrix} r_0\\r_1 \end{bmatrix}

        如果是一般的矩阵乘法,则需要进行6次乘法和4次加法,过程如下:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​            \\r_0=(d_0*g_0)+(d_1*g_1)+(d_2*g_2)\\ r_1 =(d_1*g_0)+(d_2*g_1)+(d_3*g_2)

        WInograd 算法是面向卷积的运算而不是普通的矩阵相乘:

        ​​​​​​​        ​​​​​​​        ​​​​​​​            F(2,3)=\begin{bmatrix} d_0 &d_1 &d_2 \\ d_1&d_2 &d_3 \end{bmatrix} \begin{bmatrix} g_0\\g_1 \\ g_2 \end{bmatrix}=\begin{bmatrix} m_1+m_2+m_3 \\ m_2-m_3-m_4 \end{bmatrix}

        其中:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​    \\m_1=(d_0-d_2)g_0\ \ \ \ \ m_2=(d_1+d_2)\frac{g_2+g_1+g_2}{2}\\ m_4=(d_1-d_3)g_2\ \ \ \ \ m_3=(d_2-d_1)\frac{g_0-g_1+g_2}{2}

        Winograd的计算需要进行4次乘法+12次加法+2次移位。如果卷积核filter的g_i为常数,例如filter为固定权重矩阵,则Winograd的计算需要进行4次乘法+8次加

        为了方便,Winograd 1D可以表示为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​            Y=A^T [(Gg)\odot (B^T d)]

        其中\odot为点积,即对位相乘。B^T为Input transform矩阵,尺寸为(m+r-1)\times(m+r-1)​​​​​​​,G为Filter transform矩阵,尺寸为(m+r-1)\times rr,A^T为output transform矩阵,尺寸为m\times(m+r-1)

            B^T=\begin{bmatrix} 1&0 &-1 &0 \\ 0&1 &1 &0 \\ 0& -1 & 1 &0 \\ 0& 1 &0 &-1 \end{bmatrix} ,\ G=\begin{bmatrix} 1& 0 &0 \\ \frac{1}{2}& \frac{1}{2}& \frac{1}{2} \\ \frac{1}{2}& -\frac{1}{2}& \frac{1}{2} \\ 0 & 0 & 1 \end{bmatrix}, \ A^T=\begin{bmatrix} 1 &1 & 1 & 0\\ 0& 1& -1& -1 \end{bmatrix}

        g卷积核:g=\begin{bmatrix} g_0&g_1 &g_2 \end{bmatrix}^T; d输入信号:d=\begin{bmatrix} d_0 &d_1 &d_2 &d_3 \end{bmatrix}^T,将这些矩阵带入到Y等式中,就能推出和上面F(2,3)一样的结果。

Winograd 2D

        根据Winograd 1D公式,可以如下化简:

        ​​​​​​​        ​​​​​​​        ​​​​​​​          Y=A^T [(Gg)\odot (B^T d)]=A^T [(GgG^T)\odot (B^T dB)]A

        对于二维卷积,如右图所示,用一个3*3的卷积核对4*4的区域进行卷积,总共会卷积四次,我们将3*3的卷积核拉长成一个9*1的矩阵,4*4的区域按照和卷积核的乘法方式,扩展为一个4*9的矩阵,这样这个4*9的区域扩展矩阵和9*1的卷积核扩展矩阵的乘积还是等于卷积结果:

         通过上面这种方式优化,我们就成功的将2D的卷积,转化为了1D的乘法,就可以使用我们前面Winograd 1D的化简公式来优化卷积乘法。

        每个子矩阵中重复元素的位置与一维时相同,同时重复的子矩阵也和一维时相同

 我们就可以把Winograd 1D的乘法模块复用到2D中:

        ​​​​​​​        ​​​​​​​        ​​​​​​​            F(2,3)=\begin{bmatrix} d_0 &d_1 &d_2 \\ d_1&d_2 &d_3 \end{bmatrix} \begin{bmatrix} g_0\\g_1 \\ g_2 \end{bmatrix}=\begin{bmatrix} r_0\\r_1 \end{bmatrix}

        令D_0=[k_0,k_1,k_2,k_3]^T,即窗口中的第0行元素,D_1,D_2,D_3表示第12、3行;W_0=[w_0,w_1,w_2]^T,因此我们可以推导出如下结果:

 简单来说,1D Winograd被嵌套成了2D Winograd

        对于如上的乘法,直接卷积将会进行36次乘法(4*9),采用Winograd算法,可以将乘法的数目减少到16次,减少了2.25倍,对优化卷积算法效果显著。

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

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

相关文章

stm32项目平衡车详解(stm32F407)

stm32项目 stm32项目介绍值平衡车 本文章学习借鉴于创客学院团队&#xff0c;以表感谢。教学视频 文章目录stm32项目前言一、平衡小车平衡小车的功能介绍平衡小车功能开发需求平衡小车整体框架小车环境数据采集进程1. 平衡小车姿态信息介绍2. 平衡小车项目工程框架搭建3. Mpu6…

【面试题】原型和原型链

1. 如何用class实现继承 // 父类 class People{constructor(name){this.name name}eat(){console.log(${this.name} eat something)} }// 子类 class Student extends People{constructor(name, number){super(name)this.number number}sayHi(){console.log(姓名&#xff1a…

自动化脚本如何切换环境?Pytest这些功能你必须要掌握

文章目录一、前言二、安装三、使用第1种:使用方式是终端添加–base-url这个命令第2种:使用方式是在pytest.ini配置文件种去配置base_url,然后自动读取url的数据&#xff0c;这样就不用添加–base-url这个命令行参数了&#xff1a;第3种:pytest有个hooks函数&#xff0c;可以自定…

最优二叉搜索树问题(Java)

最优二叉搜索树问题&#xff08;Java&#xff09; 文章目录最优二叉搜索树问题&#xff08;Java&#xff09;1、前置介绍2、算法设计思路2.1 最优二叉搜索树的结构2.2 一个递归算法2.3 计算最优二叉搜索树的期望搜索代价3、代码实现4、复杂度分析5、参考资料1、前置介绍 设S{x…

R语言探索 BRFSS 数据和预测

加载包 library(ggplot2) library(dplyr) library(Hmisc) library(corrplot) 加载数据 load("brfss2013.RData") 第1部分&#xff1a;关于数据 行为风险因素监测系统&#xff08;BRFSS&#xff09;是美国的年度电话调查。BRFSS旨在识别成年人口的风险因素并报告…

docker启动出现Error response from daemon: Cannot restart container的报错

1、发现问题 突然发现启动(重启)容器的时候报这个错 Error response from daemon: Cannot restart container 容器id: driver failed programming external connectivity on endpoint 容器名 (容器id): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --…

图像超分辨率:优化最近邻插值Super-Resolution by Predicting Offsets

文章目录3. Super-Resolution by Predicting Offsets3.1. 这篇论文用于处理栅格化图像的超分&#xff0c;不知道这样翻译对不对&#xff0c;3.2. 作者认为栅格图像的边缘比较规则&#xff0c;可以训练一个offset map移动栅格图像的 边缘点&#xff08;背景和前景像素 移动 和交…

能率携手梦想改造家,打造适老化住宅新典范

家装改造类节目《梦想改造家》第九季温情回归&#xff0c;日本一级建筑设计师本间贵史携手知名燃热品牌能率&#xff0c;与节目组一起关注民生&#xff0c;走进由一家五口组成的“足不出户的家”&#xff0c;共启老宅改造计划&#xff0c;倾情助力普通家庭拥抱生活与梦想&#…

(Matlab实现)蚂蚁狮子优化算法在电力系统中的应用

目录 1 知识一网打尽 2 蚂蚁狮子优化算法在电力系统经济调度中的应用 3 运行结果 4 Matlab代码实现 1 知识一网打尽 这里总结一位博主的电力系统经济调度目录 蚂蚁狮子优化算法&#xff08;完整Matlab代码实现&#xff09; 多目标蚂蚁狮子优化算法&#xff08;Matlab代码…

拒绝灵感焦虑,藏在UI设计师书签里的宝藏网站!

都在说UI设计“越来越吃香”&#xff0c;导致其他门类的设计师一心想转行。 上次和入行8年的UI大佬聊天&#xff0c;她告诉小摹3条UI设计师必备能力&#xff1a; 审美能力和眼界&#xff1a;一个界面好不好看最后都是UI来定&#xff0c;为了不背锅&#xff0c;UI一定要有国际流…

dolphinscheduler2.0.5性能手动测试

目录&#x1f42c;官方配置文件说明&#x1f42c;测试并发量&#x1f420;线程数量设置100&#x1f420;线程数量设置200&#x1f420;线程数量设置500&#x1f42c;测试结论&#x1f42c;官方配置文件说明 官方说明 master.exec.threads&#xff1a; master工作线程数量,用于…

【2013】408联考数据结构真题整理

2013年 1 题目 解析 原始&#xff1a;升序 升序 变 升序 尾插法 改编&#xff1a;升序 升序 变 降序 头插法 2 题目 答案&#xff1a;C 解析 3 题目 答案&#xff1a;B 解析 二叉排序树&#xff0c;或者是空树&#xff0c;或者是满足以下性质的二叉树&#xff1a; …

基于PHP+MySQL音乐网站的设计与实现

随着时代的发展,音乐已经逐渐成为了人们生活中必不可少的一种调剂品,人们对音乐的追求也越来越强烈,为此我通过PHP和MYSQL开发了本音乐网站 本音乐网站是一个综合性的音乐分享网站,它主要实现了娱乐新闻,上榜歌手,音乐试听,音乐下载,下载排行,音乐库,在线留言等基本的音乐共享功…

Matplotlib绘制折线图、散点图、柱状图、直方图、饼图代码

一、折线图 以折线的上升或下降来表示统计数量的增减变化的统计图 特点&#xff1a;能够显示数据的变化趋势&#xff0c;反映事物的变化情况(变化)函数&#xff1a;plt.plot(x, y) import matplotlib.pyplot as plt import randomfrom pylab import mpl mpl.rcParams["f…

day31 文件上传js验证mimeuser.ini语言特性

前言 #知识点&#xff1a; 1、文件上传-前端验证 2、文件上传-黑白名单 3、文件上传-user.ini妙用 4、文件上传-PHP语言特性 #详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整性&#xff0c;二次渲染…

基于MATLABsimulink的《电路原理》课程仿真实验平台开发

目 录 摘 要 I Abstract II 第一章 绪论 1 1.1选题背景及意义 1 1.2设计内容 1 1.3设计思想 2 第二章 MATLAB简介 3 2.1 MATLAB程序设计 3 2.2 Simulink仿真 4 2.2.1 Simulink 启动 4 2.2.2 Simulink 模块库及模块操作 4 2.2.3 仿真参数设置 6 2.3图形用户界面&#xff08;GUI&…

基于STM32的温控风扇

本设计是基于STM32的温控风扇&#xff0c;主要实现以下功能&#xff1a; 温度控制风速&#xff0c;四个挡位&#xff0c;停止、低速、中速、高速 按键可切换模式&#xff0c;可手动切换挡位&#xff0c;四个挡位&#xff0c;停止、低速、中速、高速 按键设置温度值&#xff0c…

网络刷卡器开发,刷新移动物联新生活

在物联网应用需求和身份校验普及的影响下&#xff0c;沐渥自主研发生产了一款基于网络协议传输的读卡设备——网络刷卡器&#xff0c;这是一款体积小巧&#xff0c;方便携带&#xff0c;即插即用&#xff0c;无需安装驱动&#xff0c;采用USB通讯&#xff0c;即刻响应对接客户的…

Linux系统漏洞本地提权

目录 一、实验项目名称 二、实验目的 三、实验内容 四、实验环境 五、实验步骤 六、实验结果 七、实验总结 一、实验项目名称 Linux系统漏洞本地提权及跳板设置实验 二、实验目的 1.msf工具的使用&#xff1b; 2.“脏牛”漏洞CVE-2016-5195漏洞利用方法。 三、实验…

MCE | 铁死亡——调节性细胞死亡

多细胞生物中&#xff0c;调节性细胞死亡过程 (RCD) 是细胞维持组织形态和功能必不可少的稳态机制。此前研究较多的调节性细胞死亡包括三大类&#xff1a;细胞凋亡、自噬和坏死。 “铁死亡”这一概念最早在 2012 年由 Dr. Brent R Stockwell 提出&#xff0c;它是一种铁离子依赖…