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.3416−1.3416−1.3416−0.4472−0.4472−0.44720.44720.44720.44721.34161.34161.3416 , −1.0000−1.0000−1.0000−1.0000−1.0000−1.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.2247−1.22470.00001.2247−0.52220.52221.5667−1.5667−0.52220.5222−0.52220.52221.5667−1.5667−0.52220.52220.00000.77461.5492−1.5492−0.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.0000−1.0000−1.00000.00000.00000.00001.00001.00001.00002.00002.00002.0000 , −1.0000−1.0000−1.0000−1.0000−1.0000−1.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] 完成同样的操作。