天天看点

卷积神经网络调参

卷积神经网络调参

1、adagrad_adam

卷积神经网络调参

(1)受初始学习率的影响很大

比如初始化的学习率比较大,这样不管是用随机梯度下降还是动量梯度下降,都会导致最后整个模型的梯度爆炸,使得它不收敛。

(2)每一个维度的学习率一样

α值是针对全局来设的,并不是针对每一个参数做个性化定制的,如果是针对一个稀疏的问题来说,这个问题就比较明显。会使得无法学习到稀疏数据上的有用信息。

稀疏数据:回顾神经元结构,神经元结构是w向量和x向量做内积,然后经过一个激活函数,在这里,先将w,x当做标量(一个数)来看,当给w求导数的时候,根据链式法则,最后得到的导数是x,所以当输入是0的时候,那么它的参数更新(导数)也是0,对于一个稀疏数据来说,它的很多值都是0,在很多时候它是得不到梯度的更新的,我们在多数的数据上都能够得到梯度更新,在这个时候为了让多数数据得到的更新更好,所以会将学习率调小。但是在这个时候,稀疏数据还没有学到足够多的信息。所以说,在这个时候,将learning-rate调小了,会导致在稀疏数据上的梯度不够大,所以使得模型在稀疏数据上因为学习率过小而学不到足够多的信息。所以最好的情况是给每一个维度都设置一个不一样的学习率,使得它能够个性化的去更新参数。

老师解答:对于学习率的分析,更多时候我们是定性的而不是定量的。

对于这个点来说,可能的原因是:因为有稀疏数据的存在,所以在遇到稀疏数据的时候,对应的梯度会变大,这可能也会导致在密集特征上的梯度也变大,这就有可能使得在密集数据上多次迭代得到的较好的结果又被迫偏移。所以我们要调小学习率。

AdaGrad算法:梯度衰减

思想:梯度有积累值(以往梯度的平方和),用以往梯度的平方和做学习率的分母。

使得学习率摆脱了对初始值的依赖。

卷积神经网络调参

Regularizer:分母

每个分量上的梯度是不一样的

卷积神经网络调参
卷积神经网络调参

RMSProp:将分母的平方和变成平方的均值。

卷积神经网络调参
卷积神经网络调参

Adm是一个集众家之长的算法,所以在平时训练中,我们一般会采用Adm算法。

Momentum:梯度的加权平均

RMSProp:平均的平方值作为分母

卷积神经网络调参
卷积神经网络调参
卷积神经网络调参

学习率自适应:通过自己设置的方法调整学习率

α0:学习率初始值

t: 迭代次数

k: 系数

则,α随训练次数的增多而变小。

卷积神经网络调参

优化算法选择技巧

什么时候使用什么算法?

1、例如,广告点击率预估业务,可以使用学习率自适应方法去做。

2、随机梯度下降的最终效果相对于自我调整的(Adm,AdaGrad)会比较好。

       如果想让随机梯度下降获得比Adm,AdaGrad更好的效果,需要更好的初始化,更好地去调整learning rate。

卷积神经网络调参

2、激活函数到调参技巧

激活函数的不同会导致神经网络的训练速度是不一样的。神经网络最后能达到的效果也是不一样的。

Sigmoid:输出均值:0.5,输出均值非0对神经网络的学习是不友好的。

卷积神经网络调参

Sigmoid

Sigmoid:输出均值:0.5,输出均值非0对神经网络的学习是不友好的。

卷积神经网络调参

Tanh

卷积神经网络调参

ReLU

”很大的梯度流过神经元" 的意思就是指 该神经元相关的参数被梯度下降算法更新了一次。

比如原来的参数可能是:[-10, 5, 7], 然后突然来了一个梯度是[-100, -100, -100], 这样参数就更新成了 [-110, -95, -93]。 然后如果接下来的收到的数据都是[a, b, c], 其中a, b, c >=0, 这个时候神经元的输出恒为0,于是,不会再有梯度传回来。因而参数得不到更新,也就变成了dead cell了。

卷积神经网络调参

Leaky-ReLU

卷积神经网络调参

ELU

卷积神经网络调参

Maxout

卷积神经网络调参

