Convolutional Neural Networks for Sentence Classification阅读笔记及复现
文章目录
- TEXT-CNN
-
1. 网络架构
- 嵌入层
- 卷积层
- 最大值池化层
- Softmax分类层
- 嵌入层
-
2. 参数与超参数
-
3. 变种
-
4. 实验
-
代码复现(pytorch)
-
卷积神经网络相比于DNN和RNN有以下优点:
- 能够提取局部的位置信息
- 能够便捷地将不定长的输入转换为定长输入并接入到深度神经网络(DNN)中进行处理
- 相较于RNN模型计算复杂度较低,在许多任务领域均展现出良好的性能表现
TEXT-CNN
这篇论文具有一定年代感但仍不失其价值
1. 网络结构


Embedding Layer
word embedding层, 没什么好说的
Convolution Layer
输入层经过卷积操作能够生成多个Feature Map。其中h代表纵向词语的数量,k则是单词向量的空间维度。利用大尺寸的卷积窗口,能够生成多个列向量。
Max-Pooling Layer
随后的部分中提到一种名为Max-over-time Pooling的技术被采用。具体而言,该方法通过直接从上一层的一维特征图中提取出最大值来完成信息聚合,而这些最大值往往代表了最为关键的信息点。可以看出这一方法能够有效地解决可变长度序列输入的问题(因为无论输入到池化层前一层有多少个特征单元,我们始终只需从中提取出最大的那几个数值)。经过这一过程后得到的结果是各特征图中的最大值集合,从而最终形成一个统一维度的一维向量作为当前层激活码的基本构成单元
SoftMax分类Layer
池化层的一维向量输出结果经过全连接处理,并与一个Softmax层相联系;根据具体任务需求设置这个Softmax层(通常它反映了各类别上的概率分布)。在实际应用中,在倒数第二层的全连接结构中引入Dropout技术能够有效降低模型过拟合的风险(避免隐藏层单元过度拟合或对称配置),从而有效降低模型过拟合的风险。
2. 参数与超参数
sequence_length*
CNN的输入输出具有固定的长度,在对句子进行固定长度的处理时,超出部分会被截断,并且不足的部分会用零填充.
- 多种尺寸的滤镜:通常设置为[2、3、4]或[3、4、5]
- 特征图:100
- 批量大小:50
- Dropout:Adaptive dropout (可调整)
- 优化器:AdamW
3. 变种
模型结构有几个小的变种:
-
CNN-rand
设置为 embedding_size 这个 Hyperparameter 后, 对不同单词的向量进行随机赋值, 在反向传播过程中进行优化.-
static
pre-trained词向量固定,训练过程不再调整 -
non-static
pretrained vectors + fine-tuning -
multiple channel
static与non-static搭两个通道
-
4. 实验
数据集
MR: Movie reviews with one sentence per review. Classification involves detecting positive/negative reviews.
SST-1: Stanford Sentiment Treebank—an extension of MR but with train/dev/test splits provided and fine-grained labels (very positive, positive, neutral, negative, very negative)
SST-2: Same as SST-1 but with neutral reviews removed and binary labels.
Subj: Subjectivity dataset where the task is to classify a sentence as being subjective or objective.
TREC: TREC question dataset—task involves classifying a question into 6 question types (whether the question is about person, location, numeric information, etc.)
CR: Customer reviews of various products (cameras, MP3s etc.). Task is to predict positive/negative reviews
实验结果

结论
- 相较于CNN-rand而言,CNN-static的表现更为出色,这表明预训练词向量确实带来了显著提升作用。
- 相比而言,CNN-non-static不仅在性能上优于CNN-static,而且在许多具体任务中展现出显著的优势,这是因为适当的微调确实是有利的,它使得向量更加贴合具体的任务需求。
- 在小样本数据集上,CNN-multichannel模型的表现明显优于仅使用单个通道模型的情况,这实际上体现了在保持向量与原始值之间距离的同时保留一定变化空间的一种折中策略。
代码复现(pytorch)
class CNN(nn.Module):
def __init__(self, vocab_size, embedding_dim, n_filters, filter_sizes, output_dim, dropout, pad_idx):
super(CNN, self).__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim, padding_idx = pad_idx)
self.convs = nn.ModuleList([
nn.Conv2d(in_channels = 1,
out_channels = n_filters,
kernel_size = (fs, embedding_dim))
for fs in filter_sizes
])
self.fc = nn.Linear(len(filter_sizes) * n_filters, output_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, text):
#text = [sent len, batch size](torchtext加载数据后句长在前, batch在后, 所以需要先permute)
text = text.permute(1, 0)
#text = [batch size, sent len]
embedded = self.embedding(text)
#embedded = [batch size, sent len, emb dim]
embedded = embedded.unsqueeze(1)
#embedded = [batch size, 1, sent len, emb dim]
conved = [F.relu(conv(embedded)).squeeze(3) for conv in self.convs]
#conv_n = [batch size, n_filters, sent len - filter_sizes[n]]
pooled = [F.max_pool1d(conv, conv.shape[2]).squeeze(2) for conv in conved]
#pooled_n = [batch size, n_filters]
cat = self.dropout(torch.cat(pooled, dim = 1))
#cat = [batch size, n_filters * len(filter_sizes)]
return self.fc(cat)
