数据归一化

原文链接:从公式出发:什么是模型收敛的有效方法?

大家好,我是泰哥。数据归一化在模型收敛中起着至关重要的作用,从经典机器学习到深度学习的数据归一化方法是如何一步步演变的呢?它又为什么是深度学习模型收敛最有效的手段?

一、经典机器学习的归一化方法

经典机器学习领域的数据归一化算法主要有两种,分别是0-1标准化和Z-Score标准化。二者使用效果差别不大,并且都是逐列对输入的数据进行处理。

1.1 0-1标准化

0-1标准化是最简单也是最容易想到的方法,同时也是经典机器学习领域最常用的标准化方法:
x n o r m a l i z a t i o n = x − M i n M a x − M i n {x}_{normalization}=\frac{x-Min}{Max-Min} xnormalization=MaxMinxMin

该方法通过在输入特征中逐列遍历其中里的每一个数据,将每列的Max和Min记录下来,然后根据公式将数据缩放到0-1之间:

import torch
t = torch.arange(12).reshape(6, 2).float()
print(t)

# tensor([[ 0.,  1.],
#         [ 2.,  3.],
#         [ 4.,  5.],
#         [ 6.,  7.],
#         [ 8.,  9.],
#         [10., 11.]])

def min_max(t):
    # 提取每列最大值
    t_max = t.max(0)[0]
    # 提取每列最小值
    t_min = t.min(0)[0]
    # 计算0-1标准化后结果
    zo_ans = (t - t_min) / (t_max - t_min)
    return zo_ans
    
zo_ans = min_max(t)
print(zo_ans)
# tensor([[0.0000, 0.0000],
#         [0.2000, 0.2000],
#         [0.4000, 0.4000],
#         [0.6000, 0.6000],
#         [0.8000, 0.8000],
#         [1.0000, 1.0000]])

1.2 Z-Score标准化

和0-1标准化不同,Z-score标准化利用原始数据的均值和标准差进行数据的标准化。同样是逐列进行操作,每一条数据都减去当前列的均值再除以当前列的标准差。
x n o r m a l i z a t i o n = x − μ σ {x}_{normalization}=\frac{x-\mu }{\sigma } xnormalization=σxμ

通过这种方法处理之后,会成为零点对称数据,并且如果原数据服从正态分布,通过Z-Score处理之后将服从标准正态分布。

def z_score(t):
    std = t.std(0)
    mean = t.mean(0)
    ans = (t - mean) / std
    return ans 
    
zs_ans = z_score(t)
print(zs_ans)
# tensor([[-1.2649, -1.2649],
#         [-0.6325, -0.6325],
#         [ 0.0000,  0.0000],
#         [ 0.6325,  0.6325],
#         [ 1.2649,  1.2649]])

1.3 Z-Score的局限性

尽管Z-Score归一化能够一定程度保证梯度平稳,进而提升模型收敛速度甚至是提升模型效果,但由于只是针对“初始值”的修改,因此会随着迭代次数增加而逐渐破坏了零点对称这一条件,使得零点对称的条件消失

该问题也可视作经典机器学习归一化方法应用于深度神经网络时的局限。

二、深度学习归一化的思路

我们回顾三层神经网络中第三层梯度的计算公式(每层原理都相同,因为第三层公式简单,就以第三层作为代表):
g r a d 3 = ∂ l o s s ∂ y ^ ⋅ F ( F ( X ∗ w 1 ) ∗ w 2 ) grad_3 = \frac{\partial loss}{\partial \hat y} \cdot F(F(X * w_1) * w_2) grad3=y^lossF(F(Xw1)w2)

可以发现,梯度实际上受到激活函数F()、各层输入数据X和参数w三者共同影响。

2.1 参数 w w w

我在之前的一篇文章中引出了Glorot条件,就是通过巧妙设置参数初始值,从而使得各层梯度在计算过程中尽可能更加平稳。

但由于参数的特殊性,其本身就是我们最终学习的目标,所以我们只能设置其初始值,一旦模型开始迭代,参数就将开始“不受控制”的调整,初始值的设置是很难长期保证梯度平稳的,这点和Z-Score对数据进行初始化所存在的问题一致。

2.2 激活函数 F ( ) F() F()

之前在聊梯度的消失与爆炸时,说到sigmoid和tanh激活函数容易引起梯度与爆炸,所以大佬们发明了relu,当输入大于0时梯度恒定为1,目的就是让复杂模型在更新时梯度保持平稳。

2.3 输入 X X X

写到这里,在确保梯度平稳性上就只剩输入X这一条路可走。目前应用最为广泛、并且被验证的实践效果最好的数据归一化方法就是Batch Normalization。该方法通过修改每一个batch中的数据分布,来提升模型各层梯度的平稳性,从而提升模型学习效率、提高模型训练结果。

2.4 仅仅是多次Z-Score的使用吗?

它与经典机器学习的不同主要在于两个方面:

  • 目的不同:

经典机器学习归一化主要是为了消除不同特征的量纲影响,所以对各列的数据分布进行调整,而且不是所有机器学习模型都要进行数据归一化。

而深度学习归一化的目标则是为了确保梯度平稳、模型能够有效训练,并且是适用于所有模型的必要的优化方法。

  • 计算方法不同
    那么在归一化的过程中,放缩的部分可以通过矩阵乘法来完成,而平移部分则更加简单,让数据集加上由每一列平移幅度所构成的向量即可完成。BN的平移和放缩分为两个阶段:

第一个阶段是先将数据进行Z-Score处理

第二阶段则是在此基础上在对数据的均值进行参数平移,并对其方差进行参数放缩

其实两个阶段做的是一件事,就是对参数进行平移和缩放。我们可以将第一阶段理解为将数据本身的均值与方差设为了初始值,第二阶段则是根据反向传播来不断的更新参数。

原文链接:从公式出发:什么是模型收敛的有效方法?

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值