TextCNN

1. 不同的实现方式

1.1 经典实现方式

  最经典的实现方式来自于《Convolutional Neural Networks for Sentence Classification》,下载地址为 https://www.aclweb.org/anthology/D14-1181 。

  主要分为以下几步:词嵌入、卷积、池化、全连接+softmax,示意图如下所示:
在这里插入图片描述

1.1.1 词嵌入

  首先句子可以看作是词的序列,序列长度为n,每个词用向量 x i x_i xi表示,每个词嵌入的维度是 k k k。所以句子表示为:
x 1 : n = x 1 ⊕ x 2 ⊕ : : : ⊕ x n x_{1:n} = x_1 ⊕ x_2 ⊕ : : : ⊕ x_n x1:n=x1x2:::xn

  所以 x i : i + j x_{i:i+j} xi:i+j是个左闭右闭的区间。

1.1.2 卷积

  由于不同的论文对卷积的表达是不同的,所以以上图为例。上图中宽代表词向量,高代表不同的词。

  由于TextCNN采用的卷积是一维卷积,所以卷积核的宽度和词嵌入的维度是一致的。而卷积核的高度 h h h代表的是每次窗口取的词数。所以卷积核 w ∈ R h k w \in \mathbb R^{hk} wRhk

  对于每一次滑窗的结果 c i c_i ci(标量)而言,卷积运算的结果是
c i = f ( w ⋅ x i : i + h − 1 ) + b c_i = f(w \cdot x_{i:i+h-1})+b ci=f(wxi:i+h1)+b
  其中 b ∈ R b \in \mathbb R bR而f是非线性函数,例如tanh或者relu。

  由于卷积运算是对应元素相乘然后相加,所以 w w w x i : i + h − 1 x_{i:i+h-1} xi:i+h1的维度是一致的。由于 w w w的维度是 h ∗ k h*k hk x i : i + h − 1 x_{i:i+h-1} xi:i+h1的维度也是 h ∗ k h*k hk,则 X X X的维度是 ( n − h + 1 ) ∗ h ∗ k (n-h+1)*h*k (nh+1)hk(和c的维度可以对照得到)。

  由于句子序列长度为 n n n,而卷积核的高度为 h h h,所以总共滑窗 n − h + 1 n-h+1 nh+1次。所以卷积汇总结果为 c = [ c 1 , c 2 , … , c n − h + 1 ] c=[c_1, c_2,\dots,c_{n-h+1}] c=[c1,c2,,cnh+1]

1.1.3 池化

  这里的池化采用的是全局最大池化,即 c ^ = m a x { c } \hat { c }=max\{c\} c^=max{c}。由于filter一般有多个,假设卷积核个数是 m m m,所以池化后的数据为 z = [ c 1 ^ , c 2 ^ , … , c m ^ ] z=[\hat { c_1},\hat { c_2},\dots,\hat { c_m}] z=[c1^,c2^,,cm^],数据维度为 1 ∗ m 1*m 1m(列向量)。

1.1.4 DNN+softmax

y = w ∗ z + b y=w*z+b y=wz+b

1.2 其它实现方式

  最近在研究关系抽取,研究的第一篇paper《Relation Classification via Convolutional Deep Neural Network》,下载地址为 https://www.aclweb.org/anthology/C14-1220 。

  主要分为以下几步:词嵌入、滑窗处理、矩阵运算、池化、全连接+softmax,示意图如下所示:
在这里插入图片描述

1.2.1 词嵌入

  这部分内容和上述类似,唯一的区别是多了两个token,一个是句子的最开头的token start( x s x_s xs),一个是句子的结束token end( x e x_e xe)。

1.2.2 滑窗处理

  由于句子序列长度为 t t t,而卷积核的高度为 h h h,卷积核的宽度和词嵌入的维度是一致的,从上往下滑窗,所以总共滑窗 t − h + 1 t-h+1 th+1次,但由于多了两个token,所以滑窗次数为 t − 3 + 1 + 2 = t t-3+1+2=t t3+1+2=t次。而卷积核的宽度为 n n n。所以滑窗处理后的数据维度为 t ∗ n 0 t*n_0 tn0,其中 n 0 n_0 n0 w ∗ n w*n wn w ∗ n w*n wn代表 w w w n n n列。

