深入理解BERT:从原理到实现

深入理解BERT:从原理到实现

d2l-zh 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"中含义不同,但静态模型会赋予相同的表示。

上下文敏感模型的演进

  1. ELMo:采用双向LSTM生成上下文相关表示,但需要针对不同任务设计特定架构
  2. GPT:基于Transformer解码器,实现任务无关模型,但仅能单向编码上下文
  3. BERT:结合双向编码和任务无关特性,成为通用强大的预训练模型

模型比较

BERT的核心架构

输入表示

BERT的输入设计精巧,能同时处理单句和句对:

  • 单句输入:[CLS] + tokens + [SEP]
  • 句对输入:[CLS] + tokensA + [SEP] + tokensB + [SEP]

输入嵌入由三部分组成:

  1. 词元嵌入(Token Embeddings)
  2. 片段嵌入(Segment Embeddings)区分句子A/B
  3. 位置嵌入(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%的词元并预测它们来训练模型:

  1. 80%概率替换为[MASK]
  2. 10%概率替换为随机词
  3. 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的创新之处在于:

  1. 双向上下文编码
  2. 统一的预训练-微调框架
  3. 在11项NLP任务上取得state-of-the-art

通过本项目中的实现,我们可以深入理解BERT的工作原理,为后续的模型微调和应用打下坚实基础。

总结

本文基于项目代码详细解析了BERT的核心架构和预训练机制。从输入表示到Transformer编码器,再到MLM和NSP两个预训练任务,BERT通过精心设计的模型结构和训练策略,实现了强大的上下文表示能力。理解这些关键技术对于掌握现代NLP模型至关重要。

d2l-zh d2l-zh 项目地址: https://gitcode.com/gh_mirrors/d2l/d2l-zh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喻昊沙Egerton

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值