原创:张春阳
应用和数据集
- QA
- SQuAD
后续影响
- ELMo
- BERT
原始论文
BI-DIRECTIONAL ATTENTION FLOW FOR MACHINE COMPREHENSION.pdf
- 原文的主要阅读难度在于,有大量的 block 组装在一起
- 这些模块又由很多复杂的符号组装在一起
模型概览
Type of MRC
- Open-domain vs Closed-domain
- Abstractive vs Extractive
- Ability to answer non-factoid queries
BiDAF is a closed-domain, extractive Q&A model that can only answer factoid questions.
模型整体结构
-
Embedding Layers
BiDAF 有3个 embedding layers,每一个都是用来把 Query 和 Context 字符串转变成向量的
-
Attention and Modeling Layers
通过 Attention 和 Modeling Layer,把 Query 和 Context 的信息进行合并,这部分的输出为另一个带有混合信息的向量表达。在原文中叫做 "Query-aware Context representation"
-
Output Layer
输出层会把 "Query-aware Context representation" 转化成一连串的概率,这些概率用来决定 Answer 的起始和结束位置。
Glossary
- Context : the accompanying text to the Query that contains an answer to that Query
- Query : the question to which the model is supposed to give an answer
- Answer : a substring of the Context that contains information that can answer Query. This substring is to be extracted out by the model
- T : 表示在 Context 中 words/tokens 的数量
- J : 表示在 Query 中 words/tokens 的数量
- d1 : the dimension from the word embedding step (GloVe)
- d2 : the dimension from the character embedding step
- d : the dimension of the matrices obtained by vertically concatenating word and character embeddings. d is equal to d1 + d2.
- H : the Context matrix outputted by the contextual embedding step. H has a dimension of 2dby-T
- U : the Query matrix outputted by the contextual embedding step. U has a dimension of 2dby-J
Embedding Layers
步骤1: Tokenization
T: 表示在 Context 中 words/tokens 的数量
J: 表示在 Query 中 words/tokens 的数量
把 tokenization 的结果转换成向量的形式,在 BiDAF 中使用三个维度来表示这些信息。
- word level embedding
- character level embedding
- contextual level embedding
步骤2: Word Level Embedding
BiDAF 使用预训练的 GloVe 向量来获取 Query 和 Context 的表达。
使用 GloVe 处理后的输出为两个矩阵,一个是 Context 的,一个是 Query 的。
这两个矩阵的长度分别为 T(Context) 和 J(Query),其中矩阵的维度为 ,这是一个预设的向量大小的值,可以是50/100/200/300。
步骤3: Character Level Embedding
我们使用 GloVe 处理后的矩阵并不够,因为还有一些单词是在 GloVe 中不存在的(OOV,在GloVe中,oov 的值为随机的一些向量),我们要使用一些补救方法来处理这些值。
所以,这里我们引入了一个 1D 的卷积神经网络来寻找这些 token 的 character 级别的向量表示。
步骤4: Highway Network
我们从之前的步骤中,得到了两个表示单词的向量, GloVe 和 1D-CNN 的向量。接下来把两个向量,在垂直方向上连接(concatenate)。这样会产生两个矩阵,分别表示 Contex 和 Query。它们的高度是 。同时,它们的长度和之前的相同,Contex 的是 ,Query 是 。
如果我们把一个输入的向量 放到单层的神经网络中,在生成 的过程中,会经过以下的过程:
在我们的 highway network 中,只有一小部分的输入会被执行上面的步骤;剩下的部分会不经过转换直接穿过 highway network。这个比例被一个权重 管理着,那么 就是 transform gate。这个 被使用 函数计算,通常是一个0到1之间的值。
这个网络的主要作用是,调整 word embedding 和 character embedding 的相对贡献。
这里面的逻辑是,当我们遇到一个 OOV 的单词 "misunderestimate",我们就可以提高这个单词 1D-CNN 表示的权重,因为这里识别到 GloVe 是一个随机的没有意义的值。另一方面,如果我们有一个普遍的不模糊的单词 "table",我们就可以给 GloVe 的表示更高的权重。
这一步的输出也是两个矩阵,一个是 Context 矩阵(),另一个是 Query 矩阵()。他们分别代表了 Query 和 Contex 的混合表示。
步骤5: Contextual Embedding
对于我们的任务,上面的对于文本的表示还不足够。这里主要的原因是,上面的这些表示并没有考虑到上下文的含义,我们需要把上下文的含义也表示在 Embedding 中。
这里有一个例子可以解释为什么要这么做,比如说有一对单词 "tear"(眼泪) 和 "tear"(撕扯),他们都是相同的拼写,却有着截然不同的含义,如果不把上下文考虑进去,我们很难去对这两者作区分。
因此,我们需要一个能够理解单词上下文的结构。BiDAF 使用一个双向的 LSTM(bi-LSTM).
这一步的输出是两个矩阵,一个 Context 矩阵,另一个 Query 矩阵。 分别使用 () 和 ()来表示(这里的 不同于之前从卷积中获得的矩阵 , 这里只是一个巧合)。
以上这些就是在 BiDAF 中所有关于 embedding 的部分,接下来我们会使用 Attention 把 Context 和 Query 进行融合。
Attention Mechanism
之前的输出, 表示 Context, 表示 Query。我们所有的 Attention 的目的,都是为了融合 Contex 和 Query 的信息,去创建几个矩阵用来表示 Context 同时也能表示 Query 的信息。
步骤6: Formation of Similarity Matrix
这一步主要是生成一个 Similarity 矩阵 ,这个矩阵的大小为 。这个矩阵的生成过程就是使用之前的 和 来做他们之间的关系。在这个矩阵的第 行和第 列就表示了第 个 Context 单词和第 个 Query 单词的相似度。
以下为一个例子:
Context: “Singapore is a small country located in Southeast Asia.” (T = 9)
Query: “Where is Singapore situated?” (J = 4)
他们生成的 Similarity Matrix 为下图。
我们可以从上面这个矩阵里观察到以下这些:
- 这个矩阵有 大小的维度, 是 Contex 的长度, 是 Query 的长度;
- 在行为1列为3的表格中,呈亮黄色,表示一个相对较高的值。这表明,这个单元格表示的 Query 单词和 Contex 单词相关度较高。这里我们可以看到,这两个单词其实都是一个单词 "Singapore";
- 再看行为2列为2的表格,这里表示 Context 单词 "is" 和相同的 Query 单词 "is"。然而他们之间的值并没有像 "Singapore" 一样高。这是因为这个信息也会把周围的信息加进去,这些上下文的信息对于 "is" 尤其的重要。
- 另一方面,我们可以看到两个差距很大的单词 "situated" 和 "located" 也相对的高。这要感谢我们前面的 word embeding 和 character embedding 层。
接下来我们来看看这个 矩阵是怎么生成的。我们使用了一个叫做 的符号来表示这个比较函数,这个 的函数要比普通的点乘更复杂,下面是 的等式:
由于 使用乘积对比一个的行向量和相等大小的列向量,所以他们的结果为一个标量。
以下为所有的矩阵操作。
Similarity Matrix 会分别用来作接下来的两步,Context-to-Query(C2Q) Attention 和 Query-to-Context(Q2C) Attention。
步骤7: Context-to-Query(C2Q) Attention
C2Q 的目的是找到哪个 Query 单词和 Context 单词是最相关的。
对于 Similarity Matrix 首先进行 row-wise 的 ,得到上面的矩阵 。这个矩阵的 size 和 相同。
通过观察上图,可以总结:
- 语义相似度和上表高度相关。比如说 Contex words [“Singapore”, “is”, “located”],和它们最相关的 Query Context 是 [“Singapore”, “is”, “situated”]。
- Context 单词能够 "理解" 被请求的 Query 单词。我们可以看到,Query 单词 "Where" 和 [“a”, “small”, “country”, “in” ,“Southeast”, “Asia”] Contex 单词最相关,这些单词都和地理位置相关。
然后,我们就可以在 中得到每一行都是一个 attention 的分布 ()。 表示每个 Query 单词和第 t 个 Context 单词的相关程度。
有了这个 attention 的分布 后,我们就可以使用 Query 的矩阵 来计算带有权重的和值了。这一步的结果就是 attention 的 output,我们叫做 ()。
这个 就好像 一样,表示了 Question 。不一样的是, 包含了更多的信息,包括每个 Query 单词和 Context 单词之间的相关性。
步骤8: Query-to-Context(Q2C) Attention
Q2C 的目的是找到哪个 Context 单词和 Query 单词最相关,之后用来着重的回答 Query。
Similarity matrix S
首先,我们先找到 矩阵中每一行中的最大的值,得到一个列向量。这个列向量我们起名叫做 。我们来看看,这个列向量所代表的的含义是什么?
我们把注意力放到矩阵的第四行,表示单词 "small"。我们可以看到,这一行上,没有任何一个明亮的颜色的表格,这表示在 Query 单词中没有一个单词和这个单词相关。当我们取这行的最大值时,这个最大值接近 0 。
与上面的对比,我们再看 “Singapore” 和 “located”,这两行里都至少有一个明亮的颜色,表示 Context 单词和 Query 单词相近。当我们取最大值时,这两行的值都相对较高。
下面是一个 的例子:
在 Q2C 中, 中的值表示我们的 attention value, 我们可以对 应用 得到一个 attention 的分布 ,然后可以使用这个 和 Contex Matrix 计算一个权重加权的和,这个的输出为 ( )。
Q2C 的最后一步是复制粘贴 次,并且把这些至合并成一个 大小的 。 是另一个 Context 的表达,这里融合了在 Context 单词中和 Query 单词相关性最高单词的信息。
步骤9: “Megamerge”
在这一步,我们要把 Contextual Embedding、C2Q 和 Q2C 的结果进行合并,得到一个大的矩阵 。
这里我们主要要用到的矩阵有:
- : 原始的 Contextual Embedding Matrix
- : Context matrix 聚合了每个 Query 单词和每个 Context 单词相关性信息
- : Context matrix 聚合了 Context 单词中和 Query 单词相关性最高单词的信息。
并且这三个矩阵都有相同的大小 。
但是很遗憾的是,我们并不能简单的对他们进行堆叠来完成 的获取。这里我们需要另一个函数 :
这里我们定义 是 的第 t 列向量,相当于是第 t 个 Context 单词。。最后 的大小为 。
这个 矩阵包含了 、、 中的所有信息,所以可以理解为 中的每一个列向量都表示一个 Context 单词。
一个关于小黄人的故事
An example of G. The length of the matrix, T, equals the number of words in the Context (9 in this example). Its height is 8d; d is a number that we preset in the word embedding and character embedding steps.
让我们把在 Context 中的所有单词都想象成一排小黄人。
每一个小黄人都有一个大脑,但是这个大脑的容量只够存储 大小的列向量。
小黄人的大脑并不是一直都是这么满的,实际上,在他们刚出生的时候,他们的大脑相当的空。我们来看看,他们是怎么得到这些知识的。
首先他们会上两节课,一节 "Word Embedding" 和一节 "Character Embedding"。在这些课程中,小黄人学会了他们自己的身份。Prof. GloVe 交给他们一些关于他们身份的基础信息,"Character Embedding" 课堂是一节解剖课,他们了解了自己身体的结构。
下面这张图是 ”Singapore“ 小黄人在学会着两节课后,大脑获取到的信息。
接下来,小黄人被送去上 "Contextual Embedding" 课程。这节课是一节对话课,在课上小黄人必须要其他的小黄人通过一个叫做 bi-LSTM 的设备对话,在对话中他们会互相交流在前面课上学到的关于自己的信息。
在这里他们学会了更多,知道了他们的邻居。
我们的小黄人快乐的学习,直到他们突然遇到了男人闯入了他们的学校。这个男人的名字叫 Mr. Query,这个人是一个旅行家。
The inquisitive Mr. Query. He has an urgent question —”Where is Singapore situated” — and he knows some of our Minions hold relevant information for this question.
Mr. Query 为了写一篇文章,非常急切的想要收集一些信息,他想知道"where is Singapore situated."。Mr. Query 知道一些小黄人把这些信息记在他们的大脑里。
我们的小黄人,非常的乐于助人,想要帮助我们的 Mr.Query。为了帮助他,他们需要选出来他们 team 中的成员去和 Mr. Query 见面,并且告诉他他要寻找的信息。那些知道 Mr. Query 问题答案的小黄人可以加入一个叫做 Answer 的组织。
现在,我们的小黄人有个任务去做 — 就是他们要找到,谁应该加入这个叫做 Answer 的组织。他们应该非常小心的做这件事情。如果他们遗漏了很多小黄人的话,Mr. Query 就不能获得所有他想知道的信息了。这种情况,我们叫做 Low Recall,Mr. Query 非常讨厌这样。
另一方面,如果有太多不是必要的小黄人加入到这个 Answer 组织的话,Mr. Query 就获取了过多的信息。他把这种情况叫做 Low Precision,并且他也不喜欢这样。
所以,小黄人怎么才能知道哪些应该加入这个 Answer 的团队呢?
答案就是,他们组织了很多的见面的环节,管它叫做 "Attention"。在这些见面环节,每个小黄人都会和 Mr. Query 单独的见面,并且理解他的需求。也可以说是 "the Attention sessions allow the Minions to measure their importance to Mr. Query’s question."
下面是小黄人的 MRI 扫描图片。
正如我们看到的,我们小黄人的大脑现在已经相当的满了。有了这些知识,他们可以开始选择那些人加入 Answer 这个团队了吗? 其实还不行,他们还缺少一个很重要的信息。每一个小黄人知道了他自己对于 Mr. Query 的重要性。但是,在做重要决定之前,他们还需要他们彼此对于 Mr. Query 的重要性。
也许你已经猜到了,小黄人之间需要再进行一些沟通。再次使用 bi-LSTM 装置进行沟通。
The Minions during the modeling step meeting. Here, they talk to each other through bi-LS™ and share their relative importance to Mr. Query.
这一步就是下面一部分要说的 "Modeling Step"。
Modeling and Output Layers
步骤10: Modeling Layer
Modeling Layer 由两层 bi-LSTM 组成。就像上面提到的,Model Layer 的输入是 矩阵,第一个 bi-LSTM 层把 转换成一个 的矩阵,叫做 。
然后 会作为第二个 bi-LSTM 的输入,并且把它转换成一个 的矩阵 。
和 是另一个 Context Words 的表示, 、 和之前的 Context 表示不同的地方在于 和 嵌入了整个 Context 段落和 Query 的信息。
这表示,此时我们的小黄人已经有了所有需要去做谁该加入 Answer 团队的信息。
The “Singapore” guy now has all he needs to decide if he should join the Answer Gang.
步骤11: Output Layer
对于每一个在上下文中的单词,我们已经得到了两个数值型向量编码了单词对于 Query 的相关性。我们要做的最后的事情,就是要把这些值转化为两个概率值,我们可以比较哪些是和我们 Query 相关的 Context。
在输出层,首先对 、 和 在垂直方向上进行 concat,组合成 和 。他们的大小都是 。
然后我们通过下面的公式,获取 ,对于整个 Context 起始位置索引的概率分布。
相似的,我们获取 ,对于整个 Context 结束位置索引的概率分布。
和 就能找到最佳的答案片段。最佳答案的片段就是简单的 Context 的一个子串,这个子串应该是有最高的一个 span score 值。 span score 值就等于 到 间概率的乘积。
Context: “Singapore is a small country located in Southeast Asia.” (T = 9)
Query: “Where is Singapore situated?” (J = 4)
p1 values for our example
p2 values indicate the probability of the words being the last word of the Answer span
我们答案的片段就是 "Asia"。
如果我们得到的是一段的区间,则我们需要每种情况的概率。
- Possible answer span: “Singapore” ; span score: 0.0000031
- Possible answer span: “Singapore is” ; span score: 0.00000006
- Possible answer span: “Singapore is a” ; span score: 0.0000000026
- Possible answer span: “Singapore is a small” ; span score: 0.0000316