- Knowledge graphs and fact checking
在knowledge graph中,我们通常把一个关系储存成一个triple,
例如:我喜欢吃西红柿
存成:(我,喜欢吃,西红柿)
起名:(主动名词,谓语(动词),被动名词)
给出一些定义:
对于一个Graph G来说:
entity-实体(名词):
E(G)={s|(s,,)属于G}+{{o|(,,o)属于G}}
predicate-谓语(动词):
P(G)={p|(,p,)属于G}
fact checking中我们的目的是删除错误的关系和添加丢失的关系 - Splitting a knowledge graph
为了给fact checking建模,我们需要把graph划分成不同的数据集(train-valid-test),划分过程中需要遵循以下几点:
a. 原始图像的avg indegree和avg outdegree需要和train中的尽量接近(在给定的误差范围(threshold)内)
b. train中必须包含所有node
c. 除了predicate以外,任何node的indegree和outdegree都不能为0
伪代码:
基本思路就是先把所有东西都放train里,然后一个个试试,如果删了后avg_indegree和avg_outdegree的改变量可以接受的话就真删掉,否则就保留
train=G
for p in G里的动词:
avg_indegree=train中动词数量/train中被动名词数量
avg_outdegree=train中动词数量/train中主动名词数量
for (s,p,o) in G中的所有triple:
train'=train去除(s,p,o)
如果train'中包含G中的所有名词:
avg_indegree'=train'中动词数量/train'中被动名词数量
avg_outdegree'=train'中动词数量/train'中主动名词数量
如果avg_indegree'和avg_outdegree'和原始值的误差都在允许范围内的话:
从train中删除(s,p,o)
在rest中加上(s,p,o)
- Training a fact checking model
把每个数据做embedding,然后按照向量值计算是否符合。例如(s,p,o),如果向量s+向量p=向量o,则是正确的,反之是错误的。
先初始化所有train中实体和谓语的embedding
normalize train中实体的embedding
for 想要运行的次数:
normalize train中谓语的embedding
B=一个training batch,size=bs
对于batch 中的sample都要加nr个反例(反例是将任意一个实体更改成错误的实体)
基于loss function更新embedding
检查是否需要停止
这里的loss function是max(0,margin-learning_rate*(-(原数据s+p-o的值)+错误数据s+p-o的值)),因为s+p-o都是取的正数,所以loss是期望元数据差值小,错误数据差值大的。max的原理是当真实值比较小的时候才会更新,否则不更新。
更新数据时就是把正确的s+p靠近o,把错误的s+p远离o
Cs是不包含s同种功能的所有entity,Co是不包含o同种功能的所有entity
- Evaluation
在传统的ml中train,validation,test是完全分离的,但是我们这里用的是图,所以不能完全分离。
Gx=要evaluate的triple
Gy=正确的triple
Cs=Cs(s,p,o,GY)=E(G)-{s|(s,p,o) in GY}
Co=Co(s,p,o,GY)=E(G)-{o|(s,p,o) in GY}
for triple(s,p,o) in Gx():
for s' in Cs:
[r<] =1(正确值偏离更大的个数,即大错误个数)
[r=] =0(相等的个数,即小错误个数)
如果d(sp,p)>d(s'p,o):
则[r<] +=1
如果d(sp,p)=d(s'p,o):
则[r=] +=1
当前rank=(2*[r<] + [r=])/2
当前rank加入总序列R
for o' in Co:
[r<] =1(正确值偏离更大的个数,即大错误个数)
[r=] =0(相等的个数,即小错误个数)
如果d(sp,p)>d(s'p,o):
则[r<] +=1
如果d(sp,p)=d(s'p,o):
则[r=] +=1
当前rank=(2*[r<] + [r=])/2
当前rank加入总序列R
最后再用MR/MRR/H@k之类的metric来判断是否停止