一.前言
对于文本序列,我们一般想到的应用循环神经网络(RNN),事实证明RNN在NLP中确实效果很好。但是RNN也存在一个问题,就是序列前后具有依赖关系,无法并行。而卷积神经网络(CNN)却能克服这个缺陷,且能取得不错的性能。最近博主会更新一波关于CNN在特定NLP任务上的博文,为方便理解,先放出一篇关于文本卷积的博文。
二.文本卷积
对于图像卷积,我们可能很熟悉,就是利用一个卷积核在图片上从左到右、从上到下进行滑动,然后将卷积核覆盖的元素乘以卷积核对应的元素进行求和。
那么对于文本,卷积操作是如何进行的呢?其实图像卷积类似,同样是卷积核在序列上进行滑动窗口的加权求和,只不过文本是一维的。为方便直观理解,先给出一个关于文本卷积的示例。
但是,实际上文本卷积的操作其实并没有上述展示的那样简单,因为神经网络是不能将文字作为输入的,一般的神经网络需要将文字转换为词向量,然后在词向量上进行卷积操作。
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],xi∈Rd, 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+k−1,卷积核对应的权重也展平为一个长度为
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(w⋅xi:i+k−1+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∈(k⋅d)×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+k−1×W∈Rm(2)
假设对长度为
n
n
n的短序列进行卷积输出的序列的长度为
l
l
l。则对于输入
X
∈
R
n
×
d
X \in \mathbb{R}^{n \times d}
X∈Rn×d,对应的输出
Y
∈
R
l
×
m
Y \in \mathbb{R}^{l \times m}
Y∈Rl×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)。
2.2 文本卷积的重要参数
在文本卷积中最重要的参数包括卷积核大小(kernel size)和卷积核的数量(num filters)。
卷积核大小意味着每次滑动处理的单词的长度,卷积核大小为 n n n相当于对文本提取 n − g r a m n-gram n−gram上的特征,在文本卷积中卷积核大小常设置为2~5之间。
在文本卷积中,可以使用不同大小的卷积核提取句子不同维度的信息。
在卷积中,不同的卷积核可以提取不同的特征(feature map)。
三.池化操作
在文本卷积中一般都会跟一个池化操作。池化操作可以进一步降低参数量,避免过拟合。另外,通过池化操作可以提取某个区域的总结特征。最大池化可以提取区域内的最大特征,而平均池化可以提取区域内的平均特征。注意,这个区域可能是某个局部,也可能是全局,下图展示的是两者的对比示意图:
该图中每一行对应于一个卷积核提取的特征。
在文本卷积中比较常用的池化操作是最大池化。
四.文本卷积神经网络的两种堆叠方式
横向堆叠:使用不同大小的卷积核提取句子不同维度的信息,然后进行拼接(concat)操作,最后将拼接的最终表示用于下游任务。
纵向堆叠:在某个卷积块(卷积+激活+池化)抽取的特征的基础上继续应用卷积块抽取更高维度的特征,然后将最终表示用于下游任务。
五.结语
在撰写本文的过程中,参考了一些大佬的优质资料:
放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较
Convolutional Neural Networks for Text
Convolutional Neural Networks for Sentence Classification
以上便是本文的全部内容,要是觉得不错的话,可以点个赞或关注一下博主,你们的支持是博主进步的不竭动力,当然要是有问题的话也敬请批评指正!!!