TextCNN的个人理解
参考文献放两个,一个是原作,另一个是我参考的博客。
Yoon Kim,Convolutional Neural Networks for Sentence Classification:原论文。
https://www.cnblogs.com/bymo/p/9675654.html:博客一篇。
TextCNN的主要思路
具体思路可以用下面一张图来表示:
这个还是非常明显的,做了embedding后,卷积层、最大池化层、全连接层,一气呵成,这个结构相信对深度学习的大家应该理解起来都不会太难。
但是,只理解到这一步绝对不能理解到TextCNN其中的内涵,毕竟论文虽然不长,但是上面几句话确实不需要很多篇幅。
深挖TextCNN中Trick
一维卷积
首先,这里的一维卷积,绝对不是指卷积核是一维的,卷积核的实质是一个x行y列的向量,尤其y,是指embedding词向量的维度,x经常在2-5之间。来看这个图,大家应该会更加清楚的。
这里为了简化,每个单词给了一个只有5维的词向量,后面分别是给了3种类型的卷积核,但是都有一个特点,就是他的列都和词向量一致,这就是一维卷积的核心,相当于要从整个词向量(玄学的说就是语义)抽取关键信息。
另一个关键点在于一个关键点在于,卷积的横向x行,这个行的实际含义可以理解为N-Gram的形式的信息抽取。
预训练模型和微调
在那个时代,word2vector是非常常用的预训练模型,预训练模型的优点就是可以利用外部数据,外部数据代表的是整体语境的含义,这就是预训练词汇的优势。但是,这个理解外部信息也是一个劣势,毕竟你的具体问题不是整体领域,而是某个垂直领域,这就导致你这里需要分析和取舍。更为夸张的,作者给出了4种处理预训练词向量的模式。
词向量直接用随机的。
固定的预训练词向量模型。
微调的预训练词向量模型。
多通道预训练词向量模型。
这里的多通道,最终使用的方法是一个通道是固定的预训练词向量模型,走卷积核等整个链路,预训练模型不跟着反向传播更新卷积,另一个通道预训练词向量模型也是走卷积等整个链路,但是预训练模型参数会跟着反向传播更新,两个链路在最大池化后concat起来一起做全连接得到最终分类结果。
那么,上面几个方案,具体那个好呢,作者是做了实验的:
其实可以感受到,随机的和固定模型的小伙都是靠后的,而多通道和微调在不同的数据下则比较接近,各有胜负。
所以,通过论文这个角度,用预训练模型,然后进行微调,性价比是最高的,多通道毕竟运算复杂度更高。
这里多通道和微调的结果接近的深层次原因还有待深入探究,个人认为很可能是因为这里面都包含了微调,毕竟微调和固定的结果差距很大,这里可能在concat后的全连接中,给了固定模型更低的权重,从而导致两者接近过接近。这个猜想做着同样做了一些的分析:
超参的细节
超参作者谈的不多,直接整了,这由于是作者自己尝试过的,所以我们可以作为参考,我们看看里面有没有一些trick吧。
卷积层的行用了3,4,5三种,代表的是三种N-Gram窗口大小,没用2,有点意思。(感觉这个中英文可能有差异)
随机失活用了0.5,个人感觉还不小。
L2正则,权重3.
batch size用了50。