一顿操作猛如虎,再看输出就想哭。

现象:模型训练很不稳定,运气好的时候能收敛,运气差点结果直接飞掉

方案:偶尔看到pytorch中的Normalization layers,后来加了个bn层,效果出人意料的好!

https://pytorch.org/docs/stable/nn.html#normalization-layers

pytorch对所有输入进行标准化 pytorch normalization_归一化

pytorch对所有输入进行标准化 pytorch normalization_深度学习_02

不仅好奇,怎么做到的,真是牛掰格拉斯啊!!

查询了各种资料,对于normalization 解释最直观透彻的,还是这篇:https://zhuanlan.zhihu.com/p/33173246

 

提取一下关键点

  1. BN 的转换是针对单个神经元可训练的——不同神经元的输入经过再平移和再缩放后分布在不同的区间,而 LN 对于一整层的神经元训练得到同一个转换——所有的输入都在同一个区间范围内。如果不同输入特征不属于相似的类别(比如颜色和大小),那么 LN 的处理可能会降低模型的表达能力。
  2. BN 和 LN 是用输入的特征数据的方差对输入数据进行 scale,而 WN 则是用 神经元的权重的欧氏范式对输入数据进行 scale。虽然在原始方法中分别进行的是特征数据规范化和参数的规范化,但本质上都实现了对数据的规范化,只是用于 scale 的参数来源不同。 
  3. 下层的权重值越大,其梯度就越小。这样,参数的变化就越稳定,相当于实现了参数正则化的效果,避免参数的大幅震荡,提高网络的泛化性能。

 

补充一下个人理解:

  1. 万变不离其踪,归一化的最终目的,还是让大家“统一标准”;统一之后,不管是训练速度,还鲁棒性都会好一些。(直观感受:统一规范好管理)
  2. 从公式角度看,各种normalization是对公式中的不同部分做归一化,或者w或者x或者<w, x>的计算方式
  3. 对于针对x的归一化,从处理过程看,是从不同方向的“统一”,盗图:

 

实践经验:

  1. 使用bn,batchsize最好稍大点,并且做全局shuffle, 否则效果会差很多。
  2. 待续。。