0


详解归一化、标准化、正则化以及batch normalization

文章目录

归一化、标准化、正则化、以及深度学习种经常看到的Batch Normalization分别是什么?用在哪?怎么用,以及各自的原理分别是什么?本文针对这些问题,进行对比分析,整体解析。

what(是什么)

  • 归一化,是对数据进行归一处理,处理的结果,从数据上看,会使得数据全部落在[0,1]的范围;从应用角度看,能够消除量纲的影响,也就是说,归一化在不同的特征之间进行,但可能涉及到一些反归一化的操作。
  • 标准化,主要改变数据的分布,处理结果,从数据上看,会使得数据服从标准正态分布;从应用的角度看,这种标准的正态分布能够加速模型训练,主要用在同一特征的特征数据上。
  • 正则化,是在机器学习中的损失函数中添加惩罚项,从数据上看,这种惩罚项会减小模型权重,通过减小权重,在应用中,能够降低有效防止过拟合。
  • 而深度学习中常说的Batch Normalization层则是数据标准化的一个更高级的具体实现。具体地,在标准化的基础上,对数据进一步的进行一个缩放和拉伸,以达到学习数据真实分布的目的。从数据上看,经过Batch Normalization层的后的数据,会呈现正态分布;从应用角度,该分布可以有效加速模型模型、防止梯度消失、防止过拟合的作用。

where(用在哪)

  • 归一化,主要用在存在多个特征,且多个特征之间量纲不一致的情况下,需要对数据进行归一化,以消除量纲带来的影响,尤其,当特征的数值范围变化较大时,或者算法对输入数据的数值范围敏感时,可以考虑归一化。
  • 标准化,主要在模型训练阶段,尤其当特征的分布偏差大或者算法对数据的分布敏感时,可以考虑标准化。
  • 正则化,主要用在机器学习的损失函数上。通过在损失函数上施加惩罚项,来降低模型复杂度,特别是在数据量不足或者特征数目较多时。

How(如何用&&原理)

归一化
实现方式
  • 最大最小归一化 将数据缩放到一个固定的范围,通常是[0, 1]或者[-1, 1]。
  1. ## 在 python 中实现最大最小归一化的操作import numpy as np
  2. defmin_max_normalize(data):
  3. min_val = np.min(data)
  4. max_val = np.max(data)
  5. normalized_data =(data - min_val)/(max_val - min_val)return normalized_data
原理

