# 网络结构设计的思考
实践中,我们除了结合任务直接选用一些经典神经模型做验证,有时也需要对网络结构做设计优化。网络结构的设计需要考虑的2个实质问题是:
- 神经单元应该如何连接?
- 需要有多少神经元?
### 神经单元应该如何连接?
也就是神经网络基本的架构如何设计,有两种设计思路:
- 将人类先验嵌入到模型结构设计 例如,基于图像任务的平移不变性的卷积假设设计的CNN,或者基于语言的递归性质的递归假设设计的RNN。对于先验知识,可以凭借经验做网络结构设计无疑是相对高效的,但太多复杂经验的注入,一来不够“优雅”,二来如果经验有误,设计的结构可能就失效了。
- 通过机器动态学习和计算出的结构 如神经网络架构搜索(NAS),常见的搜索方法包括:随机搜索、贝叶斯优化、进化算法、强化学习、基于梯度的算法。
### 需要有多少神经元?
神经网络由输入层、隐藏层与输出层构成:
- 输入层:为数据特征输入层,输入数据特征维数就对应着网络的神经元数。
- 隐藏层:即网络的中间层,其作用接受前一层网络输出作为当前的输入值,并计算输出当前结果到下一层。隐藏网络神经元个数直接影响模型的拟合能力。 -输出层:为最终结果输出的网络层。输出层的神经元个数代表了分类类别的个数(注:在做二分类时,如果输出层的激活函数采用sigmoid,输出层的神经元个数为1个;如果采用softmax分类器,输出层神经元个数为2个是与分类类别个数对应的;)
对于网络的输入层、输出层的神经元通常是确定的,主要需要考虑的是隐藏层的深度及宽度,在忽略网络退化问题的前提下,通常隐藏层的神经元(计算单元)的越多,模型有更多的**容量**(capcity)去达到更好的拟合效果。
搜索合适的网络深度及宽度,常用有人工调参、随机搜索、贝叶斯优化等方法。这里有个引申问题:
### 增加神经网络宽度vs深度的效果有什么差异呢?
1、拟合效果上,增加深度远比宽度高效 同等效果上,要增加的宽度远大于增加的深度。在Delalleau和Bengio等人的论文《Shallow vs. Deep sum-product networks》中提出,对于一些特意构造的多项式函数,浅层网络需要*指数增长*的神经元个数,其拟合效果才能匹配上多项式增长的深层网络。
2、参数规模上,增加深度远比宽度需要的参数少

以上图神经网络为例,将单层宽度增加3个神经元,会新增6个与之相连前后层的权重参数。而直接新增一个3个神经元的网络层,只会新增3个的权重参数。
3、 功能上,深度层功能类似于“生成特征”,而宽度层类似于“记忆特征” 增加网络深度可以获得更抽象、高层次的特征,增加网络宽度可以获得更丰富的特征。
当然,深度和宽度并不是完全对立的关系,增加深度和宽度都是在增加可学习参数的个数,从而增加神经网络的拟合能力,在网络设计需要追求深度与广度的平衡。