神经网络调参总结

做卷积神经网路方面的研究。大抵是:

                                                    1、复现别人的网络,得不到相同的表现。

                                                    2、自己的网络调参,结果调不上去。 

所以有一些调参的tricks,在这里学习记录一下,然后加上一些自己的理解。

影像神经网络效果的因素可能有但不限于以下几点:

          (1)学习率调节      (2)优化器      (3)初始化方法      (4)标签平滑       (5)归一化


                                                 学习率

                                       

好的学习率可以让调参过程事半功倍,那么什么是好的学习率呢,

                      source:https://sgugger.github.io/how-do-you-find-a-good-learning-rate.html

好的学习率应该是有利于网络学习到参数的,或者说损失函数能够得到有效的降低。对于这幅示意图来说就是,需要函数能够快速的到达谷底。如果学习率太大,就可能会直接错过最低点。如果学习率太小,就可能学得太慢,同样也不可取。

那么应该如何选取初始值呢?

                                        

                      source:https://sgugger.github.io/how-do-you-find-a-good-learning-rate.html

像这幅图一样,你可以去尝试不同的初始学习率,然后可以以5-10轮的训练为标准,比较最终的学习效果。这一点在吴恩达的深度学习专项课程中也有提到过,就是如何去寻找超参数的合适值。一般学习率可以从0.1-10-8或者更大的范围去搜索,可以每次  缩小十倍。

这样做的好处有,你可能会找到一个能够快速收敛的学习率。

但请注意,快速并不等于最终结果最优。

一些流行的学习率调整方法有:

                                                                            循环学习率

                                 

从图中可以看到,我们可以选取获得较好学习效果阶段的学习率,进行循环的调整,有一点多尺度学习的意思。

                                                                       

                                                                  热启动的随机梯度下降(SGD)

循环学习率是讲述的总体学习率调节技巧,然而如果我们不使用预训练的网络,我们应该如何开始我们的网络学习过程呢,就有  学者提出热启动的概念1.

没有仔细读论文,但是大致的意思就是刚开始网络经过初始化之后,需要经过一定的调整之后才能达到一个快速学习的状态(当然这是实验结论),需要经过一些柔性的学习率调节之后就能达到一个更加好的初始化状态,这可以看作是对网络初始化的一个  补充。

                                

 

                                                                   超级收敛(super convergence)

这里的超级意思是,学习率超级大,比以往研究中证明出来可用的学习率更大。在这种学习率下,网络仍然可以收敛的现象2,    比如:

                                      

不过对我的影响太大,数据集没那么大,总的训练时间最多也就30h, 可能在大数据下这种快速收敛有奇效。

不过论文里也指出,这种现象只针对部分的学习器和部分的网络结构,不过看起来确实很快收敛了。

                                

 

                                                                            批大小(mini-batch)

批大小如何影响网络学习的呢?第一印象就是我们可以选取任意大的批大小,最好就是full batch,这样理所当然应该有更好的效果。因为这样梯度会更加的符合实际损失函数的梯度,减少噪音。然而实验表明,梯度是一方面,损失函数的实际情况是一个方面,大批量更新梯度的方法容易让损失函数陷入到局部最优解3,而小批量的话就给模型的梯度更新引入了一些不确定性,就使    得网络有可能跳出局部最优解,这样和模拟退火有点相似。

                                        

那么办法还是有的,既然你想要又快,又好,那么肯定要动点脑筋了,那么从哪个点下手呢,结论还是学习率,看来学习率还真  是强大呀。

 

                                                                     使用小批量调整学习率

在训练的初始阶段使用较低的学习率,我想这应该也是要让网络能够获得一个更好的初始化

                             

                             

以上是在认真检查过数据的输入和输出的情况下的方法。因为又一次我遇到了训练一个分割模型,分割的dice系数到了0.6,怎么也上不去。最后可视化之后才发现,原来是数据处理有问题,训练的label和测试的label不一致。还有就是对数据进行augmentation时,一是要选择增强的方法,有些能用,有些不能用。另外就是对增强后的图像进行可视化,检查增强后的训练数  据和测试数据是否一致。

 


                                     激活函数的意义

在生物意义上的神经元中,只有前面的树突传递的信号的加权和值大于某一个特定的阈值的时候,后面的神经元才会被激活。简单的说激活函数的意义在于判定每个神经元的输出

                                                                         

有没有达到阈值。

 

