深度学习中网络设计的几点经验
1.CNN网络中的池化方式选择
池化方式有两种:1)最大池化;2)平均池化
在实验中我发现,最大池化要比平均池化慢很多,效果也不如平均池化好。所以,池化的方式我们尽量选择平均池化。
2.CNN卷积核的设计
卷积的大小,遵守奇数设计原则,如【1,3,5,7】
3.CNN和RNN网络输出到全连接层数据shape的确定
两个网络最终都要接一个全连接,你一定要保证输入全连接网络的shape是二维的,即(?,网络最终抽取特征的维数),“?”表示是batch的大小,后面是维数。
这样无论你接下来如何处理,如两个网络的特征拼接,还是能够保持相同的shape,那么直接输入到全连接层就可以了。
4.RNN网络中,深度和方向的考虑
input的方向性 - 单向或双向
深度 - 单层或多层
类型– RNN,LSTM或GRU
目前的RNN网络,最多也就是两层。
5.embeddings加入位置信息
数据表示时,对于字符、单词、句子信息
6.加入注意力机制
虽然RNN网络能够捕捉长时信息,但毕竟能力有限,在对待全局时序信息时需要我们引入注意力机制,可以显著提高模型的准确率。无论你的模型效果如何,引入注意力是一个不错的选择。
我们摒弃之前的固有思维,不再依赖于递归神经网络和卷积神经网络,转而使用一种更为简单的网络架构来做序列变换,即注意力机制的序列变换器(Transformer)。
在大部分任务中,注意力机制通常和递归神经网络联合起来使用。
在这种情况下,远距离计算序列中的依赖性关系就会变得非常困难。在我们提出的转换器结构中,我们对序列中的位置进行注意力加权,然后取均值,因此运算量可以被缩减为固定数。不过这种操作的显著弊端在于加权求均值的操作,会在一定程度上牺牲运算的精度,需要级联多级注意力机制进行精度补偿。
所谓 Self Attention,其实就是 Attention(X,X,X),X 就是前面说的输入序列。也就是说,在序列内部做 Attention,寻找序列内部的联系。
7.Transformer网络
完全抛弃了CNN, RNN,全部使用注意力来实现。值得注意的是,Feed Forward网络用到了1维卷积,增加卷积核的数量,对模型的提高帮助很大。这点需要注意。
8.NLP任务,去停用词对训练模型的影响
文本中一般都会有噪声,我们需要去停用词,目前来看停用词表内容有大有小,到底选取哪一个来作为停用词表,需要根据实际训练的情况来考虑。目前我正在尝试,给出一个结论。
优秀的预处理确实可以提高模型的精度,停用词表越大,去掉的停用词越多,留下的信息就越有用,模型表现的越好。提高停用词表的质量,可以整体提升模型的2到3个点
9.向网络中引入残差
Transformer网络中,用到了残差计算,也是提高优化性能的方式之一
10.Layer Normalization
对每一层做normalization,可以很快滴提高网络的收敛速度。transformer网络本身就没有用LSTM,在加上使用了normalization,让模型训练变得非常快,往往在5个epoch就可以达到比较好的效果
11. BERT和ELMO的比较
在特征抽取器选择方面,elmo选择了LSTM;bert选择了Transform。很多研究已经证明,transform提取特征的能力要远远强于LSTM.
elmo这种使用双向拼接融合特征的能力可能比bert一体化的特征融合方案要弱
12.训练数据集的长度截取标准
由于模型的限定,输入到模型的数据长度要求是定长的,输入长度的选取也是要讲究的,我们要观察数据长度的分布,找出一个合理的长度。
长度过长,那么较短的样本就会引入过多的padding符号。但这一点可以弥补,transformer网络能够将padding进行mask,这些信息不会有干扰。
长度过短,有些信息就会丢失,对模型来说缺乏有更为表征的样本。
这样看来,选取的长度稍微长一点,效果会好。但这样也会更耗时些。
这里需要注意的一点,padding的方式有在句前和句后做padding,个人认为将padding放在句前效果会好一些,就是所谓的“冷启动”
13.各类模型优劣总结
待续