使用这些激活函数时的技巧:

  1. 因为relu的导数比较大,每个都是1(大于0的情况下),所以learning rate要设一个比较小的值。
  2. Tanh优点输出均值是0,但是计算量会比较大。
卷积神经网络调参

3、初始化卷积神经网络

卷积神经网络调参

激活值:神经元经过激活函数后的输出

如果激活值的分布是在一个固定的区间内,例如(-1,1)或(0,1),则认为是一个好的初始化结果。

如果激活值是集中在一个固定的值,例如0, 1,则认为不好。

因为:各个参数的值是不同的,希望对每一个参数都有一个比较好的梯度更新。每一个参数的梯度计算和它在之前各层的激活值是相关的。所以激活值不一样,就代表最后的梯度可能是不一样的。所以就能使得每个参数都能达到一个比较好的梯度,然后达到一个比较快的学习过程。

其他的初始化方法:一般的初始化方法都是在均值是0,方差是某个数的正态分布去随机初始化所有的参数。

卷积神经网络调参

各层激活值的分布:

(梯度大概是由激活值乘以一个数得到的,所以当激活值集中为0时,就代表各个参数的梯度都是0)

原因:方差太小

卷积神经网络调参

方差太大:

卷积神经网络调参

Xavier-tanh

W用下面的方法初始化,保证了各层激活值的分布

卷积神经网络调参

但是:一个好的初始化方法,并不是对所有激活函数都有效!如下:

卷积神经网络调参

上述证明:在tanh上表现的好,在relu上表现的不好。

改进:He-ReLU

He-ReLU

卷积神经网络调参

批归一化(BN)

为了使每一层上激活值的分布比较统一,在每一层得到激活值之后,做一个归一化的处理。这个归一化的处理就是,减去均值,除以方差,就能把这一层激活值的分布控制在均值是0,方差是1的分布上。

问题:在每一个batch上做normalization,这样的做法会导致当数据量很大时,每个batch并不能反映整个数据的分布,所以说在这个时候,可能本来卷积神经网络已经对每个样本提取出来了具体的特征,但是做归一化之后,可能使这种特征变得在批与批之间不能够区分出来特定的样本了。

γ和β是逆归一化的参数,需要神经网络学习。当归一化没有起作用时,做了逆归一化的操作之后,可以保证原来提取的特征是有效的。(代码使用中,加一个层次就可以)

卷积神经网络调参

数据增强

能够达到增加数据的效果,防止过拟合。

卷积神经网络调参
卷积神经网络调参

更多调参技巧

正则化是机器学习中防止过拟合的方法。(一个神经网络的容量是由它的非0参数个数决定的,参数过多,会导致过拟合。解决:在损失函数上加正则化项)

当所有的梯度都比较小的时候,就说明神经网络快训练完了,如果梯度还比较大,说明还需要将继续训练,才能收敛。

了解当前的学习率是多少,如果学习率特别低,就认为网络快训练完了,或者说这种优化方法已经不能使得网络继续训练下去了。如果还想继续训练的话,可以手动的把学习率调上来。

卷积神经网络调参

可视化方法调参:

卷积神经网络调参

这几种训练集和测试集的损失值随着训练次数的变化图,都分别反映了一个什么样的训练过程的状态?

1、损失值比较大,说明没有学到东西,因为它没有收敛,可能它学习到的梯度并没有真正反映数据的规律。原因可能是learning rate比较大。

2、过拟合

3、更严重的过拟合

4、相较2,3的陡峭,4以平缓的速度在下降,训练的速度不够快,需要调整学习率。且继续训练,已达到收敛的效果。

5、初始化时没有初始化好,导致刚开始训练时训练的比较慢。

6、很有可能把梯度加反了,(把梯度往大的方向去加了),或者说是优化目标设错了。(设成了它的相反值),所以就把一个最小化问题变成了一个最大化问题。

卷积神经网络调参

fine-tune

不仅使用别人论文中的网络结构,甚至还使用他们的参数进行初始化。Fine-tuning是指:基于他们的参数进行初始化后,再去微调这个参数,使得它符合我的数据集。Fine-tuning是最有效的初始化方法。

卷积神经网络调参

继续阅读