LayerNorm与BatchNorm1d

nn.LayerNorm

LayerNorm的核心思想是在神经网络的每一层,对每个样本的所有激活值进行归一化处理。

import torch
import torch.nn as nn
a=torch.tensor([[[1,2,3,4],[2,3,4,5],[3,4,5,6]],[[1,1,2,2],[2,2,3,3],[3,3,4,4]]])
a=a.to(torch.float32)
# 创建LayerNorm层
layer_norm = nn.LayerNorm(4)
# 应用LayerNorm
output = layer_norm(a)

输入 [ [ 1 2 3 4 2 3 4 5 3 4 5 6 ] , [ 1 1 2 2 2 2 3 3 3 3 4 4 ] ] \begin{bmatrix}\begin{bmatrix}1 & 2 & 3 &4 \\2 & 3 & 4&5 \\3 & 4 & 5&6\end{bmatrix},\begin{bmatrix}1 & 1 & 2 &2 \\2 & 2 & 3&3 \\3 & 3 & 4&4\end{bmatrix}\end{bmatrix} 123234345456 , 123123234234

输出 [ [ − 1.3416 − 0.4472 0.4472 1.3416 − 1.3416 − 0.4472 0.4472 1.3416 − 1.3416 − 0.4472 0.4472 1.3416 ] , [ − 1.0000 − 1.0000 1.0000 1.0000 − 1.0000 − 1.0000 1.0000 1.0000 − 1.0000 − 1.0000 1.0000 1.0000 ] ] \begin{bmatrix}\begin{bmatrix}-1.3416& -0.4472& 0.4472& 1.3416 \\-1.3416& -0.4472& 0.4472& 1.3416\\-1.3416& -0.4472& 0.4472& 1.3416\end{bmatrix},\begin{bmatrix}-1.0000&-1.0000&1.0000&1.0000 \\-1.0000&-1.0000&1.0000&1.0000\\-1.0000&-1.0000&1.0000&1.0000\end{bmatrix}\end{bmatrix} 1.34161.34161.34160.44720.44720.44720.44720.44720.44721.34161.34161.3416 , 1.00001.00001.00001.00001.00001.00001.00001.00001.00001.00001.00001.0000

计算过程:输入 2 2 2 个样本,每个样本都是长度为 3 3 3 的token序列,每个token的维度是 4 4 4。LayerNorm的操作,就是对每一token向量进行归一化:即对 [ 1 , 2 , 3 , 4 ] [1,2,3,4] [1,2,3,4] 计算其均值方差,然后归一化。依次对 [ 2 , 3 , 4 , 5 ] [2,3,4,5] [2,3,4,5] [ 3 , 4 , 5 , 6 ] [3,4,5,6] [3,4,5,6] [ 1 , 1 , 2 , 2 ] [1,1,2,2] [1,1,2,2] [ 2 , 2 , 3 , 3 ] [2,2,3,3] [2,2,3,3] [ 3 , 3 , 4 , 4 ] [3,3,4,4] [3,3,4,4] 完成同样的操作。

nn.BatchNorm1d

输入二维向量

BatchNorm1d的主要作用是对一个批次(batch)中的数据进行归一化,使得每一层的输入数据具有相同的分布。

import torch
import torch.nn as nn
a=torch.tensor([[[1,2,3,4],[2,3,4,5],[3,4,5,6]],[[1,1,2,2],[2,2,3,3],[3,3,4,4]]])
a=a.to(torch.float32)

f2=torch.nn.BatchNorm1d(4)
b2=f2(a.view(2*3,4))

输入a.view(2*3,4) = [ 1 2 3 4 2 3 4 5 3 4 5 6 1 1 2 2 2 2 3 3 3 3 4 4 ] =\begin{bmatrix}1 & 2 & 3 &4 \\2 & 3 & 4&5 \\3 & 4 & 5&6\\1 & 1 & 2 &2 \\2 & 2 & 3&3 \\3 & 3 & 4&4\end{bmatrix} = 123123234123345234456234

