FLOPS,即每秒浮点操作次数FLoating point OPerations per Second这个指标来衡量GPU的运算能力。
MACC,即乘加数Multiply-ACCumulate operation,或者叫MADD,来衡量模型的计算量
全连接层的参数量和计算量
表示输入的特征向量的维度,
表示偏置,表示输出维度
表示乘法运算量
表示加法运算量(权重矩阵与输入/上一层值的矩阵向量相乘所需的加法运算)
表示偏置
具有300个输入神经元和100个输出神经元的全连接层的参数量是:300×100+100=30100
卷积层的参数量和计算量
stride=1,N个输入与M个输出,第m个通道的最终输出由下式给出
表示一个卷积核的宽和高,表示偏置,个卷积核
分别表示卷积核的宽和高,其中 表示乘法计算量, 表示加法计算量,表示偏置, 表示上一层 feature map的宽和高。
池化层
其他类型的层,例如池化层。这些其他层类型肯定需要时间,但它们不使用点积,因此不能用MACC测量。
示例:在112×112具有128通道的特征图上具有过滤器大小2和步幅2的最大池化层需要112×112×128=1,605,632 FLOPS或1.6兆 FLOPS。当然,如果步幅与滤波器尺寸不同例如3×3窗口,2×2步幅),则这些数字会稍微改变。
但是,在确定网络的复杂性时,通常会忽略这些附加层。毕竟,与具有100个 MFLOPSE的卷积/全连接层相比,1.6 MFLOPS非常小。因此,它成为网络总计算复杂度的舍入误差。
Batch normalization
在现代网络中,通常在每个卷积层之后都包含一个 batch norm层。针对每个输出值,计算公式如下
此处,y是上一层的输出图中的元素。我们首先通过减去该输出通道的平均值并除以标准偏差来对该值进行归一化( epsilon用于确保不除以0,通常为0.001),然后,我们将系数gamm缩放,然后添加一个偏差或偏移beta。每个通道都有自己的 gamma,beta,均值和方差值
因此,如果卷积层的输出中有C个通道,则 Batch normalization层将学习C×4参数,如下图所示
通常将Batch normalization应用于卷积层的输出后,在ReLU之前,我们可以做一些数学运算以使Batch normalization层消失!由于在全连接层中进行的卷积或矩阵乘法只是一堆点积,它们是线性变换,而上面给出的Batch normalization公式也是线性变换,因此我们可以将这两个公式组合为一个变换。我们只需要将Batch normalization参数合并到前面各层的权重中,也就是说我们可以完全忽略Batch Normalization层的影响,因为我们在进行推理时实际上将其从模型中删除了。
LSTM计算量和参数量估计
LSTM里面有 4 个非线性变换(3 个 门 + 1 个 tanh),每一个非线性变换说白了就是一个全连接网络,形如: 。其中,维度是,易得MACC为:
表示偏置
四个非线性变换中,还会对全连接层的输出进行激活函数计算(三个sigmoid和一个tanh),对于sigmoid的计算量为:个FLOPS。tanh的计算公式为:,其中共有八个加,减,乘,除,求幂,平方根等计算,所以计算量为:个FLOPS。
除此之外,LSTM除了在四个非线性变换中的计算,还有三个矩阵乘法(不是点积)、一个加法、一个tanh计算,其中三个矩阵乘法都是shape为,则这四个运算的计算量为:
????
综上所述,LSTM的计算量为:
个FLOPS
对于特征维128的输入,LSTM单元数为64的网络来说,LSTM的参数量为:((128 + 64) * 64 + 64) * 4 = 49408
激活函数计算量
非线性激活函数,例如ReLU或 sigmoid不用MACC进行度量,而是使用 FLOPST进行度量,原因是它们不做点积,ReLU:
这是在GPU上的一项操作,激活函数仅应用于层的输出,例如在具有个输出神经元的完全连接层上,ReLU计算次,因此我们将其判定为。而对于 Sigmoid激活函数来说,有不一样了,它涉及到了一个指数,所以成本更高
在计算 FLOPS时,我们通常将加,减,乘,除,求幕,平方根等作为单个FLOP进行计数,由于在 Sigmoid激活函数中有四个不同的运算,因此计算为。
实际上,通常不计这些操作,因为它们只占总时间的一小部分,更多时候我们主要对矩阵乘法和点积感兴趣,对于参数量?注意了它压根没有参数
网友评论