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