放在人脸识别卷积神经网络中来思考,卷积层的激活函数的意义在于这一块区域的特征强度如果没有达到一定的标准,就输出0,表明这种特征提取方式(卷积核w)不能在该块区域提取到特征,或者说这块区域的这种特征很弱。由于输出0时,激活函数梯度几乎都为0,所以在特征很弱的区域,梯度几乎不下降,也就是说,和该特征无关的区域不会影响到该特征提取方式的训练。

反过来说,如果没有激活函数,就算特征很弱时,仍然可以得到输出,后面的层次继续把这个输出当成一个特征使用,这是不合理的。为了形象起见,我们做个比喻,本来我们可能希望在这个区域看到一个圆形,但是这里却是一个三角形,如果该三角形和我们期望看到的圆形形状相差很大的时候神经元的输出WX+B很小,我们就不希望输出值去衡量这个三角形有多不圆,而是希望输出这里没有一个圆形(对于分类问题而言,有多不圆对于我们的分类没有意义,因为我们是通过了解到形状的组合来判定人脸  属于哪一类,验证问题同理)。

个人理解这也是激活函数要非线性的意义。

 

                                               Sigmod与tanh

                             

  Sigmoid.

Sigmoid 非线性激活函数的形式是σ(x)=1/(1+e−x),其图形如上图左所示。之前我们说过,sigmoid函数输入一个实值的数,然后将其压缩到0~1的范围内。特别地,大的负数被映射成0,大的正数被映射成1。sigmoid function在历史上流行过一段时间因为它能够很好的表达“激活”的意思,未激活就是0,完全饱和的激活则是1。而现在sigmoid已经不怎么常用了,主要是因为    它有两个缺点:

1、Sigmoid**容易饱和,并且当输入非常大或者非常小的时候,神经元的梯度就接近于0了,从图中可以看出梯度的趋势。这就使得我们在反向传播算法中反向传播接近于0的梯度,导致最终权重基本没什么更新**,我们就无法递归地学习到输入数据了。另外,你需要尤其注意参数的初始值来尽量避免这一情况。如果你的初始值很大的话,大部分神经元可能都会处在饱和的状态而把  梯度kill掉,这会导致网络变的很难学习。

对于这一点,我个人的理解就是对于数据特别小的时候,梯度确实应该接近0(等于0就不好了),理由如上所述,数据特别大的  时候,梯度不应该接近0。就像Relu函数做的那样。

 

2、Sigmoid 的输出不是0均值的,这是我们不希望的,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in f=wTx+b),那么对w求局部梯度则都为正,这样在反向传播的过程中w  要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。

当然了,如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。

(个人认为,如果使用SGD,则Batch训练仍然不能达到上面说的效果,所以sigmod使用SGD效果不好。)

 

Tanh.

Tanh和Sigmoid是有异曲同工之妙的,它的图形如上图右所示,不同的是它把实值得输入压缩到-1~1的范围,因此它基本是0均值的,也就解决了上述Sigmoid缺点中的第二个,所以实际中tanh会比sigmoid更常用。但是它还是存在梯度饱和的问题。Tanh是    sigmoid的变形:tanh(x)=2σ(2x)−1。


                                                      RELU

                            

它的数学表达式是:

                                                                               f(x)=max(0,x)

ReLU的优缺点如下:

优点1:Krizhevsky et al.在ImageNet Classification with Deep Convolutional

Neural Networks 提出使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(如上图右)。有人说这是因为它是linear,而且梯度不会饱和。

为什么线性不饱和,就会收敛的快?反向传播算法中,下降梯度等于敏感度乘以前一层的输出值,所以前一层输出越大,下降的  梯度越多。该优点解决了sigmod的问题1的一部分

优点2:相比于 sigmoid/tanh需要计算指数等,计算复杂度高,ReLU 只需要一个阈值就可以得到激活值。

 

缺点1: ReLU在训练的时候很”脆弱”,一不小心有可能导致神经元”坏死”。举个例子:由于ReLU在x<0时梯度为0,这样就导致负的梯度在这个ReLU被置零,而且这个神经元有可能再也不会被任何数据激活。如果这个情况发生了,那么这个神经元之后的梯度就永远是0了,也就是ReLU神经元坏死了,不再对任何数据有所响应。实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都坏死了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。

