欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

模型结构设计

发布时间:2024/8/1 编程问答 75 豆豆
生活随笔 收集整理的这篇文章主要介绍了 模型结构设计 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1. 模型学习能力

1.1 模型深度(隐藏层数量)

理论上来讲,只要隐藏层内具有足够的神经元数量(层宽度),仅含一个隐藏层的神经网络就足以对最复杂的输入特征做出准确预测。但对复杂特征来说,深层网络的参数效率要显著高于(具有更多神经元的)浅层网络。

因为:与浅层网络相比,深层网络可以使用更少的神经元对复杂函数进行建模,且每层习得不同抽象层次的数据特征,从而更快地收敛到一个更好的解,并同时具有更好的泛化性能。所以模型设计中,更倾向于先增加隐藏层的数量,然后再调整每个隐藏层中的神经元数量,来获得合适输入特征复杂度的模型学习能力

1.2 模型宽度(隐藏层中的神经元数量)

一般来讲,隐藏层中的神经元数量越多,模型的学习能力越强,可以解析更复杂的输入特征。对于含有多个隐藏层的神经网络,不同隐藏层中的神经元数量常见:塔状结构和桶装结构两种设计方案。

塔状结构中,每一层的神经元数量越来越少,因为它认为:许多低层特征可以合并成更少的高层特征。桶装结构中,所有隐藏层使用同样的神经元数量,它与塔式结构相比,减少了需调整的超参数数量,且在大多数情况下二者表现效果相似。

所以,目前神经网络中,基本均采取桶式结构(模型宽度只需调整一个超参数)(塔式结构很大程度上已被放弃,但不排除未来复活的可能性)。

2. 梯度稳定性

2.1 初始化策略

神经网络中常见的参数初始化方法,如下表所示1

初始化方法最适合的激活函数基于正态分布的实现(normal)基于均匀分布的实现(uniform)
Constant---
Random-η=0,σ2=1\begin{matrix} \eta = 0, & \sigma^{2} = 1 \end{matrix}η=0,σ2=1−r=−1,r=1\begin{matrix} -r = -1, & r = 1 \end{matrix}r=1,r=1
Glorot(Xavier)None、tanh、sigmoid(logistic)、softmaxη=0,σ2=1/fanavg\begin{matrix} \eta = 0, & \sigma^{2} = 1 / fan_{avg} \end{matrix}η=0,σ2=1/fanavg−r=−3/fanavg,r=3/fanavg\begin{matrix} -r = -\sqrt{3/fan_{avg}} , & r = \sqrt{3/fan_{avg}} \end{matrix}r=3/fanavg,r=3/fanavg
HeReLU、Leaky ReLU、RReLU、PReLU、ELUη=0,σ2=2/fanin\begin{matrix} \eta = 0, & \sigma^{2} = 2 / fan_{in} \end{matrix}η=0,σ2=2/fanin−r=−6/fanin,r=6/fanin\begin{matrix} -r = -\sqrt{6/fan_{in}} , & r = \sqrt{6/fan_{in}} \end{matrix}r=6/fanin,r=6/fanin
LeCunSELUη=0,σ2=1/fanin\begin{matrix} \eta = 0, & \sigma^{2} = 1 / fan_{in} \end{matrix}η=0,σ2=1/fanin−r=−3/fanin,r=3/fanin\begin{matrix} -r = -\sqrt{3/fan_{in}} , & r = \sqrt{3/fan_{in}} \end{matrix}r=3/fanin,r=3/fanin
Orthogonal---

神经网络的偏差bias)参数,默认采用全 0 常数(Constant)初始化方法,一般情况下这已可满足模型需要,很少需要调整这一超参数。

神经网络的权重(weights / kernel)参数,默认采用Glorot初始化(也称Xavier初始化)策略,它在增强训练过程中的梯度稳定性的同时,也可显著加快模型训练速度。当使用 ReLU 及其变体作为激活函数时,改用 He (权重)初始化策略,可取得更好的梯度稳定性效果,但这也会影响(减慢)模型训练速度2

循环神经网络的状态权重(recurrent_kernel)参数初始化时,必须采用 Orthogonal 方法,以避免沿时间步方向传播过程中的梯度消失现象

2.2 激活函数

