深度学习-一篇入门

【模型】一篇入门之-LN层归一化是什么

作者 : 老饼 发表日期 : 2023-10-11 04:26:49 更新日期 : 2024-10-31 07:04:42
本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com



LN层归一化(Layer Normalization)层归一化是神经网络中的一种归一化技术,常用于RNN神经网络

本文讲解LayerNorm层归一化的具体计算公式与计算流程,以及展示LayerNorm层归一化的具体代码实现

通过本文,可以快速了解LN层归一化是什么,如何计算,以及如何使用代码实现LayerNorm层归一化




   01. LN层归一化是什么    




本节介绍层归一化是什么,有什么用,以及层归一化的具体计算公式




      什么是层归一化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层归一化的计算过程如下:
一、计算                                                                                   
                                                    
                  
二、计算归一化的值                                                                           
          
三、计算仿射后的值                                                                           
                              







   02. 层归一化-代码实现    




本节展示层归一化的具体代码实现,以及使用示例




        层归一化代码实现        


在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 






联系老饼