这个缺点类似sigmod问题1的另一部分,也就是说,如果在训练中某一次下降的太快,会导致该卷积核对要提取的特征要求过      高,形象的说,就是变成了一个“完美主义”卷积核,所有形状都入不了它的眼,这样这个神经元就没用了,坏死了。

 

                                                  leaky ReLU

Leaky ReLU.  

Leaky ReLUs 就是用来解决ReLU坏死的问题的。和ReLU不同,当x\<0时,它的值不再是0,而是一个较小斜率(如0.01等)的函数。也就是说f(x)=1(x\<0)(ax)+1(x>=0)(x),其中a是一个很小的常数。这样,既修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。关于Leaky ReLU 的效果,众说纷纭,没有清晰的定论。有些人做了实验发现 Leaky ReLU 表现的很好;有  些实验则证明并不是这样。

Leaky ReLU相当于对sigmod问题2有一定改善,更主要的是解决了ReLu的坏死问题,让坏了的神经元可以自我慢慢恢复,但是  坏处就是,如果a过大,会丢失作为激活函数的原意。

我认为,Leaky ReLu的作用肯定是有的,但是既有好处也有坏处,关键在于a值的把握。

 

PReLU.

对于 Leaky ReLU 中的a,通常都是通过先验知识人工赋值的。然而可以观察到,损失函数对a的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢? Kaiming He 2015的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不仅可以训练,而且效果更好。原文说使用了Parametric ReLU后,最终效果    比不用提高了1.03%.

Randomized Leaky ReLU. Randomized Leaky ReLU 是 leaky ReLU 的random 版本, 其核心思想就是,在训练过程中,a是从    一个高斯分布中随机出来的,然后再在测试过程中进行修正。

                            

                                                    maxout

假设我们网络第i层有2个神经元x1、x2,第i+1层的神经元个数为1个,如下图所示:

                                                            

(1)以前MLP的方法。我们要计算第i+1层,那个神经元的激活值的时候,传统的MLP计算公式就是:

                                                                               z=W*X+b

                                                                                out=f(z)

其中f就是我们所谓的激活函数,比如Sigmod、Relu、Tanh等。

 

(2)Maxout 的方法。如果我们设置maxout的参数k=5,maxout层就如下所示:

                                                

相当于在每个输出神经元前面又多了一层。这一层有5个神经元,此时maxout网络的输出计算公式为:

                                                                            z1=w1*x+b1

                                                                            z2=w2*x+b2

                                                                            z3=w3*x+b3

                                                                            z4=w4*x+b4

                                                                            z5=w5*x+b5

                                                                  out=max(z1,z2,z3,z4,z5)

所以这就是为什么采用maxout的时候,参数个数成k倍增加的原因。本来我们只需要一组参数就够了,采用maxout后,就需要有  k组参数。

我的理解是,本来只能提取一类特征,现在提供五类特征提取方式,选择其中最符合一类。

                                                                           

那么可以分析得知:

优势是具有上述的恢复能力,而且恢复的是最接近的一个特征提取方式,由于有五个备选,那么虽然是线性,但是对整体系统影响不那么大。

 

