自然语言处理的CNN模型中几种常见的池化方法
自然语言处理的CNN模型中几种常见的池化方法
本文是在[1]的基础上进行的二次归纳。
0x00 池化(pooling)的作用
首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2]。filter(特征抽取器,卷积核,CV上称之为滤波器)在一个窗口(text region)上可以抽取出一个特征值,filter在整个text上滑动,将抽取出一系列特征值组成一个特征向量。这就是卷积层抽取文本特征的过程。模型中的每一个filter都如此操作,形成了不同的特征向量。
pooling层则对filters的抽取结果进行降维操作,获得样本的重要特征,为下一次的卷积增加感受野的大小,逐渐减小"分辨率", 为最后的全连接做准备。pooling层是CNN中用来减小尺寸,提高运算速度的,同样能减小噪声的影响,让各特征更具有健壮性。降维操作方式的不同产生不同的池化方法。
一般在pooling层之后连接全连接神经网络,形成最后的分类结果。
下面列举几种常见的pooling方法。
0x01 Max Pooling
做法
对于某个filter抽取到若干特征值,只取其中得分最大的那个值作为pooling层保留值,其它特征值全部抛弃,值最大代表只保留这些特征中最强的,而抛弃其它弱的此类特征。
优点
只保留区域内的最大值(特征),忽略其它值,降低噪声的影响,提高模型健壮性;
Max Pooling能减少模型参数数量,有利于减少模型过拟合问题。因为经过pooling操作后,在NLP任务中往往把一维的数组转换为单一数值,这样对于后续的卷积层或者全联接隐层来说无疑单个filter的参数或者隐层神经元个数就减少了。
Max Pooling可以把变长的输入X整理成固定长度的输入。因为CNN最后往往会接全联接层,而其神经元个数是需要事先定好的,如果输入是不定长的那么很难设计网络结构。在NLP任务中,文本的长度往往是不确定的,而通过pooling 操作,每个filter固定取1个值,那么有多少个filter,pooling层就有多少个神经元(pooling层神经元个数等于filters个数),这样就可以把全联接层神经元个数固定住。
缺点
Max-Pooling丢失特征项位置信息。在很多NLP的应用场合,特征的出现位置信息是很重要的,比如主语出现位置一般在句子头,宾语一般出现在句子尾等等,这些位置信息其实有时候对于主题分类分类任务也许不是很重要([3]保留词的顺序特征提高了文本分类性能),但是对于情感分类任务可能很重要;
Max-Pooling丢失特征频次信息。有时候有些强特征会出现多次,比如我们常见的特征权重算法TF-IDF中的TF就是指某个特征在某一个文本中出现的次数。但是因为Max Pooling只保留一个最大值,所以即使某个特征出现多次,经过max-Pooling也只能看到一次。
0x02 K-Max Pooling
做法
K-Max Pooling可以取每一个filter抽取的一些列特征值中得分在前K大的值,并保留他们的相对的先后顺序。把所有filters的前k大的特征值拼接成一个特征向量。pooling层的神经元个数等于k倍的filter个数。就是说通过多保留一些特征信息供后续阶段使用。
优点
K-Max Pooling可以表达同一类特征出现多次的情形,即可以表达某类特征的强度;
因为这些Top-K特征值的相对顺序得以保留,所以应该说其保留了部分位置信息。
缺点
这种位置信息只是特征间的相对顺序,而非绝对位置信息。
0x03 Chunk-Max Pooling
做法
把某个filter抽取到的特征向量进行分段,切割成若干段后,在每个分段里面各自取得一个最大特征值,比如将某个filter的特征向量切成3个chunk,那么就在每个chunk里面取一个最大值,于是获得3个特征值。
优点
Chunk-Max Pooling可以保留了多个局部最大特征值的相对顺序信息;
如果多次出现强特征,Chunk-Max Pooling可以捕获特征强度。
缺点
并没有保留绝对位置信息,仅保留了比较粗粒度的模糊的位置信息。
0x04 REFERENCE
[1] 张俊林. 自然语言处理中CNN模型几种常见的Max Pooling操作[EB/OL]. http://blog.csdn.net/malefactor/article/details/51078135, 2016-04-07
[2] Kim, Y. (2014). Convolutional neural networks for sentence classification. Eprint Arxiv.
[3] Johnson, R., & Zhang, T. (2014). Effective use of word order for text categorization with convolutional neural networks. Eprint Arxiv.
自然语言处理的CNN模型中几种常见的池化方法的更多相关文章
- Android源码中中一种常见的struct使用方法
直接看例子: #include<iostream> #include<stdlib.h> using namespace std; struct Base{ int ba; i ...
- [转]js中几种实用的跨域方法原理详解
转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...
- JS中几种常见的数组算法(前端面试必看)
JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...
- Spring RestTemplate中几种常见的请求方式
https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...
- Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求
Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明 ...
- tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图
tensorflow CNN 卷积神经网络中的卷积层和池化层的代码和效果图 因为很多 demo 都比较复杂,专门抽出这两个函数,写的 demo. 更多教程:http://www.tensorflown ...
- http协议里定义的四种常见数据的post方法
原文 https://blog.csdn.net/charlene0824/article/details/51199292 关于http协议里定义的四种常见数据的post方法,分别是: applic ...
- Java中9种常见的CMS GC问题分析与解决
1. 写在前面 | 本文主要针对 Hotspot VM 中"CMS + ParNew"组合的一些使用场景进行总结.重点通过部分源码对根因进行分析以及对排查方法进行总结,排查过程会省 ...
- 【2016-08-18】转载:总结C++中几种结构体初始化的方法
作者:Ac_Von 博客地址:http://www.cnblogs.com/vongang/ 文章地址:http://www.cnblogs.com/vongang/archive/2011/07/3 ...
随机推荐
- 剑指Offer 54. 字符流中第一个不重复的字符 (其他)
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...
- 网络编程 多线程/socketserver模块/ threading.local
线程:进程中负责程序执行的执行单元. 多线程:在1个进程中存在多个线程. 进程只是用来把资源集中在一起,而线程才是cpu上的执行单位. 每个进程都会默认有一个控制线程也叫作主线程. 进程之间是竞争关系 ...
- 【Keil5 MDK】armar工具的基本用法(armar --help)
ARM Librarian, 5.03 [Build 76] - archive creation and maintenance tool Command format: armar options ...
- opencv读取摄像头实时流代码
opencv读取摄像头实时流代码: #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; ...
- web driver下载地址(selenium-3.141_浏览器版本对应)
web driver: (Windows环境下) Firefox(上一目录可以找其他浏览器的driver) : 1)http://npm.taobao.org/mirrors/geckodriver/ ...
- golang: 利用unsafe操作未导出变量
unsafe.Pointer其实就是类似C的void *,在golang中是用于各种指针相互转换的桥梁.uintptr是golang的内置类型,是能存储指针的整型,uintptr的底层类型是int,它 ...
- 迷宫问题bfs, A Knight's Journey(dfs)
迷宫问题(bfs) POJ - 3984 #include <iostream> #include <queue> #include <stack> #incl ...
- bzoj 1814 Ural 1519 Formula 1 ——插头DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1814 普通的插头 DP .但是调了很久.注意如果合并两个 1 的话,不是 “把向右第一个 2 ...
- 解压zipfile & tarfile
def __un_zip(self, file_path): """解压.zip格式文件到同名目录下,若解压之前就存在该目录说明已解压,跳过解压过程,返回该目录" ...
- html/css/js-如何利用jq来更改属性的值和获取属性的值
jquery的使用在web开发中是非常广泛的,虽然说比较容易,易学,但在开发过程中,也总是会碰到各种各样的小问题. 我曾经就遇到这种问题,jq如何获取属性值和更改属性值的. 众所周知,attr()可以 ...