BatchNormalization和LayerNormalization的理解、适用范围、PyTorch代码示例


学习神经网络归一化时,文章形形色色,但没找到适合小白通俗易懂且全面的。学习过后,特此记录。

为什么要Normalization

当输入数据量级极大或极小时,为保证输出数据有效,参数必需被训练到一个极小或极大的区间,而这对初始化来说非常困难,且多层网络链式法则求导会导致梯度消失或爆炸的问题。

Reference:神经网络为什么要归一化
归一化的具体计算过程:CSDN博客

BatchNorm

BN适用于大多数Dataframe样式的常规数据。
BN对每个特征进行归一化,如下图,分别计算身高归一化后的数据、体重归一化后的数据、年龄归一化后的数据。好理解。

LayerNorm

对于NLP数据,不适用于BN。
BN的逻辑是每个变量来自于某一特定分布,虽然每次只计算一个batch内的数据,但第一个batch(如前64名同学)的身高和第二个batch(后64名同学)的身高,大概率来自同样的分布。
而对文本数据来说,所有句子的第一个词不一定来自同一分布,第二个词也是。每个句子的长度也不同,对句子末尾几个词作BN就相当于对最长句子的最后一个词和一堆padding值作BN,没有意义。
这里就要用到LN,即对每条样本作归一化,即“横着”归一化。

torch代码示例

BatchNorm: 参考pytorch BatchNorm参数详解,计算过程

# BatchNorm
import torch.nn as nn
Class Net:
	def __ init__():
		self.bn = nn.BatchNorm1d(20,affine=True)
		pass
	def forward(x):
		# x:(N,L),对L个变量分别进行normalization
		out = self.ln(x)
		# out: (N,L)

LayerNorm: 参考pytorch 层标准化 LayerNorm 的用法

# LayerNorm
import torch.nn as nn
Class Net:
	def __ init__():
		self.ln = nn.LayerNorm(W,elementwise_affine=True)	# 只对最后一个维度
		self.ln = nn.LayerNorm([H,W],elementwise_affine = True)	# 对最后两个维度,即均值、方差一起求,拉伸成一个维度
		pass
	def forward(x):
		# x: (N, H ,W),对最后几个维度进行normalization
		out = self.ln1(x)
		out = self.ln2(x)
		# out: (N, seq_len, emb_dim),归一化不改变向量维度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值