mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
774 字
2 分钟
ERNIE 论文解读:知识图谱增强的语言表示
2025-05-14

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 output

3.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_hidden

3.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 任务#

任务ERNIEBERT提升
GLUE (平均)83.882.6+1.2
MNLI86.185.9+0.2
SQuAD v1.190.790.4+0.3
SQuAD v2.082.682.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 提供新思路

参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

ERNIE 论文解读:知识图谱增强的语言表示
https://blog.souloss.com/posts/machine-learning/llm-paper-history/ernie-knowledge-graph-enhancement/
作者
Souloss
发布于
2025-05-14
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时