神经网络中,常用的激活函数可分为饱和激活函数和非饱和激活函数两大类,其中非饱和激活函数有助于缓解训练过程中的“梯度消失”问题,如下表所示:

分类激活函数改善梯度消失效果运算速度适用场景
饱和Sigmoid一般-
饱和tanh一般-
非饱和ReLU一般-
非饱和LeakyReLU较高较高-
非饱和RReLU较高较高存在过拟合
非饱和PReLU较高较高大训练数据集
非饱和ELU一般-
非饱和SELU一般顺序架构网络3

一般来讲,ReLU是目前首选(默认)的激活函数,因为它速度最快(许多软件库和硬件减速器都对其提供了特定优化)且梯度消失改善效果可满足绝大多数任务的需求;在观测到 ReLU 陷入负值“死区”后,可改用 LeakyReLU 及其变体类激活函数。对 LeakyReLU 的偏转角度 α\alphaα 来说,通常 0.01 或 0.2 都是不错的取值,可根据具体实验结果选定。

2.3 归一化

批量归一化(Batch Normalization)和层归一化(Layer Normalization)是两种常用的归一化方法,它们可有效改善训练过程中,由数据大小量级差异引起的梯度不稳定现象(梯度消失和梯度爆炸)。

二者的差异主要在于数据归一化的方向不同,批量归一化主要消除不同样本间数据大小量级间的差异,层归一化主要消除同一个样本内不同时间步间数据大小量级间的差异。图像处理任务中,批量归一化的效果好自然语言处理任务中,层归一化的效果更好

2.4 梯度裁剪

梯度裁剪是缓解梯度爆炸的另一种主流技术。它常用于循环神经网络,因为在RNN类网络中难以使用批量归一化。对于其他类型的神经网络,批量归一化通常就已足够好了。

3. 避免过拟合

目前主流的神经网络正则化方法有提前停止(Early Stopping)、l1l_{1}l1l2l_{2}l2 正则化和 Dropout 三种。其中,提前停止应用于改进模型训练策略,l1l_{1}l1l2l_{2}l2 正则化为损失函数添加正则化惩罚系数,Dropout 改进模型结构。神经网络中,常用 Dropout 代替 l1l_{1}l1l2l_{2}l2 正则化起到防止过拟合的作用,并在训练过程中配合提前停止(Early Stopping)一起使用。

Dropout 的原理是:在每个训练步骤(step)中,每个神经元(包括输入层神经元,但不包括输出层神经元)都有暂时“删除”的概率p4,这意味着这个训练步骤(step)中该神经元被完全忽略,但在下一步中仍可能处于活动状态。

采用 Dropout 技术后,每个训练步骤(step)中的网络结构都不相同(因为共有 2N2^{N}2N 种可能的网络结构,其中 N 是可以 dropout 的神经元总数),因此经过 dropout 训练的神经元不能与其相邻的神经元相互适应,必须自己发挥最大的作用,且不能过分依赖少数神经元的作用,而要必须关注到每一个神经元对预测结果的影响;这显著提高了模型的鲁棒性,使其对输入的微小变化不太敏感,有更好的泛化能力


  • 其中:
    r=3σ2r = \sqrt{3\sigma^{2}}r=3σ2
    fanavg=(fanin+fanout)/2fan_{avg} = (fan_{in}+fan_{out})/2fanavg=(fanin+fanout)/2
    faninfan_{in}fanin 是待初始化层输入向量的维度
    fanoutfan_{out}fanout 是待初始化层输出向量的维度(它也等于该层网络的神经元数量,即层宽度) ↩︎

  • 更多关于初始化策略和激活函数的信息可参阅《机器学习实战》的11.1.1节(P295页) ↩︎

  • 在非顺序架构网络(如RNN类网络)中,ELU的效果可能会优于SELU(因为SELU在 z=0 处不光滑) ↩︎

  • 超参数 p 称为dropout率,通常设置在 0.1 到 0.5 之间;
    循环神经网络中,常设置在 0.2 到 0.3 之间;
    在卷积神经网络中,常设置在 0.4 到 0.5 之间;
    特别注意,当 p=0.5 时神经元的权重需要特殊处理,详见《机器学习实战》的第233至234页。 ↩︎

  • 总结

    以上是生活随笔为你收集整理的模型结构设计的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。