我们知道BEVFormer基于Transformer,所以要想很好的理解BEVFormer,先要理解Transformer,在这篇文章里,我们先讲解一下Transformer的基本概念。

1. 自注意力机制

Transformer中最重要的一个概念之一就是自注意力机制。

1.1. 输入信号定义

Transformer的输入张量是一个张量序列,其中第i个元素为:chatGPT学习---Transformer_权值矩阵,我们为了讨论方便,假设输入序列只有4个张量组成:
chatGPT学习---Transformer_深度学习_02

1.2. 定义权值矩阵

我们定义网络需要学习的权值矩阵:

  • chatGPT学习---Transformer_深度学习_03,对应于每个输入张量的键Key;
  • chatGPT学习---Transformer_权值矩阵_04,对应于每个输入张量的值,我们可以理解为一个输入张量由键、值对表示;
  • chatGPT学习---Transformer_权值矩阵_05,对应于每个输入张量要计算它与其他输入张量关联度数值的查询条件(在所有输入张量的键K中查找);

1.3. 定义输入张量的键

chatGPT学习---Transformer_权值矩阵_06

1.4. 定义输入张量的值

chatGPT学习---Transformer_权值矩阵_07

1.5. 定义输入张量的查询条件

chatGPT学习---Transformer_深度学习_08

1.6. 自注意力

我们以第一个输入张量为例,它的查询条件为chatGPT学习---Transformer_深度学习_09,它会到所有输入张量的键chatGPT学习---Transformer_深度学习_10(包括它自己在内)中进行查询,可以得到一个匹配度的数值,然后利用Softmax函数进行归一化,代表输入张量与第1个输入张量的相关程度,将这个相关程度与各个的值chatGPT学习---Transformer_transformer_11相乘,然后再相加,从而得到第1个输入张量对应的输出值。

  • 查询:在所有输入张量的键K中模找,其实就是点积

chatGPT学习---Transformer_学习_20

  • 缩放:除以chatGPT学习---Transformer_学习_20这个标量

  • 归一化:上面计算了第1个输入张量对其他输入张量的查询结果,其为一个标量数值,我们利用softmax函数对其进行归一化,代表第1个输入张量与所有输入张量之间规整化后的关联度系数
    chatGPT学习---Transformer_深度学习_31
  • 求输出
    chatGPT学习---Transformer_权值矩阵_32
    按照上面的方法,我们可以求出第2、3、4个输入张量对应的输出值。将其按照如下方式进行堆叠:
    chatGPT学习---Transformer_transformer_33
    假设序列长度为T,张量的维度为chatGPT学习---Transformer_深度学习_34,则其形状为chatGPT学习---Transformer_transformer_35
    以上为自注意力的基本原理,但是在实际使用中,为了提高计算效率,我们通常用矩阵运算形式。我们将序列长度为k的输入向量按照如下方式堆叠:
    chatGPT学习---Transformer_学习_36
    键计算
    chatGPT学习---Transformer_transformer_37
    值计算
    chatGPT学习---Transformer_权值矩阵_38
    查询计算
    chatGPT学习---Transformer_transformer_39
    计算输出值为:
    chatGPT学习---Transformer_深度学习_40
    在实际应用中,通常是多个自注意力头,例如原始论文中就是8个头,对8个头分别做上述计算,得到输出为:
    chatGPT学习---Transformer_transformer_41
    将其拼接为chatGPT学习---Transformer_学习_42,我们定义输出权重chatGPT学习---Transformer_深度学习_43,则:
    chatGPT学习---Transformer_transformer_44