查看全课大纲(第 68 / 69 节)
  1. 1.NLP 的研究领域、应用与学习路径
  2. 2.自然语言的基本术语
  3. 3.信息论基础:信息熵与交叉熵
  4. 4.语言的进化与语义变迁
  5. 5.主观概率、客观概率与条件概率
  6. 6.贝叶斯原理与推理
  7. 7.随机变量:二项式、期望方差与联合概率
  8. 8.常见概率分布
  9. 9.辛普森悖论与贝叶斯解题实例
  10. 10.语言模型:语言概率与词袋模型
  11. 11.n-gram 语言模型(二元 / 三元 / N-Gram)
  12. 12.语言模型评价:交叉熵、困惑度与插值
  13. 13.朴素贝叶斯文本分类:垃圾邮件
  14. 14.拼写检查
  15. 15.中文分词:构词法、最大匹配、最优路径与 Jieba
  16. 16.词表示问题与语义相似度
  17. 17.TF-IDF 权重处理
  18. 18.One-Hot 表达与词表示的局限
  19. 19.Word2Vec 核心思想
  20. 20.Word2Vec 训练过程
  21. 21.Skip-gram 模型详解
  22. 22.词性标注任务与标注方法(规则 + N-Gram)
  23. 23.EM 算法与混合模型
  24. 24.高斯混合模型 GMM
  25. 25.从混合模型到隐马尔可夫模型
  26. 26.隐马尔可夫模型(HMM)推导与维特比解码
  27. 27.线性链条件随机场 CRF
  28. 28.贝叶斯网络与图模型
  29. 29.隐马尔可夫链与 HMM 推导
  30. 30.PLSA 主题模型
  31. 31.LSI 与 SVD 向量表达
  32. 32.LDA 与狄利克雷分布
  33. 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
  34. 34.上下文无关文法(CFG)与句法分析
  35. 35.概率上下文无关文法 PCFG
  36. 36.统计机器翻译:词对齐与翻译模型
  37. 37.统计机器翻译中的对齐模型与参数估计
  38. 38.从统计机器翻译到神经机器翻译
  39. 39.神经元与反向传播速览(指向深度学习课)
  40. 40.CNN 原理及其在 NLP 中的应用
  41. 41.循环神经网络的基本原理与 Elman / Jordan 网络
  42. 42.LSTM:长短期记忆网络的核心思想与分步实现
  43. 43.Encoder-Decoder 框架
  44. 44.Seq2Seq 与早期注意力机制
  45. 45.注意力机制的背景与动机
  46. 46.注意力模型实现原理与匹配函数
  47. 47.记忆网络:组成与计算
  48. 48.注意力机制的应用与历史延展
  49. 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
  50. 50.Multi-Head Attention、FFNN 与位置编码
  51. 51.层归一化、损失函数与 Universal Transformer 延展
  52. 52.预训练范式:从 ELMo 到 BERT
  53. 53.BERT 与掩码语言模型
  54. 54.BERT 下游任务微调与 GLUE 口径
  55. 55.GPT 与自回归语言建模
  56. 56.GPT-1 到 GPT-4 的演进
  57. 57.指令微调与 RLHF
  58. 58.分词器:BPE、WordPiece 与中文词表
  59. 59.上下文窗口与长文本处理
  60. 60.能力边界、成本与适用场景
  61. 61.文本分类实战:从朴素贝叶斯到逻辑回归
  62. 62.命名实体识别实战
  63. 63.文本生成与摘要实战
  64. 64.语义检索与向量库实战
  65. 65.RAG 知识库问答
  66. 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
  67. 67.幻觉与事实性问题
  68. 68.文本与知识结合(知识图谱压缩)
  69. 69.跨媒体信息检索与未来展望

文本与知识结合(知识图谱压缩)

小象实战讲义 · 自然语言处理

自然语言处理的发展并非始于深度学习。在更早的时代,研究者们怀揣着理解语言背后“真理”的宏大理想,致力于构建基于逻辑和规则的专家系统,以期实现通用人工智能。然而,现实表明,纯粹基于规则的系统难以应对语言的复杂性和不确定性。今天,我们拥有了强大的深度学习工具,能够从海量数据中学习,但有时却陷入了“运行现成神经网络”的工程化循环,缺乏更高层次的认知目标。本节将探讨如何将深度学习的“数据驱动”能力与知识图谱的“知识表示”能力相结合,为构建更“聪明”、更具推理能力的通用人工智能系统提供一条可行的路径。本节内容承接对记忆网络等推理机制的介绍,并为后续理解更复杂的知识增强模型奠定基础。

