Neural Module Networks(NMNs)
在本文中,作者将传统NMNs扩展于从段落式的文本中进行统计计算等。
考虑如图1所示的情景,多步推理需要回答下面的问题:
- 找到段落中所有“field goal”的实体。
- 选择在“第二节”中的。
- 找到它们的长度。
- 计算最长长度。
- 找到“谁踢的”。
NMN将这样一个问题转化为一个可执行代码,如relocate(find-max-num(filter(find())))
,将这个程序应用于段落可以得到正确的回答,这个程序由若干部分组成,每部分用于解决相对独立的推理问题。
NMN For Text 的组成部分
- 模块
- 上下文表示
- 问题解析器
- 学习目标:给定一个程序,可以算出用这个程序得到正确答案的概率\(p(y^*|z)\),对于一个问题\(q\)也可以计算每个程序的概率\(p(z|q)\),作者最大化似然\(J\sum_z p(y^*|z)p(z|q)\),使用beam search进行解码。
NMN For Text 的学习挑战
问题解析器
由于问题有很强的语义多边性,不能够简单的通过规则去琢磨。
程序执行器
由于每个程序执行的结果只是隐变量,没办法进行监督,所以很容易引发问题,积累误差。作者使用了可微的概率模型,来表示不确定的决策。
联合学习
由于模块之间都是连接的,一个错误会导致后面的错误,如图1中的样例,解析器预测出relocate(find())
的话,程序执行之后的结果也是错的,而这次训练也会给模型传递错误的反馈。
文本推理模块
图2所示列举了一些使用到的模块的描述和输入输出格式。
作者设计的模块,对输入输出的类型有着严格的限制,以此来保证模型最后能得到正确的结果。数据类型解释如下:
- Question (Q) and Paragraph (P) attentions: 文本中相关子字符。
- Number (N) and Date (D):文章中的段落和时间。
- Count Number(C):在某个范围内出现的次数分布。
- Time Delta(TD):时间差分布。
- Span(S):span标签(start/end)的分布概率。
问答的Neural Modules
用\(Q,P\)来表示问题和段落的向量表示。
find(Q)
\(\rightarrow\) P
question-to-paragraph 注意力矩阵\(A \in \mathbb{R}^{n \times m}\),第\(i\)行表示第\(i\)个注意力单词对段落中的单词的相似度。\(A\)由相似度矩阵\(S\)通过归一化得到,其中\(S_{ij} = \mathrm{w_f}^T [Q_{i};P_j;Q_i \circ P_j ]\),模块输出为加权的注意力矩阵:\(P=\sum_i Q_i \cdot A_i, P \in \mathbb{R}^{m}\)。
filter(Q, P)
\(\rightarrow\) P
段落掩码\(M \in \mathbb{R}^{m}\),\(M_j = \sigma (\mathrm{w_{filter}}^T [q ; P_j; q \circ P_j])\),其中\(q = \sum_i Q_i \cdot \mathbf{Q}_i, q \in \mathbb{R}^d\),表示问题的字符的向量编码的加权和。\(P_{\textrm{filtered}} = \text{normalize}(M \circ P).\)
relocate(Q, P)
\(\rightarrow\) P
作者首先使用了一个段落to段落的注意力模块,\(\mathbf{R}_{ij} = \mathrm{R_{relocate}}^T [(q+P_i);P_{j};(q+P_i) \circ P_j], q=\sum_i Q_i \cdot \mathbf{Q}_i\),最后输出\(P_{\mathrm{relocate}} = \sum_i P_i \cdot \mathbf{R}_i\)
find-num(P)
\(\rightarrow\) N
这个模块寻找一个与输入段落注意力相关的数字分布,作者使用一个段落的字符到数字的注意力矩阵\(A^{num} \in \mathbb{R}^{m \times N_{tokens}}\),其中第\(i\)行表示段落第\(i\)个字符对所有包含数字的字符的概率分布,我们首先计算一个字符到数字的相似度矩阵\(S^{\mathrm{num}} \in \mathbb{R}^{m \times N_{tokens}}\),\(S^{\mathrm{num}}_{i,j} = P_i^T W_{num}P_{n_j}\),通过归一化softmax可以得到\(A\),输出为所有数字字符的概率分布\(T = \sum_i P_i \cdot A_i^{num}\)。
find-date(P)
\(\rightarrow\) D
和上面的逻辑类似,只不过修改为计算日期。
count(P)
\(\rightarrow\) C
这个模块计算连续范围注意力的值,首先用[1,2,5,10]将注意力进行缩放,得到矩阵\(P_{scaled} \in \mathbb{R}^{m \times 4}\),一个双向GRU接着将每个位置的词嵌入编码为向量\(h_t\),然后一个软判决器将输出向量变为0/1,表示周围是否存在span,接着这些分数再加起来,\(c_v = \sum \sigma (FF(countGRU(P_{\mathrm{scaled}}))) \in \mathbb{R}\),作者假设计数值正态分布,均值为\(c_v\),标准差为\(0.5\),计算一个在支持的数字上分布的概率\(p(c) \in \exp (\frac{-(c-c_v)^2}{2v^2}), \forall c \in [0, 9]\)
compare-num-lt(P1, P2)
\(\rightarrow\) P
这个模块在两个段落的分布之间执行一个软的小于运算,这个模块的输出为两个注意力的线性组合,权重由那个数字比较小的段落所决定。这个模块会在内部调用find-num
运算得到两个输入段落的注意力的数字分布\(N_1,N_2\),然后计算两个布尔值\(p(N_1 \lt N_2), p(N_2 \lt N_1)\),然后输出对两个段落注意力的加权和,计算联合概率:
最后输出\(\mathsf{P}_{out} = p(N_1 \lt N_2) * \mathsf{P_1} + p(N_2 \lt N_1) * \mathsf{P_2}\)。
time-diff(P1, P2)
\(\rightarrow\) TD
这个模块调用了find-date
模块来计算两个段落注意力分布的日期分布\(D_1,D_2\),输出是两个分布的联合概率\(p(t_d) = \sum_{i,j} \mathbb{l}_{d_i - d_j = t_d} D_1^i,D_2^j\)
find-max-num(P)
\(\rightarrow\) P
, find-min-num(P)
\(\rightarrow\) P
拿find-max-num
举例,首先使用find-num
计算一个数字分布期望,然后计算最大的数字的概率分布,\(T^{max} \in \mathbb{R}^{N_{tokens}}\)(假设对所有数字进行采样,采一个大小为\(n\)的集合\(S\),那么数字\(N_j\)是最大的数字的概率为\(p(x \le N_j)^n - p(x \le N_{j-1})^n\),作者选择3为\(n\)的参数设置,将数字分布转化为了最大数字的概率分布)。然后根据这个新的概率将数字分布概率官员为还原为段落中那些相关的字符的概率。段落中第\(i\)个字符到第\(j\)个数字字符的概率\(T_j\):\(P_i \cdot A_{i,j}^{\textrm{num}}\),计算新的第\(i\)个字符的概率:\(\overline{P}_i = \sum_j \frac{T_j^{\textrm{max}}}{T_j}
\cdot P_i \cdot \mathbf{A}^{\textrm{num}}_{ij}\)
span(P)
\(\rightarrow\) S
这个模块将段落注意力转变为连续的答案区间,只出现在程序的最外层。该模块输出两个分布,\(P_s,P_e \in \mathbb{R}^m\),分别表示每个字符代表“开始”和“结束”的概率。
辅助的监督
在作者原本的实验中,发现find-num
等模块会在离预测的点很远的地方分配注意力,作者设计了一个宽度\(W = 10\)的窗口,让注意力尽量分配在这个窗口内部:
作者为部分数据设置了程序的监督,如对于程序find-num(find-max-num(find()))
,在预测find
模块时,作者提供了对问题中的字符的监督。
在某些情况下,模型只能通过答案得到一部分输出的监督,这可能会影响模型的泛化性能。对于像“how many yards was the longest/shortest touchdown?”,我们识别段落中token“touchdown”的所有实例,并假定最接近它的数字应该是find-num
模块的输出。我们将其作为multi-hot向量\(N^*\)来监督,并对find-num
的输出分布N使用一个类似于Question-Attention损失的辅助损失。