Bert系列之模型参数计算

大模型向量数据库增长营销

提纲

  1. 简介

  2. 计算过程

    2.1 Embedding层

    2.2 Encoder层

    2.3 Pooling层

  3. 总结

1. 简介

写这篇文章主要的目的是为了让大家对Bert有更加深入的了解,Bert是自然语言处理领域非常受欢迎的模型,但是很多人对其中的结构有一定的了解,但是如果忽然被问到Bert的参数该如何计算的话可能会一脸茫然。如果对Bert的结构有非常深入的了解的话,那么能如何计算模型参数不也应该是个理所应当的事情嘛。比如,你知道Bert的encoder层里面的前馈网络层FFN是一层全连接层还是两层?对应的单元数又大概是多少?相信这个问题应该可以问倒很多朋友了吧。即便不知道详细的计算步骤,那大概的计算过程也应该心里有数吧。所以学会怎么计算Bert的模型参数,相信能帮助大家更加深入的了解Bert,会有更多的感悟跟心得。为此,这篇文章会从模型结构层面介绍怎么去依次计算Bert的参数量。

2. 计算过程

在之前的文章《Bert系列之模型演化》中我们对Bert的结构做过简要介绍,所以在这里关于模型参数的计算也会按照模型结构相应的分为三个部分,分别是Embedding层,Encoder层,Pooling层(对这块有所疑问的朋友可以去翻阅之前发布的文章,也可以直接给公众号发送消息)。这里我们以Bert  Base模型为例进行介绍,相应的Bert Large的参数计算只要把对应的参数调整下即可,思路都是一致的。Bert Base跟Bert Large的具体参数可以参见下图,这个数据是官方论文提供的。 

picture.image

图1: Bert具体参数介绍

2.1 Embedding层

picture.image

图2: Bert的Embedding结构

  **a)** 如上图所示,Bert的Embedding分为三个部分Token Embedding, Segment Embedding, Position Embedding。其中Token Embedding包括词表V有30522个,对应30522个英文单词或者符号(  **这个不是固定的,不同语言或者不同模型的词表是不相同的)** 。Segment Embedding包括2个取值,分别表示当前token属于第一个句子还是第二个句子,这也是跟Bert预训练的NSP任务相关联的。Position Embedding包括512个取值,这里对应的Bert编码长度不超过512,因为设计时位置编码只有512种可能。每种embedding都会把token映射到H维(Bert base的H为768)的隐向量中。所以这个部分的参数量为

(30522+2+512)*768=23835648

 **b)** 在完成词嵌入过程后,每个位置的隐向量维度都是768,还要再经过一层layer normalization,我们知道layer normalization的参数包括均值跟方差,所以这一层对应的参数为768*2。



所以Embedding层总共的参数就是

(30522+2+512)768+7682=23837184

2.2 Encoder层

Bert base的Encoder层是由12层结构一致的transformer encoder结构堆叠得到的,所以我们只需要算出其中一层transformer encoder的参数量然后再乘上层数12就可以得到Bert base中Encoder层的参数量了。如下图所示,红色框里的就是Bert Encoder所用到的结构。

picture.image

图3: Transformer结构

a) Multi_Head Attention

Multi\_Head Attention就是我们常说的多头注意力机制,Bert Base的self -attention head的数量是12,每个head都拥有不同有3个矩阵,分别对应着Q,K,V,通过矩阵乘法,将上一层的输出跟这三个矩阵分别相乘,得到新的Q,K,V向量。注意这里有12个self-attention head,所以每个head的每个矩阵会把相应的上一层的768维向量输出映射768/12维的新向量(  **注意这里的维度变小了,可以理解为每个head的计算都会降维,很多朋友都会以为这里的维度是没变化的),** 然后通过concat操作将12个head的结果拼接到一起,得到新的768维的向量。具体计算过程可以查看下图的公式。

picture.image

所以这里每个head的每个矩阵的参数有权重weights是768*(768/12),对应的偏置bias是768/12。每个head有Q,K,V三个矩阵,又有12个head,所以这里的参数量是

123(768*(768/12)+768/12)=1771776

再将所有head的输出拼接到一起后,还会经过一个全连接操作,也就是图中的W^O,这部分的参数量包括权重weights有768*768,偏置bias有768。

所以整个Multi_Head Attention的参数量有

123(768*(768/12)+768/12)+768*768+768=2362368

b) Add&Norm

Add是跨层连接,把之前的结果通过跨层连接直接加到当前层,没有什么参数量。Norm是layer normalization,主要包括的参数是均值跟方差,它接受的是Multi\_Head Attention的768维的输出结果,输出时保持维度不变,所以这里的参数量是2*768

c) Feed Forward

Feed Forward是前向神经网络,这里包括两层全连接层,第一层全连接层会进行升维,会把输入从当前维度映射到4倍当前维度的中间层,第二层全连接层会负责降维,会把4倍初始输入维度的中间层结果映射到初始维度。

所以这里的参数量包括第一层全连接层的权重weights有768*(7684)和偏置bias有7684,还有第二层全连接层的权重weights有(768*4)*768和偏置bias有768。总的参数量为

768*(7684)+7684+(768*4)*768+768=4722432

d) Add&Norm

结构跟前面提到的Add&Norm,所以这里的参数量是2*768。








  **因为Bert Base总共有12层这样的transformer encoder的结构,所以这里Encoder层的参数量为**

12(2362368+1536+4722432+1536)=85054464*

2.3 Pooling层

Pooling层本质是一层全连接层,它的输入是Encoder层输出的768维结果,输出维度保持不变。所以它的参数量包括权重weights有768*768和偏置bias有768。所以对应参数量计算为768*768+768=590592。







 **综上所述,Bert base的参数量为** 

23837184+85054464+590592=109482240。

3. 总结

在从头到尾计算了一次Bert Base的参数量,我们把整个计算过程整理下来,如下图所示。  

picture.image

图4: Bert的参数计算

由上面过程也可以推断得到Bert参数计算的公式为

picture.image

由此可知,其实Bert的参数量跟self-attention head的个数并没有关联,self-attention head其实只是将Q,K,V计算的过程分解成多个部分然后再将结果拼接到一起,由此可以利用GPU并行计算来提高效率,但是参数量跟只用一个self-attention head计算全部过程是一样的。相应的,Bert Large的模型 参数可以按照同样的方式计算,更多的,其余Bert的变种也可以通过这种至上而下的方式去计算其相应的参数量。

参考文献

  1. (Transformer, 1027) Attention Is All You Need

https://arxiv.org/abs/1706.03762v5

2.(Bert, 2018) BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

https://arxiv.org/pdf/1810.04805.pdf

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论