公式为:

  1. x
  2. =
  3. x
  4. m
  5. i
  6. n
  7. (
  8. x
  9. )
  10. m
  11. a
  12. x
  13. (
  14. x
  15. )
  16. m
  17. i
  18. n
  19. (
  20. x
  21. )
  22. x'=\frac{x-min(x)}{max(x)-min(x)}
  23. x′=max(x)−min(x)x−min(x)​, 其中,
  24. (
  25. x
  26. )
  27. (x)
  28. (x) 是原始数据,
  29. (
  30. x
  31. )
  32. (x')
  33. (x′) 是归一化后的数据,
  34. m
  35. i
  36. n
  37. (
  38. x
  39. )
  40. min(x)
  41. min(x)
  42. m
  43. a
  44. x
  45. (
  46. x
  47. )
  48. max(x)
  49. max(x) 分别是数据集
  50. X
  51. X
  52. X 的最小值和最大值。
示例说明

在许多机器学习算法中,如支持向量机(SVM)、k近邻(k-NN)等,距离度量是一个重要的因素。如果特征未经过归一化,具有较大范围值的特征可能会主导距离计算,导致模型偏向于某些特征而忽略其他特征。通过归一化,可以避免这种情况,确保每个特征对模型的贡献相对平等。
例子:

假设我们有一个数据集,包含两个特征:身高(单位:厘米)和体重(单位:千克)。身高的范围可能在150到190厘米之间,而体重的范围可能在50到100千克之间。如果我们不对这些特征进行归一化,身高和体重的值范围差异很大,可能导致机器学习模型在训练过程中对于体重的变化更为敏感,而对身高的变化不敏感。

通过归一化,我们可以将身高和体重都映射到 [0, 1] 的范围内,使得这两个特征的尺度相似。这样模型在训练时能够更平衡地考虑身高和体重对输出(比如预测健康状况)的影响,而不会被特征尺度的差异所影响。

标准化
实现方式
  • Z-score方法 调整数据分布,将数据拉到均值为0,方差为1的标准正态分布。
  1. import numpy as np
  2. defcalculate_z_scores(data):"""
  3. 计算给定数据集的Z-Scores(标准化)。
  4. 参数:
  5. data: numpy数组,包含要标准化的数据集。
  6. 返回:
  7. Z-Scores的numpy数组,与输入数据形状相同。
  8. """
  9. mean_data = np.mean(data)
  10. std_data = np.std(data)
  11. z_scores =(data - mean_data)/ std_data
  12. return z_scores
  13. # 示例用法
  14. X = np.array([1,2,3,4,5])
  15. Z_scores = calculate_z_scores(X)print("原始数据 X:", X)print("Z-Scores:", Z_scores)
原理

公式为:

  1. x
  2. =
  3. x
  4. m
  5. e
  6. a
  7. n
  8. (
  9. x
  10. )
  11. s
  12. t
  13. d
  14. (
  15. x
  16. )
  17. x'=\frac{x-mean(x)}{std(x)}
  18. x′=std(x)x−mean(x)​,其中,
  19. x
  20. x'
  21. x′为处理后的数据,
  22. m
  23. e
  24. a
  25. n
  26. (
  27. x
  28. )
  29. mean(x)
  30. mean(x)为数据的均值,
  31. s
  32. t
  33. d
  34. (
  35. x
  36. )
  37. std(x)
  38. std(x)为数据方差。经过处理,数据服从标准正态分布。
示例说明

假设我们的数据集如下:
特征1特征210200208003060040400
标准化后的数据集如下(保留一位小数):
特征1特征2-1.3-1.3-0.51.30.50.51.3-0.5
通过这种标准化,我们可以看到原始数据的不同尺度被调整到了相似的范围内,这样在进一步的分析和建模中,特征的权重和贡献度更容易理解和比较

正则化
实现方式

在损失函数中添加正则项,其中L1正则添加

  1. λ
  2. i
  3. =
  4. 1
  5. n
  6. w
  7. i
  8. \lambda \sum_{i=1}^{n} |w_i|
  9. λ∑i=1n​∣wi​∣,L2正则添加
  10. λ
  11. i
  12. =
  13. 1
  14. n
  15. w
  16. i
  17. 2
  18. \lambda \sum_{i=1}^{n} w_i^2
  19. λ∑i=1nwi2
原理
  • L1正则化(Lasso正则化): 添加参数向量的L1范数作为惩罚项。它倾向于使得部分参数为零,从而实现特征选择的效果,减少不重要特征对模型的影响。 Lossregularized = Lossoriginal + λ ∑ i = 1 n ∣ w i ∣ \text{Loss}{\text{regularized}} = \text{Loss}{\text{original}} + \lambda \sum_{i=1}^{n} |w_i| Lossregularized=Lossoriginal+λi=1∑n​∣wi​∣ 其中, ( λ ) ( \lambda ) (λ) 是正则化强度参数,控制正则化项对总损失的贡献程度。
  • L2正则化(Ridge正则化): 添加参数向量的L2范数平方作为惩罚项。它通过惩罚参数的大小来控制模型的复杂度,避免参数值过大。 Lossregularized = Lossoriginal + λ ∑ i = 1 n w i 2 \text{Loss}{\text{regularized}} = \text{Loss}{\text{original}} + \lambda \sum_{i=1}^{n} w_i^2 Lossregularized=Lossoriginal+λi=1∑n​wi2​ 类似地, ( λ ) ( \lambda ) (λ) 是正则化强度参数。
作用

此处,引用大神深入理解L1、L2正则的博客中的图,进一步说明L1和L2正则。

  • L1正则 在考虑二维特征的情况下,L1正则的图像应该为一个规则矩形,将正则项记为 J J J,若把正则项 J J J、原始损失函数 L o s s o r i g i n a l Lossoriginal Lossoriginal绘制在同一个坐标下,应该为:L1正则 将带有正则的损失函数记为 L o s s r e g u l a r i z e d Lossregularized Lossregularized,那么 L o s s r e g u l a r i z e d Lossregularized Lossregularized在取到最小值时,应该在 L o s s o r i g i n a l Lossoriginal Lossoriginal、 J J J的交点处(原因以及具体推导,见大神的博客,主要是一个带约束的优化问题,使用KKT条件求解)。从图像直观理解,损失函数与正则项图像的交点,更容易落在坐标轴而非坐标平面上(高维特征空间会更加明显),在二维空间,就意味着有一维的特征数据为0,也就是说有一个维度的特征没有对损失函数起到作用。从而得出,L1正则具有使得模型更加稀疏的作用,也可以说,起到了一定的特征选择的作用。
  • L2正则 同样的,将 L 2 L2 L2正则项 J J J以及原始损失函数 L o s s o r i g i n a l Lossoriginal Lossoriginal的等值线绘制在同一个坐标系下。在这里插入图片描述 从图中可以看出,带正则的损失函数 L o s s r e g u l a r i z e d Lossregularized Lossregularized的最小值更多的出现在坐标平面中,因此L2正则是不具有使得模型更加稀疏的能力的。
Batch Normalization
pytorch中的batch normalization

BatchNorm层通常在激活函数之前应用。它会自动计算每个特征的均值和方差,并根据小批量数据的统计信息进行归一化处理,在使用时,需要注意训练与评估模式的切换,训练阶段,使用mini-batch的均值和方差,评估模式(推理模式)下,会默认使用整个批次的均值和方差

对于全连接层(线性层),可以使用

  1. torch.nn.BatchNorm1d(num_features)


对于2维卷积层,可以使用

  1. torch.nn.BatchNorm2d(num_features)


对于3维卷积层(如视频处理),可以使用

  1. torch.nn.BatchNorm3d(num_features)

  1. import torch
  2. import torch.nn as nn
  3. classMyModel(nn.Module):def__init__(self):super(MyModel, self).__init__()
  4. self.fc1 = nn.Linear(784,256)
  5. self.bn1 = nn.BatchNorm1d(256)# BatchNorm1d应用于全连接层输出
  6. self.fc2 = nn.Linear(256,10)defforward(self, x):
  7. x = torch.flatten(x,1)
  8. x = self.fc1(x)
  9. x = self.bn1(x)
  10. x = torch.relu(x)
  11. x = self.fc2(x)return x
原理

Batch Normalization由google在2015年提出,主要是为了解决深度神经网络训练过程中的内部协变量偏移(Internal Covariate Shift,在深度神经网络中,每一层的输入数据分布随着网络的训练而发生变化,这被称为内部协变量偏移。这种变化可能导致每层需要不断适应前一层输出的分布变化,使得网络训练过程变得复杂和缓慢)问题,同时有助于加速网络的收敛过程。

  • 算法步骤 摘自于Batch Normalization论文在这里插入图片描述 BN在减均值除方差后,将数据分布调整为标准的正态分布。此外,额外增加一个缩放和平移的操作,也即增加两个需要学习的参数,分别为 β \beta β、 γ \gamma γ。这两个参数的引入是为了恢复数据本身的表达能力,对规范化后的数据进行线性变换。
BN的作用

主要有三个作用,首先,通过将特征数据的分布调整到标准正态分布,而在这分布下,激活函数的梯度比较大,能够完美解决梯度消失的问题;其次,由于存在较大的梯度,能够加速模型的训练;最后,由于数据被调整为比较标准的正态分布,模型能够学习到比较通用化的特征,屏蔽了距离正态分布中心较远的特征,避免了对离群特征点的使用,能够在一定程度上减弱过拟合。

附上对BN非常详细的一个解读,有需要的同学可以仔细研读。BN论文的详细解读,该文章通过作图,详细的说明了,在标准正态分布中,激活函数的梯度变化。


本文转载自: https://blog.csdn.net/weixin_43340697/article/details/140092382
版权归原作者 桂花味的六神 所有, 如有侵权,请联系我们删除。

“详解归一化、标准化、正则化以及batch normalization”的评论:

还没有评论