💡 核心导读

  • 历史脉络:回顾从基于规则的专家系统到现代知识图谱的演变,理解知识表示在人工智能发展中的核心地位。
  • 知识表示与计算:学习如何将语义关系(如“猫有尾巴”)表示为可计算的三元组(头实体,关系,尾实体),并映射到向量空间。
  • 神经张量网络:掌握一种将知识图谱三元组进行向量化建模和推理的经典神经网络模型,理解其如何为关系打分。
  • 跨模态知识应用:了解如何利用图卷积网络(GCN)对文本进行图结构建模,并与图像等其他模态信息进行对齐,实现跨模态检索。
  • 未来方向:思考知识驱动与数据驱动相结合对于实现通用人工智能(AGI)的意义与挑战。

从专家系统到知识图谱:知识的文艺复兴

人工智能的早期研究深受“专家系统”的影响。专家系统试图通过编码人类专家的知识和规则(即“知识库”)来模拟智能行为。这种方法曾一度被认为是实现人工智能的主要途径,但其发展历程充满了起伏。主要瓶颈在于:手工构建和维护大规模、高质量的知识库极其困难,且系统缺乏从数据中学习和适应新情况的能力。

随着互联网和大数据时代的到来,一种名为“知识图谱”的技术重新焕发了生机。知识图谱可以看作是专家系统思想在新时代的“文艺复兴”。它同样以结构化的方式表示知识,但规模更大(如谷歌的Knowledge Graph、Freebase),并且更强调实体、属性及其之间的关系。与早期专家系统不同,现代知识图谱的构建往往结合了自动化信息抽取、众包和机器学习技术。

这种复兴背后的核心驱动力是:要实现更通用的智能,系统不仅需要从数据中学习模式(深度学习所长),还需要能够存储、检索和利用结构化的世界知识(知识图谱所长)。两者的有机结合,被认为是通向通用人工智能(AGI)的一条有前景的路径。

语义关系的向量化计算

如何让机器“理解”并“计算”语义关系?关键在于将逻辑关系转化为数学运算。

知识的三元组表示

知识图谱中的基本事实通常用三元组 (head, relation, tail) 或 (h, r, t) 来表示。

  • 头实体 (h):关系的主体,如“猫”、“美国”。
  • 关系 (r):连接两个实体的语义关系,如“有”、“总统是”。
  • 尾实体 (t):关系的客体,如“尾巴”、“巴黎”。

例如:

  • (猫, 有, 尾巴)
  • (监督学习, 是一种, 机器学习)
  • (法国, 首都是, 巴黎)

一系列这样的三元组就构成了一个知识库(Knowledge Base)。

关系作为向量空间的翻译

一个直观的想法是:如果我们能为每个实体(如“猫”、“尾巴”)和关系(如“有”)学习到一个向量表示,那么一个正确的三元组应该满足某种向量运算。最经典的思路来源于TransE模型的思想:将关系 r 视为从头实体向量 h 到尾实体向量 t 的“翻译”。

即,对于一个正确的三元组 (h, r, t),我们希望: h + r ≈ t

这里的 + 是向量加法。例如,“猫”的向量加上“有”这个关系的向量,应该接近于“尾巴”的向量。

基于这种思想,我们可以进行推理:

  • 链接预测:给定 (法国, 首都是, ?),计算 h("法国") + r("首都是"),然后在所有实体向量中寻找最接近的向量,可能就是“巴黎”。
  • 关系预测:给定 (猫, ?, 尾巴),寻找一个关系向量 r,使得 h("猫") + r ≈ t("尾巴"),这个 r 可能对应“有”。

下面的代码块演示了这个核心概念(使用极简的手工设定向量进行示意):

import numpy as np

# 定义极简的实体和关系向量(维度为3)
vector_cat = np.array([0.1, 0.2, 0.3])
vector_tail = np.array([0.5, 0.6, 0.7])
# 假设"有"这个关系的向量是 [0.4, 0.4, 0.4]
vector_has = np.array([0.4, 0.4, 0.4])