<think>嗯,用户想了解神经网络参数调整的顺序和策略,也就是最佳实践。首先,我得回忆一下相关的知识,比如BP神经网络的训练过程,参数调整的步骤,以及常见的优化方法。用户提到的引用里提到了学习率、权重初始化、正则化、优化器等,这些都是参数调整的关键点。 首先,参数调整的顺序应该从影响最大的超参数开始。通常学习率是最重要的,因为它直接影响梯度下降的步长,太大容易震荡,太小收敛慢。然后可能要考虑批量大小,批量大小影响梯度的稳定性和训练速度。接下来是网络结构相关的参数,比如层数和隐藏单元数,这决定了模型的复杂度。正则化参数比如L2的lambda或者dropout率,防止过拟合。然后优化器的参数,比如动量或者Adam中的beta参数。最后是学习率衰减策略,比如步长和衰减率。 然后,策略方面,需要分阶段调整,先调结构参数确定模型容量,再调优化参数提升收敛效率,最后调正则化防止过拟合。另外,使用验证集监控过拟合情况,早停法可以防止训练过久。还有,自动化的方法比如网格搜索、随机搜索或者贝叶斯优化,不过引用1里提到网格搜索在DNN中效率低,所以可能需要推荐随机搜索或者更高级的方法。 用户可能想知道具体步骤,比如先调什么后调什么,如何判断是否需要调整某个参数。例如,如果模型在训练集上表现差,可能需要增加层数或单元数;如果验证集表现差,可能需要加强正则化。同时,学习率的预热策略或自适应优化器如Adam可能对初始训练有帮助。 还要注意引用中的内容,引用2提到了学习率、权重初始化、正则化、早停等,这些都是参数调整的一部分。引用3提到了BPTT,虽然主要是RNN,但参数更新的流程类似,需要前向传播保存中间状态,反向传播更新参数。因此,在调整参数时,要考虑不同层的学习率是否不同,或者是否使用梯度裁剪。 可能还需要提到一些实际技巧,比如使用学习率范围测试,或者在训练过程中动态调整学习率。另外,批量归一化也可以视为一种参数调整的策略,虽然它更多是网络结构的一部分,但会影响其他超参数的选择。 总结下来,回答的结构应该是先顺序,再策略,结合引用中的内容,给出具体的步骤和注意事项,并生成相关问题。需要确保LaTeX格式正确,数学表达式用$...$,独立公式用$$...$$,比如学习率的更新公式可能需要独立显示。同时,问题部分要围绕参数调整的顺序、策略、具体方法、自动化工具等展开。</think>### 神经网络参数调整顺序与策略 #### 一、参数调整的核心顺序 1. **学习率(Learning Rate)** 学习率是影响模型收敛速度和稳定性的核心参数。初始值通常设置为 $10^{-3}$ 到 $10^{-2}$,并通过验证集观察损失下降情况。若损失震荡,需降低学习率;若下降过慢,则适当提高[^2]。 2. **批量大小(Batch Size)** 批量大小直接影响梯度估计的稳定性。较小的批量(如32、64)适合数据量少或噪声较多的情况,较大的批量(如256、512)适合数据分布均匀的场景。需与学习率配合调整:批量增大时,学习率可适当提高[^2]。 3. **网络结构参数** - **隐藏层数与单元数**:从浅层网络(如2-3层)开始,逐步增加复杂度。若训练集表现差,可增加层数或单元数;若验证集表现差,需减少复杂度或引入正则化。 - **激活函数选择**:如ReLU适用于大多数场景,Sigmoid/Tanh适用于输出层或特定任务。 4. **正则化参数** - **L2正则化系数(λ)**:初始值设为 $10^{-4}$,根据验证集过拟合程度调整。 - **Dropout率**:一般从0.2-0.5开始,层神经元较多时可适当提高。 5. **优化器参数** - 动量(Momentum):常设为0.9,用于加速梯度下降。 - Adam优化器参数(β1, β2):通常保留默认值(0.9, 0.999),仅在特殊任务中微调。 6. **学习率衰减策略** 例如,指数衰减公式: $$ \eta_t = \eta_0 \cdot e^{-kt} $$ 其中 $\eta_0$ 是初始学习率,$k$ 为衰减率,$t$ 为训练步数。 --- #### 二、参数调整策略 1. **分阶段调整** - **第一阶段**:固定其他参数,优先优化学习率与批量大小。 - **第二阶段**:调整网络结构(深度/宽度)以匹配任务复杂度。 - **第三阶段**:引入正则化(如Dropout、L2)防止过拟合。 2. **验证集监控与早停** 当验证集损失连续多个epoch未改善时,触发早停(Early Stopping),避免无效训练[^2]。 3. **自动化调参工具** - **随机搜索**:比网格搜索更高效,尤其在超参数维度较高时[^1]。 - **贝叶斯优化**:基于历史评估结果动态选择下一组超参数。 4. **梯度分析** 通过检查梯度幅值(如使用TensorBoard)判断参数更新是否合理: - 梯度接近0:可能学习率过小或网络初始化不当。 - 梯度爆炸:需梯度裁剪(Gradient Clipping)或降低学习率[^3]。 --- #### 三、最佳实践示例 1. **初始配置** ```python model = Sequential([ Dense(128, activation='relu', kernel_initializer='he_normal'), Dropout(0.3), Dense(10, activation='softmax') ]) optimizer = Adam(learning_rate=1e-3) model.compile(optimizer=optimizer, loss='categorical_crossentropy') ``` 2. **调整流程** - 若训练损失不降:尝试增加网络宽度(如256单元)或深度(如4层)。 - 若验证损失上升:添加L2正则化(λ=1e-4)或提高Dropout率至0.5。 - 若收敛速度慢:将学习率调整为3e-4,或改用带动量的SGD(momentum=0.9)。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值