transformer系列3---transformer结构参数量统计

本文详细解析了Transformer模型中Embedding、PositionalEncoding、EncoderLayer(包括MHA、layernorm和MLP)、DecoderLayer(包括maskMHA、交叉注意力等)的参数计算,以及总参数量的估计,重点展示了不同组件的参数规模和N层结构的参数变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 Embedding

NLP算法会使用不同的分词方法表示所有单词,确定分词方法之后,首先建立一个词表,词表的维度是词总数vocab_size ×表示每个词向量维度d_model(论文中dmodel默认值512),这是一个非常稀疏的矩阵。这样,对于Transformer的encoder输入的句子sentence,先用相应的分词方法转换成新的序列src_vocab,然后用每个词的id去前面的稀疏矩阵查表,通过查表(nn.Embedding)将该序列转换到新的向量空间,就是词嵌入的结果。Transformer的decoder输入(输出)同理,先用相应的分词方法转换成新的序列tgt_vocab,然后将该序列经过embedding转换到新的向量空间。
因此统计参数量时,应为词表的维度=vocab_size × d_model

2 Positional Encoding

位置编码同理,首先建立一个位置矩阵,维度是输入向量的最大长度src_max_len × dmodel,实际使用时候根据实际词长度n取前n个位置编码
因此,位置编码的参数量=src_max_len × dmodel

3 Transformer Encoder

3.1 单层EncoderLayer

3.1.1 MHA

在这里插入图片描述

MHA包含 W Q , W K , W V W^{Q},W^{K},W^{V} WQWKWV和输出的权重矩阵 W O W^{O} WO以及偏置, W Q , W K 维度是 d m o d e l × d k , W V 维度是 d m o d e l × d v W^{Q},W^{K}维度是dmodel × dk,W^{V}维度是dmodel × dv WQWK维度是dmodel×dkWV维度是dmodel×dv,输出权重矩阵 W O 的维度是 ( h × d v ) × d m o d e l W^{O}的维度是(h×dv)×dmodel WO的维度是(h×dv)×dmodel,论文中dk = dv = dmodel/h = 64,头数h = 8。

  1. 一个头中3个矩阵的参数量是dmodel × dk + dmodel × dk + dmodel × dv= 3dk × dmodel
  2. h个头的参数量=h × 3 × dk × dmodel = 3 d m o d e l 2 3dmodel^{2} 3dmodel2
  3. 加上输出矩阵后的矩阵总参数量=(h × dv) × dmodel + 3dmodel × dmodel = 4 d m o d e l 2 4dmodel^{2} 4dmodel2
  4. 每个矩阵偏置维度是dmodel,4个矩阵的偏置=4dmodel
  5. MHA总参数量= 4 d m o d e l 2 + 4 d m o d e l 4dmodel^{2}+4dmodel 4dmodel2+4dmodel

3.1.2 layer normalization

layer normalization层的参数包含weight和bias,代码中nn.LayerNorm(dmodel),因此weight和bias的维度都是dmodel,参数量之和=2dmodel

3.1.3 MLP

由两个线性层组成,W1维度是(dmodel,4×dmodel),b1维度是4×dmodel,W2维度是(4×dmodel,dmodel),b2维度是dmodel,参数量为 dmodel×4×dmodel+4×dmodel+4×dmodel×dmodel+dmodel = 8 d m o d e l 2 + 5 d m o d e l 8dmodel^{2}+5dmodel 8dmodel2+5dmodel

3.1.4 layer normalization

同3.1.2,参数量之和=2dmodel

3.2 N层Encoderlayer总参数量

  1. 综上计算,Transformer中1层Encoderlayer的总参数量是 4 d m o d e l 2 + 4 d m o d e l + 2 d m o d e l + 8 d m o d e l 2 + 5 d m o d e l + 2 d m o d e l = 12 d m o d e l 2 + 13 d m o d e l 4dmodel^{2}+4dmodel+2dmodel+8dmodel^{2}+5dmodel+2dmodel=12dmodel^{2}+13dmodel 4dmodel2+4dmodel+2dmodel+8dmodel2+5dmodel+2dmodel=12dmodel2+13dmodel

  2. 论文中Encoderlayer的层数是N = 6 ,因此N层的Encoderlayer的参数量统计为 12 N d m o d e l 2 + 13 N d m o d e l 12Ndmodel^{2}+13Ndmodel 12Ndmodel2+13Ndmodel,实际中常常省略一次项,参数量统计= 12 N d m o d e l 2 12Ndmodel^{2} 12Ndmodel2

4 Transformer Decoder

Decoder比Encoder多一层交叉多头注意力,以及一个layer normalization,但计算方式与Encoder相同,直接采用上面的结论

4.1 单层Decoderlayer

4.1.1 mask MHA

mask MHA总参数量= 4 d m o d e l 2 + 4 d m o d e l 4dmodel^{2}+4dmodel 4dmodel2+4dmodel

4.1.2 layer normalization

layer normalization参数量=2dmodel