输出 [ − 1.2247 − 0.5222 − 0.5222 0.0000 0.0000 0.5222 0.5222 0.7746 1.2247 1.5667 1.5667 1.5492 − 1.2247 − 1.5667 − 1.5667 − 1.5492 0.0000 − 0.5222 − 0.5222 − 0.7746 1.2247 0.5222 0.5222 0.0000 ] \begin{bmatrix}-1.2247&-0.5222&-0.5222&0.0000\\0.0000&0.5222& 0.5222& 0.7746\\ 1.2247& 1.5667& 1.5667& 1.5492\\-1.2247& -1.5667& -1.5667& -1.5492\\0.0000&-0.5222& -0.5222& -0.7746\\1.2247& 0.5222& 0.5222&0.0000 \end{bmatrix} 1.22470.00001.22471.22470.00001.22470.52220.52221.56671.56670.52220.52220.52220.52221.56671.56670.52220.52220.00000.77461.54921.54920.77460.0000

计算过程:只能输入展平的二维向量,每个样本都是维度为 4 4 4 的token向量。BatchNorm1d的操作,就是对这一批次的所有样本的同一维度的值进行归一化:即对 [ 1 , 2 , 3 , 1 , 2 , 3 ] [1,2,3,1,2,3] [1,2,3,1,2,3] 计算其均值方差,然后归一化。依次对 [ 2 , 3 , 4 , 1 , 2 , 3 ] [2,3,4,1,2,3] [2,3,4,1,2,3] [ 3 , 4 , 5 , 2 , 3 , 4 ] [3,4,5,2,3,4] [3,4,5,2,3,4] [ 4 , 5 , 6 , 2 , 3 , 4 ] [4,5,6,2,3,4] [4,5,6,2,3,4]完成同样的操作。

输入三维向量

import torch
import torch.nn as nn
a=torch.tensor([[[1,2,3,4],[2,3,4,5],[3,4,5,6]],[[1,1,2,2],[2,2,3,3],[3,3,4,4]]])
a=a.to(torch.float32)

f3=torch.nn.BatchNorm1d(3)
b3=f3(a)

输入 [ [ 1 2 3 4 2 3 4 5 3 4 5 6 ] , [ 1 1 2 2 2 2 3 3 3 3 4 4 ] ] \begin{bmatrix}\begin{bmatrix}1 & 2 & 3 &4 \\2 & 3 & 4&5 \\3 & 4 & 5&6\end{bmatrix},\begin{bmatrix}1 & 1 & 2 &2 \\2 & 2 & 3&3 \\3 & 3 & 4&4\end{bmatrix}\end{bmatrix} 123234345456 , 123123234234

输出 [ [ − 1.0000 0.0000 1.0000 2.0000 − 1.0000 0.0000 1.0000 2.0000 − 1.0000 0.0000 1.0000 2.0000 ] , [ − 1.0000 − 1.0000 0.0000 0.0000 − 1.0000 − 1.0000 0.0000 0.0000 − 1.0000 − 1.0000 0.0000 0.0000 ] ] \begin{bmatrix}\begin{bmatrix}-1.0000& 0.0000& 1.0000& 2.0000\\-1.0000& 0.0000& 1.0000& 2.0000\\-1.0000& 0.0000& 1.0000& 2.0000\end{bmatrix},\begin{bmatrix}-1.0000& -1.0000& 0.0000& 0.0000 \\-1.0000& -1.0000& 0.0000& 0.0000 \\-1.0000& -1.0000& 0.0000& 0.0000 \end{bmatrix}\end{bmatrix} 1.00001.00001.00000.00000.00000.00001.00001.00001.00002.00002.00002.0000 , 1.00001.00001.00001.00001.00001.00000.00000.00000.00000.00000.00000.0000

计算过程:对于nn.BatchNorm1d(3),归一化要对尺寸 ( 2 , 3 , 4 ) (2,3,4) (2,3,4)的向量中所有 3 3 3 维的向量进行。那么输入向量可看作 ( 8 , 3 ) (8,3) (8,3) 的二维向量。对这8个样本进行批次归一化,首先对 [ 1 , 2 , 3 , 4 , 1 , 1 , 2 , 2 ] [1,2,3,4,1,1,2,2] [1,2,3,4,1,1,2,2] 计算其均值方差,然后归一化。依次对 [ 2 , 3 , 4 , 5 , 2 , 2 , 3 , 3 ] [2,3,4,5,2,2,3,3] [2,3,4,5,2,2,3,3] [ 3 , 4 , 5 , 6 , 3 , 3 , 4 , 4 ] [3,4,5,6,3,3,4,4] [3,4,5,6,3,3,4,4] 完成同样的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值