1.简介

TextCNN 是利用卷积神经网络对文本进行分类的算法,由 Yoon Kim 在 “Convolutional Neural Networks for Sentence Classification” 一文 (见参考[1]) 中提出. 是2014年的算法.

网络结构
图1-1 参考[1] 中的论文配图


图1-2 网络盗图

合理性:
深度学习模型在计算机视觉与语音识别方面取得了卓越的成就. 在 NLP 也是可以的.
卷积具有局部特征提取的功能, 所以可用 CNN 来提取句子中类似 n-gram 的关键信息.

2.参数与超参数

  • sequence_length
    Q: 对于CNN, 输入与输出都是固定的,可每个句子长短不一, 怎么处理?
    A: 需要做定长处理, 比如定为n, 超过的截断, 不足的补0. 注意补充的0对后面的结果没有影响,因为后面的max-pooling只会输出最大值,补零的项会被过滤掉.
  • num_classes
    多分类, 分为几类.
  • vocabulary_size
    语料库的词典大小, 记为|D|.
  • embedding_size
    将词向量的维度, 由原始的 |D| 降维到 embedding_size.
  • filter_size_arr
    多个不同size的filter.

3.Embedding Layer

通过一个隐藏层, 将 one-hot 编码的词 投影 到一个低维空间中.
本质上是特征提取器,在指定维度中编码语义特征. 这样, 语义相近的词, 它们的欧氏距离或余弦距离也比较近.

4.Convolution Layer

为不同尺寸的 filter 都建立一个卷积层. 所以会有多个 feature map.
图像是像素点组成的二维数据, 有时还会有RGB三个通道, 所以它们的卷积核至少是二维的.
从某种程度上讲, word is to text as pixel is to image, 所以这个卷积核的 size 与 stride 会有些不一样.

  • xi x i

    xiRk x i ∈ R k
    , 一个长度为n的句子中, 第 i 个词语的词向量, 维度为k.
  • xi:j x i : j

    xi:j=xixi+1...xj x i : j = x i ⊕ x i + 1 ⊕ . . . ⊕ x j

    表示在长度为n的句子中, 第 [i,j] 个词语的词向量的拼接.
  • h h

    卷积核所围窗口中单词的个数, 卷积核的尺寸其实就是 hk
    h


    k


    .

  • w w

    wRhk
    w







    R




    h


    k



    , 卷积核的权重矩阵.

  • ci c i

    ci=f(wxi:i+h1+b) c i = f ( w ⋅ x i : i + h − 1 + b )
    , 卷积核在单词i位置上的输出. bRK b ∈ R K
    , 是 bias. f f
    是双曲正切之类的激活函数.
  • c=[c1,c2,...,cnh+1]
    c


    =


    [



    c


    1



    ,



    c


    2



    ,


    .


    .


    .


    ,



    c



    n





    h


    +


    1




    ]



    filter在句中单词上进行所有可能的滑动, 得到的 featuremap f e a t u r e m a p
    .

5.Max-Pooling Layer

max-pooling只会输出最大值, 对输入中的补0 做过滤.

6.SoftMax 分类 Layer

最后接一层全连接的 softmax 层,输出每个类别的概率。

7.小的变种

在 word representation 处理上会有一些变种.

  • CNN-rand
    设计好 embedding_size 这个 Hyperparameter 后, 对不同单词的向量作随机初始化, 后续BP的时候作调整.
  • static
    拿 pre-trained vectors from word2vec, FastText or GloVe 直接用, 训练过程中不再调整词向量. 这也算是迁移学习的一种思想.
  • non-static
    pre-trained vectors + fine tuning , 即拿word2vec训练好的词向量初始化, 训练过程中再对它们微调.
  • multiple channel
    类比于图像中的RGB通道, 这里也可以用 static 与 non-static 搭两个通道来搞.

一些结果表明,max-pooling 总是优于 average-pooling ,理想的 filter sizes 是重要的,但具体任务具体考量,而用不用正则化似乎在NLP任务中并没有很大的不同。

8. Text CNN 的tf实现

参见[4], [6]. 挺详细的。


图 8-1 Text CNN 网络中的卷积与池化 结构

需要注意的细节有。
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].

9. 与 LeNet 作比较


figure LeNet-5 网络结构

# LeNet5
conv1_weights = tf.get_variable("weight", [CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEEP],initializer=tf.truncated_normal_initializer(stddev=0.1))
tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1],padding='SAME')tf.nn.max_pool(relu1, ksize = [1,POOL1_SIZE,POOL1_SIZE,1],strides=[1,POOL1_SIZE,POOL1_SIZE,1],padding="SAME")
#TextCNN
conv1_weights = tf.get_variable("weight", [FILTER_SIZE, EMBEDDING_SIZE, 1, NUM_FILTERS],initializer=tf.truncated_normal_initializer(stddev=0.1))
tf.nn.conv2d(self.embedded_chars_expanded,conv1_weights,strides=[1, 1, 1, 1],padding="VALID")tf.nn.max_pool(h,ksize=[1, SEQUENCE_LENGTH - FILTER_SIZE + 1, 1, 1],strides=[1, 1, 1, 1],padding='VALID')

先来比较卷积
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() 计算损失.

10. TextCNN 论文中的网络结构

windows size 分别取 (3,4,5), 每个尺寸都会有100个filter.

