Sequence-to-Sequence Knowledge Graph Completion and QuestionAnswering(2022 ACL)

论文相关

摘要

KGE(knowledge graph embedding) 模型用低维的嵌入向量表示知识图谱中的每个实体和关系。这种方法经常用于知识图谱链接预测和基于不完整知识图谱的问答。

现存问题

KGEs通常会为图中的每个实体创建一个嵌入,由于现实中的图谱有数百万个实体,这就导致模型规模较大。对于下游任务,这些原子实体表示通常需要集成到一个多阶段管道中,这限制了它们的实用价值。

解决方法

本文提出了一个现成的transformer 编码器-解码器模型,作为一个可扩展和通用的KGE模型实现KG链路预测和不完全KG问答的最好结果。其主要将KG链路预测作为一个序列对序列的任务,并将先验KGE方法中的三重评分方法与自回归解码交换。与传统的KGE模型相比,这种简单却很有效的方法可以在保持推断时间可控的同时,将模型大小减少98%。

本文提出的方法称作KGT5。用序列到序列的方法实现了 (1) 可扩展性——通过使用组合实体表示和自回归解码(而不是对所有实体打分)进行推断。   (2) 质量——我们在两个任务上获得最先进的性能。 (3) 通用性——同一模型可用于多个数据集上的KGC和KGQA 。(4) 简单——我们使用现成的模型获得所有结果,没有任务或特定于数据集的超参数调优。

相关工作

链接预测(link prediction)是通过以(s, p, ?)和(?, p,o)形式回答queries,以预测知识图谱中丢失的三元组。这通常是使用知识图嵌入(KGE)模型来完成的。

当所使用的知识图谱不完整时,依然可以利用KGE实现KGQA。

KGT5 模型

将链接预测和问答都视为序列到序列的任务。然后,我们在这些任务上训练一个简单的编码器-解码器transformer, 它与T5-small有相同的架构,但没有预训练的权重。在进行问答训练时,我们利用链接预测目标进行正则化。

Textual Representations & Verbalization

Text mapping

对于链接预测,我们需要一个实体/关系与其文本表示之间的一对一映射。对于基于wikidata的KGs,我们使用规范的实体和关系作为其文本表示,然后使用消除歧义方案,将文本描述和唯一id附加到名称。对于仅用于QA的数据集,我们不强制一对一映射,因为在这种情况下,不必要的消除歧义甚至会损害模型的性能。

Verbalization
通过将查询(s, p, ?)表述为文本表示,我们可以将(s, p, ?)查询回答(query answering)转换为一个序列到序列任务。

比如:查询 (barack obama, born in, ?)  ---->>>>  模型输入"predict tail: barack obama | born in",输出"united states"

Training KGT5 for Link Prediction

为了训练KGT5,我们需要一组(输入,输出)序列。利用teacher forcing和交叉熵损失对KGT5进行训练。 与标准的KGE模型不同,我们并没有用显式的负采样训练。在解码的每一步,模型都会生成 可能成为下一个分词 的概率分布。在训练时,该分布由于与使用交叉熵损失的“真实”分布(即下一个真实token的概率为1,其他所有token的概率为0)不同而受到惩罚。

:teacher-forcing 在训练网络过程中,每次不使用上一个state的输出作为下一个state的输入,而是直接使用训练数据的标准答案(ground truth)的对应上一项作为下一个state的输入。

Link Prediction Inference

给定一个查询query (s,p,?), 传入KGt5模型之前将其转化为文本表示的形式。然后,从decoder 取样一些序列,并将其映射到它们的实体id。通过使用这样的生成模型,我们能够用高置信度估计t前m个模型预测,而不必像传统的KGE模型那样对KG中的所有实体打分。对于每个被解码的实体,我们为其分配一个分数,该分数等于解码其序列的(log)概率。这为我们提供了一组(实体,分数)对。为了计算与传统KGE模型相比较的最终排名指标,我们为抽样过程中没有遇到的所有实体分配了一个−∞的分数。

KGQA Training and Inference

对于KGQA,我们使用链路预测任务在背景KG上对模型进行预训练。然后对相同的模型进行微调,用于问答。我们将一个新的任务前缀(predict answer:)与输入的问题连接起来,并将答案实体的提及字符串定义为输出。这种统一的方法允许我们将KGT5应用于任何KGQA数据集,而不考虑问题的复杂性,并且不需要实体链接等子模块。

为了在QA微调期间(特别是在具有小KGs的任务上)防止过拟合,我们设计了一个正则化方案:我们从背景KG中随机采样链接预测序列到每个批次,这样一个批次包含相等数量的QA和链接预测序列。对于推断,我们使用束搜索和基于邻域(neighbourhood-based)的重新排序来获得模型的预测,这是一个单一的答案。

实验部分

 

 

 

 

 

 

以下是一个简单的英语到印地语的 seq2seq 模型代码示例: ```python from keras.models import Model from keras.layers import Input, LSTM, Dense # 定义模型输入和输出序列的最大长度 max_encoder_seq_length = 50 max_decoder_seq_length = 50 # 定义输入序列的维度 num_encoder_tokens = ... num_decoder_tokens = ... # 定义LSTM层的维度 latent_dim = 256 # 定义编码器模型 encoder_inputs = Input(shape=(None, num_encoder_tokens)) encoder = LSTM(latent_dim, return_state=True) encoder_outputs, state_h, state_c = encoder(encoder_inputs) encoder_states = [state_h, state_c] # 定义解码器模型 decoder_inputs = Input(shape=(None, num_decoder_tokens)) decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True) decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states) decoder_dense = Dense(num_decoder_tokens, activation='softmax') decoder_outputs = decoder_dense(decoder_outputs) # 定义整个模型 model = Model([encoder_inputs, decoder_inputs], decoder_outputs) # 编译模型 model.compile(optimizer='rmsprop', loss='categorical_crossentropy') # 训练模型 model.fit([encoder_input_data, decoder_input_data], decoder_target_data, batch_size=batch_size, epochs=epochs, validation_split=0.2) # 预测模型 encoder_model = Model(encoder_inputs, encoder_states) decoder_state_input_h = Input(shape=(latent_dim,)) decoder_state_input_c = Input(shape=(latent_dim,)) decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c] decoder_outputs, state_h, state_c = decoder_lstm(decoder_inputs, initial_state=decoder_states_inputs) decoder_states = [state_h, state_c] decoder_outputs = decoder_dense(decoder_outputs) decoder_model = Model([decoder_inputs] + decoder_states_inputs, [decoder_outputs] + decoder_states) # 定义预测函数 def decode_sequence(input_seq): states_value = encoder_model.predict(input_seq) target_seq = np.zeros((1, 1, num_decoder_tokens)) target_seq[0, 0, target_token_index['\t']] = 1. stop_condition = False decoded_sentence = '' while not stop_condition: output_tokens, h, c = decoder_model.predict([target_seq] + states_value) sampled_token_index = np.argmax(output_tokens[0, -1, :]) sampled_char = reverse_target_char_index[sampled_token_index] decoded_sentence += sampled_char if (sampled_char == '\n' or len(decoded_sentence) > max_decoder_seq_length): stop_condition = True target_seq = np.zeros((1, 1, num_decoder_tokens)) target_seq[0, 0, sampled_token_index] = 1. states_value = [h, c] return decoded_sentence ``` 需要注意的是,这只是一个简单的代码示例,实际上,seq2seq 模型需要更多的优化和调整才能在实际任务中获得好的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值