TextCNN 应用与详解(备忘)

TextCNN对文本浅层特征的抽取能力很强,在短文本领域如搜索、对话领域专注于意图分类时效果很好,应用广泛,且速度快,一般是首选;对长文本领域,TextCNN主要靠filter窗口抽取特征,在长距离建模方面能力受限,且对语序不敏感。

filter windows: [2,3,4]  ,指的是filtert的行,2行,3行,4行。

sentence of length: n, padding where necessary


- convolution layer:这一层主要是通过卷积,提取不同的n-gram特征。输入的语句或者文本,通过embedding layer后,会转变成一个二维矩阵,假设文本的长度为|T|,词向量的大小为|d|,则该二维矩阵的大小为|T|x|d|,接下的卷积工作就是对这一个|T|x|d|的二维矩阵进行的。卷积核的大小一般设定为

n是卷积核的长度,|d|是卷积核的宽度,这个宽度和词向量的维度是相同的,也就是卷积只是沿着文本序列进行的,n可以有多种选择,比如2、3、4、5等。对于一个|T|x|d|的文本,如果选择卷积核kernel的大小为2x|d|,则卷积后得到的结果是|T-2+1|x1的一个向量。在TextCNN网络中,需要同时使用多个不同类型的kernel,同时每个size的kernel又可以有多个。使用的kernel size大小为2/ 3/ 4

- max-pooling layer:最大池化层,对卷积后得到的若干个一维向量取最大值,然后拼接在一块,作为本层的输出值。如果卷积核的size=3,有128个kernel,则经过卷积层后会得到 (句子长度- 卷积核长度n+1)*1 x128个 的向量,再经过max-pooling( (句子长度- 卷积核长度n+1)*1)之后,会1有*128个值,与其他大小的拼接在一块,得到最终的结构—3*128x1的向量。max-pooling层的意义在于对卷积提取的n-gram特征



比较与Lenet卷积

LeNet 的 filter 是正方形的, 且每一层都只用了同一种尺寸的卷积核. Text-CNN中, filter 是矩形, 矩形的长度有好几种, 一般取 (2,3,4), 而矩形的宽度是定长的, 同 word 的 embedding_size 相同. 每种尺寸都配有 NUM_FILTERS 个数目, 类比于LeNet中的output_depth,所以得到的feature_map是长条状, 宽度为1. 

因为是卷积, 所以stride每个维度都是1.

再说池化层. 

池化处理, 也叫下采样. 这里依旧可以对比 LeNet 网络.

LeNet 的 kernel 是正方形, 一般也是2*2等, 所以会把卷积后的feature_map尺寸缩小一半. 

Text-CNN 的 kernel 依旧是长方形, 将整个feature_map 映射到一个点上. 一步到位, 只有一个池化层.

全连接层

都是多分类, 这一步的处理比较类似. 将池化后的矩阵 reshape为二维, 用 tf.nn.sparse_softmax_cross_entropy_with_logits() 计算损失.


首先导入了tensorflow与numpy包,然后代码主要是建立一个可复用的TextCNN类,类的初始化参数

sequence_length:CNN需要固定输入与输出,所以每个句子的输入都是定长*词向量长度,定长一般设为最大句子长度,如果输入的句子词数没到定长就补充零,补充的零对后面的结果没有影响,因为后面的max-pooling只会输出最大值,补零的项会被过滤掉

num_classes:输出的文本类别总数也就是文本中有几个类别

vocab_size:字典大小,在之前的文本预处理阶段需要对文本进行分词与对单词进行编号,在训练的时候也是输入单词的id然后再词向量化,字典大小用通俗的话来说就是文本中出现了多少个词

embedding_size:嵌入长度,指的是词向量长度也就是用一个多大维的向量来表示词语,一般来说根据文本的规模定词向量的维度大小,样本数太少时使用较大维的词向量会造成难以收敛与容易过拟合的问题,有的TextCNN在这里会有一些区别,有的会采用固定的word2vec、fasttext、glove预先训练好的词向量

filter_sizes:卷积核大小的List,TextCNN里面的卷积和大小其实对应了传统NLP的n元语法的概念,这里的卷积核都是filter_size*embedding_size,其实就是filter_size个词作为一个整体来考虑,也可以理解为中文中有的词是一个字有的词是两个字,在不同卷积核的情况下对应数量字数的词会表现出更好的效果

num_filters:每个卷积核大小对应的卷积核个数,这里为了偷了一点懒,将不同大小卷积核的数量都设为一个常量

l2_reg_lambda:这个就是L2正则的权值,就不多解释了


定义了输入与输出、dropout比例的占位符,设立了一个常量记录L2正则损失,每当出现新的变量时就会用变量的L2正则损失乘上L2正则损失权值加入到这个l2_loss里面来。

你可能感兴趣的:(TextCNN 应用与详解(备忘))