自然语言处理中CNN模型几种常见的Max Pooling操作

CNN是目前自然语言处理中和RNN并驾齐驱的两种最常见的深度学习模型。图1展示了在NLP任务中使用CNN模型的典型网络结构。一般而言,输入的字或者词用Word Embedding的方式表达,这样本来一维的文本信息输入就转换成了二维的输入结构,假设输入X包含m个字符,而每个字符的Word Embedding的长度为d,那么输入就是m*d的二维向量。


这里可以看出,因为NLP中的句子长度是不同的,所以CNN的输入矩阵大小是不确定的,这取决于m的大小是多少。卷积层本质上是个特征抽取层,可以设定超参数F来指定设立多少个特征抽取器(Filter),对于某个Filter来说,可以想象有一个k*d大小的移动窗口从输入矩阵的第一个字开始不断往后移动,其中kFilter指定的窗口大小,dWord Embedding长度。对于某个时刻的窗口,通过神经网络的非线性变换,将这个窗口内的输入值转换为某个特征值,随着窗口不断往后移动,这个Filter对应的特征值不断产生,形成这个Filter的特征向量。这就是卷积层抽取特征的过程。每个Filter都如此操作,形成了不同的特征抽取器。Pooling层则对Filter的特征进行降维操作,形成最终的特征。一般在Pooling层之后连接全联接层神经网络,形成最后的分类过程。

可见,卷积和PoolingCNN中最重要的两个步骤。下面我们重点介绍NLPCNN模型常见的Pooling操作方法。

|CNN中的Max Pooling Over Time操作

MaxPooling Over TimeNLPCNN模型中最常见的一种下采样操作。意思是对于某个Filter抽取到若干特征值,只取其中得分最大的那个值作为Pooling层保留值,其它特征值全部抛弃,值最大代表只保留这些特征中最强的,而抛弃其它弱的此类特征。

CNN中采用Max Pooling操作有几个好处:首先,这个操作可以保证特征的位置与旋转不变性,因为不论这个强特征在哪个位置出现,都会不考虑其出现位置而能把它提出来。对于图像处理来说这种位置与旋转不变性是很好的特性,但是对于NLP来说,这个特性其实并不一定是好事,因为在很多NLP的应用场合,特征的出现位置信息是很重要的,比如主语出现位置一般在句子头,宾语一般出现在句子尾等等,这些位置信息其实有时候对于分类任务来说还是很重要的,但是Max Pooling 基本把这些信息抛掉了。

其次,MaxPooling能减少模型参数数量,有利于减少模型过拟合问题。因为经过Pooling操作后,往往把2D或者1D的数组转换为单一数值,这样对于后续的Convolution层或者全联接隐层来说无疑单个Filter的参数或者隐层神经元个数就减少了。

 再者,对于NLP任务来说,Max Pooling有个额外的好处;在此处,可以把变长的输入X整理成固定长度的输入。因为CNN最后往往会接全联接层,而其神经元个数是需要事先定好的,如果输入是不定长的那么很难设计网络结构。前文说过,CNN模型的输入X长度是不确定的,而通过Pooling操作,每个Filter固定取1个值,那么有多少个FilterPooling层就有多少个神经元,这样就可以把全联接层神经元个数固定住(如图2所示),这个优点也是非常重要的。


但是,CNN模型采取MaxPooling Over Time也有一些值得注意的缺点:首先就如上所述,特征的位置信息在这一步骤完全丢失。在卷积层其实是保留了特征的位置信息的,但是通过取唯一的最大值,现在在Pooling层只知道这个最大值是多少,但是其出现位置信息并没有保留;另外一个明显的缺点是:有时候有些强特征会出现多次,比如我们常见的TF.IDF公式,TF就是指某个特征出现的次数,出现次数越多说明这个特征越强,但是因为Max Pooling只保留一个最大值,所以即使某个特征出现多次,现在也只能看到一次,就是说同一特征的强度信息丢失了。这是Max Pooling Over Time典型的两个缺点。

其实,我们常说“危机危机”,对这个词汇乐观的解读是“危险就是机遇”。同理,发现模型的缺点是个好事情,因为创新往往就是通过改进模型的缺点而引发出来的。那么怎么改进Pooling层的机制能够缓解上述问题呢?下面两个常见的改进Pooling机制就是干这个事情的。

