TextCNN模型详解
Text CNN
Overview
本节我们来重点介绍一下卷积神经网络在文本分类问题当中的应用。CNN网络在图像领域已经占据了主导地位,在文本领域也有不错的表现。在 "Convolutional Neural Network for Sentence Classification" 一文中,作者使用了CNN进行文本分类任务,取得了非常不错的效果
事实上在很多情况下,Multi-Window-Size的CNN正确率和LSTM相差无几,下面我们来看一看模型的结构。
Model Structure
我们知道在CV领域中,CNN是使用卷积核在不同的channel上进行特征提取,每一个卷积核都会提取出一张feature map,然后我们再去做pooling。那么在文本分类的时候,我们显然是没有 R G B RGB RGB三个channel的。通常情况下,我们会将原始文本经过处理转变成一个shape为 [ b a t c h , s e q _ l e n , e m b e d d i n g _ d i m ] [batch, \ seq\_len, \ embedding\_dim] [batch,seq_len,embedding_dim]的矩阵,这里类比图像, s e q _ l e n seq\_len seq_len可以认为是 h e i g h t height height, e m b e d d i n g _ d i m embedding\_dim embedding_dim可以认为是 w i d t h width width。那么显然如果我们想要使用二维卷积,我们的shape是少了一个channel维度的
但是再转念一想,这不就是一张黑白图像么!我们就把这个矩阵当作是一个 c h a n n e l = 1 channel=1 channel=1的图像,然后再应用卷积,不就大功告成了。因此,我们每次使用一个 k e r n e l _ s i z e kernel\_size kernel_size为 [ w i n d o w _ s i z e , e m b e d d i n g _ d i m ] [window\_size, embedding\_dim] [window_size,embedding_dim]的卷积核来进行文本特征提取,这里:
- window_size表示每次我们希望看到几个单词(我们默认使用token level),window_size的选取也很重要,因为选小了,我们可能会捕捉不到上下文信息;选的太大,可能会导致计算资源的浪费或者模型准确率的下降
- embedding_dim就是词向量的维度,这里我们不难发现,卷积核的kernel_size是一个矩形。文本比较特殊的是,每一个token是用一个向量进行表示,因此如果我们的卷积核每次不能覆盖一个完整的单词,那么就会丢失掉很多的信息。这一点与图像不一样,因为图像的每个像素点就是一个scalar,我们不会把像素点再用一个向量进行表示。
Multi Window Size
上面我们提到卷积核的window_size对模型的表现能力会产生很大影响,那么我们自然会想到使用多种大小的window_size,这样不就能取长补短了么?因此我们使用多组卷积核,每组卷积核的window_size互不相同,然后就得到了多张feature map。接着我们将所有的feature map进行一个concatenation,再丢进池化层
(当然也可以先对每张feature map进行池化,再concatenation,效果一样),得到一个shape为 [ b a t c h , o u t _ c h a n n e l ∗ n ] [batch,out\_channel*n] [batch,out_channel∗n]的特征矩阵,再经过一个linear transformation,最后就得到了我们的输出。
值得一提的是,原论文采用的window_size是 [ 3 , 4 , 5 ] [3,4,5] [3,4,5]
Static vs Non-Static
论文中还提出了许多提升模型效果的方法,其中一个就是Non-Static CNN。Static CNN就是我们使用了静态的词向量,如最经典的word2vec,直接将与训练好的词向量复制到我们的Embedding Layer中,不随卷积层一起训练。那么Non-Static CNN就是在训练过程中同时训练更新词向量,根据不同的任务做一下fine tuning,作者发现Non-Static CNN效果要优于Static CNN。
现Non-Static CNN效果要优于Static CNN。
TextCNN模型详解相关推荐
- 文本分类算法TextCNN原理详解
详情请看:膜拜大佬![原创]文本分类算法TextCNN原理详解(一) - ModifyBlog - 博客园 Textcnn 原理 与rnn lstm 的比较, Textcnn更快 textCNN的总结 ...
- 使用pickle保存机器学习模型详解及实战(pickle、joblib)
使用pickle保存机器学习模型详解及实战 pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. "Pickling"是将Python对象层次结构转换为字节 ...
- Transformer 模型详解
Transformer 是 Google 的团队在 2017 年提出的一种 NLP 经典模型,现在比较火热的 Bert 也是基于 Transformer.Transformer 模型使用了 Self- ...
- TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344 作者简介:汪剑,现在在出门问问负责推荐与个性化。曾在微软雅虎工作,
TensorFlow Wide And Deep 模型详解与应用 TensorFlow Wide-And-Deep 阅读344 作者简介:汪剑,现在在出门问问负责推荐与个性化.曾在微软雅虎工作,从事 ...
- TensorFlow Wide And Deep 模型详解与应用
Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右发布的一类用于分类和回归的模型,并应用到了 Google Play 的应用推荐中 [1].wide and dee ...
- 数学建模——智能优化之模拟退火模型详解Python代码
数学建模--智能优化之模拟退火模型详解Python代码 #本功能实现最小值的求解#from matplotlib import pyplot as plt import numpy as np imp ...
- 数学建模——智能优化之粒子群模型详解Python代码
数学建模--智能优化之粒子群模型详解Python代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplo ...
- 数学建模——支持向量机模型详解Python代码
数学建模--支持向量机模型详解Python代码 from numpy import * import random import matplotlib.pyplot as plt import num ...
- 数学建模——一维、二维插值模型详解Python代码
数学建模--一维.二维插值模型详解Python代码 一.一维插值 # -*-coding:utf-8 -*- import numpy as np from scipy import interpol ...
最新文章
- iptables防火墙策略
- C语言基础-数据类型
- 我曾七次鄙视自己的灵魂
- POJ 3258 -- River Hopscotch(二分)
- 我的世界JAVA刷怪范围_《我的世界》只有刷怪蛋能够刷新生物吗?并不是,还有一种物品!...
- 【JAVA学习】09.创建BootstrapTale列表页
- @param注解什么意思_Java反射是什么?看这篇绝对会了!
- mongo .update
- Java Web 开发的目录结构
- numpy常用矩阵运算
- HenCoder Android 自定义 View 1-6:属性动画(上手篇)
- linux基础(十四)定时任务和管理系统的临时文件
- electron-vue中调用系统屏幕键盘(linux与windows)
- elasticsearch的父子_ElasticSearch 学习记录之父子结构的查询
- 【mysql 练习题】查询和“01”号同学所学课程完全相同的其他同学的学号
- 美团 java_GitHub - meituan/mssapi_java: 美团云对象存储 Java SDK
- Mac使用技巧/M1 Mac安装 PS 2021 闪退、卡启动界面解决方法
- golang(3)高质量编程与性能分析
- 学习笔记-TP5框架学习笔记\(路由\)
- 将XML文件中的内容批量修改