【论文总结】知识图谱增强大模型的几种方法
2023-10-02 20:28:18

引子

大模型,比如ChatGPT,在各大领域嘎嘎乱杀,目前感觉各个专业的各个研究方向都有许多项目和大模型有关。大模型大多采用Transformer架构,大概分为三种,BERT类(主要结构为Transformer的encoder)、GLM类(主要结构包括encoder和decoder)和GPT类(主要结构为decoder)。大模型具有普适性,即能输出各个领域的知识。但是,其也存在很多问题,比如胡乱推理(hallucination,幻觉现象)、黑盒性(这导致人类很难具体解释大模型内部是怎么运作的)。

知识图谱内部存储具体的、实际的信息,其一般以三元组方式存储知识,结构为:(实体A,实体A与实体B的关系,实体B)。在无噪声的知识图谱内搜索,不会出现“胡乱推理”的行为,但是,知识图谱也存在一系列问题:难以构造、没法获取新知识等。

可以通过知识图谱增强大模型的推理能力。本文总结幻读过的一些论文,做个关于二者结合的小小总结。

参考《Unifying Large Language Models and Knowledge Graphs: A Roadmap》这篇论文,通过知识图谱增强大模型的方法大概有两种:

  1. Dynamic Knowledge Fusion(动态的知识融合)。该方法的架构为如下的双塔型:

    将整个KG、问题分别编码,接着送入联合推理层进行推理。

  2. Retrieval-Augmented Knowledge Fusion(检索增强的知识融合)。该方法的架构为,先从KG选取和问题有关的子图,接着进行处理。

动态知识融合的实例

QA-GNN

该方法主要处理选择题。

结构如下:

该方法步骤如下:

  1. 将问题编码,搜寻涉及到的问题节点和答案节点,接着设定一个辅助节点Z,将它与知识图谱中的问题节点、答案节点连接起来,构成一个工作图(working graph)。

  2. 应用如下公式计算每个节点的相关性评分:

  3. 应用以GAT为基础的图神经网络(GNN)在工作图上进行推理,参数更新如下:

    这里的$f_n$是两层MLP。

  4. 对于每一个节点,我们要考虑节点类型和其能提供的信息,节点类型的计算:

    这里的$f_u$是一个线性变换,$f_r$是一个2层感知机,就是两层MLP。其中源、目标节点、关系类型用one-hot方法表示,记作$u_s,u_t$,二者关系用$e_{st}$表示。提供的信息用如下公式进行计算:

    一个线性变换。

  5. 接着计算最终的注意力权重:

    首先将节点的相关性分数升维,然后计算查询向量和key向量带来的权重,接着计算注意力机制即可。

JointLK

处理选择题。其创新之处在于双向注意力机制的应用。

结构如下:

该结构包括两个主要部分:交叉推理模块和动态修剪模块。

LM Encoder层先采用预训练的语言模型编码问题和备选项,接着应用下图公式,先输入进一个线性变换层,接着应用一个激活函数输出即可:

GNN Layer层则要复杂一些,首先使用平均池化的BERT获得KG中每个实体的表示,接着应用以RGAT为基础的GNN层处理得到的实体表示:

交叉推理模块的目的是减少知识图谱特征和查询向量之间的差异,其输入是之前提到的两个层的输出。首先根据如下公式构造一个“亲和力矩阵”(Affinity Matrix):

其中$q_i^{l-1}$是第l层交叉推理模块输入的第i个查询向量。

接着用Softmax函数处理,得到KG-to-LM attention,若用Softmax函数处理亲和力矩阵的转置矩阵,则得到LM-to-KG attention。

原有的查询向量和KG-to-LM attention矩阵相乘,得到暂时的查询向量表示;原有的KG表示和LM-to-KG attention矩阵相乘,得到暂时的KG表示。暂时的查询向量表示和暂时的KG表示相连,再送入线性层,即可得到新的查询向量表示,新的KG表示也可以通过类似的方法得到。详情见总结构图。

对于动态修建模块来说,我们的目标是在KG中切除没用的节点,断开没用的关系边,计算公式如下:

$K$是一个超参数,决定修剪的激进程度,而$|V|$则表示实体的数量。公式14的意思就是,从Z这个KG中,留下$upperbound(K|V|)$个节点。

在这之后,将切除的节点和与它们相连的边删除即可。

在N层迭代之后,将KG表示做注意力池化,将查询向量表示做平均池化,将二者concat,输入MLP层,即可得到输出。

GreaseLM

结构如下:

其结构很简单,通过LM编码query,通过GNN编码KG,接着将query中的一个元素和GNN中的一个元素接入一个MLP,这就完成了信息的传递,接着将剩下的元素分别传入LM和GNN,在这两个结构内,信息逐步传播到邻近的节点。

检索增强的知识融合实例

Think-on-graph

结构如下:

步骤如下:

  1. 实体获取:根据输入的问题,应用LLM获取有关联节点。
  2. 基于束搜索(Beam Search)的探索:
    1. 关系搜索与修剪:从现有的节点开始,探索所有相连的关系边,迭代操作,最终应用LLM修剪贡献不大的边。
    2. 实体搜索与修剪:在关系搜索的过程中,每次迭代都会获取一个实体的集合,应用LLM修剪贡献不大的实体节点。
  3. 推理:最终我们获取了P条推理链,应用LLM判断这些推理链是否足够推理出最终结果。能,就输出最终结果,否则重复探索操作。

StructGPT

本篇论文提出的方法可以被简单地概括为迭代阅读-推理方法

结构如下:

该篇论文没有局限在只使用KG来增强LLM,作者使用了各种结构化的知识库,如KG、数据库和数据表。

步骤如下:

  1. 阅读:应用预选设计的一系列API,从结构化的知识库中提取出相关知识。
  2. 推理:首先将阅读得到的信息线性化,亦即转化为规定好的格式,然后交付给LLM输出。LLM的输出有两种情况,一种是简单地输出最终答案,一种是输出根据现有信息推导出的新信息,根据新信息,继续迭代阅读。

该方法没有完全解决Hallucination的问题。

EMAT

结构如下:

步骤如下:

  1. 将结构化的知识存储为键值对。作者采用的结构化知识库的key是问题,value是答案。
    1. 对key编码时,首先在key前增加一个长度为P的前缀,卷积最后一层隐藏层的输出,接着取前P个结果作为编码。
    2. 对value编码时,增加长度为P的前缀,取最后一层隐藏层输出的前P个元素作为编码。
  2. 对于输入的问题,应用上面对key编码的方式,接着应用MIPS(Maximun Inner Product Search)搜索top-K个最相关的键值对,按照相关顺序排序。
  3. 将key增加位置编码,然后concat成一个矩阵,在每一层隐藏层的状态前都concat这个矩阵。对于value,做同样的操作,但是要加在每一层隐藏层的前面。如此操作,最终输出答案即可。

其他方法

CRITIC

应用外部应用(搜索引擎、编程语言、知识图谱等)验证、修改LLM输出。

Graph-Toolformer

微调出一个能够生成在KG中查询的LLM。