# 计算 h + r
predicted_tail = vector_cat + vector_has
print("'猫'的向量:", vector_cat)
print("'有'的向量:", vector_has)
print("计算得到的 h + r:", predicted_tail)
print("真实的'尾巴'向量:", vector_tail)

# 计算预测向量与真实向量的欧氏距离
distance = np.linalg.norm(predicted_tail - vector_tail)
print("\n预测向量与真实向量的欧氏距离:", round(distance, 4))
'猫'的向量: [0.1 0.2 0.3]
'有'的向量: [0.4 0.4 0.4]
计算得到的 h + r: [0.5 0.6 0.7]
真实的'尾巴'向量: [0.5 0.6 0.7]

预测向量与真实向量的欧氏距离: 0.0

在这个完美的示意中,距离为0,表示关系 h + r = t 严格成立。现实中,我们通过优化模型参数,使正确三元组的距离尽可能小,错误三元组的距离尽可能大。

神经张量网络:对关系进行深度建模

简单的向量相加模型(如TransE)虽然优雅,但难以建模复杂的关系(如一对多、多对一)。神经张量网络(Neural Tensor Network, NTN)提供了更强大的建模能力。

NTN的核心思想是:使用一个双线性张量积来直接建模两个实体向量在特定关系下的交互,而不仅仅是简单的平移。

NTN的评分函数

对于一个三元组 (e1, R, e2),NTN为其计算一个可信度得分。得分函数如下:

g(e1,R,e2)=uRT⋅f(e1TWR[1:k]e2+VR[e1e2]+bR)g(e_1, R, e_2) = u_R^T \cdot f \left( e_1^T W_R^{[1:k]} e_2 + V_R \begin{bmatrix} e_1 \\ e_2 \end{bmatrix} + b_R \right)

我们来分解这个公式:

  • 输入:e1, e2 是维度为 d 的实体向量。
  • 张量部分:W_R 是一个三维张量,尺寸为 d × d × k。e1^T W_R^{[1:k]} e_2 运算的结果是一个 k 维向量,其中第 i 个分量为 e1^T W_R^{[:,:,i]} e2。这部分捕获了实体间复杂的、与关系 R 相关的双线性交互。
  • 线性部分:V_R 是一个 k × 2d 的矩阵,[e1; e2] 是 2d 维的实体向量拼接。V_R [e1; e2] 提供了一个线性变换。
  • 偏置与激活:b_R 是 k 维偏置向量。将张量部分、线性部分和偏置相加后,通过一个非线性激活函数 f(如 tanh)。
  • 最终得分:u_R 是一个 k 维权重向量,将激活后的 k 维向量转换为一个标量得分。得分越高,表示该三元组成立的可能性越大。

训练目标

NTN的训练目标是区分正确三元组和错误三元组。对于知识库中的每个正确三元组 T,我们会构造一些“损坏”的三元组 T_c(例如,随机替换头实体或尾实体)。损失函数使用间隔损失(margin-based loss):

J(Ω)=∑T∈S∑Tc∈STmax⁡(0,1−g(T)+g(Tc))+λ∥Ω∥22J(\Omega) = \sum_{T \in \mathcal{S}} \sum_{T_c \in \mathcal{S}_T} \max(0, 1 - g(T) + g(T_c)) + \lambda \lVert\Omega\rVert_2^2

其中:

  • Ω 代表所有可训练参数 {W, V, b, u, E}(包括实体向量 E)。
  • S 是所有正确三元组的集合。
  • S_T 是针对正确三元组 T 采样得到的错误三元组集合。
  • 目标是最小化 J(Ω),使得正确三元组的得分 g(T) 比错误三元组的得分 g(T_c) 至少高出一个间隔(margin=1)。
  • 最后一项是L2正则化项,防止过拟合。

通过这种训练,NTN 学到的并不只是实体向量:实体来自矩阵 E,而每个关系 R 分别拥有自己的张量 W_R、矩阵 V_R、偏置 b_R 与输出权重 u_R——关系是一组参数而非单个向量,这正是它比 TransE 表达力更强(也更重)的原因。在此基础上,模型得到一个可以推理新事实的评分模型。例如,训练后,模型可以判断 (孟加拉虎, 有部分, 尾巴) 的得分很高,而 (孟加拉虎, 有部分, 电脑) 的得分很低。

