论文浅尝 | 问题生成(QG)与答案生成(QA)的结合

本文转载自公众号:徐阿衡



梳理一下 MSRA 3 篇关于 QG 的 paper:


  • Two-Stage Synthesis Networks for Transfer Learning in Machine Comprehension

  • Question Answering and Question Generation as Dual Tasks

  • A Joint Model for Question Answering and Question Generation

QG 系列其他的笔记(见徐阿衡公众号):

  • 论文笔记 - Machine Comprehension by Text-to-Text Neural Question Generation

  • 论文笔记 - Semi-Supervised QA with Generative Domain-Adaptive Nets

目前的 QA 大多是 抽取式(extractive)的任务,答案是文本中的一个连续片段,通常是命名实体这类语义概念,而 QG 是生成式的(abstractive),问句是完整句子,部分单词可能是文档中没出现过的,很多情况下,问句和答案的语言结构不同,因此甚至可以看做两种不同类型的数据。所以第 1 篇 SynNet 就把答案生成当作序列标注任务,把 QG 当作生成任务;第 3 篇 Joint Model 从另一个角度出发,把 QA 和 QG 都当作生成任务,放到同一个 encoder-decoder 框架下,用转变输入数据来实现联合训练,用 pointer-softmax 来处理抽取/生成问题。

另外,QA 和 QG 任务在概率上是有联系的,可以通过 q、a 的联合概率分布联系起来,P(q|a) 就是 QG 模型,P(a|q) 类似 QA 模型,于是第 2 篇 dual tasks 就把这两个任务当做对偶任务,用一个正则项把两个任务联合在一起640?



Two-Stage Synthesis Networks for Transfer Learning in MC




我们知道 MRC 系统的输入是 (passage, question, answer) 三元组,q 和 a 依赖人工标注,这是制约 MRC 落地应用的最大问题之一,这篇 paper 提出了 SynNet,利用已有领域中可用的监督数据为基础进行训练,训练完成后迁移到新的领域中,根据新领域的文档,模型能自动合成与文档 p 相关的 (q, a) 对,替代昂贵的人工标注,为 MRC 的迁移落地提供了便利。

SynNet 把 QA 对(question-answer pair)的生成过程 P(q,a|p) 分解为条件概率 P(a|p) P(q|p,a) ,也就是下面两个步骤:

  1. 基于文档生成答案 P(a|p)
    学习文档中的 potential “interestingness” pattern,包括文章中可作为常见问题答案的关键知识点、命名实体或语义概念
    由于答案是文档的片段,所以看做序列标注任务

  2. 基于文档和答案生成问题 P(q|p,a)
    学习生成自然语言的完整问句
    作为生成任务

640?

答案合成模块(Answer Synthesis Module),序列标注问题,训练了一个 IOB tagger (4 种标记,start, mid, end, none)来预测段落里的每个单词是不是答案。结构很简单,BiLSTM 对 p 的词向量进行编码,然后加两个 FC 层和一个 Softmax 产生每个单词的 tag likelihoods,选择连续的 span 作为 candidate answer chunks,喂给问题生成模块。

问题合成模块(Question Synthesis Module)学习的是640。模型结构是 encoder-decoder + attention + copy mechanism。通过在段落词向量中加入一个 0/1 特征来表示单词是不是出现在答案中。

训练算法:
640?
在源领域上训练 SynNet,产生新领域的 QA 对,然后和源领域的数据一起来 finetune 源领域的 MC 模型(用 SGD),源领域和新领域的数据采样比是 k:1(paper 里设的 k=4),这主要是为了处理合成数据的噪音问题而进行的正则化操作。

测试阶段也就是用 finetune 完成的 MC 模型回答新领域的问题时,可以对不同时刻的 checkpoints 的 answer likelihoods 做平均,然后用 DP 找到最佳的 answer span 640?,最大化 640?,复杂度是 linear,和 BiDAF 的逻辑相同。

难得的是这篇 paper 还提供了实现细节,其中一个 trick 是,在训练问题合成模块时,他们只用了 SQuAD 的训练集,但是在答案合成模块,还引入了 NER Tagger 来增强答案数据,基本假设任何命名实体都可以被当做某个问题的潜在答案。

在 Ablation Studies 和 Error Analysis 中还提到了一些有趣的发现,具体可以看论文。待解决的问题一个是 copy 机制导致的产生的问句和 paragraph 高度相似的问题,可以通过改进 cost function 在促进解码过程的多样化,另一篇 paper 有提到。还有一个问题是 SynNet 在解决比如数字、人名这种问题的效果很好,但是在需要一些推理的问题,像是 what was / what did 这些问题就很弱了,这也是后续的研究方向。

这篇 paper 个人非常喜欢,实现细节和一些结果的分析都很赞。




Question Answering and Question Generation as Dual Tasks




