Bert/Transformer模型的参数大小计算

前段时间仔细研究了下Bert论文:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》。了解到bert其实用的网络结构就是Transformer,因此,又去仔细看了下《Attention is all you need》。对Bert和Transformer有了一个大概的理解。但是其中有个地方却困扰了我很久,就是Bert的Base model参数大小是110M,Large modle 是340M。之前一直也没算出来,直到最近,对Transformer的源码进行了深入分析。才渐渐的知道该参数的计算了。

  • Bert的模型结构:
    在这里插入图片描述
  • 那么这两个参数是怎么计算的呢?
Base model
(1)第一:词向量参数(embedding)
         看下源码:
         
	class BertEmbeddings(nn.Module):
		    """Construct the embeddings from word, position and token_type embeddings.
		    """
			def __init__(self, config):
		        super(BertEmbeddings, self).__init__()
		        self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size)
		        self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size)
		        self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size)

从代码中,可以看到,词向量包括三个部分的编码:词向量参数,位置向量参数,句子类型参数(bert用了2个句子,为0和1)并且,Bert采用的vocab_size=30522,hidden_size=768,max_position_embeddings=512,token_type_embeddings=2。这就很显然了,embedding参数 = (30522+512 + 2)* 768

(2)第二:multi-heads参数(Multi-Heads Attention)

这个直接看《Attention is all you need》中的Transformer结构就知道了

  • Transformer结构:
    在这里插入图片描述
    从结构中可以看到,Q,K,V就是我们输入的三个句子词向量,从之前的词向量分析可知,输出向量大小从len -> len x hidden_size,即len x 768。如果是self-attention,Q=K=V,如果是普通的attention,Q !=K=V。但是,不管用的是self-attention还是普通的attention,参数计算并不影响。因为在输入单头head时,对QKV的向量均进行了不同的线性变换,引入了三个参数,W1,W2,W3。其维度均为:768 x 64。为什么是64呢,从下图可知,
    Wi 的维度 :dmodel x dk | dv | dq
    而:dk | dv | dq = dmodle/h,h是头的数量,dmodel模型的大小,即h=12,dmodle=768;
    所以:dk | dv | dq=768/12=64
    得出:W1,W2,W3的维度为768 x 64
    在这里插入图片描述
    那么单head的参数:768 * 768/12 * 3
    而头的数量为h=12
    multi-heads的参数:768 * 768/12 * 3 * 12
    之后将12个头concat后又进行了线性变换,用到了参数Wo,大小为768 * 768
    那么最后multi-heads的参数:768 * 768/12 * 3 * 12 + 768 * 768
(3)全连接层(FeedForward)参数

在这里插入图片描述

我们还是从论文解析:
在这里插入图片描述
以上是论文中全连接层的公式,其中用到了两个参数W1和W2,Bert沿用了惯用的全连接层大小设置,即4 * dmodle,为3072,因此,W1,W2大小为768 * 3072,2个为 2 * 768 * 3072。

(4) LayerNorm层

文章其实并没有写出layernorm层的参数,但是在代码中有,分别为gamma和beta。在三个地方用到了layernorm层:
①词向量处
在这里插入图片描述
②多头注意力之后
在这里插入图片描述
③最后的全连接层之后
在这里插入图片描述
但是参数都很少,gamma和beta的维度均为768。因此总参数为768 * 2 + 768 * 2 * 2 * 12(层数)

而Base Bert的encoder用了12层,因此,最后的参数大小为:

词向量参数(包括layernorm) + 12 * (Multi-Heads参数 + 全连接层参数 + layernorm参数)= (30522+512 + 2)* 768 + 768 * 2 + 12 * (768 * 768 / 12 * 3 * 12 + 768 * 768 + 768 * 3072 * 2 + 768 * 2 * 2) = 108808704.0 ≈ 110M

PS:本文介绍的参数仅仅是encoder的参数,基于encoder的两个任务next sentence prediction 和 MLM涉及的参数(768 * 2,2 * 768 * 768,总共约1.18M)并未加入,此外涉及的bias由于参数很少,本文也并未加入。

large的大小的计算同理。这里就不做介绍了。

ps:文章中的图均来自源代码或者原文章,如有侵权,请联系删除。

  • 60
    点赞
  • 156
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
根据引用中的描述,Transformer模型参数量可以通过以下公式计算得出: 单头(self-attention或普通attention)的参数数量为: 768 * 768/12 * 3 多头(multi-heads)的参数数量为: 768 * 768/12 * 3 * 12 全连接层(FeedForward)的参数数量为: 768 * 768 * 4 最后,将上述三部分的参数数量加起来,再加上词向量的参数数量,就可以得到Transformer模型的总参数量。 然而,上述公式仅计算Transformer的encoder部分的参数量。如果考虑到基于encoder的两个任务(Next Sentence Prediction和Masked Language Modeling)涉及的参数以及偏置项,总参数量会更大一些。 总体而言,Transformer模型参数量取决于模型大小和架构。例如,BERT的Base模型参数量约为110M,Large模型参数量约为340M,具体数值取决于模型的设置和超参数的选择。引用和引用提供了对BERT模型参数量的更详细计算。 请注意,这里只考虑了Transformer模型参数数量,而没有考虑其他可能的参数或假设的情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Bert/Transformer模型参数大小计算](https://blog.csdn.net/weixin_43922901/article/details/102602557)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值