zoukankan      html  css  js  c++  java
  • 深度学习中网络设计的几点经验

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

      

    待续

  • 相关阅读:
    python处理字符串类型的公式并计算结果
    Python之sklearn学习
    查看python安装的包
    Qt配置Qwt
    Qt开启C++线程里并访问界面
    Matlab的nargin、nargout
    sql获取行数
    C++/QT打印当前行文件名和行数
    QString::number保留小数
    Qt:setGeometry: Unable to set geometry 2170x1017+0+23 on QWidgetWindow/'MainWindowWindow
  • 原文地址:https://www.cnblogs.com/demo-deng/p/10188771.html
Copyright © 2011-2022 走看看