[从0开始AIGC][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的空间复杂度的分析

相关推荐
咕咕吖6 分钟前
对称二叉树(力扣101)
算法·leetcode·职场和发展
九圣残炎38 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
lulu_gh_yu44 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
丫头,冲鸭!!!1 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
程序员X小鹿1 小时前
全部免费!6款AI对口型神器,让照片开口说话唱歌,早晚用得上,建议收藏!(附保姆级教程)
aigc
真忒修斯之船1 小时前
大模型分布式训练并行技术(三)流水线并行
面试·llm·aigc
为什么这亚子2 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
2 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
~yY…s<#>2 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode