本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
LN层归一化(Layer Normalization)层归一化是神经网络中的一种归一化技术,常用于RNN神经网络
本文讲解LayerNorm层归一化的具体计算公式与计算流程,以及展示LayerNorm层归一化的具体代码实现
通过本文,可以快速了解LN层归一化是什么,如何计算,以及如何使用代码实现LayerNorm层归一化
本节介绍层归一化是什么,有什么用,以及层归一化的具体计算公式
什么是层归一化LN
LN层归一化(Layer Normalization)是用于神经网络归一化的一种方法,常用于激活函数之前
层归一化LN出自Jimmy Lei Ba等人2016的论文《Layer Normalization》
LN的提出主要是因为批归一化BN难以应用于RNN等应用于时间序列的神经网络模型
也就是说,批归一化BN一般作为CNN的归一化方法,而层归一化LN则是作为RNN的归一化方法
层归一化及计算公式
层归一化一般用于激活函数之前,层归一化是针对单个样本的单层而言的,如下所示:
层归一化方法如下:
1. 将当层的所有神经元的神经元值N(激活函数之前的值)进行统计学上的归一化
2. 进一步用仿射变换还原神经元值的范围
层归一化的具体公式如下:
(1)
(2)
其中, ,n是节点个数
,n是节点个数
:是待优化的参数,它们都是向量
注意,每个神经元对应的是独立的,并不相同
:一个较小的数,通常取为0.00005
即,是N的均值和标准差,公式(1)就是对当层所有节点进行标准(归一)化
公式(2)则是对各个神经元的输出范围进一步放宽,进行恢复
层归一化的计算实例
下面举例说明整个计算过程(注意,层归一化是针对单样本单层的)
假设共有4个神经元,在激活前加入了层归一化,神经元值和相关参数如下
神经元值 :
层归一化的参数:
则LN层归一化的计算过程如下:
一、计算和
二、计算归一化的值
三、计算仿射后的值
本节展示层归一化的具体代码实现,以及使用示例
层归一化代码实现
在pytorch中可以用LayerNorm来实现一个层归一化
下面我们了解一下pytorch中的LayerNorm如何使用,以及它的计算逻辑
import torch.nn as nn
import torch
x = torch.tensor([0., 1., 2., 3., 4.]) # 生成一个tensor数据x
L = nn.LayerNorm(5,eps=0.00005) # 初始化层归一化
y = L(x) # 计算层归一化的值
print('\n层归一化后的值:\n',y) # 打印结果
# 检验LN是怎么计算的
mu = x.mean() # 均值
sigma = ((x -x.mean())*(x -x.mean())/x.shape[0]).sum().sqrt() # 标准差
gamma = L.get_parameter('weight') # 仿射权重
beta = L.get_parameter('bias') # 仿射阈值
test_y = gamma*(x-mu)/(sigma)+beta # 用公式计算输出
print('\n用公式计算层归一化后的值:\n',test_y) # 打印结果
代码运行结果如下:
可见,pytorch中的LayerNorm实际就是按层归一化公式进行计算
层归一化使用例子
下面展示如何在pytorch中使用层归一化的具体例子
层归一化LayerNorm的使用示例如下:
import torch
from torch import nn
model = nn.Sequential(
nn.Linear(3, 5), # 线性层
nn.LayerNorm(5,eps=0.00005), # 层归一化
nn.Tanh() # 激活函数
)
x = torch.tensor([0., 1., 2.]) # 生成一个tensor数据x
y = model(x) # 计算模型输出
在代码中可以看到,只需要在激活函数之前,加入一个LayerNorm层就可以
End