|K-Max Pooling

K-MaxPooling的意思是:原先的Max Pooling Over TimeConvolution层一系列特征值中只取最强的那个值,那么我们思路可以扩展一下,K-Max Pooling可以取所有特征值中得分在Top –K的值,并保留这些特征值原始的先后顺序(图32-max Pooling的示意图),就是说通过多保留一些特征信息供后续阶段使用。

很明显,K-Max Pooling可以表达同一类特征出现多次的情形,即可以表达某类特征的强度;另外,因为这些Top K特征值的相对顺序得以保留,所以应该说其保留了部分位置信息,但是这种位置信息只是特征间的相对顺序,而非绝对位置信息。

|Chunk-Max Pooling

Chunk-MaxPooling的思想是:把某个Filter对应的Convolution层的所有特征向量进行分段,切割成若干段后,在每个分段里面各自取得一个最大特征值,比如将某个Filter的特征向量切成3Chunk,那么就在每个Chunk里面取一个最大值,于是获得3个特征值。(如图4所示,不同颜色代表不同分段)


乍一看Chunk-Max Pooling思路类似于K-Max Pooling,因为它也是从Convolution层取出了K个特征值,但是两者的主要区别是:K-Max Pooling是一种全局取Top K特征的操作方式,而Chunk-Max Pooling则是先分段,在分段内包含特征数据里面取最大值,所以其实是一种局部Top K的特征抽取方式。

至于这个Chunk怎么划分,可以有不同的做法,比如可以事先设定好段落个数,这是一种静态划分Chunk的思路;也可以根据输入的不同动态地划分Chunk间的边界位置,可以称之为动态Chunk-Max方法(这种称谓是我随手命名的,非正式称谓,请注意)。

Chunk-Max Pooling很明显也是保留了多个局部Max特征值的相对顺序信息,尽管并没有保留绝对位置信息,但是因为是先划分Chunk再分别取Max值的,所以保留了比较粗粒度的模糊的位置信息;当然,如果多次出现强特征,则也可以捕获特征强度。

Event Extraction via Dynamic Multi-Pooling Convolutional Neural Networks这篇论文提出的是一种ChunkPooling的变体,就是上面说的动态Chunk-Max Pooling的思路,实验证明性能有提升。Local Translation Prediction with Global Sentence Representation 这篇论文也用实验证明了静态Chunk-Max性能相对MaxPooling Over Time方法在机器翻译应用中对应用效果有提升。

如果思考一下,就会发现,如果分类所需要的关键特征的位置信息很重要,那么类似Chunk-Max Pooling这种能够粗粒度保留位置信息的机制应该能够对分类性能有一定程度的提升作用;但是对于很多分类问题,估计Max-Pooling over time就足够了。

比如我们拿情感分类来说,估计用Chunk-max策略应该有帮助,因为对于这种表达模式:

Blablabla….表扬了你半天,BUT…..你本质上就是个渣”

与这种表达模式

“虽然说你是个渣,但是…..Blablabla…..欧巴我还是觉得你最好,因为你最帅”

明显位置信息对于判别整体情感倾向是有帮助作用的,所以引入位置信息应该有帮助。

所以,你分析下你手头的问题,看看位置是不是重要特征,如果是,那么套用一下Chunk-Max策略,估计性能会有提升,比如上面举的情感分类问题估计效果会有提升。

