Yilin Niu, Fangkai Jiao, Mantong Zhou, Ting Yao, Jingfang Xu, Minlie Huang, A Self-Training Method for Machine Reading Comprehension with Soft Evidence Extraction
论文原文:https://arxiv.org/pdf/2005.05189.pdf
源代码:https://github.com/SparkJiao/Self-Training-MRC (official ** pytorch)
1 introduction
1.1 background 论文背景与思路
当前大多数经典的机器阅读理解模型(MRC)往往包括以下两个结构:
- 证据提取器(evidence extractor):也就是负责检索出可能对解决这个问题有帮助的部分文本,此时检索的结果可能是一个句子 / 一段片段 etc,著名的 SQuAD 和 CoQA 数据集给出的任务都是这个思路
- 答案预测器( answer predictor):从前面提取出的片段种割出一个部分作为答案,也就是常见的那种任务为预测答案开始位置和结束位置的论文的思路
也就是说,此时证据标签(evidence labels)对于整个模型的训练是很重要的,也就是说我需要知道我所提取出的部分是不是真的对的答案的出处。对于 抽取式 的阅读理解任务是很好训练的,因为本身的答案也就是从整个文本中进行抽取的。但是这一标签对于 非抽取式的机器阅读理解任务往往是难以获得的,比如答案为 Yes/No 的问题,或者一些类似于选择题 / 多选题的形式,本身不存在对应的文中的出处,也就是说只有答案,但是没有答案对应的文章部分的 span,缺少证据标签导致在这类非抽取式任务上难以直接对证据提取器进行训练。
举一个非抽取式的例子:
针对这类非抽取式的机器阅读理解任务,经典方法有:
- 人工标注 gold answer:费时间且贵,需要钞能力来雇佣生物型人工智能,不现实
- 远程监督:往往会依赖于一些人工手动设置的规则或一些外部资源来生成 distant label ,有效性有待商榷
- 强化学习:本身强化学习的训练往往是不稳定的
为了解决针对非抽取式阅读理解问题缺乏用于训练的证据标签的问题,原文提出了一种 自训练方法(Self Training method ,STM),直观来说也就是在迭代的过程中,自动生成证据标签并用来训练我们的证据提取器。每一个迭代中,用正确答案(gold answer)和噪声标签(noisy evidence labels)同时来训练基础的机器阅读理解模型(MRC),再利用这个模型来预测伪标签(也就是我们的 MRC 认为是对的的标签,但是并没有经过人工的验证步骤),并加入监督下一轮的训练。整个过程不需要手动舍设定的规则或外部信息,同时具有较好的可迁移性。
1.2 self-training 自训练
开始之前先稍微说说什么是自训练
自训练本身提出就是为了用在缺少标注的数据上的,通过让模型自己学习,自己创建可能的标签,再不断训练迭代的方式来学习。
具体思路如下:
- 将此时的数据分为训练集和测试集和未标记数据,注意这里的训练集是得到标记的,也就是说一开始需要一定的已标记数据来启动模型,但是不需要标记所有数据,自训练的优势也就是在于可以将未标记数据利用到模型中
- 利用训练集中的数据(已标记)来训练模型
- 利用当前训练的模型来尝试标记没有人工标记的数据,选择正确率足够高的一些标签作为 “伪标签”,这里的伪标签的选取可以全部都要或者根据一定的置信度加权
- 将上一步得到的 “伪标签” 数据和原始的训练数据放到一起,再一同用于训练模型
- 重复上面的步骤,直到此时还未被标记的数据本身少于某一个数值,或者此时模型进行的预测不足以获得新的伪标签(比如新的预测对应的置信度都卡住了高不上去了)
- 最后在测试集上测试分类器性能,注意这里的测试集是人工标注的数据
也就是说,此时只是需要少量一部分的已标注数据(一部分作为训练集来启动模型,一部分作为测试集来进行评估),而同时可以利用大量的未标注数据,属于半监督学习的方式。
2 Methods 模型介绍
2.1 overview
先来看看模型的整体结构:
此时有两个数据池, U 和 L,沿用自训练的思路,此时 L(labeled data) 中的数据是已经经过了标记的少量数据,而 U(unlabeled data) 中的数据是大量未标注数据,也就是说 U 中的没有对应的证据标签(答案出处)而只有正确答案
整体 STM 模型的思路如下:
- MRC 模型同时在 U 和 L 两个数据池上进行训练(注意这里是同时在训练的,也就是对应图中 ① 的两个箭头)
- MRC 对未标注数据池 U 中的数据进行预测,也就是预测 U 中的只有正确答案的数据其对应的证据标签
- Selector 进行选择,从上一步 MRC 的所有预测中选择有一定置信度的预测,将选中的预测从数据池 U 移到 L 中,这一步也就是选择伪标签并加入训练集以监督下一轮训练的部分
2.2 Base Model 阅读理解部分模型
先来看一下 STM 中 MRC 部分模型的结构:
同理,此时由 三个部分 组成:编码层(encoder layer)+ 证据提取(evidence extractor)+ 答案预测(answer predict)
第一个编码层也就是用了文档 D (token 单位的)和问题 Q 的 embedding,没啥好说的,主要看看后两个
2.2.1 evidence extractor 证据提取
此时将问题 Q 和文档 D 作为输入,编码层负责获得输入的上下文表示。设此时文档 D 包括句子 S: D = { S 1 , S 2 , . . . , S m } D = \{S_1 , S_2, ... , S_m\} D={S1,S2,...,Sm},而 h i , j D h^D_{i,j} hi,jD 表示文档 D 中第 i 个句子中的第 j 个单词的表示, h i Q h^Q_i hiQ 为问题 Q 中的第 i 个单词的表示。
encoder 层还是依赖于注意力机制(注意力相关基础知识戳这里),这里使用了 token 级别的 attention 和 句子级别的 attention 来获得文档的上下文表示 h D h^D hD:
token-level attention:
也就是通过注意力模块得到句子的上下文表示,这里以句子中的多个 token 为单位
首先以问题 Q 为查询向量,通过打分函数 + softmax 得到权重后融合各个 token,得到最后句子的向量表示
h
i
D
h_i^D
hiD:
再对整个句子作自注意力,也就是利用可学习的参数将原句子投影到新的空间作为查询矩阵,这里得到句子本身的自注意力向量表示
s
i
D
s_i^D
siD:
一点小细节,这里原文的打分函数用的是双线性的形式 bilinear form
sentence-level attention
也就是以 sentence 句子为单位,通过注意力计算各个句子的权重以得到整个文档 D 的表示
h
D
h^D
hD:
注意这里用的是句子 i 本身的自注意力后的向量表示 si 和问题的表示 hQ 来计算得分函数的
这里其实有一点类似于那种通过问题匹配来寻找答案可能出现的范围的问题,此时这个句子的权重越高说明问题越可能来自于这里
2.2.2 answer prediction 答案预测
注意以上两个注意力模块最后的输出实际上是最后的 h D h^D hD,也就是文档的向量表示,此时将文档的向量表示和问题的向量表示 h Q h^Q hQ 一同输入来进行答案的预测
如果此时是抽取式问题,也就是需要给出文档的一部分内容作为答案,则此时使用两个 MLP 多层感知机来分别预测每一个 token 的位置是 (答案的开始位置)和是(答案的结束位置)的概率,再选取答案
如果此时是 Yes/No 的问题,直接使用一个简单的线性分类器;如果是 多项选择问题 则使用 MLP + softmax 的形式给出各个答案的概率
2.3 Loss Function 损失函数
这里定义两个损失函数,分别对应任务的损失函数和证据提取的损失函数
2.3.1 task-specific loss 任务部分损失函数
这里直接使用的是极大似然法(用的是负对数的那个似然函数)
这里的 A 是正确答案(gold answer),而
A
^
\hat{A}
A^ 是我预测的答案
2.3.2 evidence loss 证据提取部分损失函数
这里的证据理解为句子级别的,也就是选出 K 个可以作为证据的句子(这里的 K 是一个预先决定的超参数)。注意因为可能有 k 个句子,故这里一步一步地计算 loss:
- 选出最可能的那个句子(也就是权重最大的)
- 在所有没有被选过的句子上计算 loss,也就是把被选过的句子 mask 掉
重复上面的步骤 k 次,也就是每一次都从当前剩下的句子里选出一个最大的,再算剩下的。最后的 loss 是上面 k 步 loss 的平均值
这里利用了一个 BP-able 来选择 top-K 最可能为证据的句子。
考虑:
这里的 M 表示 mask,也就是
M
k
=
{
M
1
k
,
.
.
.
,
M
m
k
}
M^k = \{M_1^k ,...,M_m^k\}
Mk={M1k,...,Mmk},文章 D 中共 m 个句子,而每一个
M
i
k
∈
{
0
,
−
∞
}
M^k_i \in \{0,-\infty \}
Mik∈{0,−∞},表示为第 k 轮是句子 i 的 mask,如果 mask = 0 表示此时这个句子还没有被选中,而选中的句子为
−
∞
-\infty
−∞,注意第 k 轮中新被选中的句子的对应 Mk 的 mask 也是
−
∞
-\infty
−∞
这里的
E
i
∈
{
0
,
1
}
E_i \in \{0,1\}
Ei∈{0,1} 用来标识当前的 第 i 个句子是不是真的是证据
在每一轮都需要选择出当前所有还没有被选择的句子中的一个最可能的句子,则此时在每一轮都计算所有未被选择句子的注意力分布:
这里的 si 是句子的自注意力表示,打分函数出来后经过 softmax
选出句子后计算它的 loss:
这里的
E
i
∈
{
0
,
1
}
E_i \in \{0,1\}
Ei∈{0,1} 用来标识当前的 第 i 个句子是不是真的是证据
H 是对应第 k 步的结果,最后总体的损失函数也就是 k 个 H 的均值
综上,此时总体的损失函数就是上面两种损失函数的加权组合:
η 本身是一个超参数
2.4 Self-Training MRC (STM) 整体模型
现在来看看整体模型的结构:
首先,利用真实答案来训练 MRC 部分的模型,这里同时用到了 U 和 L 两个数据集,训练 MRC 的时候不需要证据标签,只要直到正确答案就可以
这里的 MRC 的训练用的是上面那个同时(任务导向)+(证据提取部分导向)的总的损失函数
进一步通过给定的(D,Q,A),也就是文章+问题+答案 来进行证据标签的标注,这里标注依赖于:
也就是说我本来是依赖真实的(是否为证据 Ei)来计算损失函数,则此时我同样可以来考虑使得损失函数最小的 Ei 是什么样的,由此得到未标记(指的是未标记证据出处)数据的证据标签的估计
E
^
\hat{E}
E^
则此时对于
(
D
,
Q
,
A
,
E
^
)
(D,Q,A,\hat{E})
(D,Q,A,E^),这个组合的置信得分定义为:
同时用到了任务导向的损失函数 和 证据标签部分的 loss
而这里的 selector 的选择依据:
- 要求组成上面置信得分的两个损失函数都在某一个阈值以下(防止其中一个很低而另一个不行导致的总体得分高,需要两个任务上都差不多不错)
- 在满足 1 的情况下,达到置信得分最高
一个小细节,在初始的时候数据池 L 实际上是空的,而证据提取器的训练是由远程监督完成的
整体模型的流程如下所示:
3 Experiments 实验部分
3.1 dataset
Yes/No Question Answering (YNQA) :二元选择回答的数据集,非抽取,包括如下几个:
- CoQA
- BoolQ
- MS MARCO
Multiple-choice MRC:多项选择的数据集
- RACE
- DREAM
- MultiRC
Open-domain QA (ODQA):开放
- Quasar-T
3.2 result
看看在几个类型上的结果:
对于二元选择:
多项选择:
开放:
由于用到的是自学习,这里验证了一下 Error propagation 的问题,也就是一开始就预测错了,但是又被拿去作训练,导致整个模型坚定不移地学着错的东西
约有 4% 的错误的证据反而被复用了(就是又被拿去学了),但是它们中有接近一半的在后面的 tire 又被纠正了,在此可以认为 STM 并不会陷入严重的 error propagation 导致整个的崩溃
阅读仓促,存在错误 / 不足欢迎指出!期待进一步讨论~
转载请注明出处。知识见解与想法理应自由共享交流,禁止任何商用行为!