CharCNN
之前看了TextCNN,也就是基于词级别的CNN,卷积的时候是对多个词向量(window size)进行卷积。Character-level Convolutional Networks for Text
Classification 这篇文章从一个新的视角来看待文本数据,那就是字符(character),本文通过实现字符级别的卷积神经网络来做文本分类任务,与传统文本分类方法和深度神经网络如CNN、RNN相比,在多个数据集上取得了不错的效果。
Background
CharCNN主要针对的还是文本分类任务。文本分类我认为是NLP领域最为基础但也是应用最广的一类任务,文章中提到了多种文本分类模型,如:Bag-of-words + TFIDF、Bag-of-ngrams + TFIDF、Word-based CNN、LSTM等,这些模型都被作者用来做了对比实验。本文采用的仍然是卷积神经网络,因为卷积神经网络在图像和语音领域均取得了很好的效果,并且近些年来CNN用于文本任务也非常常见了,在很多情况下模型效果要好于RNN。这篇文章首次在纯字符级别应用卷积神经网络。
Character Quantization
首先来看如何将字符进行编码。我们知道在word-based的模型里面,我们的句子表示都是基于Word Embedding来做的,也就是对单词进行编码,并且发展出了效果非常好的预训练词向量。那么本文把字符当作特征,首要问题就是如何对字符进行编码,作者采用的还是最直接的方式:独热编码。作者使用了一个包含70个字符的字符表,包含 26 26 26个小写英文字母、 10 10 10个阿拉伯数字、 33 33 33个常见标点符号。然后,对每个句子取 l 0 = 1014 l_0\ =\ 1014 l0 = 1014个字符(可能是调参的结果),每个字符用一个长度为 m = 70 m\ =\ 70 m = 70的独热编码向量来表示,因此每个句子编码后就是一个shape为 [ l 0 , m ] [l_0,\ m] [l0, m]的特征矩阵。
Model Structure
模型是基于一维卷积神经网络进行构建的,这也是CharCNN和TextCNN的区别之一。一维卷积的公式如下:
h
(
y
)
=
∑
x
=
1
k
f
(
x
)
⋅
g
(
y
⋅
d
−
x
+
c
)
h(y)\ =\ \sum_{x=1}^{k}f(x) \cdot g(y\cdot d-x+c)
h(y) = x=1∑kf(x)⋅g(y⋅d−x+c)
其中
d
d
d是步长,
k
k
k是filter size,
c
=
k
−
d
+
1
c=k-d+1
c=k−d+1,
f
f
f是我们的卷积核,
g
g
g是我们的字符编码。
池化层还是采用的MaxPooling,只不过现在也变成了一维池化:
h
(
y
)
=
m
a
x
x
=
1
k
g
(
y
⋅
d
−
x
+
c
)
h(y)\ =\ max_{x=1}^{k}\ g(y \cdot d - x + c)
h(y) = maxx=1k g(y⋅d−x+c)
模型一共有9层,6层卷积加3层全连接。作者设计了两种模型,一大一小,主要体现在卷积核数量和全连接层参数量上。具体见下图
Data Argumentation
本文作者使用了一种文本数据增强的方法:同义词替换,以实现数据扩充。English thesaurus中对多个同义词的相关性进行了排序。选择某个同义词使用公式如下:
P
[
s
]
=
q
s
P[s]\ =\ q^s
P[s] = qs
q
q
q是选择某个同义词的概率,
s
s
s是这个词的序号,序号越大代表相关性越小,被选择用来替换的概率也越小。在选择替换词的个数上,原文用的是:
P
[
r
]
=
p
r
P[r]\ =\ p^r
P[r] = pr
p
p
p是替换概率,
r
r
r代表替换词的个数,意思是替换一个词的概率是
p
p
p,替换两个词的概率是
p
2
p^2
p2 ,也就是意味着不会替换很多个词。原文对于参数
p
p
p和
q
q
q都取
0.5
0.5
0.5。
Experiment
本文作者采用的数据集如下:
用于对比试验的模型有以下几种:
- Bag-of-words and its TFIDF
- Bag-of-ngrams and its TFIDF
- Bag-of-means on word embedding
- Word-based ConvNets
- Long-short term memory
实验效果如下:
进一步,作者又设计了一个效果对比图,指标为相对误差,即对比模型与本文模型分类误差之差,因此下图中负表示比本文模型效果好,正表示比本文模型效果差
通过对实验效果的分析,作者得出了一些结论,这里只选取了三条我认为比较重要的:
- Character-level ConvNet is an effective method。作者认为CharCNN证明了字符级别的模型是非常有效的,不一定需要词作为文本特征。下图是CharCNN中卷积层的可视化[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X9tF5SMz-1641823278492)(…/…/pictures/93.PNG)]
- Dataset size forms a dichotomy between traditional and ConvNets models。作者发现在比较小的数据集上,传统方法如ngram+TFIDF的地位还是不可撼动的,但是当数据量达到了百万级别,CharCNN的效果会变得更好,因此CharCNN适合于大文本训练
- Choice of alphabet makes a difference。作者发现字符集的选择对模型效果也有很大影响。在相对小的数据集上,区分大小写会比不区分更好,但是到了百万级别,区分与不区分影响不是很大
Reflection
本文带给我的启发如下:
- 开辟了一个新的理解文本数据的视角,即字符,事实证明效果也很不错
- 同义词替换是一种比较有效的文本数据增强方法
- 深度学习模型在一些数据集上不一定就比传统方法表现更好,因此Baseline很重要
思考与疑问如下:
- 虽然实验证明字符级别的卷积效果也不错,但是仍然无法理解模型是如何通过字符来理解文本的。单词可以有上万个,通过单词理解文本并实现分类通常可以认为是句子中某些单词起了关键作用,比如good、bad。但是字符如何理解,字符只有70个,因此每个句子中其实都只是字符的顺序不一样,但是基本来说,字符的种类是一样的,那么模型是如何进行理解的?有没有可能这种字符级别的理解其实只是我们的想法,但是模型在做的时候仍然是对字符进行了分割得到单词?
既然有词向量,那么可不可以设计一种动态的字符向量,这个感觉可以作为一个研究方向(是我想多了)