希望这篇随笔能够从一个实用化的角度对ML中的标准化方法进行一个描述。即便是了解了标准化方法的意义,最终的最终还是要:拿来主义,能够在实践中使用。
动机:标准化的意义是什么?
我们为什么要标准化?想象我们有一个Data Matrix $\mathbf{X}\in \mathbb{R}^{n\times d}$ 我们首先必须要做的事情就是对这个Data Matix进行标准化,意义是:“取消由于量纲不同、自身变异或者数值相差较大所引起的误差。”这个解释还不是很明白,那么我们可以想象如果不进行标准化会发生什么。首先这个Data Matrix $\mathbf{X}$ 的每一行就代表了一个样本,我们需要利用这些样本feature之间的差异来完成我们的机器学习任务,such as regression and classification。接着我们就要使用不同的算法和模型来完成我们的任务,如果你直接对把这些raw data喂给模型。那么一个可能出现的情况就是模型参数的爆炸或者消失,同时训练速度可能会相当慢。这种情况的影响我的理解是很容易造成样本特征的模糊或者消失,虽然我们仍然能够对模型进行训练,但是效果可能非常不好。
好了,现在我们理解了标准化的意义,那么一个可能的思索是这样的:既然我们对原始数据进行了标准化处理,那么假如来了新数据我们应该咋办?要知道我们训练模型的目的是为了泛化,我们训练了一个模型之后该对付新来的数据呢,比如:使用标准化之后的模型训练了一个分类器,现在又来了一个样本,显然它没办法直接用我们训练的模型进行分类(因为我们的模型是用标准化之后的数据处理的鸭)。我的想法是,有两种方法:1. 在对数据矩阵标准化的时候记录下标准化参数,当有新的数据喂给模型的时,先要对这个数据进行一样的标准化处理。2. 我们用标准化后的数据训练了一个模型,模型参数为$\mathbf{W}_{N}$,能够用这个模型参数倒推“不进行标准化”的模型参数$\mathbf{W}$。这样我们获得了一个trained original model。这个模型能够直接处理不进行标准化的数据。很显然,第一个方法要比第二个方法简单通用的多。
最常用的标准化方法:Z-score and Max-Min Normalization
wikipedia上有一个表格,记录下了标准化的方法:
Name | Formula | Use |
---|---|---|
Standard score | Normalizing errors when population parameters are known. Works well for populations that are normally distributed[2] | |
Student's t-statistic | the departure of the estimated value of a parameter from its hypothesized value, normalized by its standard error. | |
Studentized residual | Normalizing residuals when parameters are estimated, particularly across different data points in regression analysis. | |
Standardized moment | Normalizing moments, using the standard deviation | |
Coefficient of variation | Normalizing dispersion, using the mean | |
Min-Max Feature scaling | Feature scaling is used to bring all values into the range [0,1]. This is also called unity-based normalization. This can be generalized to restrict the range of values in the dataset between any arbitrary points |
其中最最常用的两个就是Min-Max Feature scaling和Standard score(也叫Z-score),原理和功能可以点上面的链接了解,下面介绍一下实现的步骤和一些坑。
Z-score
按如下方法标准化Data Matirx矩阵的每一列 $\mathbf{x}_i$ of $\mathbf{X}(1\leq i\leq d)$:(这里解释一下为什么是按列标准化:数据矩阵的每一列就代表了样本的每一维,我们想通过标准化来更好的处理该维度的特征,可以想想按行标准化是什么效果:make no sense)$$z_{ij}\leftarrow \frac{x_{ij}-\text{mean}(\mathbf{x}_i)}{\text{std}(\mathbf{x}_i)}$$
其中$x_{ij}$代表$\mathbf{x}_i$的第$j$个条目,同样的$z_{ij}$代表$\mathbf{z}_i\in \mathbb{R}^n$的第$j$个条目,$\mathbf{\overline{Z}}=(\mathbf{1},\mathbf{z}_1,\cdots,\mathbf{z}_d)\in \mathbb{R}^{n\times(d+1)}$, mean和std就是按列求每一列的均值啦,我们接下来处理$\mathbf{\overline{Z}}$这个矩阵就好了~~为什么这里会多一维呢?你可能已经知道这个多出来的一叫做dummy variable,我的理解是它一方面可以简化我们的模型表达,一方面提供了一个相当相当广义的正则化处理,降低了噪声的影响(当然这是我见过的大部分模型的需要,需要灵活处理,思想懂了就简单)。
Min-Max Feature scaling
这个标准化方法在我看来就非常的简单粗暴了,方式如下:$$z_{ij}\leftarrow \frac{x_{ij}-\text{min}(\mathbf{x}_i)}{\text{max}(\mathbf{x}_i)-\text{min}(\mathbf{x}_i)}$$
其中$x_{ij}$代表$\mathbf{x}_i$的第$j$个条目,同样的$z_{ij}$代表$\mathbf{z}_i\in \mathbb{R}^n$的第$j$个条目,$\mathbf{\overline{Z}}=(\mathbf{1},\mathbf{z}_1,\cdots,\mathbf{z}_d)\in \mathbb{R}^{n\times(d+1)}$, max和min是按列求每一列的最大和最小值。
实现中可能出现的问题:
假如我们的数据矩阵比较稀疏,可能会出现一整列都是0的情况。此时我们发现上面两个方法的分母都为0,出现除以0的情况,这时我们该怎么办?一个比较合理的想法是假如有一整列的0,我们可以标准化后保留。一列零还让它是一列零。那么我们可以对求得的分母加上一个epsilon,也就是一个小量,1e-8这样的量级。这样一列零的情况还是一列零,$\text{std}$ 或者 $\text{max}-\text{min}$不为0的情况也不会受影响。