目录
Model
1.输入层
2.卷积层
3.池化层
4.全连接层
5.输出层
关于demo的实现
x i ∈ R k,x i 为k维word向量,与句子中的第i个word对应,
一个长为n的句子可表示为:x 1:n = x 1 ⊕ x 2 ⊕ . . . ⊕ x n
x i:i+j 指一系列相关联的words x i , x i+1 , . . . , x i+j
一个卷积运算包括一个过滤器w ∈ R (hk),这个过滤器会被用到一个含h个words的窗口来产生一个新的特征
比如:
a feature c i is generated from a window of words x i:i+h−1 by c i = f (w · x i:i+h−1 + b).
b是一个偏项,f是一个非线性函数,比如双曲正切。
这个过滤器会被用到句子中每一个可能的words窗口{x 1:h , x 2:h+1 , . . . , x n−h+1:n }来产生一个特征map
c = [c 1 , c 2 , . . . , c n−h+1 ]
c∈R (n−h+1)
之后利用最大时间池化(max-over-time pooling)操作对特征map进行处理得到最大的值ĉ = max{c}并作为和这个特定过滤器相对应的特征。
这样做的目的就是捕获每一个特征map的最重要的特征(最大值的那个)。
这种pooling方案会自动处理长度变化的句子。
模型利用多个过滤器获得多个特征。
这些特征组成一个倒数第二层然后被传递给一个输出是标签上的概率分布的全连接softmax层。
参考:https://blog.csdn.net/u014732537/article/details/79573174
https://www.jianshu.com/p/594d1984fbd9
可以把输入层理解成把一句话转化成了一个二维的图像:每一排是一个词的word2vec向量,纵向是这句话的每个词按序排列。输入数据的size,也就是图像的size,n×k,n代表训练数据中最长的句子的词个数,k是embbeding的维度.
CNN-rand: 所有的word vector都是随机初始化的,同时当做训练过程中优化的参数;
CNN-static: 所有的word vector直接使用无监督学习即Google的Word2Vector工具得到的结果,并且是固定不变的;
CNN-non-static: 所有的word vector直接使用无监督学习即Google的Word2Vector工具得到的结果,但是会在训练过程中被Fine tuned;
CNN-multichannel: CNN-static和CNN-non-static的混合版本,即两种类型的输入。
从输入层还可以看出kernel的size,不同的kernel想获取不同范围内词的关系,所以kernel的高(h)会有不同。
和图像不同的是,NLP中的CNN的kernel的宽(w)一般都是图像的宽,也就是word2vec的维度,因为我们需要获得的是纵向的差异信息,也就是不同范围的词出现会带来什么信息。
在输入层的基础上,使用Filter Window
进行卷积操作得到Feature Map
。
实验中使用的3种类型大小的Filter Window
,分别是3*K,4*K,5*K
,K表示词向量的长度。
由于kernel的特殊形状,因此卷积后的feature map是一个宽度是1的长条。
利用最大时间池化(max-over-time pooling)操作对特征map进行处理得到最大的值ĉ = max{c}并作为和这个特定过滤器相对应的特征。
这样做的目的就是捕获每一个特征map的最重要的特征(最大值的那个)。
这种pooling方案会自动处理长度变化的句子。
该层的输入为池化操作后形成的一维向量,经过激活函数输出,再加上Dropout层防止过拟合。并在全连接层上添加l2正则化参数
。
该层的输入为全连接层的输出,经过SoftMax
层作为输出层,进行分类。
我的基本想法是
利用Pytorch实现(网上有很多利用tensorflow和theano实现的,但对于目前的我来说,难度很大,框架和库完全不了解)
第一步数据预处理:
利用MR数据集,在数据预处理中,返回文本和对应标签。返回文本为list,构建词表,再构建词表到索引的映射,比如:
word_to_id={word:i for i,word in enumerate(word_vocb)}
id_to_word={word_to_id[word]:word for word in word_to_id}
再构建训练数据,将训练数据的word转换为word的索引
第二步构建TextCNN模型:
用embedding构建词向量,放入卷积层、池化层、全连接层、输出层。
第三步训练:
设置的学习率为LR = 0.001,optimiser为Adam,使用的损失函数为 nn.CrossEntropyLoss()。
菜鸡选手目前仍在努力研究中,暂时还没有完成demo的实现。