【问题标题】:How is the number of parameters be calculated in BERT model?BERT模型的参数个数是怎么计算的?
【发布时间】:2022-03-15 02:11:50
【问题描述】:
Devlin & Co. 的论文“BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding”计算了基本模型大小为 110M 的参数(即 L=12、H=768、A=12),其中 L = 数字层数,H = 隐藏大小,A = 自注意力操作数。据我所知,神经网络中的参数通常是层之间“权重和偏差”的计数。那么这是如何根据给定的信息计算出来的呢? 12768768*12?
【问题讨论】:
标签:
neural-network
nlp
bert-language-model
【解决方案1】:
Transformer Encoder-Decoder Architecture
BERT 模型仅包含变压器架构的编码器块。让我们看一下 BERT 的编码器块的各个元素,以可视化数字权重矩阵以及偏置向量。给定的配置 L = 12 表示将有 12 层 self attention,H = 768 表示单个 token 的嵌入维度将是 768 维,A = 12 表示一层 self attention 中将有 12 个注意力头。编码器块执行以下操作序列:
-
输入将是作为 S * d 维矩阵的标记序列。其中 s 是序列长度,d 是嵌入维度。生成的输入序列将是令牌嵌入、令牌类型嵌入以及位置嵌入的总和,作为每个令牌的 d 维向量。在 BERT 模型中,第一组参数是词汇嵌入。 BERT 使用具有 30522 个标记的 WordPiece[2] 嵌入。每个令牌有 768 个维度。
-
嵌入层标准化。一个权重矩阵和一个偏置向量。
-
多头自注意力。将有 h 个头,每个头将有三个矩阵,分别对应于查询矩阵、键矩阵和值矩阵。这些矩阵的第一个维度是嵌入维度,第二个维度是嵌入维度除以注意力头的数量。除此之外,还会有一个矩阵将注意力头生成的连接值转换为最终的令牌表示。
-
残差连接和层归一化。一个权重矩阵和一个偏置向量。
-
位置前馈网络将有一个隐藏层,对应于两个权重矩阵和两个偏置向量。论文中提到隐藏层的单元数将是嵌入维度的四倍。
-
残差连接和层归一化。一个权重矩阵和一个偏置向量。
让我们通过将正确的维度与 BERT 基础模型的权重矩阵和偏置向量相关联来计算参数的实际数量。
嵌入矩阵:
- 词嵌入矩阵大小[词汇量,嵌入维度] = [30522, 768] = 23440896
- 位置嵌入矩阵大小,[最大序列长度,嵌入维度] = [512, 768] = 393216
- 令牌类型嵌入矩阵大小 [2, 768] = 1536
- 嵌入层归一化、权重和偏差 [768] + [768] = 1536
- 总嵌入参数 = ???????? ≈ ???
注意头:
-
查询权重矩阵大小 [768, 64] = 49152 和偏差 [768] = 768
-
关键权重矩阵大小 [768, 64] = 49152 和偏置 [768] = 768
-
值权重矩阵大小 [768, 64] = 49152 和偏差 [768] = 768
-
12 个头的一层注意力的总参数 = 12∗(3 ∗(49152+768)) = 1797120
-
heads [768, 768] = 589824 和 Bias [768] = 768, (589824+768 = 590592) 连接后投影的密集权重
-
层归一化权重和偏差 [768], [768] = 1536
-
位置明智的前馈网络权重矩阵和偏差 [3072, 768] = 2359296, [3072] = 3072 和 [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)
????SASE中的总参数=???????? + + + + = ??????????????????≈