一、算法的时间和空间复杂度


文章目录

  • 一、算法的时间和空间复杂度
  • 1、时间复杂度
  • 2、空间复杂度
  • 二、Transformer的时间复杂度分析
  • 1、 self-attention 的时间复杂度
  • 2、 多头注意力机制的时间复杂度
  • 三、transformer的空间复杂度


算法是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是过程中消耗的资源和时间却会有很大区别。

那么如何衡量不同算法之间的优劣?

主要还是从算法所占用的时间和空间两个维度去考量。

  • 时间维度:是指执行当前算法所消耗的时间,通常用时间复杂度来描述
  • 空间维度:是指执行当前算法需要占用多少内存空间,通常用空间复杂度来描述

1、时间复杂度

想要知道算法的时间复杂度,简单方法是把算法运行一遍,就知道所消耗的时间。但是这种方法会有很多弊端,首先该方式非常容易受到运行环境的影响,不同性能的机器运行的时间差异很大;再者,写算法的时候也没法完整运行整个算法。

因此,另一种更为通用的方法就出来了:大O表示法。

常见的时间复杂度量级有:

[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_transformer

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
  • 相似度计算[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_时间复杂度_02 : [从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_AIGC_03[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_算法_04 运算,得到[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_transformer_05矩阵,复杂度为[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_时间复杂度_06
  • softmax计算:对每行做softmax,复杂度为O(n),则n行的复杂度为[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_AIGC_07
  • 加权求和: [从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_算法_08[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_AIGC_03运算,得到 �×� 矩阵,复杂度为[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_时间复杂度_06

因此,Self-Attention的时间复杂度是:[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_2d_11

2、 多头注意力机制的时间复杂度

对于多头注意力机制,假设有h个head,这里h是一个常数,对于每个head,首先需要把三个矩阵映射到[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_AIGC_12

  • Q,K,V:[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_AIGC_03[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_算法_14 运算,复杂度为[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_AIGC_15
  • 相似度计算[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_时间复杂度_02: 多头的相似度计算不是通过循环完成的,而是通过transpose和reshapes,用矩阵乘法来完成的。假设有h个head,则[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_2d_17。将[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_AIGC_03的矩阵拆分为[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_时间复杂度_19的张量,再利用转置操作转为 [从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_2d_20 。故[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_时间复杂度_02的计算为 与[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_2d_20[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_2d_20 做计算,得到 [从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_算法_24 的张量,复杂度为[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_时间复杂度_25, 即[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_transformer_26,。由于h是一个常数,故复杂度为[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_时间复杂度_06,。
  • softmax计算:对每行做softmax,复杂度为O(n),则n行的复杂度为[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_AIGC_07
  • 加权求和: [从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_算法_08[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_AIGC_03运算,得到 [从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_AIGC_03 矩阵,复杂度为[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_时间复杂度_06

故最后的复杂度为[从0开始AIGC][Transformer相关]:算法的时间和空间复杂度_2d_33

三、transformer的空间复杂度

由于空间复杂度是程序所占用的空间,但是transformer占用的空间复杂度比较复杂,涉及到变量储存、参数储存、梯度储存等,暂时还没搜到关于transformer的空间复杂度的分析