把 QA 和 QG 当作对偶任务。关键还是下面这个式子:

640?

P(q|a) 即 QG 模型,和 P(a|q) 即 QA 模型可以通过联合概率联系起来,于是这里把 QA 和 QG 当作对偶任务,Seq2Seq 实现 QG,RNN 实现 QA,通过一个正则项把两个任务联系起来,联合训练一起学习 QA 和 QG 的参数,损失函数服从下面的条件:

640?

其中640?分别对应答案句和问句的语言模型。

这里 QA 任务不再是在 context 里选 answer span 的任务,而被看作是在一组候选答案句集合中选择可能性最高的 answer sentence 的一个排序任务。也就是说,这里的 a 是答案所在的句子,而不是前一篇 paper 提到的简单的语义概念/实体。

QG 任务还是一个生成任务,输入是答案句 a。要注意的是这里 QA 和 QG 的输入都没有 p,都只考虑了句子层面的信息。

和之前介绍的 GDAN 不同的是,这里 QA 和 QG 的地位是相同的,也并不需要预训练 QA。

下面看一下模型细节:
QA 模型 分别用 BiGRU 对 q 和 a 进行编码,拼接 last hidden state 作为向量得到 v_q 和 v_a,question-answer pair 的表达由四个向量拼接构成
640?, c(q,a) 表示 q,a 的共现词,对应的词向量表达通过引入额外的 embedding 矩阵 640?实现,d_c 表示词共现向量的维度 |V_c| 则是词汇表大小,640?也就是 qa 相关性函数通过对 v(q,a) 进行线性变换加 tanh 激活得到,最后 softmax 得到概率,损失函数还是 negative log-likelihood。

QG 模型 还是经典的 encoder-decoder + attention 模型,输入是 answer sentence,还是用 BiGRU 进行编码,连接两个方向的 last hidden state 作为 encoder 的输出以及 deocder 的初始状态。对 attention 做了改进,希望模型能记住 answer sentence 中哪些 context 被使用过了,在产生 question words 的时候就不再重复使用。

640?
拼接 s_t 和 c_t,接一个 linear layer 和 softmax 得到输出单词在词汇表上的概率分布,一个 trick 是 softmax 输出维度取 top frequent question words,OOV 用 attention probability 最高的词替换,相当于对文档单词的一个 copy 机制,当然也可以用 pointer network 来做。

模型每次输入 m 个 QA 对正例和 m 个负例,通过 QG 和 QA 各自模型计算各自 loss,再加上一个正则化项一起计算参数梯度并更新参数。
640?
正则化 dual 项利用了 QA 和 QG 的对偶关系:
640?

考虑到 640?和 QA 模型的输出有差异,因此给定 q,sample 一系列 answer sentences A’,从中得到 640?

640?

在实现细节里提到模型对 question words 和 answer words 用了不同的 emebdding 矩阵来学习特定的语义。另外 sampled answer sentence 来自其他的 passage,这降低了 QA 的难度。

结果分析再次证明了 word co-occurrence 是一个简单但非常有效的特征。

实验设计部分不大能看出模型的实际效果,不明白为什么不直接刷榜看一下结果。另外 QG 部分的评价指标也只用了 BLEU-4 分数,对 fluency 没有进行说明。

We first report results on the MARCO and SQUAD datasets. As the dataset is splitted by ourselves, we do not have pre- viously reported results for comparison.




A Joint Model for Question Answering and Question Generation



这篇和上篇都是讲怎么同时生成答案和问题,不同的是上篇通过一个 dual regularization term 将两者联合起来训练,这里把 QA 和 QG 任务都作为生成任务,模型基本结构还是 Seq2Seq + Attention + Pointer Softmax,和之前提到的一篇 论文笔记 - Machine Comprehension by Text-to-Text Neural Question Generation 差不多。输入是文档,以及一个 condition sequence,在 QA 任务里表现为 question word sequence,给定 question 生成 answer;QG 任务里表现为 answer word sequence,给定 answer 生成 qestion,condition 由一个 0/1 变量来控制,表示收到的数据是给 a-gen 还是给 q-gen。Joint training 通过对输入数据的转换实现。

Pointer-softmax 一定程度上能解决 extractive/abstractive 的混合问题,通过选择 copy 文档的单词还是生成词汇表的单词来产生下一个单词,表达了 extractive/abstractive 的切换。这带来的一个额外好处是可以产生 abstractive answer

具体来讲,Encoder 里,词向量和字向量拼接得到 word embedding,其中字向量用 BiLSTM 产生,word embedding 经过另一个 BiLSTM 编码得到文档编码 h^d_i 和条件序列的编码 h^c_j。

