我们会发现,这个有限状态自动机可以用一个三维张量,以及两个向量表示,张量的三个纬度分别是词表大小 V,自动机状态数 S,以及状态数 S,可以看成是由每个单词对应的转移矩阵 stack 起来组成。两个向量分别表示了自动机的初始状态以及结束状态。 如下图所示,对于一个句子,我们可以得到每一个单词的转移矩阵,若该矩阵的第 i 行第 j 列为 1,则表示可以通过该单词从状态 si 转移到 sj。因此,我们可以用前向算法(forward algorithm)或者维特比算法(viterbi algorithm)来计算句子被该自动机接受的分数。
▲ 图一
我们以前向算法为例:读完整个句子之后,从开始状态到达任一结束状态的路径数可以表示为:
我们只要改换一下 notation 以及公式的形式,这个计算过程就可以被看成一个 RNN。其中 A 是指自动机(automata),x 为句子。
ht 类似 RNN 中的隐状态向量,他的维度等于自动机状态数。ht 的每一个维度就表示:在读了 t 个单词之后,有多少条路径能够从开始状态到该维度对应的自动机状态。
1.2 规则的文本分类系统
接下来我们描述一个基于正则表达式的文本分类系统。如下图的上半部分所示,我们针对输入句子运行所有的正则表达式,得到匹配结果,然后通过一些逻辑操作,将匹配的结果整合。 例如,如果一句话只被针对 A 类别的正则表达式匹配,那么他的标签是 A 类别;如果这句话被 A,B 两个类别都匹配,那么我们可以通过事先定义一个优先级关系来选出更可能的类别。这些都可以用逻辑操作来实现。 所以,正则表达式的分类系统先匹配(matching),再整合匹配结果(aggregation)来得到句子的标签。
记 t 时刻的输入为 x_t, 我们可以把 ER 看成一个只包含规则信息的词嵌入矩阵,vt 则是 ER 矩阵的对应行选出的 R 维词向量。由此,我们模型的参数量大大减少,相当甚至更少于 LSTM, GRU 等循环神经网络。接下来我们介绍我们结合词向量(如:glove)的方法。为了结合 D 维度的词向量,我们利用一个 DxR 的矩阵 G 将词向量从 D 映射到 R 维空间,这个矩阵 G 可以初始化为词嵌入矩阵 Ew 的违逆乘上 ER。我们再引入一个 0,1 之间的超参数来结合 vt 与 G 映射后的两个 R 纬词向量,控制接受多少词向量语义的信息,更新公式变为如下:
我们比较了结构对应的传统神经网络。具体结构为 BiRNN / BiGRU / BiLSTM / CNN / DAN 给句子做 encoding,用 Linear 层输出每个 label 的 score。除此之外,我们使用了一些已有方法将规则与传统神经网络结合。 分别是 Luo et, al 提出的三种利用正则表达式匹配结果的方式(+i: 将正则表达式匹配结果作为额外的特征输入,+o: 利用 RE 结果直接改变输出 logits, +io 前两者结合),以及两种基于知识蒸馏的方式,分别记为 +kd(Hinton et al., 2015)以及 +pr(Hu et al. 2016)。
3.2 数据集
我们在三个文本分类数据集上实验,分别是 ATIS (Hemphill et al., 1990), Question Classification (QC) (Li and Roth,2002) 以及 SMS (Alberto et al.,2015). 我们使用了 glove 词向量。下表显示了数据集以及规则的统计信息以及样例。 ▲ 表二:数据集统计及规则样例我们发现,FA-RNN 在 zero-shot 以及 low-resource 的场景下有着明显的优势,并且在 full-shot 上仍然能够得到与传统简单神经网络方法以及其经过规则加强后相似的准确率。结果如下: ▲ 表三:zero-shot 准确率