1. 从零理解BERT:面试官最想听到的架构解析
作为一名经历过数十场AI算法面试的老兵,我发现BERT模型的理解深度往往是区分候选人的关键分水岭。不同于泛泛而谈"BERT基于Transformer"这样的回答,面试官更期待你拆解那些精妙的设计细节。让我们从工程实现的角度,重新审视这个NLP领域的里程碑模型。
1.1 输入表示:三重嵌入的工程智慧
BERT的输入处理远不止简单的词向量查找。当你看到Token Embedding + Segment Embedding + Position Embedding这个公式时,需要理解每个模块解决的实际问题:
WordPiece分词器的隐藏逻辑:
- 传统分词器面对"unaffordable"可能直接OOV(Out-of-Vocabulary),而WordPiece会拆分为
["un", "##aff", "##ordable"] - 这种子词划分使模型能处理罕见词,但带来了约5%的推理速度损耗
- 实际部署时需要权衡词表大小(默认30,522)与内存占用的关系
位置编码的工程选择:
- 原始Transformer使用正弦函数生成固定位置编码,理论上能外推更长序列
- BERT改用可学习的位置嵌入,在预训练长度(512)内效果更好
- 实际代码中,位置嵌入通过
nn.Embedding实现,与词嵌入共享维度
python复制# PyTorch实现示例
position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size)
segment_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size)
1.2 注意力机制的计算优化
多头注意力是BERT的计算瓶颈,理解其实现细节对优化至关重要:
头维度(head_dim)的划分艺术:
- BERT-base的12个头将768维隐藏层拆分为64维的12个子空间
- 这种拆分使模型能并行关注不同特征空间,但计算量随头数线性增长
- 工业界常用
hidden_size % num_heads == 0的约束避免padding
