1. 简介
参考:(1) Recurrent Convolutional Neural Networks for Text Classification
(2) https://zhuanlan.zhihu.com/p/55015587
(3) https://zhuanlan.zhihu.com/p/42201550
- 设计思想:简而言之就是,结合RNN处理序列数据的优势与CNN提取局部特征的优势。具体分析,(1) RNN属于"biased-model",一个句子中越往后的词重要性越高。(2) CNN属于无偏模型,能够通过最大池化获得最重要的特征,但是CNN的滑动窗口大小不容易确定,选的过小容易造成重要信息丢失(太小得到的局部特征太小,会丢失较大的特征),选的过大会造成巨大的参数空间。
1.1 模型原理
- 网络结构:模型的网络结构如下图所示,

模型的第一部分是一个BiRNN结构,第二部分是max-pooling层,第三部分是全连接层。第一部分主要用来学习word representation,第二部分和第三部分用来学习text representation。
1.1.1 Word Representation Learning
(1) 学习单词的左上文与右下文的信息
(1)
c
l
(
w
i
)
=
f
(
W
(
l
)
c
l
(
w
i
−
1
)
+
W
(
s
l
)
e
(
w
i
−
1
)
)
c_l(w_i)=f(W^{(l)}c_l(w_{i-1})+W^{(sl)}e(w_{i-1})) \tag{1}
cl(wi)=f(W(l)cl(wi−1)+W(sl)e(wi−1))(1)
(2)
c
r
(
w
i
)
=
f
(
W
(
r
)
c
r
(
w
i
+
1
)
+
W
(
s
r
)
e
(
w
i
+
1
)
)
c_r(w_i)=f(W^{(r)}c_r(w_{i+1})+W^{(sr)}e(w_{i+1})) \tag{2}
cr(wi)=f(W(r)cr(wi+1)+W(sr)e(wi+1))(2)
- c l ( w i ) c_l(w_i) cl(wi):是一个稠密向量,表示单词 w i w_i wi的左上文。
- e ( w i ) e(w_i) e(wi):是一个稠密向量,表示单词 w i w_i wi的嵌入向量,即word embedding。
- W ( l ) W^{(l)} W(l):是一个矩阵,用于将上一个单词的左上文 c l ( w i − 1 ) c_l(w_{i-1}) cl(wi−1)传递到下一个单词的左上文 c l ( w i ) c_l(w_{i}) cl(wi)中。
- W ( s l ) W^{(sl)} W(sl):是一个矩阵,结合当前词 e ( w i − 1 ) e(w_{i-1}) e(wi−1)的语义到下一个词的左上文中,s表示的是semantic。
- 右下文 c r ( w i ) c_r(w_i) cr(wi)的计算中的符号意义同理可知。
(2) 计算单词 w i w_i wi的隐藏语义向量 (潜在语义表示)
- 将单词
w
i
w_i
wi的左上文、嵌入向量和右下文表示连接起来表示单词
w
i
w_i
wi:
(3) x i = [ c l ( w i ) ; e ( w i ) ; c r ( w i ) ] x_i=[c_l(w_i);e(w_i);c_r(w_i)] \tag{3} xi=[cl(wi);e(wi);cr(wi)](3) - 使用线性变换激活函数计算单词
w
i
w_i
wi的隐藏语义向量:
(4) y i ( 2 ) = t a n h ( W ( 2 ) x i + b ( 2 ) ) y_i^{(2)}=tanh(W^{(2)}x_i+b^{(2)}) \tag{4} yi(2)=tanh(W(2)xi+b(2))(4)
注释(个人理解):Word Representation Learning 过程可以看作是卷积过程(从宏观上理解),每个单词的隐藏语义向量 y i ( 2 ) y_i^{(2)} yi(2)相当于是一个通道的计算结果,即响应图。
1.1.2 Text Representation Learning
(1) max-pooling层
(5)
y
(
3
)
=
max
i
=
1
n
y
i
(
2
)
y^{(3)}=\max_{i=1}^n y_i^{(2)} \tag{5}
y(3)=i=1maxnyi(2)(5)
每一个
y
i
(
2
)
y_i^{(2)}
yi(2)是一个向量,取每一个向量中的最大值组成向量
y
(
3
)
y^{(3)}
y(3),类似于取每一个响应图中的最大值。最大池化可以帮助找到句子中最重要的潜在语义信息。
(2) 全连接层
(6)
y
(
4
)
=
W
(
4
)
y
(
3
)
+
b
(
4
)
y^{(4)}=W^{(4)}y^{(3)}+b^{(4)} \tag{6}
y(4)=W(4)y(3)+b(4)(6)
(7)
p
j
=
e
x
p
(
y
j
(
4
)
)
∑
k
=
1
n
e
x
p
(
y
k
(
4
)
)
p_j=\frac{exp(y_j^{(4)})}{\sum_{k=1}^{n}exp(y_k^{(4)})} \tag{7}
pj=∑k=1nexp(yk(4))exp(yj(4))(7)
将
y
(
3
)
y^{(3)}
y(3)输入到全连接层,然后通过softmax进行分类。
2. 实践
- 说明:论文中作者给出了BiRNN的内部计算方式公式(1)和公式(2),与RNN本身的构造不一样 (个人理解),因此网上的代码有两种实现方式,一种是按照论文的公式构造BiRNN,一种是使用tensorflow库中的RNN,即原始的RNN结构。