事实核查-Fact checking

  1. 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中我们的目的是删除错误的关系和添加丢失的关系
  2. 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)
  1. 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

  1. 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来判断是否停止
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值