2017CS231n笔记_S6训练神经网络(上)

目录

S6.1前言

S6.2激活函数(Activation Functions)

S6.3数据预处理(Data Preprocessing)

S6.4权重初始化(Weight Initalization)

S6.5批归一化

S6.6训练过程监控

S6.7超参数优化(Hyperparameter Optimization)


S6.1前言

在训练网络之前,如何选择激活函数,怎样做数据预处理,权重初始化,正则化,梯度检查。在训练时,如何监控学习过程,权重的更新,如何进行超参数优化。训练结束后,模型的评估与集成问题等等。上述这些问题将会在S6和S7上进行讲解。


S6.2激活函数(Activation Functions)

常见的激活函数有:

  • Sigmoid(x):该函数将数字压缩到[0,1]之间。历史上很流行,因为它们有一个很好的解释,就是一个神经元的饱和“放电率”。缺点:在函数的两端存在梯度消失的问题;该函数的输出是非零中心,输出全为正的,则参数W上的梯度是全正或者全负,则梯度要么正增长,要么负增长。但这样的话,梯度更新十分低效;exp()计算(指数计算)的计算代价稍微有点高。
  • tanh(x):该函数将数字压缩到[-1,1]之间。优点:该函数的输出是以0为中心的。缺点:当饱和时(输入特别大或者特别小),梯度会消失。
  • ReLU(x):全称为"Rectified Linear Unit"。优点:在正区间不会饱和;计算高效;收敛速度相比sigmoid和tanh更快;从生物学上而言是更合理的。缺点:函数输出是非零中心;在负区间,当饱和时,梯度会消失。网络中多达10%到20%的部分是一些挂了的ReLU单元,大多数使用ReLU的网络都有这个问题。 
  • Leaky ReLU(x)优点:不会饱和;计算高效;收敛速度相比sigmoid和tanh更快;梯度不会消失。
  • PReLU(x):全称为"Parametric Rectifier"。该函数表达式为f(x)=max(\alpha x,x)\alpha是一个参数,不需要设置它,也不用对它进行硬编码,它是一个可以反向传播和学习的参数。优点:具有ReLU的优点。
  • ELU(x):全称为"Exponential Linear Units"指数线性单元。相关论文[Clevert et al.,2015]。优点:具有ReLU的优点;输出均值接近0。缺点:在负区域饱和。
  • Maxout(x)优点:泛化ReLU和Leaky ReLU;不会饱和,梯度不会消失。

上述函数的图形如下图所示。

 在实际运用中,每个激活函数都有特定的优点和缺点。需要在实验中依据结果来判断哪个函数的效果更好。而且在实验中,可能会对函数进行修正以及提出新的想法等等。不过,还有一些可参考的经验,如下图所示。


S6.3数据预处理(Data Preprocessing)

机器学习中预处理的方法:零均值化,归一化(标准化),PCA和白化。零均值化操作使得数据均值为0。该操作是为了避免输入数据都是正的。当输入数据都为正时,会导致低效的梯度更新问题。归一化使得数据分布均值为0,方差为1。该操作是为了使所有的特征在相同的值域内,并且这些特征的贡献相同。这样会使得模型对权重的变化不那么敏感,模型更容易优化。这里需要提醒的是,在神经网络中,若某一层的输入均值不为0或者方差不为0,那么该层权重矩阵的微小变化就会造成该层输出的巨大变化,从而造成学习困难。上述预处理方法的效果如下图所示。

在卷积网络中对图像一般采用的预处理方式:仅零均值化。因为在大部分情况下,图像的每个位置有相对可比较的范围与分布,因此没必要归一化太多。进行零均值化时,先从训练集中得到均值mean,然后在训练集,验证集,测试集中减去mean。例如对CIFAR-10的预处理方法有两种,如下图所示。channel表示通道,例如图像有R,G,B通道。


S6.4权重初始化(Weight Initalization)

使用0进行权重初始化:输入数据后,每个神经元做相同的操作,输出相同的数值并得到相同的梯度,因此它们会用相同的方式更新权重。那么网络中的神经元完全相同,它们会做相同的事情。

选取较小的随机数:从某个概率分布中抽样,例如从标准高斯分布中抽样。抽样之后,进行缩放,就能得到很多小的随机数。该方式打破了参数对称问题。这样的参数在小型网络中适用,但不适用于更深的网络。因为在更深的网络中,层的输出会趋近0,梯度也会变成0,权重将不会更新,网络就不会学习。

选取较大的随机数:和选取小的随机数相比,不同的地方是在进行缩放的时候,调整缩放参数,使得随机数较大。但当激活函数为tanh,sigmoid等等,该方法会导致饱和,使得梯度消失(变为0),权重将不会更新,网络就不会学习。

Xavier初始化:来自论文[Glorot et al.,2010]。该方式是一种合理的初始化方法。如果有较少的输入,将除以较小的数,从而得到较大的权重。如果有很多的输入,想要更小的权重,以便让它在输出中得到相同的传播。但问题是,当使用类似ReLU激活函数时,由于ReLU会“消除一半的神经元”,因此它实际上会将方差减半。那么就不会得到正确的方差,而是一个特别小的值。接着,层的输出会趋近于0,从而影响网络的梯度下降和权重更新。该问题可以尝试使用论文[He et al.,2015]的方法(除以2)来解决。


S6.5批归一化

如果想要单位高斯激活,以及控制饱和的程度,就进行批归一化(Batch Normalization,BN)。BN能够改进网络的梯度流图;能够允许更高的学习率;能够减少对权重初始化的依赖。在网络中加入BN,训练会更加容易。BN首先对输入数据进行归一化处理,将输入转化为符合单位高斯分布的数据,这样是为了避免饱和。之后再对数据进行缩放和偏移,这是为了控制饱和程度。缩放和偏移参数会在训练过程中进行学习。BN算法如下图所示。关于BN更多信息请参见论文[loffe and Szegedy,2015]。

批归一化层是指对每层的输出数据进行批归一化操作,使得每一层的输入数据/输出数据符合高斯分布。批归一化层一般在全连接层或者卷积层之后,非线性激活之前。在卷积层之后的批归一化层,是在每个激活映射图上进行BN处理。


S6.6训练过程监控

  1. 检查损失函数是否正确;
  2. 先从训练集中选择20个样本,进行网络训练。如果数据拟合得很好,再在整个训练集上进行训练;
  3. 选择最优的学习率。

在训练过程中,要观察随时间变化的损失函数曲线和准确率曲线。


S6.7超参数优化(Hyperparameter Optimization)

超参数(例如学习率)的调优方法有三种参:Grid Search,Random Search,Coarse to fine search(粗细粒交叉搜索)。Random Search在理论上更优越,它可以对超参数空间覆盖的更好。粗细粒交叉搜索过程是:首先是选择相当分散的数值进行coarse调参,这样会发现一个较好的参数区间。然后在该区间搜索更精确的值,进行fine调参。在调参时,在训练集上进行训练,在验证集上进行验证,来进行参数的调优。


发布了71 篇原创文章 · 获赞 6 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/KKALL1314/article/details/104138540
今日推荐