0. 简介
本文将从维度变换的视角,详细剖析BERT中输入序列的处理流程——从原始文本输入到Encoder层输出的全过程。通过追踪这些维度的变化,希望有助于更好地理解BERT模型(即Transformer的Encoder部分)的内部运作机制。
1. 前置说明
以bert-base-uncased模型为例,进行step by step解析:
- 输入序列长度:
n
(例如,512 是 BERT 的典型最大长度) - 批大小:
batch_size
(例如,32) - 词表大小:
vocab_size
(例如,30522 对于 BERT-base) embedding_size
或d_model
:d
(例如,768 对于 BERT-base,在config.json中的名字是"hidden_size",所以这3个名字都是指同一个意思)- 注意力头数:
h
(例如,12 对于 BERT-base) - 每个头的维度:
d_k = d_v = d_head
(例如,d_head = d / h = 768 / 12 = 64
对于 BERT-base) - 前馈网络隐藏层维度:
d_ff
(例如,4 * d = 3072
对于 bert-base-uncased该值存于config.json的"intermediate_size"字段)
补充说明:
之前有小伙伴问我embedding_size
和d_model
是什么关系,这里做一些补充说明。
其实embedding_size = d_model
,只是称谓不同而已。
embedding_size
(也称为d_model
):
指的是你将每个输入token转换成的连续向量表示的维度大小。例如,你有一个包含 30000 个单词的词表,embedding_size=512
意味着每个单词会被表示成一个 512 维的实数向量。d_model
:在 Transformer 架构(BERT 基于此)中,d_model
是模型内部表示的统一维度。它定义了模型在处理序列时,每个时间步(每个token位置)的特征向量的长度。它是 Transformer 块(编码器/解码器层)设计的关键参数。- 关系:在标准的 Transformer 和 BERT 实现中,
embedding_size
被设定为等于d_model
。也就是说,词嵌入向量被直接映射到模型内部工作所需的维度d_model
上。这是模型设计的一个关键点,它确保了:- 可加性:词嵌入(Word Embedding)、位置嵌入(Positional Embedding)、段嵌入(Segment Embedding)都是
d_model
维的,可以直接相加。 - 一致性:所有后续线性变换(如 Q、K、V 投影)、层归一化(LayerNorm)、前馈网络(FFN)的输入和输出在序列长度
n
的每个位置上都保持d_model
维的特征向量。
- 可加性:词嵌入(Word Embedding)、位置嵌入(Positional Embedding)、段嵌入(Segment Embedding)都是
步骤0:输入准备
- 输入数据:一批句子。每个句子被分词、添加特殊token(如
[CLS]
,[SEP]
)并填充/截断到长度n
。 - 初始维度:
(batch_size, n)
。这是一个整数张量,每个元素是词表vocab_size
中的token ID。
完整版欢迎前往微信公众号"小窗幽记机器学习"。