4.1.3 交叉多头注意力

总参数量= 4 d m o d e l 2 + 4 d m o d e l 4dmodel^{2}+4dmodel 4dmodel2+4dmodel

4.1.4 layer normalization

layer normalization参数量=2dmodel

4.1.5 MLP

MLP参数量= 8 d m o d e l 2 + 5 d m o d e l 8dmodel^{2}+5dmodel 8dmodel2+5dmodel

4.1.6 layer normalization

layer normalization参数量=2dmodel

4.2 N层Decoderlayer总参数量

  1. 1层Decoderlayer参数量为上述计算之和, 4 d m o d e l 2 + 4 d m o d e l + 2 d m o d e l + 4 d m o d e l 2 + 4 d m o d e l + 2 d m o d e l + 8 d m o d e l 2 + 5 d m o d e l + 2 d m o d e l = 16 d m o d e l 2 + 19 d m o d e l 4dmodel^{2}+4dmodel+2dmodel+4dmodel^{2}+4dmodel+2dmodel+8dmodel^{2}+5dmodel+2dmodel=16dmodel^{2}+19dmodel 4dmodel2+4dmodel+2dmodel+4dmodel2+4dmodel+2dmodel+8dmodel2+5dmodel+2dmodel=16dmodel2+19dmodel
  2. N层Decoderlayer参数量= 16 N d m o d e l 2 + 19 N d m o d e l 16Ndmodel^{2}+19Ndmodel 16Ndmodel2+19Ndmodel

5 Transformer输出

Decoder输入输出向量的最大长度tgt_max_len,最后一层参数量=dmodel×tgt_max_len

Transformer的总参数量为上述5个部分的参数量之和。

### Vision Transformer 模型参数量统计 Vision Transformer (ViT) 的参数量取决于多个因素,包括嵌入维度、编码器层数、多头注意力机制中的头数以及前馈网络的大小。 #### 影响 ViT 参数量的关键组件 1. **Embedding 层** - 图像被分割成固定大小的补丁(patch),每个补丁转换为一个向量。假设图像尺寸为 \(H \times W\) ,补丁大小为 \(p \times p\) ,则会有 \(\frac{HW}{p^2}\) 个补丁。 - 对于每个补丁,存在一个可学习的位置编码矩阵加上投影权重矩阵来映射到指定维数 d 。因此这部分参数大约是 \((\text{{patch size}} * C + 1) * D\) ,其中C表示通道数目(通常是3),D代表目标特征空间维度[^3]。 2. **Transformer Encoder 结构** - 编码器由 N 个相同的层组成,每一层包含两个子层:一个多头自注意(Multi-head Self-Attention, MSA)模块和一个全连接前馈神经网络(Feed Forward Network, FFN)[^3]。 - 多头自注意部分涉及查询(Q)、键(K) 和值(V) 权重矩阵的学习,对于 h 个头部来说,总共有 \(h*D*(D/8)*3=3*h*D^2 / 8\) 个参数用于 QKV 投影;另外还有输出线性变换带来的额外 \(D*D=D^2\) 参数。 - 前馈网络通常采用两层感知机设计,中间隐藏层宽度设为\(4D\),所以此阶段贡献了约 \(D*4D+4D*D=5D^2\) 的参数量- 考虑到整个编码器堆叠了 L 层,则上述计算需乘以L倍。 3. **MLP Head** - 这是一个简单的分类头,在最后接上一层线性的变换将序列长度压缩至类别数量 K 。如果输入给定的是 CLS token 表征,则仅需考虑从 D 映射到 K 的权值矩阵,即 \(D*K\) 参数。 综上所述,可以得出 ViT 总体参数的大致估算公式如下: \[ P_{total} = (\text{{Patch Projection Params}}) + L * ((MHA\_Params)+FFN\_Params))+(Classification\_Head\_Params)\] 具体数值会依据实际配置而变化,比如 ImageNet 上训练的标准 ViT-B/16 架构拥有大约 8600万参数[^1]。 ```python def calculate_vit_params(img_size=(224, 224), patch_size=16, embed_dim=768, num_heads=12, mlp_ratio=4., qkv_bias=True, depth=12, num_classes=1000): import math H, W = img_size patches_per_side = int(math.sqrt(H * W / (patch_size ** 2))) # Patch embedding parameters patch_proj_params = (patch_size**2 * 3 + 1) * embed_dim # Multi-head attention & feedforward network params per layer head_dims = embed_dim // num_heads attn_params = 3 * num_heads * head_dims**2 + embed_dim**2 ffwd_hidden_dim = int(embed_dim * mlp_ratio) ffwd_params = embed_dim * ffwd_hidden_dim + ffwd_hidden_dim * embed_dim encoder_layer_params = attn_params + ffwd_params total_encoder_params = depth * encoder_layer_params cls_head_params = embed_dim * num_classes return sum([ patch_proj_params, total_encoder_params, cls_head_params ]) print(f'Total Parameters: {calculate_vit_params():,}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CV温故知新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值