今天写的博客主要参考了清华大学黄民烈老师团队2018年在IJCAI上发表的paper《Densely Connected CNN with Multi-scale Feature Attention for Text Classification》。
这篇paper其实就是使用基于CNN的网络来进行文本的情感分类,但是它针对的问题是传统的多层次的CNN网络使用static窗口来进行卷积,每次针对句子中提取n-gram feature 都是一样的,如果遇到以下例子,就会影响模型的准确性:
在该样例中,不管是单纯的1-gram还是3-gram都不太合适:针对“nice”这个单词需要1-gram,但是针对“without being patronizing”这个词组需要3-gram。如何设计模型,让其能够自动地识别这种区别,是这篇paper主要解决的问题。
在正式介绍模型之前,作者提出了“a deeper model is more elegant than a wider solution”。因为使用小窗口的deeper model在模型高层次部分,其卷积器真正观测到的原始句子序列中的视野是越来越大的。于是,参照在图像处理中常见的一种结构,作者设计了一种网络结构如下所示:
左边是模型的逻辑运作示意图,右边是模型的真实实现示意图。其实图中最需要关注的就是那几条红线。假设模型的层次一共是lll层,那么第lll层结果计算公式如下所示:
Xl=f(Wl,[X1,X2,.......Xl−1])X_l=f(W_l,[X_1,X_2,.......X_{l-1}])Xl=f(Wl,[X1,X2,.......Xl−1])
其中参数矩阵WlW_lWl维度为Wl∈R(l−1)∗k∗w∗kW_l \in R^{(l-1)*k*w*k}Wl∈R(l−1)∗k∗w∗k,其中w代表了宽度,一个k代表了卷积器的个数,一个k代表了中间词向量的维度。可以看出这里面X1X_1X1,X2X_2X2…Xl−1X_{l-1}Xl−1都是维度为m∗km*km∗k的矩阵,mmm代表了句子中单词的个数。在使用卷积处理之后,结果依然是l−1l-1l−1个维度为m∗km*km∗k结果矩阵,然后使用矩阵的对位相加操作得当最终的XlX_lXl为m∗km*km∗k。
按照这样的计算方式,最终模型的输出层有X1,X2....XlX_1,X_2....X_lX1,X2....Xl,每一个矩阵的每一行都代表了以该行号为下标的n-gram,接下来就是设计一种attention从中选择对分类最有意义的n-gram。整个过程如下图所示:
假设xli∈Rkx_l^i \in R^kxli∈Rk代表第l层下标为i的语义向量,设sli=∑j=1kxli(j)s_l^i=\sum_{j=1}^k x_l^i(j)sli=∑j=1kxli(j)
xatteni=∑l=1Lαlixlix_{atten}^i=\sum_{l=1}^L \alpha_l^i x_l^ixatteni=∑l=1Lαlixli
其中 alphai=softmax(MLP(si))alpha^i=softmax(MLP(s^i))alphai=softmax(MLP(si))
si=[s1i,s2i,....sLi]s^i=[s^i_1,s^i_2,....s^i_L]si=[s1i,s2i,....sLi]
αi=[α1i,α2i,.....αLi]\alpha^i=[\alpha_1^i,\alpha_2^i,.....\alpha_L^i]αi=[α1i,α2i,.....αLi]
最终句子的表征为Xatten=[xatten1,xatten2,.....,xattenm]X_{atten}=[x_{atten}^1,x_{atten}^2,.....,x_{atten}^m]Xatten=[xatten1,xatten2,.....,xattenm]。接下来得到的XattenX_{atten}Xatten会送入到后续的处理模型中。
感觉这个输入信号直接通过跳层传到后续网络结构中的思想还是很有价值的,和深度残差网络的构造思想很像,以后可以灵活加以应用。