774 字
2 分钟
ERNIE 论文解读:知识图谱增强的语言表示
BERT 通过大规模预训练展现了强大的语言理解能力,但它只从纯文本中学习,忽略了结构化知识的价值。
ERNIE(Enhanced Language Representation with Informative Entities)创新性地将知识图谱融入预训练过程,让模型同时掌握词汇、句法和知识信息。
本文将详细解读 ERNIE 的技术方案和核心思想。
本文要点
- 知识图谱增强的动机
- 异构信息融合架构
- 知识编码器设计
- 知识驱动任务的提升
一、背景:为什么需要知识图谱?
1.1 语言模型的局限
graph TB
subgraph BERT 从大规模语料学习
A["词汇共现统计"]
B["句法结构模式"]
C["语义关联"]
end
subgraph 但缺乏
D["实体概念知识<br/>如'北京是中国的首都'"]
E["关系事实知识<br/>如'Obama是美国人'"]
F["常识推理能力"]
end
subgraph 表现
G["Obama was born in Honolulu"]
H["可能学会语法<br/>但不理解 Honolulu 是什么"]
end
style D fill:#ffcccc
style E fill:#ffcccc
style F fill:#ffcccc
1.2 知识图谱的价值
# 知识图谱中的结构化知识示例knowledge_graph = { ("Obama", "born_in", "Honolulu"): True, ("Obama", "nationality", "American"): True, ("Honolulu", "located_in", "Hawaii"): True, ("Hawaii", "part_of", "USA"): True,}
# ERNIE 目标:让模型理解这些关系# 普通 BERT:可能只是学会了语法模式# ERNIE:理解实体和关系二、核心思想:融合知识与文本
2.1 整体架构
flowchart TB
subgraph 输入层
A["文本序列"] --> B["Token 嵌入"]
A --> C["Entity 嵌入"]
end
subgraph 知识编码器
B --> D["Text Encoder"]
C --> E["Knowledge Encoder"]
D --> F["信息融合"]
E --> F
end
subgraph 输出
F --> G["预训练任务"]
G --> H["知识增强表示"]
end
style D fill:#2196f3,color:#fff
style E fill:#ff9800,color:#fff
style F fill:#4caf50,color:#fff
2.2 两种信息源
graph TB
subgraph 文本信息
A["词汇、语法、句法"]
B["上下文语义"]
C["来源:大规模语料库"]
end
subgraph 知识图谱信息
D["实体概念"]
E["关系事实"]
F["层级结构"]
G["来源:Wikidata 等知识库"]
end
subgraph 融合挑战
H["文本和知识图谱是异构的"]
I["需要对齐两个空间的表示"]
J["知识噪声需要处理"]
end
style D fill:#ff9800,color:#fff
style E fill:#ff9800,color:#fff
style F fill:#ff9800,color:#fff
style H fill:#ffcccc
style I fill:#ffcccc
style J fill:#ffcccc
三、技术方案
3.1 模型架构
class ERNIE(nn.Module): """ERNIE 模型核心组件"""
def __init__(self, vocab_size, d_model, n_layers, entity_dim): super().__init__()
# 文本编码器(类似 BERT) self.token_embedding = nn.Embedding(vocab_size, d_model) self.position_embedding = nn.Embedding(512, d_model) self.text_encoder = TransformerEncoder(n_layers, d_model)
# 实体编码器 self.entity_embedding = nn.Embedding(num_entities, entity_dim) self.knowledge_encoder = KnowledgeTransformer(n_layers, d_model, entity_dim)
# 融合层 self.fusion_layer = nn.Linear(d_model + entity_dim, d_model) self.ln_f = nn.LayerNorm(d_model)
def forward(self, token_ids, entity_ids, token_to_entity_map): # 文本编码 token_emb = self.token_embedding(token_ids) text_h = self.text_encoder(token_emb)
# 实体编码 entity_emb = self.entity_embedding(entity_ids) knowledge_h = self.knowledge_encoder(entity_emb, token_to_entity_map)
# 融合 fused = torch.cat([text_h, knowledge_h], dim=-1) output = self.ln_f(self.fusion_layer(fused))
return output3.2 知识编码器
class KnowledgeTransformer(nn.Module): """知识编码器:处理实体级别信息"""
def __init__(self, d_model, entity_dim, n_heads): super().__init__() self.entity_proj = nn.Linear(entity_dim, d_model) self.attn = MultiHeadAttention(d_model, n_heads) self.ffn = PositionwiseFFN(d_model)
def forward(self, entity_emb, token_to_entity_map, token_mask): # 将实体嵌入映射到文本空间 entity_hidden = self.entity_proj(entity_emb)
# 实体- token 对齐注意力 # 对于每个 token,聚合相关实体的信息 output = self.attn( query=token_hidden, key=entity_hidden, value=entity_hidden, mask=token_mask )
return output + token_hidden3.3 预训练任务
# ERNIE 的预训练任务
# 1. 遮蔽语言模型(标准 BERT)def masked_language_model_loss(tokens, masked_tokens, predictions): """MLM 损失""" loss = F.cross_entropy(predictions, masked_tokens) return loss
# 2. 遮蔽实体预测(ERNIE 新增)def masked_entity_model_loss(hidden, entity_labels): """预测被遮蔽的实体""" entity_logits = self.entity_head(hidden) loss = F.cross_entropy(entity_logits, entity_labels) return loss
# 3. 关系预测(ERNIE 新增)def relation_prediction_loss(hidden, relations): """预测实体之间的关系""" # 使用实体表示计算关系分数 entity_hidden = gather_entities(hidden, entity_positions) rel_logits = self.relation_head(entity_hidden) loss = F.cross_entropy(rel_logits, relations) return loss
# 总损失total_loss = mlm_loss + mem_loss + rel_loss四、实验结果
4.1 知识驱动任务
bar-chart
title "ERNIE vs BERT 在知识驱动任务上的表现"
x-label "任务"
y-label "准确率 %"
data: 实体分类: ERNIE: 95.2, BERT: 91.3, 关系抽取: ERNIE: 89.5, BERT: 83.2, 问答: ERNIE: 78.3, BERT: 72.1
4.2 标准 NLP 任务
| 任务 | ERNIE | BERT | 提升 |
|---|---|---|---|
| GLUE (平均) | 83.8 | 82.6 | +1.2 |
| MNLI | 86.1 | 85.9 | +0.2 |
| SQuAD v1.1 | 90.7 | 90.4 | +0.3 |
| SQuAD v2.0 | 82.6 | 82.0 | +0.6 |
结论:知识增强不损害标准任务性能
4.3 知识探测实验
# 测试模型是否学习了知识
# 原始句子text = "[E1]Obama[/E1] was born in [E2]Honolulu[/E2]"
# ERNIE 能正确回答:# Q: Where was Obama born?# A: Honolulu (通过知识图谱增强理解)
# 测试关系推理text = "[E1]Microsoft[/E1] was founded by [E2]Bill Gates[/E2]"
# ERNIE 能理解:# - Microsoft 和 Bill Gates 的关系# - 实体类型信息五、知识图谱融合方法
5.1 实体链接流程
flowchart
A["原始文本"] --> B["命名实体识别"]
B --> C["实体消歧"]
C --> D["知识图谱查询"]
D --> E["实体嵌入"]
E --> F["融入模型"]
style B fill:#2196f3,color:#fff
style C fill:#ff9800,color:#fff
5.2 融合策略对比
| 策略 | 方法 | 优缺点 |
|---|---|---|
| 早期融合 | 拼接词嵌入和实体嵌入 | 简单,但可能引入噪声 |
| 晚期融合 | 分别编码后融合 | 更灵活,但融合困难 |
| ERNIE 融合 | 通过注意力动态融合 | 平衡两者,效果好 |
六、影响与后续
6.1 ERNIE 系列发展
timeline
title ERNIE 系列演进
2019 : ERNIE 1.0
: 知识图谱融合
: 实体级别预训练
2020 : ERNIE 2.0
: 持续多任务学习
: 任务感知的预训练
2021 : ERNIE 3.0
: 大规模知识增强
: 中文领域优化
ERNIE-gram : 细粒度知识注入
6.2 知识增强的启示
- 知识注入的有效性:结构化知识确实能提升语言理解
- 异构信息融合:不同模态的信息可以互补
- 预训练任务设计:针对性的预训练任务很重要
常见问题 FAQ
Q1:ERNIE 和 BERT 的主要区别是什么?
A:ERNIE 在 BERT 基础上增加了知识图谱信息,通过实体嵌入和知识编码器将结构化知识融入语言表示。BERT 只从纯文本学习,而 ERNIE 同时学习文本和知识。
Q2:知识图谱如何选择?
A:ERNIE 使用 Wikidata 作为知识源。Wikidata 覆盖范围广、关系质量高、更新及时。中文场景可使用 CN-DBpedia、OwnThink 等。
Q3:知识图谱引入的噪声如何处理?
A:ERNIE 通过注意力机制动态选择相关知识,避免引入过多无关信息。同时预训练任务的设计也让模型学会过滤噪声。
Q4:知识增强是否会影响标准 NLP 任务?
A:实验表明知识增强不会损害标准任务性能,甚至有一定提升。因为知识图谱提供的信息与语言理解是互补的。
小结
ERNIE 创新性地将知识图谱融入预训练语言模型:
mindmap
root((ERNIE))
创新点
异构信息融合
文本
知识图谱
知识编码器
实体级别注意力
多任务预训练
MLM
MEM
RP
效果
知识驱动任务显著提升
标准任务不逊色
证明知识增强的有效性
影响
启发后续知识增强预训练
为知识密集型 NLP 提供新思路
参考资料
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时
相关文章 智能推荐
1
GraphRAG 论文解读:知识图谱增强的检索生成
AI 深度解读 Microsoft GraphRAG 论文——如何利用知识图谱改进 RAG,实现对整个文本语料库全局问题的回答。
2
Codex 论文解读:AI 编程的开端
AI 深度解读 Codex 论文——OpenAI 如何训练能够编写代码的 GPT 模型,以及 HumanEval 基准的建立。
3
GPT 系列论文解读:从 GPT-1 到 GPT-4 的演进之路
AI 深度解读 OpenAI GPT 系列论文——从 GPT-1 的生成式预训练到 GPT-4 的多模态能力,见证大语言模型的崛起。
4
Toolformer 论文解读:让语言模型学会使用工具
AI 深度解读 Toolformer 论文——Meta 如何让语言模型通过自监督学习掌握使用外部工具的能力。
5
GLaM 论文解读:混合专家模型的高效扩展
AI 深度解读 GLaM 论文——Google 如何通过混合专家架构,以三分之一的训练成本实现更好的零样本性能。






