深入理解BERT:从原理到实现
d2l-zh 项目地址: https://gitcode.com/gh_mirrors/d2l/d2l-zh
引言
BERT(Bidirectional Encoder Representations from Transformers)是自然语言处理领域里程碑式的模型,它通过双向Transformer编码器结构,在多项NLP任务上取得了突破性进展。本文将基于项目中的BERT实现,深入解析其核心原理和关键技术。
上下文表示的发展历程
从静态词向量到动态上下文表示
传统词嵌入模型如Word2Vec和GloVe生成的是静态词向量,无法根据上下文动态调整。例如,"bank"一词在"river bank"和"bank account"中含义不同,但静态模型会赋予相同的表示。
上下文敏感模型的演进
- ELMo:采用双向LSTM生成上下文相关表示,但需要针对不同任务设计特定架构
- GPT:基于Transformer解码器,实现任务无关模型,但仅能单向编码上下文
- BERT:结合双向编码和任务无关特性,成为通用强大的预训练模型
BERT的核心架构
输入表示
BERT的输入设计精巧,能同时处理单句和句对:
- 单句输入:
[CLS] + tokens + [SEP]
- 句对输入:
[CLS] + tokensA + [SEP] + tokensB + [SEP]
输入嵌入由三部分组成:
- 词元嵌入(Token Embeddings)
- 片段嵌入(Segment Embeddings)区分句子A/B
- 位置嵌入(Position Embeddings)可学习的位置编码
class BERTEncoder(nn.Layer):
def __init__(self, vocab_size, num_hiddens, ...):
self.token_embedding = nn.Embedding(vocab_size, num_hiddens)
self.segment_embedding = nn.Embedding(2, num_hiddens)
self.pos_embedding = ... # 可学习位置编码
Transformer编码器
BERT使用多层Transformer编码器堆叠,每层包含:
- 多头自注意力机制
- 前馈神经网络
- 残差连接和层归一化
self.blks = nn.Sequential()
for i in range(num_layers):
self.blks.add_sublayer(f"{i}", EncoderBlock(...))
BERT的预训练任务
掩蔽语言模型(MLM)
MLM通过随机掩蔽15%的词元并预测它们来训练模型:
- 80%概率替换为
[MASK]
- 10%概率替换为随机词
- 10%概率保持不变
这种策略防止模型过度依赖特定标记。
class MaskLM(nn.Layer):
def __init__(self, vocab_size, num_hiddens):
self.mlp = nn.Sequential(
nn.Linear(num_hiddens, num_hiddens),
nn.ReLU(),
nn.LayerNorm(num_hiddens),
nn.Linear(num_hiddens, vocab_size))
下一句预测(NSP)
NSP判断两个句子是否连续,帮助模型理解句子间关系:
- 50%正样本:实际连续的句子对
- 50%负样本:随机组合的句子对
class NextSentencePred(nn.Layer):
def __init__(self, num_inputs):
self.output = nn.Linear(num_inputs, 2)
完整BERT模型实现
将编码器和预训练任务组合:
class BERTModel(nn.Layer):
def __init__(self, vocab_size, num_hiddens, ...):
self.encoder = BERTEncoder(...)
self.mlm = MaskLM(vocab_size, num_hiddens)
self.nsp = NextSentencePred(num_hiddens)
应用与影响
BERT的创新之处在于:
- 双向上下文编码
- 统一的预训练-微调框架
- 在11项NLP任务上取得state-of-the-art
通过本项目中的实现,我们可以深入理解BERT的工作原理,为后续的模型微调和应用打下坚实基础。
总结
本文基于项目代码详细解析了BERT的核心架构和预训练机制。从输入表示到Transformer编码器,再到MLM和NSP两个预训练任务,BERT通过精心设计的模型结构和训练策略,实现了强大的上下文表示能力。理解这些关键技术对于掌握现代NLP模型至关重要。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考