BERT模型中的参数个数是如何计算的?

How is the number of parameters be calculated in BERT model?

Devlin & Co. 的论文“BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”计算了基本模型大小为 110M 的参数(即 L=12、H=768、A=12),其中 L = 层数,H = 隐藏大小,A = 自注意力操作数。据我所知,神经网络中的参数通常是层之间“权重和偏差”的计数。那么这是如何根据给定的信息计算出来的呢? 12768768*12?

Transformer Encoder-Decoder Architecture BERT 模型仅包含 transformer 架构的编码器块。让我们看一下 BERT 编码器块的各个元素,以可视化数字权重矩阵和偏置向量。给定的配置 L = 12 意味着将有 12 层自我关注,H = 768 意味着单个标记的嵌入维度将为 768 维,A = 12 意味着在一层自我关注中将有 12 个注意力头。编码器块执行以下操作序列:

  1. 输入将是作为 S * d 维矩阵的标记序列。其中 s 是序列长度,d 是嵌入维度。生成的输入序列将是标记嵌入、标记类型嵌入以及位置嵌入的总和,作为每个标记的 d-dimensional 向量。在 BERT 模型中,第一组参数是词汇嵌入。 BERT 使用具有 30522 个标记的 WordPiece[2] 嵌入。每个标记有 768 个维度。

  2. 嵌入层归一化。一个权重矩阵和一个偏置向量。

  3. Multi-head 自我关注。将有 h 个头,对于每个头,将有三个矩阵,分别对应查询矩阵、键矩阵和值矩阵。这些矩阵的第一个维度将是嵌入维度,第二个维度将是嵌入维度除以注意力头的数量。除此之外,还会有一个矩阵将注意力头生成的连接值转换为最终的标记表示。

  4. 残差连接和层归一化。一个权重矩阵和一个偏置向量。

  5. Position-wise 前馈网络将有一个隐藏层,对应两个权重矩阵和两个偏置向量。论文中提到隐藏层的单元数会是embedding维度的四倍

  6. 残差连接和层归一化。一个权重矩阵和一个偏置向量。

让我们通过将正确的维度关联到 BERT 基础模型的权重矩阵和偏置向量来计算实际的参数数量。

嵌入矩阵:

  • 词嵌入矩阵大小[词汇大小,嵌入维度] = [30522, 768] = 23440896
  • 位置嵌入矩阵大小,[最大序列长度,嵌入维度] = [512, 768] = 393216
  • 令牌类型嵌入矩阵大小 [2, 768] = 1536
  • 嵌入层归一化、权重和偏差 [768] + [768] = 1536
  • 总嵌入参数 =

关注点:

  • 查询权重矩阵大小 [768, 64] = 49152 and Bias [768] = 768

  • 关键权重矩阵大小 [768, 64] = 49152 和偏差 [768] = 768

  • 值权重矩阵大小 [768, 64] = 49152 和偏差 [768] = 768

  • 12个头的一层attention的总参数=12*(3*(49152+768))=1797120

  • 头部连接后投影的密集权重 [768, 768] = 589824 and Bias [768] = 768, (589824+768 = 590592)

  • 层归一化权重和偏差 [768], [768] = 1536

  • 位置明智的前馈网络权重矩阵和偏差 [3072, 768] = 2359296, [3072] = 3072 and [768, 3072] = 2359296, [768] = 768, (2359296+3072 + 2359296+768 = 4722432)

  • 层归一化权重和偏差 [768], [768] = 1536

  • 一个完整注意力层的总参数 (1797120 + 590592 + 1536 + 4722432 + 1536 = 7113216 ≈ 7)

  • 12层注意力的总参数(*=)

BERT Encoder的输出层:

  • 密集权重矩阵和偏差 [768, 768] = 589824, [768] = 768, (589824 + 768 = 590592)

ase 中的总参数 = + + =