TextCNN

1. 不同的实现方式

1.1 经典实现方式

  最经典的实现方式来自于《Convolutional Neural Networks for Sentence Classification》,下载地址为 https://www.aclweb.org/anthology/D14-1181

  主要分为以下几步:词嵌入、卷积、池化、全连接+softmax,示意图如下所示:
TextCNN

1.1.1 词嵌入

  首先句子可以看作是词的序列,序列长度为n,每个词用向量xix_i表示,每个词嵌入的维度是kk。所以句子表示为:
x1:n=x1x2:::xnx_{1:n} = x_1 ⊕ x_2 ⊕ : : : ⊕ x_n

  所以xi:i+jx_{i:i+j}是个左闭右闭的区间。

1.1.2 卷积

  由于不同的论文对卷积的表达是不同的,所以以上图为例。上图中宽代表词向量,高代表不同的词。

  由于TextCNN采用的卷积是一维卷积,所以卷积核的宽度和词嵌入的维度是一致的。而卷积核的高度hh代表的是每次窗口取的词数。所以卷积核wRhkw \in \mathbb R^{hk}

  对于每一次滑窗的结果cic_i(标量)而言,卷积运算的结果是
ci=f(wxi:i+h1)+bc_i = f(w \cdot x_{i:i+h-1})+b
  其中bRb \in \mathbb R而f是非线性函数,例如tanh或者relu。

  由于卷积运算是对应元素相乘然后相加,所以wwxi:i+h1x_{i:i+h-1}的维度是一致的。由于ww的维度是hkh*kxi:i+h1x_{i:i+h-1}的维度也是hkh*k,则XX的维度是(nh+1)hk(n-h+1)*h*k(和c的维度可以对照得到)。

  由于句子序列长度为nn,而卷积核的高度为hh,所以总共滑窗nh+1n-h+1次。所以卷积汇总结果为c=[c1,c2,,cnh+1]c=[c_1, c_2,\dots,c_{n-h+1}]

1.1.3 池化

  这里的池化采用的是全局最大池化,即c^=max{c}\hat { c }=max\{c\}。由于filter一般有多个,假设卷积核个数是mm,所以池化后的数据为z=[c1^,c2^,,cm^]z=[\hat { c_1},\hat { c_2},\dots,\hat { c_m}],数据维度为1m1*m(列向量)。

1.1.4 DNN+softmax

y=wz+by=w*z+b

1.2 其它实现方式

  最近在研究关系抽取,研究的第一篇paper《Relation Classification via Convolutional Deep Neural Network》,下载地址为 https://www.aclweb.org/anthology/C14-1220

  主要分为以下几步:词嵌入、滑窗处理、矩阵运算、池化、全连接+softmax,示意图如下所示:
TextCNN

1.2.1 词嵌入

  这部分内容和上述类似,唯一的区别是多了两个token,一个是句子的最开头的token start(xsx_s),一个是句子的结束token end(xex_e)。

1.2.2 滑窗处理

  由于句子序列长度为tt,而卷积核的高度为hh,卷积核的宽度和词嵌入的维度是一致的,从上往下滑窗,所以总共滑窗th+1t-h+1次,但由于多了两个token,所以滑窗次数为t3+1+2=tt-3+1+2=t次。而卷积核的宽度为nn。所以滑窗处理后的数据维度为tn0t*n_0,其中n0n_0wnw*nwnw*n代表wwnn列。

1.2.3 矩阵运算

  论文中的计算公式为Z=W1XZ=W_1X,维度运算结果为n1tn_1*t,每一行代表的是每一个filter对不同的windows的结果相乘然后相加的结果,每一列代表的是不同的filter对相同的window相乘然后相加的结果,而在神经网络中比较普遍的公式应该是Z=XW1Z=XW_1,所以此时X需要做个转置,即为n0tn_0*t。而ZZ的维度为n1n0n_1*n_0。其中n1n_1为filter_num(或为output_channels)。

  为了便于理解,先假设n1=1n_1=1,则Z的维度运算结果为Z=(1n0)(n0t)=1tZ=(1*n_0)*(n_0*t)=1*t。此时W1W_1为一个filter,它为1行n0n_0列的数据。XXn0n_0tt列的数据。矩阵相乘Z=W1XZ=W_1XW1W_1的行和XX的列相乘之后然后相加。X的每一列对应的是每个window的数据concat放到了一列。以第一行和第一列相乘为例,则结果为卷积核和第一个window的运算。把W1W_1第一行和XX的所有列进行运算,就可以理解n1=1n_1=1的结果。如果是多个卷积核,W1W_1为多个行向量,然后把W1W_1每一行和XX的每一列进行运算,就可以理解n1>1n_1>1的结果。注:如果是Z=XW1Z=XW_1,此时XX维度为tn0t*n_0W1W_1维度为n0n1n_0*n_1

1.2.4 池化

  这里的池化采用的是全局最大池化,即mi=maxZ(i,)0in1m_i=max \quad Z(i,\cdot) \quad 0 \leq i \leq n_1。则mim_i指的是对每一个filter对不同的windows取最大值的结果。m={m1,m2,,mn1}m=\{m_1,m_2,\dots,m_{n_1}\},此时的m显然为行向量,维度为1n11*n_1

1.2.5 全连接

g=tanh(W2m)g=tanh(W_2m)
  由于W2W_2维度为n2n1n_2*n_1,所以m维度为n11n_1*1,即对上述的m进行转置。

1.2.6 区别

  经典的TextCNN卷积相乘运算后,会添加bias,然后使用非线性函数进行运算。而这篇paper并没有bias和非线性函数。

  经典的TextCNN的卷积核的size可以为多个,然后进行concat,而本篇论文的size必须是固定的,文中为指定的3。