深度学习中网络设计的几点经验

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. 各类模型优劣总结


本文转自:博客园 - 今夜无风,转载此文目的在于传递更多信息,版权归原作者所有。
原文链接:https://www.cnblogs.com/demo-deng/p/10188771.html

推荐阅读