1.2.3 矩阵运算

  论文中的计算公式为 Z = W 1 X Z=W_1X Z=W1X,维度运算结果为 n 1 ∗ t n_1*t n1t,每一行代表的是每一个filter对不同的windows的结果相乘然后相加的结果,每一列代表的是不同的filter对相同的window相乘然后相加的结果,而在神经网络中比较普遍的公式应该是 Z = X W 1 Z=XW_1 Z=XW1,所以此时X需要做个转置,即为 n 0 ∗ t n_0*t n0t。而 Z Z Z的维度为 n 1 ∗ n 0 n_1*n_0 n1n0。其中 n 1 n_1 n1为filter_num(或为output_channels)。

  为了便于理解,先假设 n 1 = 1 n_1=1 n1=1,则Z的维度运算结果为 Z = ( 1 ∗ n 0 ) ∗ ( n 0 ∗ t ) = 1 ∗ t Z=(1*n_0)*(n_0*t)=1*t Z=(1n0)(n0t)=1t。此时 W 1 W_1 W1为一个filter,它为1行 n 0 n_0 n0列的数据。 X X X n 0 n_0 n0 t t t列的数据。矩阵相乘 Z = W 1 X Z=W_1X Z=W1X W 1 W_1 W1的行和 X X X的列相乘之后然后相加。X的每一列对应的是每个window的数据concat放到了一列。以第一行和第一列相乘为例,则结果为卷积核和第一个window的运算。把 W 1 W_1 W1第一行和 X X X的所有列进行运算,就可以理解 n 1 = 1 n_1=1 n1=1的结果。如果是多个卷积核, W 1 W_1 W1为多个行向量,然后把 W 1 W_1 W1每一行和 X X X的每一列进行运算,就可以理解 n 1 > 1 n_1>1 n1>1的结果。注:如果是 Z = X W 1 Z=XW_1 Z=XW1,此时 X X X维度为 t ∗ n 0 t*n_0 tn0 W 1 W_1 W1维度为 n 0 ∗ n 1 n_0*n_1 n0n1

1.2.4 池化

  这里的池化采用的是全局最大池化,即 m i = m a x Z ( i , ⋅ ) 0 ≤ i ≤ n 1 m_i=max \quad Z(i,\cdot) \quad 0 \leq i \leq n_1 mi=maxZ(i,)0in1。则 m i m_i mi指的是对每一个filter对不同的windows取最大值的结果。 m = { m 1 , m 2 , … , m n 1 } m=\{m_1,m_2,\dots,m_{n_1}\} m={m1,m2,,mn1},此时的m显然为行向量,维度为 1 ∗ n 1 1*n_1 1n1

1.2.5 全连接

g = t a n h ( W 2 m ) g=tanh(W_2m) g=tanh(W2m)
  由于 W 2 W_2 W2维度为 n 2 ∗ n 1 n_2*n_1 n2n1,所以m维度为 n 1 ∗ 1 n_1*1 n11,即对上述的m进行转置。

1.2.6 区别

  经典的TextCNN卷积相乘运算后,会添加bias,然后使用非线性函数进行运算。而这篇paper并没有bias和非线性函数。

  经典的TextCNN的卷积核的size可以为多个,然后进行concat,而本篇论文的size必须是固定的,文中为指定的3。

2. 后记

  需要注意的是,一般来说,CNN的卷积核是三维的(input_channels*width*height),但对于TextCNN来说,由于input_channels是1,所以卷积核是二维的。但也有paper在文本分类上采用多个input_channels(多种词向量),参考https://arxiv.org/pdf/1603.04513.pdf。

  优点如下所示:1) a frequent word can have c representations in the beginning (instead of only one), which
means it has more available information to leverage; 2) a rare word missed in some embedding
versions can be “made up” by others (we call it
“partially known word”). Therefore, this kind of
initialization is able to make use of information
about partially known words, without having to
employ full random initialization or removal of
unknown words. The vocabulary of the binary
sentiment prediction task described in experimental part contains 5232 words unknown in HLBL
embeddings, 4273 in Huang embeddings, 3299 in
GloVe embeddings, 4136 in SENNA embeddings
and 2257 in Word2Vec embeddings. But only
1824 words find no embedding from any channel! Hence, multichannel initialization can considerably reduce the number of unknown words.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

herosunly

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值