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 训练流程
- 对输入句子进行分词,加上
[CLS]和[SEP] - 随机选择 15% 的 token 做 Mask 操作:
- 80% 替换为
[MASK] - 10% 替换为随机词
- 10% 保留原词
- 80% 替换为
- 模型输出所有 token 的表示
- 只在被 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 解码器 | 单向输入 | 自回归预测 | 文本生成 |

浙公网安备 33010602011771号