Pooling层的作用:
1. 不变性,更关注是否存在某些特征而不是特征具体的位置。可以看作加了一个很强的先验,让学到的特征要能容忍一些的变化。
2. 减小下一层输入大小,减小计算量和参数个数。
3. 获得定长输出。(文本分类的时候输入是不定长的,可以通过池化获得定长输出)
4. 防止过拟合或有可能会带来欠拟合。


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我们可以使用 TensorFlow 来实现一个 CNN 模型。 首先,我们需要准备输入数据和标签。接着,我们可以定义模型的网络结构。 下面是一个基本的 CNN 模型的示例代码: ``` import tensorflow as tf # 定义输入层 input_layer = tf.keras.layers.Input(shape=(28, 28, 1)) # 定义卷积层,包含 32 个 3x3 的卷积核 conv_layer = tf.keras.layers.Conv2D(32, (3, 3), activation='relu')(input_layer) # 定义池化层,使用 2x2 的最大池化 pooling_layer = tf.keras.layers.MaxPooling2D(pool_size=(2, 2))(conv_layer) # 定义 Flatten 层,将池化层的输出压平 flatten_layer = tf.keras.layers.Flatten()(pooling_layer) # 定义全连接层,输出为 10 类别 output_layer = tf.keras.layers.Dense(10, activation='softmax')(flatten_layer) # 定义整个模型 model = tf.keras.Model(inputs=input_layer, outputs=output_layer) # 编译模型,指定损失函数和优化器 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, batch_size=32, epochs=5) ``` 在这个示例代码,我们定义了一个包含输入层、卷积层、池化层、Flatten 层和全连接层的 CNN 模型。我们使用 Adam 优化器来训练模型,并使用交叉熵 ### 回答2: 卷积神经网络(CNN)是一种常用的深度学习模型,用于图像识别、图像分类和目标检测等任务。下面是一个简单的CNN模型的代码示例: ``` python import tensorflow as tf # 定义CNN模型 def cnn_model(): model = tf.keras.Sequential() # 第一个卷积层 model.add(tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) model.add(tf.keras.layers.MaxPooling2D((2, 2))) # 第二个卷积层 model.add(tf.keras.layers.Conv2D(64, (3, 3), activation='relu')) model.add(tf.keras.layers.MaxPooling2D((2, 2))) # 第三个卷积层 model.add(tf.keras.layers.Conv2D(128, (3, 3), activation='relu')) model.add(tf.keras.layers.MaxPooling2D((2, 2))) # 全连接层 model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(64, activation='relu')) model.add(tf.keras.layers.Dense(10, activation='softmax')) return model # 构建模型 model = cnn_model() # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 加载数据集 (X_train, y_train), (X_test, y_test) = tf.keras.datasets.cifar10.load_data() # 数据预处理 X_train = X_train / 255.0 X_test = X_test / 255.0 # 训练模型 model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test)) # 评估模型 test_loss, test_accuracy = model.evaluate(X_test, y_test) print('Test Loss:', test_loss) print('Test Accuracy:', test_accuracy) ``` 这个CNN模型包含了三个卷积层和一个全连接层。卷积层用于提取图像的特征,最大池化层用于降低特征图的尺寸,全连接层用于进行分类。在训练过程,通过反向传播算法更新模型的权重,使其能够更好地拟合训练数据。最后,通过测试数据评估模型的性能。 ### 回答3: 卷积神经网络(Convolutional Neural Network, CNN)是一种广泛应用于图像识别和计算机视觉任务的深度学习模型。下面是一个简单的CNN模型示例: 1. 准备数据:CNN模型通常需要大量的标记图像数据作为训练集。首先,我们需要收集一组图像数据,并将其标记为不同的类别,比如猫、狗和鸟等。 2. 数据预处理:对于每一张图像,我们需要将其进行一些预处理操作,比如调整大小、灰度化或归一化。这些操作有助于提高模型的训练和推理效果。 3. 构建模型:我们可以使用Python的深度学习框架,比如TensorFlow或Keras,来构建CNN模型。一个简单的CNN模型可以由以下几个必要的组件组成: - 输入层:接受图像数据作为输入。 - 卷积层:使用卷积核对输入图像进行特征提取。 - 激活函数层:引入非线性变换,增强模型的表达能力。 - 池化层:对特征图进行下采样,减少参数数量,同时保留重要特征。 - 全连接层:将特征图展开,与全连接层连接,实现分类或回归任务。 - 输出层:输出模型的预测结果。 4. 训练模型:使用训练集的标记数据对CNN模型进行训练。通过反向传播算法,优化模型的参数,使其能够更好地拟合训练数据。 5. 评估模型:使用一个独立的验证集,评估CNN模型的性能指标,比如准确率、精确率和召回率。 6. 应用模型:训练好的CNN模型可以应用于未标记的图像数据,进行分类或回归预测。同时,还可以进行模型的迁移学习或进一步优化。 总结:上述300字内的回答简要介绍了CNN模型的构建步骤,包括数据准备、模型构建、训练和评估等关键步骤。通过这些步骤,我们可以构建一个简单的CNN模型来解决图像分类或回归问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值