一、算法的时间和空间复杂度
文章目录
- 一、算法的时间和空间复杂度
- 1、时间复杂度
- 2、空间复杂度
- 二、Transformer的时间复杂度分析
- 1、 self-attention 的时间复杂度
- 2、 多头注意力机制的时间复杂度
- 三、transformer的空间复杂度
算法是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是过程中消耗的资源和时间却会有很大区别。
那么如何衡量不同算法之间的优劣?
主要还是从算法所占用的时间和空间两个维度去考量。
- 时间维度:是指执行当前算法所消耗的时间,通常用时间复杂度来描述
- 空间维度:是指执行当前算法需要占用多少内存空间,通常用空间复杂度来描述
1、时间复杂度
想要知道算法的时间复杂度,简单方法是把算法运行一遍,就知道所消耗的时间。但是这种方法会有很多弊端,首先该方式非常容易受到运行环境的影响,不同性能的机器运行的时间差异很大;再者,写算法的时候也没法完整运行整个算法。
因此,另一种更为通用的方法就出来了:大O表示法。
常见的时间复杂度量级有:
2、空间复杂度
既然时间复杂度不是用来计算程序具体耗时的,那空间复杂度也不是用来计算程序实际占用的空间的。
空间复杂度是一个对算法来运行过程中临时占用储存空间大小的一个量度,同样反映的是一个趋势。
空间复杂度比较常用的有:O(1)、O(n)、O(n²)
二、Transformer的时间复杂度分析
一个形状为N × M的矩阵,与另一个形状为M × P的矩阵相乘,其运算复杂度来源于乘法操作的次数,时间复杂度为O(NMP)
Transformer模型的时间复杂度主要取决于输入序列的长度N和模型中隐藏层的数量H。而且tansformer的时间复杂度主要在于self-attention那块,至于激活函数、归一化、残差连接、前馈神经网络等这些计算的时间复杂度可忽略不计。
因此Transformer的时间复杂度,可以从两个角度看,一个是self-attention,另一个是多头attention。
1、 self-attention 的时间复杂度
self-attention 主要包括三个步骤:输入的线性映射、相似度计算、softmax和加权平均
- Q,K,V:n × d
- 相似度计算 Q K T QK^T QKT : n × d n\times d n×d与 n × d n \times d n×d 运算,得到 n × n n \times n n×n矩阵,复杂度为 O ( n 2 d ) O(n^2d) O(n2d)
- softmax计算:对每行做softmax,复杂度为O(n),则n行的复杂度为 O ( n 2 ) O(n^2) O(n2)
- 加权求和: n × n n\times n n×n 与 n × d n\times d n×d运算,得到 �×� 矩阵,复杂度为 O ( n 2 d ) O(n^2d) O(n2d)
因此,Self-Attention的时间复杂度是: O ( n 2 d ) O(n^2d) O(n2d)
2、 多头注意力机制的时间复杂度
对于多头注意力机制,假设有h个head,这里h是一个常数,对于每个head,首先需要把三个矩阵映射到 d q , d k , d v d_q,d_k,d_v dq,dk,dv。
- Q,K,V: n × d n\times d n×d 与 n × d h n\times \frac{d}{h} n×hd 运算,复杂度为 O ( d 2 n ) O(d^2n) O(d2n)
- 相似度计算 Q K T QK^T QKT: 多头的相似度计算不是通过循环完成的,而是通过transpose和reshapes,用矩阵乘法来完成的。假设有h个head,则 m = d h m=\frac{d}{h} m=hd。将 n × d n\times d n×d的矩阵拆分为 n × h × m n\times h\times m n×h×m的张量,再利用转置操作转为 h × n × m h\times n\times m h×n×m 。故 Q K T QK^T QKT的计算为 与 h × n × m h\times n\times m h×n×m与 h × n × m h\times n\times m h×n×m 做计算,得到 h × n × n h\times n\times n h×n×n 的张量,复杂度为 O ( h 2 n 2 m ) O(h^2n^2m) O(h2n2m), 即 O ( h n 2 d ) O(hn^2d) O(hn2d),。由于h是一个常数,故复杂度为 O ( n 2 d ) O(n^2d) O(n2d),。
- softmax计算:对每行做softmax,复杂度为O(n),则n行的复杂度为 O ( n 2 ) O(n^2) O(n2)
- 加权求和: n × n n\times n n×n与 n × d n\times d n×d运算,得到 n × d n\times d n×d 矩阵,复杂度为 O ( n 2 d ) O(n^2d) O(n2d)
故最后的复杂度为 O ( n 2 d + n d 2 ) O(n^2d+nd^2) O(n2d+nd2)
三、transformer的空间复杂度
由于空间复杂度是程序所占用的空间,但是transformer占用的空间复杂度比较复杂,涉及到变量储存、参数储存、梯度储存等,暂时还没搜到关于transformer的空间复杂度的分析