收藏神经网络的计算量和参数量估计总结

nas1638收藏神经⽹络的计算量和参数量估计总结
点上⽅蓝字⼈⼯智能算法与Python⼤数据获取更多⼲货
在右上⽅ ··· 设为星标 ★,第⼀时间获取资源
仅做学术分享,如有侵权,联系删除
转载于 :作者⼁DengBoCong@知乎
编辑⼁极市平台
Github:本⽂代码放在该项⽬中:NLP相关Paper笔记和代码复现
⽬录:
全连接层的计算量和参数量估计
激活函数的计算量估计
LSTM的计算量和参数量估计
卷积层的计算量和参数量估计
深度可分离卷积的计算量和参数量估计
Batch Normalization的计算量和参数量估计
其他层的计算量和参数量估计
对于深度学习模型来说,拥有⼀个⾮常好的设计思路和体系架构⾮常重要,对模型性能的影响⾮常之⼤,所以对于模型的研究倾向于在模型性能上的表现。但是对于商业应⽤来说,算法模型落地的另⼀个重要考量就是在满⾜业务场景内存占⽤、计算量等需要的同时,保证算法的性能,这个研究对于移动端的模型部署更加明显,这有利于压缩应⽤的体积。最近这段时间正好在研究关于移动端模型部署(TensorFlow Lite⽤的不是很顺⼼呀),所以要仔细研究⼀下模型的参数量等,这不仅可以让我们对模型的⼤⼩进⾏了解,还能更好的调整结构使得模型响应的更快。
可能有时候觉得,模型的⼤⼩需要计算嘛,直接保存⼤⼩直接看不就完事⼉了?运⾏速度就更直接了,多运⾏⼏次取平均速度不就⾏了嘛? so easy?这个想法也没啥错,但是⼤前提是你得有个整型的模型呀(训练成本多⾼⼼⾥没数嘛),因此很多时候我们想要在模型设计之初就估计⼀下模型的⼤⼩以及可能的运⾏速度(通过⼀些指标侧⾯反应速度),这个时候我们就需要更深⼊的理解模型的内部结构和原理,从⽽通过估算模型内部的参数量和计算量来对模型的⼤⼩和速度进⾏⼀个初步评估。
⼀个朴素的评估模型速度的想法是评估它的计算量。⼀般我们⽤FLOPS,即每秒浮点操作次数FLoating point OPerations per Second 这个指标来衡量GPU的运算能⼒。这⾥我们⽤MACC,即乘加数Multiply-ACCumulate operation,或者叫MADD,来衡量模型的计算量。不过这⾥要说明⼀下,⽤MACC来估算模型的计算量只能⼤致地估算⼀下模型的速度。模型最终的的速度,不仅仅是和计算量多少有关系,还和诸如内存带宽、优化程度、CPU流⽔线、Cache之类的因素也有很⼤关系。
下⾯我们对计算量来进⾏介绍和定义,⽅便我们后续展开层的讲解:
神经⽹络中的许多计算都是点积,例如:
y = w[0]*x[0] + w[1]*x[1] + w[2]*x[2] + ... + w[n-1]*x[n-1]
此处,  和  是两个向量,结果  是标量(单个数字)。对于卷积层或完全连接的层(现代神经⽹络中两种主要类型的层),  是该层的学习权重,  是该层的输⼊。我们将  计数为⼀个乘法累加或1个MACC,这⾥的“累加”运算是加法运算,因为我们将所有乘法的结果相加,所以上式具有  个这样的MACC(从技术上讲,上式中只有  个加法,⽐乘法数少⼀个,所以这⾥知识认为MACC的数量是⼀个近似值)。就FLOPS⽽⾔,因为有  个乘法和  个加法,所以点积执⾏  FLOPS,因此,MACC ⼤约是两个FLOPS。现在,我们来看⼏种不同的层类型,以了解如何计算这些层的MACC数量。
注意了:下⾯的阐述如果没有特别说明,默认都是batch为1。
全连接层计算量和参数量估计
在完全连接的层中,所有输⼊都连接到所有输出。对于具有  输⼊值和  输出值的图层,其权重  可以存储在  矩阵中。全连接层执⾏的计算为:
在这⾥,  是  输⼊值的向量,  是包含图层权重的  矩阵,  是  偏差值的向量,这些值也被相加。结果  包含由图层计算的输出值,并且也是⼤⼩  的向量。对于完全连接层来说,矩阵乘法为  ,其中具有  个MACC(和权重矩阵  ⼤⼩⼀样),对于偏置  ,正好补齐了前⾯我们所说的点积中正好少⼀个加法操作。因此,⽐如⼀个具有300个输⼊神经元和100个输出神经元的全连接层执⾏  个MACC。特别提⽰:上⾯我们讨论的批次⼤⼩  需要具体计算需要乘上Batch。
也就是说,通常,将长度为  的向量与  矩阵相乘以获得长度为  的向量,则需要  MACC或
FLOPS。
上⾯我们讨论了全连接层的计算量,那么它的参数量是多少呢?这个应该很容易就算出来,对于全连接层⽽⾔,它的参数分别是权重  和偏置  ,所以对于上⾯的例⼦中具有300个输⼊神经元和100个输出神经元的全连接层的参数量是:  ,这个很容易进⾏验证,下图是使⽤TensorFlow进⾏验证参数量:
激活函数计算量
通常,⼀个层后⾯紧接着就是⾮线性激活函数,例如ReLU或sigmoid,理所当然的计算这些激活函数需要时间,但在这⾥我们不⽤MACC 进⾏度量,⽽是使⽤FLOPS进⾏度量,原因是它们不做点积,⼀些激活函数⽐其他激活函数更难计算,例如⼀个ReLU只是:
这是在GPU上的⼀项操作,激活函数仅应⽤于层的输出,例如在具有  个输出神经元的完全连接层上,ReLU计算  次,因此我们将其判定为  FLOPS。⽽对于Sigmoid激活函数来说,有不⼀样了,它涉及到了⼀个指数,所以成本更⾼:
在计算FLOPS时,我们通常将加,减,乘,除,求幂,平⽅根等作为单个FLOP进⾏计数,由于在Sigmoid激活函数中有四个不同的运算,因此将其判定为每个函数输出4 FLOPS或总层输出  FLOPS。所以实际上,通常不计这些操作,因为它们只占总时间的⼀⼩部分,更多时候我们主要对(⼤)矩阵乘法和点积感兴趣,所以其实我们通常都是忽略激活函数的计算量。
对于参数量?注意了它压根没有参数,请看它们的公式,⽤TensorFlow验证如下:
LSTM计算量和参数量估计
关于LSTM的原理可以参考这⼀篇⽂章
Understanding LSTM Networkscolah.github.io
LSTM结构如下:
海门市东洲小学
实际上LSTM⾥⾯有 4 个⾮线性变换(3 个 门 + 1 个 tanh),每⼀个⾮线性变换说⽩了就是⼀个全连接⽹络,形如:
。其中,第⼀层是  和  的结合,维度就是embedding_size + hidden_size,第⼆层就是输出层,维度为 hidden_size,则它的计算量按照上⽂我们对全连接层的阐述,易得MACC为:
(embedding_size + hidden_size) * hidden_size * 4
四个⾮线性变换中,还会对全连接层的输出进⾏激活函数计算(三个sigmoid和⼀个tanh),由上⾯讨论的sigmoid我们知道,对于
sigmoid的计算量为:(embedding_size + hidden_size) * hidden_size * 3 *4个FLOPS,⽽tanh的计算公式为:  ,其中共有⼋个加,减,乘,除,求幂,平⽅根等计算,所以计算量为:(embedding_size + hidden_size) * hidden_size * 8个FLOPS。除此之外,LSTM除了在四个⾮线性变换中的计算,还有三个矩阵乘法(不是点积)、⼀个加法、⼀个tanh计算,其中三个矩阵乘法都是shape为(batch, hidden_size),则这四个运算的计算量为:batch * hidden_size + batch * hidden_size + batch * hidden_size + batch * hidden_size + batch * hidden_size * 8,综上所述,LSTM的计算量为:
(embedding_size + hidden_size) * hidden_size * 4 个MACC
embedding_size * hidden_size * 8 + hidden_size * (hidden_size + 20) 个FLOPS
⽽该⽹络的参数量就是:
((embedding_size + hidden_size) * hidden_size + hidden_size) * 4
对于特征维128的输⼊,LSTM单元数为64的⽹络来说,LSTM的参数量为:((128 + 64) * 64 + 64) * 4 = 49408,通过TensorFlow 验证如下:钱德勒
卷积层计算量和参数量估计
卷积层的输⼊和输出不是⽮量,⽽是shape为  的三维特征图,其中  是特征图的⾼度,  是宽度,  是每个位置的通道数,正如我们所见今天使⽤的⼤多数卷积层都是⼆维正⽅内核,对于内核⼤⼩为  的转换层,MACC的数量为:
输出特征图中有Hout × Wout × Cout个像素;
每个像素对应⼀个⽴体卷积核K x K x Cin在输⼊特征图上做⽴体卷积卷积出来的;
⽽这个⽴体卷积操作,卷积核上每个点都对应⼀次MACC操作
同样,我们在这⾥为了⽅便忽略了偏置和激活。我们不应该忽略的是层的stride,以及任何dilation因⼦,padding等。这就是为什么我们需要参看层的输出特征图的尺⼨Hout × Wout,因它考虑到了stride等因素。⽐如,对于  ,128个filter的卷积,在
带有64个通道的输⼊特征图上,我们执⾏MACC的次数是:
这⼏乎是10亿次累积运算!注意:在此⽰例中,我们使⽤“same”填充和  ,以便输出特征图与输⼊特征图具有相同的⼤⼩。通常看到卷积层使⽤  ,这会将输出特征图⼤⼩减少⼀半,在上⾯的计算中,我们将使⽤  ⽽不是
那我们现在来计算⼀下参数量,如果了解卷积的原理,应该也不难算出它的参数量(可能有⼈会说卷积原理怎么理解,这⾥推荐⼀篇写得通俗易懂的⽂章:
模型仿真
G-kdom:CNN基础知识——卷积(Convolution)、填充(Padding)、步长(Stride)
根据卷积的原理,对于上⾯的例⼦中,  ,128个filter的卷积,在  带有64个通道的输⼊特征图上的参数量为:
,⽤TensorFlow验证结果如下图:
深度可分离卷积层
深度可分离卷积是将常规卷积因式分解为两个较⼩的运算,它们在⼀起占⽤的内存更少(权重更少),并且速度更快,这些层在移动设备上可以很好地⼯作,既是MobileNet的基础,也是Xception等⼤型模型的基础。深度可分离卷积中,第⼀个操作是深度卷积,它在很多⽅⾯与常规卷积相似,不同之处在于我们不合并输⼊通道,也就是说输出通道数始终与输⼊通道数相同,深度卷积的MACC总数为:
这减少了  的⼯作量,⽐常规的卷积层效率更⾼。当然,仅深度卷积是不够的,我们还需要增加“可分离”,第⼆个操作是常规卷积,但始终使⽤内核⼤⼩  ,即  ,也称为“逐点”卷积,MACC的数量为:
深度可分离卷积分为两个操作,深度卷积和可分离,所以现在我们对两种操作分别就上⾯的例⼦计算,和并和常规  卷积进⾏⽐较:
3×3 depthwise          : 7,225,344
1×1 pointwise          : 102,760,448
深度可分离卷积          : 109,985,792 MACCs阪神大地震
常规 3×3 卷积          : 924,844,032 MACCs
所以深度可分离卷积的计算量简化为:东风金龙
我们来看看MobileNet V2中的对深度可分离卷积的拓展,MobileNet V2相⽐与V1,主要是由DW+PW两层变成了下⾯的三层
PW+DW+PW:
⼀个  卷积,为特征图添加更多通道(称为expansion layer)
深度卷积,⽤于过滤数据(depthwise convolution)
卷积,再次减少通道数(projection layer,bottleneck convolution)
这种扩展块中MACC数量的公式:Cexp = (Cin × expansion_factor),(expansion_factor⽤于创建深度层要处理的额外通道,使得Cexp在此块内使⽤的通道数量)
,(参照上⾯传统卷积,把卷积核设置为1x1即得)
(参照MoblieNet V1分析)
(参照MoblieNet V1分析,或者传统卷积把卷积核设置为1x1即得)
把所有这些放在⼀起:
这与MobileNet V1使⽤的深度可分层相⽐如何?如果我们使⽤输⼊特征图  扩展因⼦6,以及  的  深度卷积和128输出通道,那么MACC的总数是:
这不是⽐以前更多吗?是的,它甚⾄超过了最初的  卷积。但是......请注意,由于扩展层,在这个块内,我们实际上使⽤了  通道。因此,这组层⽐原始的  卷积做得更多(从64到128个通道),⽽计算成本⼤致相同。
Batch normalization
在现代⽹络中,通常在每个卷积层之后都包含⼀个batch norm层。对于想要详细了解Batch normalization的原理,可参考这篇⽂章:DengBoCong:论⽂阅读笔记:看完也许能进⼀步了解Batch Normalization
Batch normalization在层的输出上进⾏计算,针对每个输出值,计算公式如下:
此处,  是上⼀层的输出图中的元素。我们⾸先通过减去该输出通道的平均值并除以标准偏差来对该值进⾏归⼀化(epsilon ⽤于确保不除以0,通常为0.001),然后,我们将系数gamma缩放,然后添加⼀个偏差或偏移beta。每个通道都有⾃⼰的gamma,beta,均值和⽅差值,因此,如果卷积层的输出中有  个通道,则Batch normalization层将学习  参数,如下图所⽰:
通常将Batch normalization应⽤于卷积层的输出,⽽在ReLU之前,在这种情况下,我们可以做⼀些数学运算以使Batch normalization层消失!由于在全连接层中进⾏的卷积或矩阵乘法只是⼀堆点积,它
们是线性变换,⽽上⾯给出的Batch normalization公式也是线性变换,因此我们可以将这两个公式组合为⼀个变换。我们只需要将Batch normalization参数合并到前⾯各层的权重中,其数学运算⾮常简单。具体可以参见上⾯的那篇关于Batch Normalization的⽂章,也就是说我们可以完全忽略Batch Normalization层的影响,因为我们在进⾏推理时实际上将其从模型中删除了。
注意:此trick仅在层的顺序为:卷积->BN->ReLU时才有效;不适⽤于:卷积->ReLU->BN。ReLU是⼀个⾮线性操作,它会把数据弄乱。(但如果批量标准化后⾯紧跟⼀个新的卷积层,你可以反过来折叠参数)

本文发布于:2024-09-21 20:40:36,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/208111.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:卷积   模型   计算   输出
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议