美文网首页
NLP - TextCNN

NLP - TextCNN

作者: Jessie_83bf | 来源:发表于2019-07-25 11:41 被阅读0次

    1.  word2vec(word2Vec 来源和原理)

    2, Text -CNN 文本分类 (转自:Text-CNN 文本分类

    Text-CNN

    合理性: 深度学习模型在计算机视觉与语音识别方面取得了卓越的成就, 在NLP 也是可以的,卷积具有局部特征提取的功能,所以可用CNN 来提取句子中类似n-gram的关键信息。
    在图像数据处理时,CNN 使用的卷积核的宽度和高度是一样的,但是在text-CNN中,卷积核的宽度是与词向量的维度一致!这是因为我们输入的每一行向量代表一个词,在抽取特征的过程中,词作为文本的最小粒度,如果我们使用卷积核的宽度小于词向量的维度就已经不是以词作为最小粒度了。 而高度和CNN一样,可以自行设置(通常取(2,3,4,5), 高度类似于n-gram了。 由于我们的输入是一个句子,句子中相邻的词之间关联性很高,因此,当我们用卷积核进行卷积时,不仅考虑了词义而且考虑了词序及其上下文。(类似于skip-gram 和CBOW模型的思想)
    详细讲解卷积过程: 卷积层输入的是一个表示句子的矩阵,维度为n*d,即每个句子共有n个词,每个词有d维的词向量表示。假设X_i:i+j 表示从词X_i 到词X_i+j,使用一个宽度为d,高度为h的卷积核W 与X_i:i+h-1(h个词)进行卷积操作后再使用激活函数激活得到相应的特征ci,则卷积操作可以表示为Ci=f(W.*Xi:j+h-1 _ + b). (卷积后维度缩减)。 因此经过卷积擦左后,可以得到一个n-h+1维的向量C 形如:C = [C1,C2,...Cn-h+1]. 以上是一个卷积核与输入句子的卷积操作,同样的我们也可以使用更多高度不同的卷积核,且每个高度的卷积核多个,得到更多不同特征。

    2.2 池化层: 因为在卷积层过程中,我们使用了不同高度的卷积核,使得我们通过卷积层后得到的向量维度会不一致,所以在池化层中,我们使用1-Maxpooling对每个特征向量池化层一个值,即抽取每个特征向量的最大值表示该特征,而且认为这个最大值表示的是最重要的特征。

    2.3 全连接层: 跟其他模型一样,假设有两层全连接层,第一层可以加上‘relu’作为激活函数, 第二层则用softmax激活函数得到属于每个类的概率,如果处理的数据集是二分类,第二层也可以用sigmoid作为激活函数,然后损失函数使用binary_crossentropy。

    2.4 Max Pooling:只会输出最大值,减少参数维度,顺便对输入中的补0 做过滤。
    2.5 SoftMax 分类layer: 最后接全连接softmax 层,输出每个类别的概率。
    2.6 小改动(变种):    在word representation 处理上会有一些变种。
        1) CNN-rand:设计好embedding_size这个Hyperparameter 后,对不同单词的词向量做随机初始化,后续BP的时候做调整。
        2)static: 拿pre-trained vectors from word2vec, FastText or Glove 直接用,训练过程中不再调整词向量(迁移学习的一种思想)
        3)non-static: pre-trained vectors +fine tuning: 即拿word2vec训练好的词向量初始化,训练过程中再对他们微调。
        4)multiple channel: 类比于图像中的RGB 通道,这里也可以用static 与non-static 搭两个通道来做。
    一些结果表明,max-pooling 总是犹豫average-pooling, 理想的filter sizes 是最重要的,但是具体任务具体考量,而用不用正则化似乎在NLP任务重没有很大的不同。

    2.7 使用text-CNN模型对imdb数据集进行情感分析
    从对上文的 text-cnn的模型介绍,我们将利用keras 搭建该模型,并对imbd数据进行情感分析。

    卷积过程中,由于只是沿着高度方向进行卷积,即只在一个维度卷积,所以使用Conv1d。 Conv1d(filters, kernel_size, activation): 
    filters: 卷积核的个数,kernel_size: 卷积核的宽度,activation: 卷积层使用的激活函数。

    池化过程使用的在一个维度上池化,使用MaxPooling1D.
    MaxPooling1D(pool_size): pool_size 池化窗口的大小,由于我们要将一个卷积核得到特征向量池化为1个值,所以池化窗口可以设为(句子长度-卷积核宽度+1,即卷积层得到的特征向量的长度)

    池化过程最后还需要对每个值拼接起来,可以使用concatenate 函数实现。
    concatenate(inputs, axis): inputs: 为一个tensor的list,所以需要将得到的1-MaxPooling 得到每个值append到list中,并把list 作为inputs 参数的输入。 axis:指定拼接方向。

    2.7 Text CNN 的 tf 实现

    CNN TF 

    需要注意的细节有。

    tf.nn.embedding_lookup() creates the actual embedding operation. The result of the embedding operation is a 3-dimensional tensor of shape [None, sequence_length, embedding_size].
    TensorFlow’s convolutional conv2d operation expects a 4-dimensional tensor with dimensions corresponding to batch, width, height and channel. The result of our embedding doesn’t contain the channel dimension, so we add it manually, leaving us with a layer of shape [None, sequence_length, embedding_size, 1].

    2.8  与LeNet 比较

    LeNet-5 网络结构 LeNet-5 TextCNN

    1)先来比较卷积:
    LeNet 的filter 是正方形,且每一层都只用了同一种尺寸的卷积核,Text-CNN中,filter是矩形,且矩形的长度有好几种,一般取(2,3,4), 而矩形的宽度是定长的,同word的embedding_size相同,每种尺寸都配有NUM_FILTER个数目,类比于LeNet 中的output_depth,所以得到的feature_map是长条状,宽度为1,因为是卷积,所以stride每个维度都是1.
    2)池化层:
    池化处理也叫下采样。LeNet的kernel 是正方形,一般也是2*2等,所以会把卷积后的feature_map尺寸缩小一半,Text-CNN的kernel依旧是长方形,将整个feature_map映射到一个点上,一步到位,只有一个池化层。
    3)全连接层
    都是多分类,这一步处理比较类似,将池化后的矩阵reshape为二维度。

    3,TextCNN 对新浪新闻文本主题分类

    GPU 占用30%

    GPU 30% NVIDIA Quadro M1200

    不过 内存占用比较多

    相关文章

      网友评论

          本文标题:NLP - TextCNN

          本文链接:https://www.haomeiwen.com/subject/empxrctx.html