深度学习建模训练总结(二):回顾全连接层和卷积层
最近秋招要准备面试,所以我就想着回顾一下之前学过的内容,同时也想结合这些内容,谈谈如何构建模型和训练优化模型。
之前简单介绍了一下如何训练模型,最后提到如果模型无法收敛,可能就要回到模型的结构进行分析,对于模型结构的分析,我认为有两点需要考虑的,第一,我们的场景、问题有什么需求,在构建模型的过程中是否需要根据这些需求设计合理的结构,第二,如何让模型降低损失、提高测试集准确率。
当我们谈论神经网络的结构时,有四个最经典也是最常用的结构:全连接层、卷积层、RNN和LSTM,这次我就想谈谈我对全连接层和卷积层的一些想法。
对于全连接层,我觉得这真的是最简单但是又最常用到的结构,用途很广泛,比如做图像分类的时候,可以先从CNN提取特征,最后压成一维向量再用全连接层做分类,比如我最近做的生物信息项目,我就用了全连接层对生物实体进行embedding。
在用到全连接层的时候,我主要考虑的问题就是,到底每一层的神经元数量怎么设置,要设置多少神经层(隐藏层),关于这点,我想先展示几个例子。
首先,我想介绍一下cover定理:将复杂的模式分类问题非线性地投射到高维空间将比投射到低维空间更可能是线性可分的。一个很经典的例子:
对于左图,我们是没办法用一条直线进行分类的,但是右图我们可以用一个平面实现效果较好的分类(不要误认为线性可分就是用一条直线分类,应该是用x=3之类的式子作为一个分类的依据,而x=3在二维空间表示为直线,在三维空间则表示为平面)。从这个例子我们就能看到,如果我们设置神经层的神经元数量比输入层的数量少,模型的层数可能就需要设置更多,才能达到较好的效果,相反,可能如果我们设置神经元的数量多于输入,就可能只需要一两层就能实现较好的分类效果。
第二个例子,我想说的是word2vec,这是一个word embedding算法,详细说比较麻烦,我们只需要知道它的输入是一个尺寸非常大的向量,比如10000,而第一层神经层,他设置的神经元数量一般是300,很明显,它的一个目的就是为了降维(除此之外还有其他目的)。
综合上面两个例子就能看出,其实用多少神经元,有时候是和实际情况相关的,也就是我一开始提到的,需要分析实际的场景、问题,根据实际情况进行判断。而对于模型的层数,我一般会从模型收敛的效果出发进行调整,一般来说,我会先简单写几层网络,看训练效果,再调整、对比,观察模型的损失、收敛的快慢、测试集的准确率等等指标,再进行分析判断。
说完全连接层,再来看看卷积层,和全连接层相比,卷积层既能处理一维数据(使用1*n的卷积核),也能处理高维数据,所以一般来说,对于一维以上的数据我都是使用卷积层处理分析,但是卷积层也有他的缺点,和全连接层相比,全连接层处理的是完整的输入,而卷积核每次计算的都是局部的数据,这就导致了,卷积核对于全局特征的提取能力较弱(关于这一点之前的文章我有详细的介绍,当然,也可以构建深层网络,但是也要考虑训练数据是否足够,是否存在梯度消失等问题),除此之外,我觉得更直观的一个问题是使用了卷积层会导致训练和推理的速度变慢,而且随着层数增多越明显。
对于全连接层和卷积层,能够深入探讨的内容不多,但我认为这两个结构真的可以称得上是神经网络的起点和精髓,后续的发展,其实目的只要有两个,一个是改善多层神经网络的梯度爆炸(消失)问题,另一个是对于某些问题,需要修改模型的结构才能进行分析(比如变长序列的处理、目标检测)。