在机器学习回归问题,以及训练神经网络过程中,通常需要对原始数据进行中心化(零均值化)与标准化(归一化)预处理。
目的:通过中心化和标准化处理,最终得到均值为0,标准差为1的服从标准正态分布的数据。
原理:
中心化(又叫零均值化):是指变量减去它的均值。其实就是一个平移的过程,平移后所有数据的中心是(0,0)。
标准化(又叫归一化): 是指数值减去均值,再除以标准差。
零均值化:
为什么要零均值化?
- 人们对图像信息的摄取通常不是来自于像素色值的高低,而是来自于像素之间的相对色差。零均值化并没有消除像素之间的相对差异(交流信息),仅仅是去掉了直流信息的影响。(很多情况下我们对图像的照度并不感兴趣,而更多地关注其内容,虽然图像被零均值化后变成了一团黑,但是可能计算机好理解了)
- 数据有过大的均值也可能导致参数的梯度过大。
- 如果有后续的处理,可能要求数据零均值,比如PCA。
假设数据存放在一个矩阵 X 中,X 的形状为(N,D),N 是样本个数,D 是样本维度,零均值化操作可用 python 的 numpy 来实现:
X -= numpy.mean(X, axis=0)
即 X 的每一列都减去该列的均值。
对于灰度图像,也可以减去整张图片的均值:
X -= numpy.mean(X)
对于彩色图像,将以上操作在3个颜色通道内分别进行即可。
归一化(Normalization)
为什么要归一化?
归一化是为了让不同维度的数据具有相同的分布规模。
假如二维数据数据(x1,x2)两个维度都服从均值为零的正态分布,但是x1方差为100,x2方差为1。可以想像对(x1,x2)进行随机采样并在而为坐标系中标记后的图像,应该是一个非常狭长的椭圆形。
对这些数据做特征提取会用到以下形式的表达式:
S = w1*x1 + w2*x2 + b
则:
dS / dw1 = x1 , dS / dw2 = x2
由于x1与x2在分布规模上的巨大差异,w1与w2的导数也会差异巨大。此时绘制目标函数(不是S)的曲面图,就像一个深邃的峡谷,沿着峡谷方向变化的是w2,坡度很小;在峡谷垂直方向变化的是w1,坡度非常陡峭。
因为我们期望的目标函数是这样的:
而现在的目标函数可能是这样的:
这样的目标函数是非常难以优化的。因为w1与w2的梯度差异太大,在两个维度上需要不同的迭代方案。但是在实际操作中,为了简便,我们通常为所有维度设置相同的步长,随着迭代的进行,步长的缩减在不同维度间也是同步的。这就要求W不同维度的分布规模大致相同,而这一切都始于数据的归一化。
一个典型的归一化实现:
X /= numpy.std(X, axis = 0)
在自然图像上进行训练时,可以不进行归一化操作,因为(理论上)图像任一部分的统计性质都应该和其它部分相同,图像的这种特性被称作平稳性(stationarity)。(注意是同分布,不是独立同分布)
下图中以二维数据为例:左图表示的是原始数据;中间的是中心化后的数据,数据被移动大原点周围;右图将中心化后的数据除以标准差,得到为标准化的数据,可以看出每个维度上的尺度是一致的(红色线段的长度表示尺度)。
引用: