神经网络常见名词小结

作者:u013599693

若发现有违反侵权地方,请通知我删除!谢谢

Preprocess_data(数据预处理)

数据预处理具有很重要的意义,由于直接得到的数据具有很大差异性,数据的归一化有利于算法达到最优的效果。不同的数据具有不同的数据特性,其预处理技术也不一样。以图片为例,会对图像进行平均归一化处理。常用的有mean image(图像均值法)和mean channel(通道均值法)。Mean image: 对所有图片求平均值得到mean image,再利用每张图片减去均值图像进行中心化处理。优点:图片整体数据归一化。缺点:当图片数量过大,存在溢出的风险,且计算量较大。(AlexNet 采用过此方法)Mean channel:每张图片的三通道分别求通道平均值得到一个(x’,y’,z’),使该图片每个像素点减去该值得到一副处理后的图像。优点:计算量小,不存在计算溢出,图像处理主流预处理方法。缺点:整体归一化不如Mean image,但对实验结果几乎没有影响。(VGGNet 采用)。


Weights and Bisas Initialization(权值的初始化)

权值初始化的好坏直接影响到模型训练的好坏。一个坏的权值设置可能会导致网络不收敛。权值设置是一个经验问题,一般来说,权值的设定不能太大,太大容易导致参数爆炸(深层网络时层层累加最后结果会boom),这个问题在sigmoid,tan(h(x))等激活函数中还会导致网络不收敛。详细参考激活函数。权值也不能设置全相同或全0。这样会导致输出的网络中每个神经元得到相同的梯度。常规的做法是采用Xavier init,即通常采用(0,1)之间较小的元素来初始化权值。 权值矩阵通常为: W = 0.01*np.random.randn(D,H);其中randn()表示产生标准的正太分布随机数,D,H为矩阵表示矩阵的大小D。这样使得每个神经元的权重向量被初始化为多维的高斯随机抽样向量,所以,神经元在输入空间中指向具有随机性,具有更好的鲁棒性。当然这不是最好的权值初始化方法,在不同的学习特征和激活函数中,权值的初始化方法也不同。偏置矩阵b的设置,在一般的过程设置中经常把b初始化为0.原因是在权重初始化中提供了权重的对称性。但是在人们使用relu激活函数,为了确保不使大量的神经元初始化后输出为0经常将b初始化为0.01。


activeFunction(激活函数)从网络结构方面来讲,激活函数的作用是引入非线性的作用来使数据可分,没有激活函数网络仅是一个线性分类器。从数据角度来讲:激活函数的作用是把数据映射到高维的空间中进而使数据变得线性可分。激活函数的目的不是为了想去激活什么,重点在函数,函数即映射,而是如何把激活的神经元的特征通过函数的特征把其映射出来(保留需要的特征)它是神经元处理非线性可分数据的关键。下图是神经元基本结构。设输入为矩阵X(x0,x1,x2…xn),权值矩阵为W(w0,w1,w2….wn),所以神经元本体的输入值为矩阵


经过激活函数f得到其输出值为f(T)。


  再简单举个实例来了解下激活函数的功能,如下图二所示,下面数据不能线性可分。为了能把它分开,设计一个激活函数其中a是激活阈值。同时设计一个网络如图3所示。


分别将A,B,C,D四个点的坐标输入进去,我们可以得到如下的表

因此,从第三层的输入,这样我们可以在空间上将其表示出来。从图4可以看到,我们很容易找出一个平面将ABCD分为BC 和 AD两部分。从这个角度看激活函数是一种映射,是非线性的因素变得线性可分。

从第三层的输出来看,这就是所说的分类了,bc分为0类,ad分为1类,其在平面上的表示如图所示。从这方面可以看出,激活函数是提供非线性因素。使分离面拟合分类数据。


下面介绍几种经典的激活函数:


此函数值域处于(0,1)之间,并不中心对称。且两段趋于平滑,函数处于饱和状态。当值处于两段时,梯度趋于0,很难下降。会造成梯度消失。由于映射趋于过于饱和,导致信息会丢失。

2.改进的Sigmoid:tan(h(x)),这个函数处于(-1,1)之间,且中心对称。但是仍旧没有解决饱和问题,收敛速度较慢。

3.Relu:较常使用的激活函数,也是现在主流的激活函数。其数学表达式为:f(x) = max(0,x);如下图所示:



优点:

收敛较快,只有梯度为0和1两种情况;在正半轴方向没有饱和区域。梯度不会消失。

缺点:

不是中心对称,不是理想的模型,输出均值不接近零。

