李飞飞计算机视觉课程CS213n课程笔记

训练神经网络的细节part1

数据预处理Data Preprocesing


数据预处理就是假设你有一个二维原始数据团,并且数据团是以(2,0)为中心的,这就意味着我们们要让每一个特征值减去均值。
在机器学习中,你会发现有人对数据进行归一化处理。在每个维度上除以标准差进行标准化,或者确保每个维度最大值和最小值在-1到1之间。有很多种归一化方法,但在图像处理中并不常用,因为你不用区分不同的特征,在图像中所有特征都是像素,而且取值在0到255之间,所以图像处理中归一化并不常用,但零中心化应用很多。
机器学习应用中,数据存在协方差,你可以应用PCA算法把协方差矩阵变成对角矩阵,或者你可以进一步处理,对数据进行白化处理,那意味着在PCA处理后,对数据进行压缩,使协方差矩阵变成单位矩阵,这是另一种比较常见的数据预处理形式。
关于这两种处理方式,我在课程笔记中做了详细介绍。我没有特别详细地介绍,是因为他们在图像处理中并没有应用。在图像处理中常见的是均值中心化处理,还有它的变种形式,在实践中应用更加方便。
在均值中心化处理过程中,数据是32*32*3的CIFAR图像,
减去均值图像
减去单通道均值,在红绿蓝三色通道中分别计算,更简单,因为只有三个数字,而不是一个矩阵。
李飞飞计算机视觉课程CS213n课程笔记

**函数


另一个我想提的是,Goodfellow提出的Maxout神经元,它非常普通,你会在学习神经网络时遇到它。一般来说,它是一个非常特别的神经元,不仅仅是**函数看起来不同,它实际上改变了计算的变量和计算方式,它不仅仅是w转置乘以x的函数,而是有两组权重。实际上计算的是w的转置乘以x加上b,与另一组w转置乘以x再加上b的最大值。最后你得到两个超平面,再作最大值运算,这就是神经元的运算。你会发现这些**函数有很多种应用方式。这种**函数中没有ReLU函数的一些缺点,不会出现神经元失活(dead),任然是分段性和高效率,但现在每一个神经元有两组权重,所以如果你在意两部的参数问题,那么这个方法也许并不理想。虽然有人在用,但我认为这个方法并不是很普遍,不得不说ReLU函数任然是应用最广泛的。

权重初始化Weight Initialization


如果把权重初始化为0,所有的神经元是一样的,在反向传播中他们的运算方式也是一样的,他们是完全对称的,所有的神经元进行相同的计算,在反向传播中计算相同的梯度等,所以不是最好的方式。
从标准差0.01的高斯公式中随机抽取,这就w的初始化方式。
我希望了解,隐含层的数据会如何,隐含层的神经元会如何**,我们着重关注均差和标准差。我们将均差和标准差用柱状图绘制出来,我们让所有的数据都通过网络,然后观察第五,第六或第七层上的权值,我们将用柱状图显示出来,使用这种初始化方法进行试验,你将会看到下面的结果:

一开始,我们的均值是0,标准差是1,在前向传播过程中。
我们观察数据经过10层网络之后的情况,我们使用tanh函数,tanh函数是关于原点对称的。所以均值会归于0左右,再看看方差的情况,一开始它是1,接下来的层中,它变成0.2,0.04,直到降为0。这些神经元的方差会降为0.
我们看看这儿的柱状图,一个一个来看,
01:50
 

训练神经网络的细节part2

SGD
Sgd更新参数的速度最慢,是什么原因导致它的速度如此之慢?
损失函数构成的平面,有个方向的长度远大于其他方向(每个方向Scale不一样),所以损失函数(偏导)在这水平方向比较浅显,垂直方向比较深,我们要根据合成的方向进行最小化,试图达到最小值。优化图中的损失函数,让它看起来水平和垂直方向都能达到要求,在水平方向进行比较缓慢,在垂直方向进展的很快。
 
补救这种情况的一种方式是动量更新