条件序列的另一种编码是“抽取式的”,也就是从 document encoding 中直接抽取出出现在 condition sequence 中的单词的对应部分,这和 论文笔记 - Machine Comprehension by Text-to-Text Neural Question Generation 原理相同。然后抽取的向量经过 BiLSTM 产生对应编码 h^e_k。两种条件序列的编码 h^c_j 和 h^e_k 的 final state 分别为 h^c_J 和 h^e_K。在 a-gen mode 也就是对问句进行编码是采用 h^c_J,在 q-gen mode 也就是对答案进行编码时采用 h^e_K,相当于模拟了 extractive 和 abstractive 的特性。

Decoder 用了 pointer-softmax mechanism,比之前的工作复杂一些,具体可以戳阅读原文或者看 paper。

损失函数
640?
实现细节里,encoder 用了整个词表,decoder 用了训练数据里 gold question 中的频率最高的 100 个单词的词表。另外一个 trick 是 decoder 保留了之前产生的单词的历史来防止输出的重复。

640?
联合训练下,a-gen 的表现有显著提升,q-gen 略有下降。一个直观结论是,模型并没有提高 QA 任务的效果,但是增加了 QG 的能力。

过去大多模型都把 QA 当做 point to answer span within a document 而不是 NLG 任务,这一篇的创新之处就在于把 QA 也当作了生成问题,与 QG 放到同一个框架下,用 pointer-softmax 来调节生成/抽取的比率,给 QA 也增加了“生成”的能力。

一个显著优势是,和上一篇 paper 相同,这里不需要预训练 QA,可以直接用 QG 辅助 QA 的实现同时给模型提供QG 的能力。

a key distinction of our model is that we harness the process of asking questions to benefit question answering, without training the model to answer the generated questions.

MSRA 出品的 QG 系列的 paper 在各自模型及实现上有共性也有个性,一些 trick 基本是通用的,具体的实用性能还待具体领域的实践检验。



OpenKG.CN


中文开放知识图谱(简称OpenKG.CN)旨在促进中文知识图谱数据的开放与互联,促进知识图谱和语义技术的普及和广泛应用。

640?wx_fmt=jpeg

点击阅读原文,进入 OpenKG 博客。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
Apache Mina-sshd服务端如果没有设置hostkey,会自动生成一个hostkey,如果设置了hostkey,会优先使用设置的hostkey,而不是自动生成的hostkey。因此,如果你自己生成了hostkey并将其用作Apache Mina-sshd服务端的hostkey,服务端不会对其进行重写。 以下是一个使用自己生成的hostkey的示例代码: ```java import java.io.File; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import org.apache.sshd.common.config.keys.AuthorizedKeyEntry; import org.apache.sshd.common.config.keys.PublicKeyEntry; import org.apache.sshd.server.SshServer; import org.apache.sshd.server.auth.pubkey.PublickeyAuthenticator; import org.apache.sshd.server.auth.pubkey.SimplePublicKeyAuthenticator; import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; public class SSHServer { public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException { // Load the hostkey from a file File hostKeyFile = new File("hostkeyfile"); SimpleGeneratorHostKeyProvider hostKeyProvider = new SimpleGeneratorHostKeyProvider(hostKeyFile); // Create the SSH server SshServer sshd = SshServer.setUpDefaultServer(); sshd.setPort(22); sshd.setKeyPairProvider(hostKeyProvider); // Configure public key authentication PublickeyAuthenticator publicKeyAuthenticator = new SimplePublicKeyAuthenticator(); PublicKeyEntry publicKeyEntry = new AuthorizedKeyEntry("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDq1Oy25jyN3x3uTDVQZC1Oq8MlK8+3+6kqCQs+4j6aGqAq5nbCwVJlbD5zKbJN1yJFJX8kVzXo4yPhS6Y/7I6sE4mFQvT5XgqD1Wl1QeN8L4q5Pv9aJsLd9FmXjCdsfZnJh3aT4s6XnLQ6YFQWvI4QaQdjC3QpE+8XKoO/RiU4jH3S8yS1XG2QJrBbG2Yx7RzUZm5O5F2RJjZQw5L6rWVJo4nL3a6zG1zVhl8Kv3LxWpqtMKzB0S+c8LwSv7q2a5W1yPznJy4eOYQXb9yYrTm8pQJ5qk5S5TjIHX5y5QG2Z43v/2xFyQHqy7CHYKlR8K9K2mTm7QgE8O0t1a24VQW1xQZ8QrjK+qJIViFzUx8P"); publicKeyAuthenticator.addAuthorizedKey(publicKeyEntry); sshd.setPublickeyAuthenticator(publicKeyAuthenticator); // Start the SSH server sshd.start(); System.out.println("SSH server is running"); } } ``` 该程序将从名为hostkeyfile的文件中加载hostkey,并将其用作Apache Mina-sshd服务端的hostkey。在配置公钥认证时,将使用一个硬编码的公钥作为示例。你应该将其替换为你自己的公钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值