实体的文本表示:NTN 中的实体向量可由实体名称各组成词的词向量取平均得到(如“Bengal tiger”由 Bengal 与 tiger 两词的词向量平均),并用大规模文本预训练词向量初始化、在训练中调整。这样实体表示共享了名称中各词的统计信息,也能为原知识库中未出现过的实体给出表示,从而提升关系预测并支持未登录实体。

文本图卷积网络:知识在跨模态中的应用

除了结构化知识推理,一般的图结构也可用于文本表示,并与图像等其他模态信息融合。本课素材中的 text GCN 就是这方面的一个例子——但这里要先分清名号:它是讲师团队那个双路径跨模态检索模型(论文中命名为 Graph-In-Network, GIN)的文本分支,本身并不使用知识图谱或实体关系三元组,也不是学界通称的 Text GCN。

名号辨析:学界广泛引用的 Text GCN 指 Yao、Mao 与 Luo(AAAI 2019)的 Graph Convolutional Networks for Text Classification——它在整个语料上建一张异构图,节点同时包含词与文档,词-词边由 PMI 共现强度定义、词-文档边由 TF-IDF 定义,用于文本分类。而本节讲的 GIN 文本分支只以词为节点、按 Word2Vec 相似度做 kNN 建边,两层图卷积后接全连接层映射到公共语义空间,用于跨模态检索。两者形似而神不同,按同一名字检索会找到完全不同的一套方法。

核心思想:将文本表示为图

传统的文本表示方法(如词袋模型、TF-IDF、RNN)各有局限,它们或忽略词序,或难以捕获非局部依赖关系。本节 GIN 文本分支的做法是:从整个语料的高频词中提取节点,构建一张全语料共享的词图(而不是为每篇文档单独重建一张词图),把词与词之间的关系建模为图(Graph):

  • 节点:语料中的每个高频唯一词是一个节点。
  • 边:如果两个词的词向量(通过预训练的Word2Vec得到)相似度很高(例如,余弦相似度排在前k名),则在它们之间建立一条边。
  • 节点特征:原始 GIN 设定使用该词在文档中的词频(TF)作为节点特征;TF-IDF 加权可作为可选变体,并非原论文机制。

这样,文本的语义信息就被编码在图的拓扑结构(哪些词相似)和节点特征中。

图卷积网络学习文本特征

得到文本图后,我们使用图卷积网络(GCN)来学习图中节点的深层特征表示。GCN的核心操作可以简化为:

  • 每一层,节点会聚合其邻居节点的特征信息,并与自身的特征结合,通过一个可学习的权重矩阵进行变换,再经过非线性激活。
  • 经过多层传播后,每个节点(词)的表示融合了其多跳邻域中的结构与语义信息(层数决定感受野有多远,并不是一步就看到整张图)。
  • 原 GIN 在两层图卷积(各接 ReLU)之后接一个全连接层,把文本特征映射到与图像表示同维的公共语义空间;它并没有对词节点做求和/平均池化。求和或平均池化是其他图神经网络常见的读出方式,若使用只能作为单独的 readout 变体说明。

跨模态检索框架

在一个跨模态检索系统中,我们可以构建一个双路径神经网络:

  1. 文本路径:输入文本 -> 构建文本图 -> GCN -> 得到文本特征向量 f_text。
  2. 图像路径:输入图像 -> CNN(或全连接网络)-> 得到图像特征向量 f_image。
  3. 目标:确保描述同一内容的文本和图像对 (f_text, f_image) 在向量空间中尽可能接近。这通常通过最大化它们的向量点积(或最小化距离)来实现。
  4. 损失函数:常采用对比损失或三元组损失,拉近匹配对的距离,推远不匹配对的距离。

通过联合训练,模型能够学习到一个共享的语义空间,使得来自不同模态但语义相同的内容具有相似的向量表示,从而实现“以文搜图”或“以图搜文”。

文本输入:"一只鸟在树枝上,有蓝色的羽毛。"
图像输入:(一张对应的蓝鸟图片)

文本路径:
词: {鸟,树枝,蓝色,羽毛}
构建图:根据Word2Vec相似度连接"鸟"-"羽毛","蓝色"-"羽毛"等。
GCN学习:得到融合了"鸟"、"蓝色"、"羽毛"等关系的文档向量。

图像路径:
CNN提取:得到包含蓝色、鸟类、树枝等视觉特征的图像向量。

目标:使上述文本向量和图像向量的点积尽可能大。

📝 动手练一练

  1. 概念辨析:神经张量网络(NTN)与简单的翻译模型(如TransE)在建模知识图谱三元组时,最主要的区别是什么?NTN通过引入什么结构来增强其表达能力?
👉 点击查看参考答案

最主要的区别在于关系建模的复杂度。

  • 翻译模型(如TransE):将关系 r 建模为一个简单的平移向量。它假设对于正确三元组 (h, r, t),有 h + r ≈ t。这种方式计算简单,但难以处理复杂关系(如多对一:(北京, 位于, 中国) 和 (上海, 位于, 中国),两个头实体经同一关系对应同一个尾实体,TransE 会导致 h("北京") ≈ h("上海"),这不符合事实)。
  • 神经张量网络(NTN):将关系 R 建模为一个双线性张量 W_R 和一系列权重矩阵/向量 (V_R, b_R, u_R)。通过公式 g(e1,R,e2) = u_R^T · f( e1^T W_R e2 + V_R [e1; e2] + b_R ) 计算三元组得分。W_R 这个三维张量允许模型捕获头尾实体之间复杂、非线性的交互,这种交互是关系特定的,因此表达能力更强,能更好地建模各种复杂关系。
  1. 简单计算:假设我们有一个极简的知识图谱,实体向量维度为2,关系“首都”的翻译向量 r_capital 为 [1.0, 0.0]。已知实体“法国”的向量 h_france 为 [0.0, 0.0],实体“巴黎”的向量 t_paris 为 [1.0, 0.0]。请计算三元组 (法国, 首都, 巴黎) 在TransE模型下的得分(用头实体加关系向量与尾实体的欧氏距离的相反数表示,即 score = -distance(h+r, t))。
👉 点击查看参考答案
import numpy as np

# 定义向量
h_france = np.array([0.0, 0.0])
r_capital = np.array([1.0, 0.0])
t_paris = np.array([1.0, 0.0])

# 计算 h + r
predicted = h_france + r_capital
print("h + r =", predicted)

# 计算欧氏距离
distance = np.linalg.norm(predicted - t_paris)
print("欧氏距离 =", distance)

# 计算得分(距离的相反数)
score = -distance
print("TransE 得分 =", score)
h + r = [1. 0.]
欧氏距离 = 0.0
TransE 得分 = -0.0

计算结果显示 h_france + r_capital = t_paris,距离为 0,得分打印成 -0.0。这里的负号不是错误:距离是 0.0,取相反数得到浮点负零 -0.0,按 IEEE 754 它和 0 数值相等,只是 Python 保留了符号位。所以这个极简设定下 (法国, 首都, 巴黎) 是一个完美的三元组。实际上,模型会优化所有三元组,使正确三元组的距离尽可能接近 0。

本章小结

本节探讨了自然语言处理中一条重要的发展脉络:将深度学习的强大学习能力与知识图谱的结构化知识表示相结合。我们回顾了从专家系统到知识图谱的思想演进,学习了如何将语义关系向量化并利用神经张量网络进行深度推理,最后了解了如何利用图结构处理文本并实现跨模态的知识对齐。这条路径的核心在于,让AI系统不仅能从数据中学习“相关性”,还能利用结构化知识进行关系预测和常识推理;需要说明,这些模型学习的是三元组距离或置信度、跨模态相似度,本身并不识别干预效应、因果方向或反事实,不能仅凭使用结构化知识就宣称具备因果推理能力。

📋 行动清单

  • 理解三元组:尝试用 (头实体, 关系, 尾实体) 的形式描述你身边的三条常识(例如:(太阳, 从, 东边升起))。
  • 思考结合点:在你熟悉的NLP任务(如情感分析、机器阅读)中,想象一下如何引入外部知识图谱(如概念关系、常识)来提升模型性能。
  • 探索现代进展:了解当前大语言模型(LLMs)如何与知识图谱结合(如检索增强生成RAG、知识注入微调),思考其相对于NTN等早期模型的优势与挑战。

—— 小象教研组