快速入门CNN在NLP中的使用

一.前言

对于文本序列,我们一般想到的应用循环神经网络(RNN),事实证明RNN在NLP中确实效果很好。但是RNN也存在一个问题,就是序列前后具有依赖关系,无法并行。而卷积神经网络(CNN)却能克服这个缺陷,且能取得不错的性能。最近博主会更新一波关于CNN在特定NLP任务上的博文,为方便理解,先放出一篇关于文本卷积的博文。

二.文本卷积

对于图像卷积,我们可能很熟悉,就是利用一个卷积核在图片上从左到右、从上到下进行滑动,然后将卷积核覆盖的元素乘以卷积核对应的元素进行求和。

same_padding_no_strides

那么对于文本,卷积操作是如何进行的呢?其实图像卷积类似,同样是卷积核在序列上进行滑动窗口的加权求和,只不过文本是一维的。为方便直观理解,先给出一个关于文本卷积的示例。

cnn_filter_reads_text

但是,实际上文本卷积的操作其实并没有上述展示的那样简单,因为神经网络是不能将文字作为输入的,一般的神经网络需要将文字转换为词向量,然后在词向量上进行卷积操作

2.1 卷积详细过程

假设输入序列为 ( w 1 , w 2 , . . . , w n ) (w_1, w_2, ..., w_n) (w1,w2,...,wn),每个词对应的词向量表示为 X = ( x 1 , x 2 , . . . , x n ) , i ∈ [ 1 , n ] , x i ∈ R d X = (x_1, x_2, ..., x_n),i \in [1,n], x_i \in \mathbb{R}^{d} X=(x1,x2,...,xn),i[1,n],xiRd d d d为词向量的维度,卷积核大小(kernel size)为 k k k,卷积核数量为 m m m

文本卷积的过程

卷积核在序列上从左到右滑动,每次都选取窗口为 k k k的短序列与卷积核进行加权求和操作得到一个特征。实际在实现文本卷积时,是对将长度为 k k k的短序列拼接为一个长度为 k × d k \times d k×d的向量 x i : i + k − 1 \bold{x}_{i:i+k-1} xi:i+k1,卷积核对应的权重也展平为一个长度为 k × d k \times d k×d的向量 w \bold{w} w,然后卷积操作:
c i = f ( w ⋅ x i : i + k − 1 + b ) (1) c_i= f(\bold{w} \cdot \bold{x}_{i:i+k-1} + b) \tag{1} ci=f(wxi:i+k1+b)(1)
其中 f f f表示非线性变换,一般选择Relu

对于 m m m个卷积核,每个卷积核可以提取一个不同的特征,文本卷积是实际操作为将每个卷积核的权重展平为一个长度为 k × d k \times d k×d的一维向量,然后组成一个二维矩阵 W ∈ ( k ⋅ d ) × m W \in (k \cdot d) \times m W(kd)×m,该矩阵的每一列为一个卷积核,则短序列对应于多个卷积核的卷积为:
c = x i : i + k − 1 × W ∈ R m (2) \bold{c} = \bold{x}_{i:i+k-1} \times W \in \mathbb{R}^{m} \tag{2} c=xi:i+k1×WRm(2)
假设对长度为 n n n的短序列进行卷积输出的序列的长度为 l l l。则对于输入 X ∈ R n × d X \in \mathbb{R}^{n \times d} XRn×d,对应的输出 Y ∈ R l × m Y \in \mathbb{R}^{l \times m} YRl×m,其中 l l l的计算与输入长度 n n n,卷积核的参数如卷积核大小(kernel size)、步长(stride)以及填充(padding)都有关,其计算方式与图像卷积相同,这里就不重复赘述了。

同样为方便直观理解,同样给出一个文本卷积过程示意图,该图中展示了 m m m卷积核大小为3,步长为1的卷积核在序列<pad> I like the cat <eos> <pad>上进行卷积操作。图的左侧部分展示的是完整序列对应于 m m m个卷积核的卷积结果,图的中间部分展示的是单个短序列对 m m m个卷积核的卷积结果,图的右侧部分展示的是单个短序列对应于 m m m个卷积核的实际计算过程,也就是公式(2)。

convolution_linear_layer-min

2.2 文本卷积的重要参数

在文本卷积中最重要的参数包括卷积核大小(kernel size)卷积核的数量(num filters)

卷积核大小意味着每次滑动处理的单词的长度,卷积核大小为 n n n相当于对文本提取 n − g r a m n-gram ngram上的特征,在文本卷积中卷积核大小常设置为2~5之间

在文本卷积中,可以使用不同大小的卷积核提取句子不同维度的信息。

在卷积中,不同的卷积核可以提取不同的特征(feature map)。
several_filters_read

三.池化操作

在文本卷积中一般都会跟一个池化操作。池化操作可以进一步降低参数量,避免过拟合。另外,通过池化操作可以提取某个区域的总结特征。最大池化可以提取区域内的最大特征,而平均池化可以提取区域内的平均特征。注意,这个区域可能是某个局部,也可能是全局,下图展示的是两者的对比示意图:

pooling_vs_global-min

该图中每一行对应于一个卷积核提取的特征。

在文本卷积中比较常用的池化操作是最大池化

四.文本卷积神经网络的两种堆叠方式

横向堆叠:使用不同大小的卷积核提取句子不同维度的信息,然后进行拼接(concat)操作,最后将拼接的最终表示用于下游任务。

纵向堆叠:在某个卷积块(卷积+激活+池化)抽取的特征的基础上继续应用卷积块抽取更高维度的特征,然后将最终表示用于下游任务。

五.结语

在撰写本文的过程中,参考了一些大佬的优质资料:

放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较

Convolutional Neural Networks for Text

Convolutional Neural Networks for Sentence Classification

以上便是本文的全部内容,要是觉得不错的话,可以点个赞关注一下博主,你们的支持是博主进步的不竭动力,当然要是有问题的话也敬请批评指正!!!

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯曦巍峨

码文不易,有条件的可以支持一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值