Week1-ELMo, BERT, GPT概念

📚 NLP 深度学习笔记:ELMo, BERT, GPT 全面解析

https://www.cnblogs.com/zishu/p/17363205.html

🧠 1. ELMo(Embeddings from Language Models)

🧾 核心思想

ELMo 通过 双向 LSTM(BiLSTM) 获取词在上下文中的表示,解决了传统 word2vec / GloVe 无法处理词义歧义的问题。

📌 关键点

  • 输入是字符级别(能处理 OOV)
  • 使用双向语言模型(BiLM):前向 LSTM + 后向 LSTM
  • 输出词向量是多个层的线性组合(可训练)

📈 表达式

给定词语序列 ( w_1, w_2, ..., w_n ),ELMo 的表示为:

[
ext{ELMo}k = \gamma \sum^{L} s_j h_{k,j}
]

其中:

  • ( h_{k,j} ):第 (j) 层的第 (k) 个词的 hidden state
  • ( s_j ):softmax 权重
  • ( \gamma ):可学习的缩放因子

🧠 2. BERT(Bidirectional Encoder Representations from Transformers)

🧾 核心思想

BERT 是基于 Transformer Encoder 堆叠的预训练语言模型。它通过双向上下文来理解语言,训练目标包括:

  • Masked Language Model(MLM)
  • Next Sentence Prediction(NSP)

🔄 BERT 训练流程

  1. 对输入句子进行分词,加上 [CLS][SEP]
  2. 随机选择 15% 的 token 做 Mask 操作:
    • 80% 替换为 [MASK]
    • 10% 替换为随机词
    • 10% 保留原词
  3. 模型输出所有 token 的表示
  4. 只在被 Mask 的位置计算交叉熵损失,优化目标:

[
\mathcal{L}{MLM} = -\sum \log P(w_i | ext{context})
]

其中 ( M ) 是被 mask 的位置集合。


🧩 BERT 的双向性体现在哪?

  • 与 GPT 的单向语言模型不同,BERT 的 MLM 可以观察当前 token 左右两边的上下文。
  • 所有词向量通过 Transformer Encoder 同步建模,捕捉全局语义。

✅ BERT 模型结构代码简化(PyTorch)

class BERT(nn.Module):
    def __init__(self, vocab_size, max_len, embed_dim, num_heads, ff_dim, num_layers):
        super().__init__()
        self.token_embedding = nn.Embedding(vocab_size, embed_dim)
        self.position_embedding = nn.Embedding(max_len, embed_dim)
        self.layers = nn.ModuleList([
            TransformerEncoderBlock(embed_dim, num_heads, ff_dim)
            for _ in range(num_layers)
        ])
        self.layernorm = nn.LayerNorm(embed_dim)

    def forward(self, input_ids, mask=None):
        positions = torch.arange(0, input_ids.size(1), device=input_ids.device)
        x = self.token_embedding(input_ids) + self.position_embedding(positions)
        for layer in self.layers:
            x = layer(x, mask)
        return self.layernorm(x)

❓ 被 [MASK] 掉的 token 怎么处理?

  • 所有 [MASK] 的初始嵌入是完全相同的,来自 embedding 表中的同一个 vector。
  • 但通过上下文不同的 Transformer 输出,最终语义表示是不同的。

🧠 3. GPT(Generative Pretrained Transformer)

🧾 核心思想

GPT 是基于 Transformer Decoder 堆叠结构 的模型,用于从左到右地生成文本。

目标是学习一个自回归语言模型,预测下一个词:

[
P(w_t | w_1, w_2, ..., w_{t-1})
]


✅ GPT 的模型结构:

  • Token Embedding + Position Embedding
  • 多层 Transformer Decoder(含 Masked Self-Attention)
  • Linear + Softmax 输出词表概率

🧪 训练目标

最大化语言序列的联合概率:

[
P(w_1, w_2, ..., w_T) = \prod_{t=1}^{T} P(w_t | w_1, ..., w_{t-1})
]

损失函数为交叉熵:

[
\mathcal{L}{LM} = -\sum^{T} \log P(w_t | w_{<t})
]


⚔️ GPT vs BERT 对比

比较点 BERT GPT
结构 Transformer Encoder Transformer Decoder
方向 双向(同时看左+右) 单向(只能看左)
训练任务 MLM + NSP 自回归语言建模
典型用途 分类、问答、NER 文本生成、对话、补全
可用于生成? ❌ 原始 BERT 不能生成 ✅ GPT 可直接用于文本生成

🧱 GPT Block 简化代码(PyTorch)

class GPTBlock(nn.Module):
    def __init__(self, embed_dim, num_heads, ff_dim):
        super().__init__()
        self.attn = nn.MultiheadAttention(embed_dim, num_heads)
        self.ff = nn.Sequential(
            nn.Linear(embed_dim, ff_dim),
            nn.GELU(),
            nn.Linear(ff_dim, embed_dim)
        )
        self.ln1 = nn.LayerNorm(embed_dim)
        self.ln2 = nn.LayerNorm(embed_dim)

    def forward(self, x, mask=None):
        attn_out, _ = self.attn(x, x, x, attn_mask=mask)
        x = self.ln1(x + attn_out)
        x = self.ln2(x + self.ff(x))
        return x

✅ 总结回顾

模型 结构类型 输入方式 表示上下文方式 用途
ELMo BiLSTM 字符级 静态+上下文相关 表达词义(可插入)
BERT Transformer 编码器 双向输入 Mask 多词 表达理解
GPT Transformer 解码器 单向输入 自回归预测 文本生成
posted @ 2025-05-25 11:16  SIo_2  阅读(32)  评论(0)    收藏  举报