利用CNN来做NLP(textcnn)

讲到nlp,我们常用的都是lstm/gru。
举个例子,因为我们总会说,因为句子经过embdding后,句子为一个三维张量,假设为:(None,20,300)。其中20为timestep,也就是一个句子的单词个数,300为embdding维度。为了更深的理解句子,剖析句子语意,我们假设接上一层lstm(num_units=128,return_sequence=True),那么输出的张量就为(None,20,128)。你会发现句子的embedding维度变了,我们可以说经过lstm后,我们用一种更高级的方式表示出了单词的维度,不再是300,而是128了。也就是句子变了。我们往往会接上两层这样的lstm,之后再接一些池化层、全连接层等等,一个基本的nlp分类网络就形成了~

那么如果我告诉你CNN同样可以改变句子的维度,就像lstm那样变成一个新的句子,且新句子更容易被网络理解,而且提供了n-gram的信息。是不是很神奇?

等一下。n-gram?他不是tfidf那边的东西吗?(如果不明白n-gram,请先自行百度)我们为了结合单词间的关系,我们把连续的2个词,3个词…称为一个term。在神经网络也可以完成这样的转换?是的,这就是textcnn。

OK。textcnn我不想讲太多,我建议直接看下面这篇博文,我自己写也写不了这么多,这么好。但是看完后,我会加一些自己的东西。

链接:[NLP] TextCNN模型原理和实现

看完之后我想你一定有一些体会,但是肯定还会有一些疑问。我想你的疑问不外乎这些:
1.我想知道textcnn每一步之后的输出张量的形状,这样我方便知道每一层发生了什么,显然上面的链接没有给你很直观的体验。
2.我想知道为什么用Maxpooling不用平均池化?
3.我想知道为什么要用池化。。。
4。卷积和池化和我以前在cv里看到的不一样。。看不懂。。

1,4我将用一段代码来解释。2,3在后面我将将一些自己的理解。
下面是一个简短的textecnn的代码:

    xconv1 = Convolution1D(filters=50,
                        kernel_size=1,
                        padding='same',
                        activation='relu')(x)
    
    xconv2 = Convolution1D(filters=50,
                        kernel_size=2,
                        padding='same',
                        activation='relu')(x)

到这里我们停一下,我们设x形状:(None,20,300)
请你回答我的xonv1,xonv2的形状?我如果padding='valid’呢?形状变不变?
首先第一个问题啊,2个输出都是(None,20,50)。首先解释一下:
Convolution1D,确实有两个方向可以做卷积,比如嘛,对于conv1,这里不是(20,300)的矩阵吗,我显然做一维卷积,我的单个卷积核可以是(20,1)或者(300,1),一个实现的是词方向的卷积,一个实现的是embedding方向的卷积。但是明显,,,我们是要词方向的啊。所以卷积核形状一定是(300,1)。这样的话,每一个卷积核都会产生一个20维向量,50个自然是(20,50)了~
补充:对于conv2,卷积核形状:(300,2)
第二个问题,我其实是为例迎合这个图:
利用CNN来做NLP(textcnn)_第1张图片
这个图经过卷积后,每一个卷积核生成的向量怎么长度不一?如果你pad的话,肯定是一样的,你不pad,也就是padding=‘valid’。那么不填充自然就维度不一了。

接下来为了不乱,我们只对conv1池化:

xconv1 = GlobalMaxPooling1D()(xconv1)

已知池化前形状:(None,20,50)输出形状是啥?
直接说了哦,是(None,1,50)
也就是(None,50).。
为什么不是(None,20)?
我只说一句话你就懂了。
GlobalMaxPooling1D是对整个feature_map上取最大值。(定义使然)feature_map不就是20维的向量吗,我们再找最大值,20–》1,不自然而然的变成了(None,1,50)了吗。
应该明白了吧。

对于问题3。我简单说一下:因为20,也就是time_step,是你pad sentence后补齐、截取得到的,取平均的话里面可能有很多补的0.因为这个和我们textcnn关系不大,我简单说一下,如不懂请留言。

问题4:
https://www.cnblogs.com/ymjyqsx/p/6485924.html

最后附上膨胀卷积的处理方式,它考虑了跳过一些单位之间词的关系。

    xconv3 = Convolution1D(filters=50,
                        kernel_size=4,dilation_rate=2,
                        padding='same',
                        activation='relu')(x)

关于空洞卷积/膨胀卷积:
https://www.zhihu.com/question/54149221

最后论文链接:
https://arxiv.org/pdf/1408.5882.pdf

你可能感兴趣的:(NLP,DL)