2.    前向传播时没有被激活的神经元在bp时,它会被kill掉。不会进行参数的调整。

为了修正Relu失活问题,减少神经元在训练中不被激活的情况,有设计出了Leaky-Relu和PRelu,前者是后者的特例,PRelu 的数学表达式如下。

4.PRelu : f(x) =max(ax,x); 其中a处于(0,1),当a = 0.01时是leakyRelu.。

其中不同层之间的a可以不同,a的值也是出于动态更新的。其更新公式如下所示:

其中u为动量,e为学习率

不断更新a,会把a推向于0。但有实验表明,PRelu和Relu的实验结果几乎没有啥影响。

5.ELU 这更是一个比较神奇的激活函数。其激活函数数学表达式如下所示:


其函数图像:

图 ELU激活函数图

右侧现行部分是ELU能缓解梯度消失,左侧软饱和让ELU对输入变换和噪声变得更有鲁棒性,ELU的输出均值为0.接近于理想模型,收敛更快。

以上只是提出的集中较为常见的激活函数,其它激活函数还有maxout,cRelu等等。激活函数的选取对网络是否收敛有着重大影响,因此要慎重选择。


Gradient descent(梯度下降)

梯度下降是一个最优化算法,梯度下降目的是寻找函数的极小值点。能找到极小值点的原因是负梯度方向是函数值下降最快的方向(泰勒公式展开),这里涉及到一个求凸函数的最小解的问题。值得注意的是,并非所有的数据集我们都能求得最优解,即达到损失函数最少的那个解。现在的梯度下降方法只是在求一个最优化的近似解。且不断提升其下降收敛的速度。这里介绍几种常见的梯度下降的方法。

Batch gradient descent(整体梯度下降):每一次参数的更新都要利用全部的训练数据集来计算损失函数的梯度。当数据样本够大时,整体梯度下降会变得十分缓慢。

Stochastic gradient descent(随机梯度下降):SGD,它在执行梯度下降时只随机从训练样本中挑选部分来参与到损失函数的梯度计算中。这是一种抽样思想,以部分代替整体。但可能会造成造成局部最优的解。其数学表达式如下:

 其中 u为学习率(learning_rate),为在t时刻的梯度, 为调整的方向大小,为t时刻的向量。
 注意:针对SGD的局部最优问题其实在拥有大量数据集的网络中中这个问题不会出现的很明显。梯度图出现的将不再是沟壑,而更像是一个碗,虽然这个碗的底部并非是圆滑的,存在多个局部最优值,但其得到的最后的损失函数值是相近的。因此局部最优影响不大。

Momentum(动量法):SGD存在一个缺点,更新的方向是完全依赖于当前的选取的样本batch的方向。因此会存在反复的震荡,Momentum是对SGD的算法的一个优化,即在上一次梯度下降的方向基础上进行梯度方向的微调整。其数学表达式如下所示。

其中mu是一个超参数,一般设置为0.9左右, 为t时刻的梯度方向,d 为此刻batch的梯度方向。这个表达式可以用物理来理解:假设有一个钟摆,其运动有惯性,来回摆动,但是在摆动过程中存在有摩擦力。其摩擦系数为mu,同时为了使其停下来,对其施加一个的力,其造成的加速度为learning_rate。所以我们可以理解这是在最初选取的样本的方向上增加一个便宜的加速度用来修正其下降方向。

此外还存在AdaGrad, AdaDelta ,牛顿法,RMSProp等梯度下降的方法。

Dropout

Dropout的思想是在每层的反馈中随机的灭活一些神经元参与本轮的权值参数的调整。这样做的目的是防止过拟合。实验者在研究中发现,表示一个图像的特征其实并不需要所有的神经元来表示,同时本轮灭活一些神经元参与进梯度的求和可以减少网络对本张图像特征的依赖,进而可以学习更多的特征来表示目标物体。换个角度看,我们也可以发现随机灭活一些神经元相当于对每张图片构建了一个各自的小的学习网络。我们的网络其实就是有这些小的网络组成的大的网络。Dropout的使用大大的提高了网络的泛化性和鲁棒性。


Batch Normalization

思想:在网络的每一层输入的时候,又插入了一个归一化层(均值为0,方差为1),也就是先做一个归一化处理,然后再进入网络的下一层。

但这样在A中所学习到的特征,被强制归一化处理,标准差限制在1内后被破坏,于是为了能保留所在本层所学习到的特征,作者引入了可学习参数 ,其公式如下所示:


这样每个神经元都存在一对参数。其中

Batch Normalization的前向传导公式就是:


BN处理后的层,在training过程中存在mini-batch的概念,但是在测试阶段