训练神经网络

在选择数据时,我们可以选择一次性使用全部的数据进行训练,但是这样的计算量太大,还可以选择每次选择一个数据进行计算,但是这样容易受到噪音的干扰,因此我们希望采用一种更加折中的方式,即采用小批量随机梯度下降法。

这样既没有那么震荡,也没有那么大的计算量。

激活函数选择

sigmod

  • 梯度消失问题

可以看到当$ x $过大或过小时,很容易造成梯度消失的问题,这不利于对于参数的调整。

  • 不关于$ 0 $对称问题

  • 指数运算问题

在进行指数运算时容易产生很大的计算开销。

tanh

$ \tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} $,实际上是关于$ sigmod $函数的变型,也就是$ tanh(x)=2sigmoid(2x)-1 $。

避免了不关于原点对称的$ zig-zag $问题,但仍存在梯度消失问题。

ReLU

关于$ ReLU $激活函数具有不饱和,计算快,收敛快这一系列优点,但是它仍具有不关于$ 0 $对称,并且在$ x<0 $的情况下它的输出为$ 0 $。

由于这个函数在$ x<0 $时梯度为$ 0 $,因此会出现一种$ Dead\ ReLU $的问题,即当输入为负时,梯度为0。这个神经元及之后的神经元梯度永远为0,不再对任何数据有所响应,导致相应参数永远不会被更新。

这种情况可能是由于初始化不好,或者学习率过大导致改变幅度过大到一个$ Dead \ ReLU $的地方再也出不去。为了解决这个问题通常加上一个偏置项在初始化中,避免开始就进入了$ Dead\ ReLU $。

Leaky ReLU

对于前面的$ ReLU $的神经元梯度为$ 0 $的问题,我们可以使用$ Leaky\ ReLU $的方式。

ELU

进一步使得输出接近关于$ 0 $对称,但同时指数的运算也带来了较大的运算量。

Maxout

通过在两个神经元后面再加上一层神经元,其中有$ k $个神经元,参数个数也成$ k $倍增加。

总结一下,多使用$ ReLU $,但是要注意它的学习率,不要在中间层使用$ sigmod $函数,可能是因为计算量太大还会有$ zig-zag $问题。

数据预处理

+ 标准化处理

通过标准化,使其分布更加均匀,关于标准正态的解释可以使用中心极限定理解释,原始分布在$ n $足够大时近似为正态分布。

  • 主成分分析

首先通过主成分分析将数据转化在一个二维空间中,再进行标准化,这也被称为$ PCA $白化,然后将其重新变回之前所在的维度,这被称为$ ZCA $白化。

权重初始化

我们可能认为由于最终都有梯度下降进行迭代,那么无论怎么进行权重初始化都没有什么影响,但是实际上。如果我们给同一层的神经元一个相同的值,那么对于相同的输入,相同的权重,自然会导致相同的输出,相同的反向传播梯度,相同的更新,那么无论我们具有多少神经元本质上都是仅仅只有一个,因此权重初始化是一个很重要的问题。

当初始化的权重过小时,输出全部都分布在$ 0 $这个地方,那么就会导致梯度为$ 0 $。

当权重增大时,输出不全为$ 0 $,但是激活函数的导数全部为$ 0 $,那么梯度也为$ 0 $。

为了使得输入的方差和输出的方差相同,我们可以使用$ Xavier $的方式进行权重初始化。

使用将权重的方差设置为符合$ (0,\frac{1}{d}) $的正态分布,也就可以保证输入的方差和输出的方差相同(但是上面的图我还是有些看不明白,既然保持不变那么为什么还会减小,直到最后几层才保持不变,是因为没有考虑激活函数的影响吗)

对于不是关于$ 0 $对称的$ ReLU $,可以使用$ Kaiming $初始化的方法。

批量归一化

在进行深层的神经网络训练中,顶层的梯度很大,但是越往下层的梯度就越小,因此底层的收敛速度就很慢,因此在底层进行收敛的时候导致顶层原本学习好的数据重新学习,这无疑是低效的,因此我们希望可以每层的输出和梯度都保持在一个固定的分布。

具体的就是计算每个小批量的均值和方差,方差计算中需要加上一个$ \epsilon $,避免计算时分母为$ 0 $的情况。同时可能标准正态分布并不满足要求,因此可以使用$ \gamma,\beta $来调整方差和均值。

当作用在输出上时,这个批量归一化的操作需要在激活函数之前,因为如果先进行了非线性的改变在进行批量归一化,例如$ ReLU $将很多输出都设置为$ 0 $,这时的意义不是很大。

当作用在输入时,这个批量归一化对于全连接来讲就是对于每一个特征计算对应的均值和方差,对于卷积层来讲就是将每个通道维的全部像素点作为样本,因此每个通道维就是特征,计算每个通道维的均值和方差。

对于批量归一化到底是在做什么不太好判断,一开始认为是减少内部变量的转移,后来又认为是在小批量中加入噪音。

批量归一化通过固定均值和方差,然后加上可调整的偏移和缩放,这样做可以使得训练加快,但是无法改变模型的精度本身。

优化算法

SGD

在开始介绍了梯度下降,随机梯度下降,小批量随机梯度下降这三种方法,但是对于这些方法来讲,除了使用全部数据的梯度下降,都存在震荡的情况。

更有甚者,可能会出现陷入局部最优点,鞍点的情况,对于这种情况,可以考虑加上一个动量。

SGD+Momentum

即不是仅仅使用梯度本身,而是使用一个$ v_t $,使用$ v_t={\beta}v_{t-1}+g_t $,这样展开的话就是一个平滑的梯度,其中的$ \beta $作为一个超参数,当批量较大时也可以设置一个较大的$ \beta $,这样可以考虑更多的数据。

Nesterov Momentum

刚刚使用的$ Momentum $的方法很好用,但是还可以更好的改进,尽然要使用$ v_t $,那就使用加上$ v_t $之后的梯度,向前看一步,显然使用$ a $这个梯度是要好于$ b $的。

图中的点标注有点错误,应该是$ X_t+1 $。

AdaGrad

在$ AdaGrad $中使用了对梯度进行惩罚的方式,但是因为$ grad_squared $是一个累加和,随着这个数的越来越大在后面的更新可能会越来越慢。

$ RMSProp $

为了解决上面的问题,引入了一个$ decay_{rate} $进行衰减,通过这个值选择保留多少之前的$ grad_squared $。

Adam

上面的$ Momentum $考虑了之前的累加和,$ AdaGrad $即考虑了对较大的梯度进行惩罚,现在将这两种方法加在一起就有了$ Adam $优化算法。

但是这个的第一动量和第二动量在开始的时候都起不到什么作用,因此可以进行优化。

开始的时候$ t $很小,因此$ 1\ -\ beta1\ ^{**}\ t $的值就很小,因此$ first_unbias $就很大,使得这个值在开始的时候不会不起作用,随着时间的累积,这个值和原本的$ first_moment $自然越来越接近。

上述提到的这些都是仅使用一阶导函数,还可以使用二阶导函数的牛顿法进行优化。

Author

yzd

Posted on

2024-10-19

Updated on

2024-11-19

Licensed under