TextCNN
1. 不同的实现方式
1.1 经典实现方式
最经典的实现方式来自于《Convolutional Neural Networks for Sentence Classification》,下载地址为 https://www.aclweb.org/anthology/D14-1181 。
主要分为以下几步:词嵌入、卷积、池化、全连接+softmax,示意图如下所示:
1.1.1 词嵌入
首先句子可以看作是词的序列,序列长度为n,每个词用向量表示,每个词嵌入的维度是。所以句子表示为:
所以是个左闭右闭的区间。
1.1.2 卷积
由于不同的论文对卷积的表达是不同的,所以以上图为例。上图中宽代表词向量,高代表不同的词。
由于TextCNN采用的卷积是一维卷积,所以卷积核的宽度和词嵌入的维度是一致的。而卷积核的高度代表的是每次窗口取的词数。所以卷积核。
对于每一次滑窗的结果(标量)而言,卷积运算的结果是
其中,而f是非线性函数,例如tanh或者relu。
由于卷积运算是对应元素相乘然后相加,所以和的维度是一致的。由于的维度是,的维度也是,则的维度是(和c的维度可以对照得到)。
由于句子序列长度为,而卷积核的高度为,所以总共滑窗次。所以卷积汇总结果为。
1.1.3 池化
这里的池化采用的是全局最大池化,即。由于filter一般有多个,假设卷积核个数是,所以池化后的数据为,数据维度为(列向量)。
1.1.4 DNN+softmax
1.2 其它实现方式
最近在研究关系抽取,研究的第一篇paper《Relation Classification via Convolutional Deep Neural Network》,下载地址为 https://www.aclweb.org/anthology/C14-1220 。
主要分为以下几步:词嵌入、滑窗处理、矩阵运算、池化、全连接+softmax,示意图如下所示:
1.2.1 词嵌入
这部分内容和上述类似,唯一的区别是多了两个token,一个是句子的最开头的token start(),一个是句子的结束token end()。
1.2.2 滑窗处理
由于句子序列长度为,而卷积核的高度为,卷积核的宽度和词嵌入的维度是一致的,从上往下滑窗,所以总共滑窗次,但由于多了两个token,所以滑窗次数为次。而卷积核的宽度为。所以滑窗处理后的数据维度为,其中为,代表行列。
1.2.3 矩阵运算
论文中的计算公式为,维度运算结果为,每一行代表的是每一个filter对不同的windows的结果相乘然后相加的结果,每一列代表的是不同的filter对相同的window相乘然后相加的结果,而在神经网络中比较普遍的公式应该是,所以此时X需要做个转置,即为。而的维度为。其中为filter_num(或为output_channels)。
为了便于理解,先假设,则Z的维度运算结果为。此时为一个filter,它为1行列的数据。为行列的数据。矩阵相乘,的行和的列相乘之后然后相加。X的每一列对应的是每个window的数据concat放到了一列。以第一行和第一列相乘为例,则结果为卷积核和第一个window的运算。把第一行和的所有列进行运算,就可以理解的结果。如果是多个卷积核,为多个行向量,然后把每一行和的每一列进行运算,就可以理解的结果。注:如果是,此时维度为,维度为。
1.2.4 池化
这里的池化采用的是全局最大池化,即。则指的是对每一个filter对不同的windows取最大值的结果。,此时的m显然为行向量,维度为。
1.2.5 全连接
由于维度为,所以m维度为,即对上述的m进行转置。
1.2.6 区别
经典的TextCNN卷积相乘运算后,会添加bias,然后使用非线性函数进行运算。而这篇paper并没有bias和非线性函数。
经典的TextCNN的卷积核的size可以为多个,然后进行concat,而本篇论文的size必须是固定的,文中为指定的3。