正文
SPINN 模型的全称是“Stack-augmented Parser-Interpreter Neural Network”,它作为一种解决了自然语言推理任务的方案,随
Bowman et al. (2016)
论文面世,当时使用的是斯坦福的
SNLI
数据集。
这里的任务,是把成对的语句分类为三组类别:假设第一个句子是对某幅用户无法看到的图像的准确注解,第二个句子同样是对该图像的注解,那么第二句话到底是 (a) 绝对准确 (b) 可能准确还是 (c) 绝对不准确的?举个例子,假设第一句话是 “two dogs are running through a field”(两条狗穿过一片农田)。那么,让这组语句“绝对正确”的句子可以是““there are animals outdoors”(户外有动物);让它们“可能准确”的,可以是“some puppies are running to catch a stick”(一群幼犬跑着去接一个木棒);让它们“绝对不准确”的可以是 “the pets are sitting on a couch”(宠物们坐在沙发上)。
导致 SPINN 诞生的研究,为实现其目标要在决定句子之间的关系之前,把每句话编码为固定长度的矢量表达(还有其他方式,比如注意力模型)。
数据集包含机器生成的语法树( syntactic parse trees),后者把每句话里的词组合为短语和子句,每一个都有独立涵义,并且有两个词或 sub-phrases 组成。许多语言学家认为,人类理解语言,是通过把涵义以层级(hierarchical)方式组合起来,就像这样的树状结构。因此,创建一个以同样方式运作的神经网络或许是必要的。下面的例子是一个数据集里的句子,它的语法树以括号结构表示:
( ( The church ) ( ( has ( cracks ( in ( the ceiling ) ) ) ) . ) )
用支持语法树结构的神经网络对这个句子编码,方法之一是创建一个神经网络层 Reduce,把词组(以 GloVe 这样的 word embedding 来表示)或短语组合起来,然后将这一层循环应用,把上一个 Reduce 操作的结果,作为句子的编码:
X = Reduce(“the”, “ceiling”)
Y = Reduce(“in”, X)
... etc.
但如果,我想让神经网络以更“人性化”的方式运作呢?能从左到右阅读,保持语境,同时使用语法树把短语组合起来?或者,如果我想要训练一个神经网络,让它在看到这句子时,基于读到的词语创建它自己的语法树?这是一个同样的语法树,只是写出来的方式稍稍有区别:
The church ) has cracks in the ceiling ) ) ) ) . ) )
第三种方法,仍然是一回事:
WORDS: The church has cracks in the ceiling .
PARSES: S S R S S S S S R R R R S R R
我所做的,仅仅是去除括号,用“S” 代表“shift”来标记词语, 并用“R”代表“reduce”替代右括号。现在,信息可作为操作堆栈(stack) 和类似堆栈的 buffer 的一系列指令从左读到右,与上文描述的循环方式有同样的结果: