大家好,数据归一化在模型收敛中起着至关重要的作用,从经典机器学习到深度学习的数据归一化方法是如何一步步演变的呢?它又为什么是深度学习模型收敛最有效的手段?
一、经典机器学习的归一化方法
经典机器学习领域的数据归一化算法主要有两种,分别是0-1标准化和Z-Score标准化。二者使用效果差别不大,并且都是逐列对输入的数据进行处理。
1.1 0-1标准化
0-1标准化是最简单也是最容易想到的方法,同时也是经典机器学习领域最常用的标准化方法:
该方法通过在输入特征中逐列遍历其中里的每一个数据,将每列的Max和Min记录下来,然后根据公式将数据缩放到0-1之间:
import torcht = 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标准化利用原始数据的均值和标准差进行数据的标准化。同样是逐列进行操作,每一条数据都减去当前列的均值再除以当前列的标准差。
通过这种方法处理之后,会成为零点对称数据,并且如果原数据服从正态分布,通过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归一化能够一定程度保证梯度平稳,进而提升模型收敛速度甚至是提升模型效果,但由于只是针对“初始值”的修改,因此会随着迭代次数增加而逐渐破坏了零点对称这一条件,使得零点对称的条件消失。
该问题也可视作经典机器学习归一化方法应用于深度神经网络时的局限。
二、深度学习归一化的思路
我们回顾三层神经网络中第三层梯度的计算公式(每层原理都相同,因为第三层公式简单,就以第三层作为代表):
可以发现,梯度实际上受到激活函数F()、各层输入数据X和参数w三者共同影响。
2.1 参数
我在之前的一篇文章中引出了Glorot条件,就是通过巧妙设置参数初始值,从而使得各层梯度在计算过程中尽可能更加平稳。
但由于参数的特殊性,其本身就是我们最终学习的目标,所以我们只能设置其初始值,一旦模型开始迭代,参数就将开始“不受控制”的调整,初始值的设置是很难长期保证梯度平稳的,这点和Z-Score对数据进行初始化所存在的问题一致。
2.2 激活函数
之前在聊梯度的消失与爆炸时,说到sigmoid和tanh激活函数容易引起梯度与爆炸,所以大佬们发明了relu,当输入大于0时梯度恒定为1,目的就是让复杂模型在更新时梯度保持平稳。
2.3 输入
写到这里,在确保梯度平稳性上就只剩输入X这一条路可走。目前应用最为广泛、并且被验证的实践效果最好的数据归一化方法就是Batch Normalization[1]。该方法通过修改每一个batch中的数据分布,来提升模型各层梯度的平稳性,从而提升模型学习效率、提高模型训练结果。
2.4 仅仅是多次Z-Score的使用吗?
它与经典机器学习的不同主要在于两个方面:
- 目的不同:
经典机器学习归一化主要是为了消除不同特征的量纲影响,所以对各列的数据分布进行调整,而且不是所有机器学习模型都要进行数据归一化。
而深度学习归一化的目标则是为了确保梯度平稳、模型能够有效训练,并且是适用于所有模型的必要的优化方法。
- 计算方法不同
技术交流
欢迎转载、收藏、有所收获点赞支持一下!
目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
- 方式①、发送如下图片至微信,长按识别,后台回复:加群;
- 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群