3.1 Hyperparameters and Training
For all datasets we use: rectified linear units, filter
windows (h) of 3, 4, 5 with 100 feature maps each,
dropout rate (p) of 0.5, l2 constraint (s) of 3, and
mini-batch size of 50. These values were chosen
via a grid search on the SST-2 dev set.

参考

  1. Convolutional Neural Networks for Sentence Classification
  2. Tensorflow版TextCNN主要代码解析
  3. Recurrent Neural Network for Text Classification with Multi-Task Learning
  4. implementing-a-cnn-for-text-classification-in-tensorflow
  5. understanding-convolutional-neural-networks-for-nlp
  6. textcnn实现-github

Text-CNN 文本分类相关推荐

  1. cnn文本分类python实现_CNN文本分类

    将神经网络应用于大图像时,输入可能有上百万个维度,如果输入层和隐含层进行"全连接",需要训练的参数将会非常多.如果构建一个"部分联通"网络,每个隐含单元仅仅只能 ...

  2. 基于Tensorflow里CNN文本分类

    使用CNN进行文本分类 卷积神经网络 英文邮件分类 语料 simplistic , silly and tedious . it's so laddish and juvenile , only te ...

  3. 【NLP】保姆级教程:手把手带你CNN文本分类(附代码)

    分享一篇老文章,文本分类的原理和代码详解,非常适合NLP入门! 写在前面 本文是对经典论文<Convolutional Neural Networks for Sentence Classifi ...

  4. 【NLP傻瓜式教程】手把手带你CNN文本分类(附代码)

    文章来源于NewBeeNLP,作者kaiyuan 写在前面 本文是对经典论文<Convolutional Neural Networks for Sentence Classification[ ...

  5. 【NLP保姆级教程】手把手带你CNN文本分类(附代码)

    分享一篇老文章,文本分类的原理和代码详解,非常适合NLP入门! 写在前面 本文是对经典论文<Convolutional Neural Networks for Sentence Classifi ...

  6. tensorflow多层卷积网络实现CNN文本分类

    1.实验数据获取: 这里的实验数据是本人自己提取的,具体方式是: (大家可以根据自己喜好进行如下步骤) 1.选取3个不同类别的文本,每类500篇,共1500篇. 2.使用TF-IDF或词频等方式,从每 ...

  7. NLP中的情感分析可参考该篇 CNN文本分类

    https://blog.csdn.net/yangfengling1023/article/details/82780788?utm_source=blogxgwz2

  8. TensorFlow使用CNN实现中文文本分类

    TensorFlow使用CNN实现中文文本分类 读研期间使用过TensorFlow实现过简单的CNN情感分析(分类),当然这是比较low的二分类情况,后来进行多分类情况.但之前的学习基本上都是在英文词 ...

  9. 文本分类(下) | 卷积神经网络(CNN)在文本分类上的应用

    正文共3758张图,4张图,预计阅读时间18分钟. 1.简介 原先写过两篇文章,分别介绍了传统机器学习方法在文本分类上的应用以及CNN原理,然后本篇文章结合两篇论文展开,主要讲述下CNN在文本分类上的 ...

  10. 详解CNN实现中文文本分类过程

    摘要:本文主要讲解CNN实现中文文本分类的过程,并与贝叶斯.决策树.逻辑回归.随机森林.KNN.SVM等分类算法进行对比. 本文分享自华为云社区<[Python人工智能] 二十一.Word2Ve ...

最新文章

  1. debug.keystore not found for signing config 'debug'.
  2. java字典序列化_Java对象序列化,Serialize Java Data Object,音标,读音,翻译,英文例句,英语词典...
  3. HTTP协议基础解读
  4. 4G EPS 中的随机接入
  5. Spring 梳理 - ContentNegotiatingViewResolver
  6. Android 系统各种StreamType 的Volume关联和Mute设置
  7. opencv-4.1.0-百度云盘下载链接-环境配置
  8. AOJ 558 Cheese(bfs)
  9. Linux下没有包含头文件(不知是哪个)导致编译无法通过的解决心得
  10. (进阶篇)Redis6.2.0 集群 哨兵模式_搭建_01
  11. Docker学习笔记_安装和使用Zookeeper
  12. linux下两个线程交替打印,两个线程交替打印AB
  13. vue引入字体文件踩坑
  14. 在一起计时器_奇妙物理·高中篇:打点计时器基本介绍
  15. 高斯克吕格投影知识总结
  16. Windows 更新 升级 8007003错误 800tb109错误 文件没有正确签名 很难确定你的电脑能否运行win10【解决方法】
  17. 纽约科技行业十大高薪职位
  18. 解决PHP项目显示“该网页无法正常运作”,但没有显示报错内容
  19. MATLAB 制作抖音同款故障风海报
  20. 英飞凌微控制器,驱动物联网的关键“大脑”

热门文章

  1. Ubuntu 安装sogo输入法
  2. vue项目中动态显示时间
  3. c语言程序安装软件,c语言程序下载软件
  4. AI 操控战斗机战胜飞行员?道翰天琼认知智能机器人平台API接口大脑为您揭秘-3。
  5. 博弈论-多智能体强化学习基础
  6. @Transactional使用
  7. 视频显示输出接口总结
  8. 物体检测中的小物体问题
  9. Cy5-MAL,Cy5-马来酰亚胺,1437796-65-0,1437872-46-2
  10. GIT(分布式版本控制系统)入门