一顿操作猛如虎,再看输出就想哭。
现象:模型训练很不稳定,运气好的时候能收敛,运气差点结果直接飞掉。
方案:偶尔看到pytorch中的Normalization layers,后来加了个bn层,效果出人意料的好!
https://pytorch.org/docs/stable/nn.html#normalization-layers
不仅好奇,怎么做到的,真是牛掰格拉斯啊!!
查询了各种资料,对于normalization 解释最直观透彻的,还是这篇:https://zhuanlan.zhihu.com/p/33173246
提取一下关键点:
- BN 的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而 LN 对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么 LN 的处理可能会降低模型的表达能力。
- BN 和 LN 是用输入的特征数据的方差对输入数据进行 scale,而 WN 则是用 神经元的权重的欧氏范式对输入数据进行 scale。虽然在原始方法中分别进行的是特征数据规范化和参数的规范化,但本质上都实现了对数据的规范化,只是用于 scale 的参数来源不同。
- 下层的权重值越大,其梯度就越小。这样,参数的变化就越稳定,相当于实现了参数正则化的效果,避免参数的大幅震荡,提高网络的泛化性能。
补充一下个人理解:
- 万变不离其踪,归一化的最终目的,还是让大家“统一标准”;统一之后,不管是训练速度,还鲁棒性都会好一些。(直观感受:统一规范好管理)
- 从公式角度看,各种normalization是对公式中的不同部分做归一化,或者w或者x或者<w, x>的计算方式
- 对于针对x的归一化,从处理过程看,是从不同方向的“统一”,盗图:
实践经验:
- 使用bn,batchsize最好稍大点,并且做全局shuffle, 否则效果会差很多。
- 待续。。