评估计算量指标
- 每秒浮点操作次数FLOPS(FLoating point OPerations per Second),来衡量GPU的运算能力。
- 乘加数MACC(Multiply-ACCumulate operation),或者叫MADD,来衡量模型的计算量。
模型最终的的速度,不仅仅是和计算量多少有关系,还和诸如内存带宽、优化程度、CPU流水线、Cache之类的因素也有很大关系。
全连接层计算量和参数量估计
对于输入为 I I I,输出为 J J J的全连接层,其权重 W W W存储在 I × J I \times J I×J的矩阵中。
- 计算量为 I × J I \times J I×J MACC 或 ( 2 I − 1 ) × J (2I-1) \times J (2I−1)×J FLOPS。
- 它的参数分别是权重 W W W和偏置 b b b,所以参数量为 I × J + J = ( I + 1 ) × J I \times J + J=(I+1) \times J I×J+J=(I+1)×J
激活函数计算量
激活函数没有参数,所以参数量为0。
- ReLU计算操作为 y = max ( x , 0 ) y=\max(x,0) y=max(x,0),所以对于输出为 J J J个神经元,计算量为 J J J FLOPS。
- Sigmoid计算操作为 y = 1 / ( 1 + exp ( − x ) ) y=1/(1+\exp(-x)) y=1/(1+exp(−x)),所以对于输出为 J J J个神经元,计算量为 J × 4 J \times 4 J×4 FLOPS。
- Tanh计算操作为 y = ( exp ( x ) − exp ( − x ) ) / ( exp ( x ) + exp ( − x ) ) y=(\exp(x)-\exp(-x))/(\exp(x)+\exp(-x)) y=(exp(x)−exp(−x))/(exp(x)+exp(−x)),所以对于输出为 J J J个神经元,计算量为 J × 8 J \times 8 J×8 FLOPS。
LSTM计算量和参数量估计
LSTM包含4个非线性变换,每一种非线形变换可视作一个全连接层。令 E E E=embedding_size, H H H=hidden_size。其中,第一层是 x i x_i xi和 h i h_i hi的结合,维度就是 E + H E+H E+H,第二层就是输出层,维度为 H H H。四个非线性变换中,还会对全连接层的输出进行激活函数计算(三个Sigmoid和一个Tanh)。除此之外,LSTM除了在四个非线性变换中的计算,还有三个矩阵乘法(不是点积)、一个加法、一个Tanh计算。
- 计算量为 ( E + H ) × H × 4 (E+H) \times H \times 4 (E+H)×H×4 MACC,或 E × H × 8 + H × ( H + 20 ) E \times H \times 8 + H \times (H+20) E×H×8+H×(H+20) FLOPS。
- 参数量为: ( ( E + H ) × H + H ) × 4 ((E+H) \times H +H) \times 4 ((E+H)×H+H)×4
卷积层计算量和参数量估计
对于输入为 H i n × W i n × C i n H_{in} \times W_{in} \times C_{in} Hin×Win×Cin,输出为 H o u t × W o u t × C o u t H_{out} \times W_{out} \times C_{out} Hout×Wout×Cout的卷积层,输出的每一个像素对应了一个立体卷积核 K × K × C i n K \times K \times C_{in} K×K×Cin。
- 计算量为 K × K × C i n × H o u t × W o u t × C o u t K \times K \times C_{in} \times H_{out} \times W_{out} \times C_{out} K×K×Cin×Hout×Wout×Cout MACC。
- 参数量为 K × K × C i n × C o u t + C o u t K \times K \times C_{in} \times C_{out} + C_{out} K×K×Cin×Cout+Cout。
深度可分离卷积层
深度可分离卷积分为两个操作,深度卷积和 1 × 1 1\times1 1×1常规卷积。
- 计算量为: K × K × C i n × H o u t × W o u t + C i n × H o u t × W o u t × C o u t = C i n × H o u t × W o u t × ( K × K × C o u t ) K \times K \times C_{in} \times H_{out} \times W_{out} + C_{in} \times H_{out} \times W_{out} \times C_{out}=C_{in} \times H_{out} \times W_{out} \times (K \times K \times C_{out}) K×K×Cin×Hout×Wout+Cin×Hout×Wout×Cout=Cin×Hout×Wout×(K×K×Cout)。
- 参数量为 K × K × C i n + 1 × 1 × C i n × C o u t = C i n × ( K × K + C o u t ) K \times K \times C_{in} + 1 \times 1 \times C_{in} \times C_{out}=C_{in} \times (K \times K + C_{out}) K×K×Cin+1×1×Cin×Cout=Cin×(K×K+Cout)。
Batch normalization
BN的计算操作为 z = γ y − μ σ 2 + ϵ + β z = \gamma \frac{y-\mu}{\sqrt{\sigma^{2}+\epsilon}}+\beta z=γσ2+ϵy−μ+β。每个通道都有自己的 γ , β , μ , σ 2 \gamma,\beta,\mu,\sigma^{2} γ,β,μ,σ2,因此,如果卷积层的输出中有 C C C个通道,则BN层将学习 C × 4 C \times 4 C×4个参数。
池化层
池化操作不使用点积,因此不能用MACC测量。这种附加层的计算量与卷积层、全连接层相比非常小,通常可以忽略不计。
Concate层
连接操作通常不需要单独的复制步骤,不需任何参数和计算。