近十年来,语义表征学习获得了巨大的成功,从早期的word2vec和共现统计方法,到近期以Bert为代表的上下文表征预训练模型, 通过大规模非监督语料训练并斩落了多个下游NLP任务, 证明了AE模型强大的威力。
而知识表示学习(KRL),又称之为knowledge Embedding(KE), 将实体和关系映射到低维的连续向量空间, 早期方法主要以三元组, 近些年来以subgraph或paths作为训练样本,进一步提升了SOTA效果。
知识和语义的融合会带来下游任务的效果提升。这是NLP与图谱结合的一个热门领域,被称为KGE(知识图谱嵌入)。 在我们的上下文中,知识可以是属性,关系,长文本描述,一般可以用图表示。 这里的图可以包括: 二部图,序列图,社交关系图,知识语义图,或知识图谱。
普通人能够读懂通用文本,但没有专业背景知识,就不能做出较好的专业回答。 然而,专业领域的语料来训练的成本实在太高,标注数据较少时,finetune bert模型会有较大的困难。 若引入知识,便能提升模型效果,同时大幅降低所需的标注数据量。
知识图谱可以融入到语义模型中(KG->Bert),融合可以在数据增强阶段,预训练(pretrain),微调(finetune),推理阶段进行。 在微调阶段融入知识时,就一定与具体任务有关,不具备通用性。
反过来,语义向量也能提升图和图谱模型的表现效果(Bert->KG),如KG-Bert。 但本文主要以知识融入语义这个方向为主。以下我们将沿着知识融合的脉络,对每类方法进行总结,按照知识本身的复杂程度顺序排序(属性,三元组,图),并指出各自优缺点。
1. 数据增强阶段
本方法一般用于图向语义模型融合。思路主要是利用现有知识构建更多的训练语料。
1.1 属性生成增强样本
主要是利用知识规则,随机替换实体和属性,创建更多的正负样本,进行数据增广。可用于pretrain和finetune阶段。
以保险为例,详细的可参考文献[3] 例如:
- 如加限定词替换,对象(少年/老年/孕妇/...); 替换保险对象关键词 ‘高龄’, ‘老年’,“汽车险”。 同类替换正样本,异类替换负样本
- 拼接模板,增加query端的语言完整性,增加提取语义,处理歧义的能力,比如“该买XX保险
1.2 三元组生成增强样本(CKLRM)
这也是一类较早期,但简单有效地方法, 例如方法1 即在知识图谱中获得三元组, 根据该三元组在维基百科中选取包含两个实体的句子, 随机mask掉其中一个实体。 接着将含有mask的这句话作为一个问题, 通过随机选取一些实体(当然要包括原实体)来作为答案构造样本,进而使得bert必须识别两者关系才能进行预测。 它的问题是:只能图谱中的最简单的三元关系, 和百度的ERNIE在技术上没有本质区别。
1.2 图遍历生成样本(adapter)
将知识构建为图,在图上进行遍历,生成大量文本样本, 用于pretrain阶段。 例如生成“张坤是易方达的基金经理,管理易方达蓝筹精选混合“等。
其中2就是这样的方法。 具体地,为了提升特定领域的效果,在bert上增加adapter。 在特定领域语料训练时,freeze住bert参数,只训练adapter。而在下游finetune训练时,bert和adapter一起更新。adapter结构如下:
$$Adapter(X) = X+ f(XW_d+b_d)W_u +b_u $$
这类方案实现简单,但问题是噪音不好控制,必须限制子图范围, 而且生成的文本似乎没有特别的语义含义,不具备语法的多样性,使得模型过拟合这类KG任务。 改进空间方面,可使用下文提到的类似CoLake的Mask self-attetion技术,使得在做MLM时每个节点只能看到与它相邻的1跳节点信息。
2. 预训练阶段
数据生成和预训练方法的共同好处,是无需像微调方法那样,需要解决语义和知识向量的不一致(Heterogeneous Embedding Space)。但其问题是,bert在fintune时容易忘记在之前学到的知识。不能免俗,下文的方法依然是属性,三元组,图融合的升级。
2.1 百度ERNIE(entity masking)
百度ERNIE是非常早的知识语义融合工作,其最大的价值还是对Bert的中文化改进。 其主要概念就是”entity masking”。因为bert的单token模式,无法对成语,或英文中常见的“pull up”等进行分析。 ERNIE通过语法解析,获得短语(phrase)和实体(entity)信息。 并以一定比例mask掉这些短语。
这类方法能够捕捉实体,却不提供实体的属性,更不能捕捉实体间的关系。 算是一种最简单的知识融合。论文也有缺点: 缺乏消融实验,例如增加了较多的训练语料,增益有多少来自于knowledge的增强?
2.2 清华ERINE
百度方案集中在预训练模型上,而清华的ERNIE则集中在于知识图谱的联合建模上,即通过TransE算法,将encode后的知识图谱融入到预训练模型。
具体的方案是多层T-Encoder和K-Encoder, 其中K-Encoder是主要的创新点。 信息融合层的设计值得借鉴,在这之后第i个aggregator采用了information fusion layer将两个信息进行了融合,这边不是采用简单的向量相加得到一个向量,而是先combine后divide的方式,分别得到新的token embedding以及entity embedding。其缺点是: 知识图谱中的关系信息没有被用到(这和entity-mask一样)。 由于实体向量和词向量使用不同的方法得到,存在向量空间的不一致。
2.2 CoLAKE
CoLake增加了节点的邻居信息,将图结构知识融入语义模型, 结构图如下:
CoLAKE[7]在加入实体嵌入表示的同时也加入它的上下文信息,允许模型在不同语境下关注实体的不同邻居,同时学习文本和知识的上下文表示。为此,CoLAKE将文本和知识的上下文组成了一张图作为训练样本,称为word-knowledge graph(WK graph),然后在图上做MLM同时学习文本和知识的表示。和K-Bert比较像,区别在于K-Ber作用于finetune,而CoLake作用于pretrain。 相比于ERNIE和KnowBert只使用了语义信息(semi-contextualized),CoLake则使用了完整的上下文(语义+图谱),并通过统一的pretrain task,学习统一的表征。
Transformer也能用在graph,文本也可看成全连接的graph,但一般的图怎么转换为文本序列送入到transformer中?在CoLake中, 类似于Bert的Position Embedding, CoLake也为每个entity和relation增加soft-position index。 如下图所示,在word graph使用原始句子顺序,而在knowledge graph中使用层次遍历,并支持可重复的postion index。
为了在Transformer 编码上图的序列时能体现节点的连接属性。CoLake使用了类似UniLM的Mask self-attetion技术,使得每个节点只能看到与它相邻的1跳节点信息。 但这对“全连接”的word graph并不起作用。
CoLake虽然是图谱向语义融合,但并不止于此。 通过mask不同类型的entity,可实现不同的下游任务:
- mask word节点:对应于传统的MLM
- mask entity: 能帮助语义和知识向量完成对齐
- mask relation: 等价于关系抽取和链接预测。
训练完成后,在finetune和推理阶段,图谱结构可以不进行拼接,不拼也能一定程度上提升效果,这大大降低了后处理的难度。 在知识密集型任务中比较有用。
其改进空间是,”允许模型在不同语境下关注实体的不同邻居“,但实际上挑选邻域子图时,和上下文无关。当邻居较多时,可能采样到和文章上下文完全无关的节点。
3. 微调阶段
下面是在微调阶段进行知识融合的方案。在我们的场景中,finetune下游任务主要是分类和双塔的度量学习(如相关性和召回等)。
3.1 增加辅助任务+ 多任务学习(MTK)
增加辅助任务,例如在item_emb的基础上增加分类任务,预测item的细粒度属性,最终强迫表征模型学到表征中蕴含的类目信息。最终的loss是matching_loss和type loss的求和,并进行多任务学习。这些任务可能是:
- query-item类别是否一致,
- 包含的entity, type是否一致
- 预测item类别
这类方法相对简单,很有用。不会修改bert中的特征。但缺点是:知识必须是可枚举的类目型属性,很难抵御特征缺失和属性冲突的问题,例如健康意外险。
3.2 属性拼接方法
通过在item上拼接属性,例如title+ [SEP] + Property1+ [SEP] +Property2
来融入知识。该方案也很简单,但缺点也明显,无法传导关系,对属性的缺失值和错误值比较敏感。可以试图通过随机mask掉部分属性的做法(转化为空字符串)来增强鲁棒性。
另一种做法,可以解决属性缺失,我们将传统的知识补全任务优化目标从 Head_Entity + Relation = Tail_Entity 改为 Head_Entity + Property = Query。 参考Improving multi-hop question answering over knowledge graphs using knowledge base embeddings.
以上两种方法,可以参考下图在保险上的真实结构:
3.3 K-Bert(北大+腾讯)
首先句子会经过一个知识层(knowledge layer),然后将关联到的三元组信息加入到句子中,形成一个句子树。结构如下图所示:
文章非常类似于CoLake, 通过soft-position给增加的语义信息编上位置。 为了使得各个分叉的词不会跨分叉互相影响,又引入了可见矩阵Visiable Matrix.(可见矩阵在XLNet, UniLM上都有使用。) 只不过CoLake的原始词和关联词分别分开放置,而K-Bert则混合了起来,使得visual matrix变得更加复杂。
方法 | CoLake | K-Bert |
---|---|---|
应用过程 | pretrain | finetune |
融入的知识结构 | 三元组 | 三元组 |
三元组过滤逻辑 | 随机抽取15个 | 不过滤 |
原文本构图方式 | 原文本构成全连通图 | 原文本构成链表 |
图节点元素 | 短语(phrase) | 单词 |
混合方式 | 左句子右图谱 | 原始句子和图谱混合表达 |
K-Bert最大的好处是,它可以直接加载市面上已经公开预训练好的Bert模型,而不用重新训练。在通用问题上提升不太明显,但在专业领域上提升较多。论文的问题是:通过Visiable Matrix仅仅影响了mask-self-attention, Bert的其他步骤不会影响吗?
3.4 增加邻居节点信息(TextGNN, QA-GNN和DHGAN)
这类方法不会修改bert模型,检索子图然后获取knowledge。 在打分的过程中也需要检索子图, 因此依赖检索中的精度对齐。
除了拼接属性,还可以拼接item的邻居。 这类方法可以参考TextGNN和DHGAN(例如在点击图上,query拼item, item拼query等),在原始论文中,它们都应用于召回相关性的类双塔模型中,因此被放置到finetune分类中。CoLake与这类方法也非常接近,区别仅在于CoLake原始论文中没有增加finetune任务,本质应当都差不多。
在TextGNN中,为了降低噪音,提升邻居节点的相关性,通常可使用点击率和点击数过滤的原则,取top3的邻域节点等。在搜索场景下,长尾query缺乏足够的曝光点击行为,因此考虑基于近似最近邻(Approximate Nearest Neighbor,ANN)的邻域补全技术,使用邻域图搜索技术,找到当前长尾query最近邻的高频query来做替换。
TextGNN用一种简化思路处理关系型知识。 通过GNN(如GAT,GraphSage)等方法建模邻域关系。通过图数据的附加信息对文本编码器进行补充,实现了比仅靠纯语义信息所能实现的更强的性能。
QA-GNN相比TextGNN,会检索包含该节点的子图,通过将Node节点和context融合,并经过一个分类器,增加邻居节点相关性的判定,对无关节点进行剪枝。 不过本方法主要应用于QA领域来做选择题。QA-GNN结构如下:
DHGAN是TextGNN方法的一个优化和特化, DHGAN双塔模型中, 会同时考虑同构邻居和异构邻居,并使用两层注意力网络。它在两个部分增加了邻居信息, 分别是在DHGAT中增加同构的query2query,异构的 query2shop的邻居节点;以及在TKPS模块中,增加query下产生交易的商品title信息。
它更面向于实际应用,通过拼接user这类feature,实现了端到端的召回,相关性甚至排序。若说到改进之处,一方面DHGAN号称它能很好地解决长尾query问题,但它仅通过拼接q-s-i图来间接地学习长尾词,问题是长尾词甚至都很难关联到合适的shop和item,与TextGNN显式地通过ANN寻找高频临近query相比,还是显得有些粗糙了。另一方面工业属性较强,增加了非常多的模块和trick,进而限制了它能适应的范围。
下图展示了它们之间的区别:
| 名称 | TextGNN | DHGAN | CoLake |
| -------- | -------- | -------- | --------- |
| 图来源 | q2k | q2q,q2s, q2i,s2s,s2i | 知识图谱 |
| 邻居类型和数量 | 同构,top3 | 同构+异构,邻居数6 | 异构的三元组,15个三元组|
| 特征 | 无 | 加入user特征 | 未增加side-feature |
| 聚合方式 | 单层GNN | DHGAN: 层次图注意力,双层\n TKPS: term AVG-pooling*N | 层次遍历+ bert encoder |
| loss | 交叉熵 | 交叉熵+ 邻居节点相似度 | MLM+NSP多分类 |
| 孤立节点优化 | ANN映射到高频query | | 未提及 |
| 模型结构 | 双塔+dot | 双塔+dot | Bert MLM |
| 应用 | 搜索相关性 | 搜索端到端 | 见2.3Colake一节 |
上表中, q代表query, s为shop, i为商品item. k为keywords(在微软搜索中是赞助商打在item的keyword)
在异构图中,通常会增加type-embedding来区别node types。 以CoLake为例,类型如word, entity和relation .
4. 推理阶段
在推理阶段融合的主要思想是设计多个模型,分别注重语义和知识。 通过模型集成(ensemble)的手段融合多个模型结果。在最终结果上,实现了知识和语义的融合。
在此方法的基础上,通常会增加模型蒸馏,融合到一个student模型中。例如Distilling Structured Knowledge for Text-Based Relational Reasoning[6]。 它蒸馏模型表征,并增加了对比学习(contrastive learning):
5. 使用语义用于图谱建模(Bert->KG)
主要可用于知识库补全(如三元组分类,链接预测和关系预测),结合预训练模型,能将更丰富的上下文补充到模型中。
6.1 KG-Bert
在原始bert中,是通过任意的span来区分词和文档序列。 但在KG-bert里,我们明确地将它们区分为h,r,t。 它们会经过一个统一的Bert生成向量,而非随机生成的向量表征。 item内部的实体,明确地用[sep]来分割。 h,t分享segment emb, r除外,因为r和ht是本质不同的。
KG-Bert(a)和KG-Bert(b), 本质的区别在于问题定义不同,前者是h,r,t判断是否为一个正例; 后者为一个多分类问题。 在样本构造时,负样本是通过正样本随机替换h或t来进行的。以下是KG-Bert(a)的结构图:
KG-Bert的缺点也比较明显:
- 只使用三元组用于图谱建模
- KG-Bert只使用了Bert的pretrain后的向量表征,并没有做联合训练
- 所有的h,r,t都必须全部过bert才能预测,这导致了线上推断会非常的耗时
- 同时只局限于预训练加载,并没有实现端到端训练。
6.2 与图结构融合训练
笔者暂时还没有看到这类论文,待补充。主要可能用于在工业界的具体应用上进行联合训练。
6. 其他方法
6.1 小样本和元学习策略
元学习也是解决知识融合的一路策略,因为本质上知识在表现形式上就是小样本,人就是通过简短,寥寥几次的文本图像信息,来获得知识的。小样本学习的几种分类:
- Model Based: 在通过模型结构的设计快速在少量样本上更新参数,直接建立输入x和预测值P的映射函数
- Metric Based: 通过度量batch集中的样本和support 集中样本的距离,借助最近邻的思想完成分类;
- Optimization Based: 通过特定的优化器来解决。
此处不限于在GPT-3上进行小样本的finetune,也是一种思路。度量学习也是一种解法。限于笔者水平,还难于详细介绍元学习的具体细节,有兴趣的读者可以参考相关内容。
7.2 待补充
持续啃论文中。
总结
以上哪些方法最好? 笔者认为,需要非常仔细地思考当前场景的具体情况,包括图和图谱的建设完备情况,已有的语料规模和质量,以及是泛知识场景,还是知识密集型场景(如医学,金融等领域)。
简单的方法未必不好,如语料生成(1.1),辅助任务(3.1)和属性拼接(3.2),它们可以精准地控制知识融入的范围,并在训练前进行检查。 而那些将三元组甚至子图融入到语义模型的方法, 需要精细的控制(如三元组的筛选和子图的裁剪),否则很容易就为语言模型加入大量噪音(knowledge noise) 。
需要针对数据集的知识类型,选择合适的融合方法。泛知识语料,优先使用数据生成和pretrain类方法,而对知识密度较高的专业领域,建议使用微调方法,更容易实现精细知识控制。 但在融入子图时,就必须对子图进行采样剪枝,否则就会融入大量噪音。
我们能将各类方法的基本元素予以抽象,它们只是这些元素的不同排列组合而已:
并将各类方法的优缺点总结成下表:
融合方向 | 在何时融合 | 方法 | 团队 | 融合方式 | 缺点 | 改进点 | |
---|---|---|---|---|---|---|---|
--- | -- | -- | -- | -- | --- | --- | |
属性->语义 | 微调 | side-task | 蚂蚁 | 增加辅助任务来融入知识 | 只能是分类标签,交互能力太浅 | 属性拼接更深一点 | |
属性->语义 | bert-finetune | 属性拼接 | 无 | 将属性以SEP添加到句子中,类似K-Bert | 无法建模关系,属性缺失性能大幅下降,且不是所有知识都能划分类目 | 使用VM或mask来降低对属性的依赖 | |
图谱-> 语义 | 数据生成阶段 | 生成数据 | 蚂蚁 | 通过知识生成更多训练数据 | 数据量陡增,和真实样本分布不同 | ? | |
bert-finetune | 融合GCN | GCN标准+ bert表征 | 部分场景GCN规模不大 | ? | |||
实体->bert | bert-finetune | entity-mask | 百度ERINE | mask掉整个entity | 无法建模关系,适用于长文本 | ? | |
图谱->bert | bert-finetune | K-bert | 北大,腾讯 | 将三元组挂载在句子树+ VM | baseline不强,只能建模一阶关系,引入更多噪声 | ||
bert->图谱 | pretrain | KG-bert | ? | 将bert训练后的结果,融入图谱进行训练 | 所有的三元组都要打分,耗时过大 | ||
图谱->bert | bert-finetune | K-encoder | 清华ERINE | TransE算法,图谱encode融入到预训练模型 | ? | ||
图谱->bert | pretrain | 图语义融合 | 蚂蚁 | 构图后(query,属性,)生成训练样本 | ? | ||
图谱->bert | pretrain | Text GNN | WWW2021 | ? | |||
并行 | pretrain | Distilling Structed | EMNLP 2020 | ? |
从以上的分析来看,可以做的方向还有很多。
首先,知识融合有几种层次,除了实体对齐外,还有概念层的知识融合、跨语言的知识融合等工作。本文限于篇幅,主要笔墨用在了属性和关系类知识到语义模型方面;
实际上不仅是短文本,长描述信息这类知识如何建模却少有人讨论;其次,当前针对下游特定任务设计Pre-training task还处于探索期,是一个值得持续深耕的方向;针对未见过的分类属性,如何自适应地学习也是需要探索的,可以参考阿里巴巴云小蜜的相关工作[9]
再次,在工业界,如何将语义和图等信息,与用户个性化等信息联合建模,用于召回,相关性甚至个性化排序方向,都是值得深入研究的话题:除了文中已经提到的DHGAN,还有KGAT,它将user-item和知识图谱融合在一起,形成一种新的网络结构。
限于笔者知识,文章中难免有疏漏和错误,欢迎读者一起讨论。
参考文献:
[1] Align, Mask and Select: A Simple Method for Incorporating Commonsense Knowledge into Language Representation Models arxiv 2019
[2] Common Sense or World Knowledge? Investigating Adapter-Based Knowledge Injection into Pretrained Transformers. emnlp2020 workshop
[3]基于Bert和UniLM强知识融合的保险语义相关性算法
[4] Lazada搜索语义匹配模型2.0&3.0-文本与知识的融合
[5] A Dual Heterogeneous Graph Attention Network to Improve Long-Tail Performance for Shop Search in E-Commerce
[6] Distilling Structured Knowledge for Text-Based Relational Reasoning
[7] CoLAKE: Contextualized Language and Knowledge Embedding
[8]QA-GNN:
[9] 知识表示与融入技术前沿进展及应用 https://zhuanlan.zhihu.com/p/343814502