IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> nn.LayerNorm的实现及原理 -> 正文阅读

[人工智能]nn.LayerNorm的实现及原理

LayerNorm

在transformer中一般采用LayerNorm,LayerNorm也是归一化的一种方法,与BatchNorm不同的是它是对每单个batch进行的归一化,而batchnorm是对所有batch一起进行归一化的

y = x ? E ( x ) V a r ( x ) + ? ? γ + β y = \frac{x-E(x)}{\sqrt{Var(x)+\epsilon}}*\gamma+\beta y=Var(x)+? ?x?E(x)??γ+β

nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True, device=None, dtype=None)

  • normalized_shape:归一化的维度,int(最后一维)list(list里面的维度)
  • eps:加在方差上的数字,避免分母为0
  • elementwise_affine:bool,True的话会有一个默认的affine参数

elementwise_affine就是公式中的 γ \gamma γ β \beta β,前者开始为1,后者为0,二者均可学习随着训练过程而变化

举例

假设我们的输入为(1, 3, 5, 5)的变量,并对其进行LayerNorm,一般来说有两种归一化的方式。如下图所示,左边为第一种归一化方法,对所有channel所有像素计算;右边为第二种归一化方法,对所有channel的每个像素分别计算

  • 计算一个batch中所有channel中所有参数的均值和方差,然后进行归一化,即(3, 5, 5)
  • 计算一个batch中所有channel中的每一个参数的均值和方差进行归一化,即(3, 1, 1),计算25次

第一种

直接给出计算代码

注意:输入为(1, 3, 5, 5),layernorm的normalized_shape为[3, 5, 5],也就是说对后三维度进行归一化操作

from torch import nn
import numpy as np
import torch.nn as nn
from torchvision.transforms import Compose, ToTensor
import torch

def transform():
    return Compose([
        ToTensor(),
    ])

arr1 = np.arange(1,26).reshape(5, 5)
arr2 = np.arange(11, 36).reshape(5, 5)
arr3 = np.arange(31, 56).reshape(5, 5)
arr = np.dstack((arr1, arr2, arr3))
arr = np.reshape(arr,[5,5,3])
arr = arr.astype(np.float32)
# print(arr.shape)      # [5, 5, 3]
arr = transform()(arr)
# print(arr.size())     # [3, 5, 5]
arr = arr.unsqueeze(0)  
# print(arr.size())     # [1, 3, 5, 5]
''' 直接使用nn.LayerNorm函数计算 '''
norm = nn.LayerNorm([3, 5, 5])
print(norm(arr))
''' 手动计算 '''
u = arr.mean()
s = (arr-u).pow(2).mean()
x = (arr-u)/torch.sqrt(s+1e-5)
print(x)
'''
tensor([[[[-1.7584, -1.6890, -1.6196, -1.5502, -1.4808],
          [-1.4114, -1.3420, -1.2725, -1.2031, -1.1337],
          [-1.0643, -0.9949, -0.9255, -0.8561, -0.7867],
          [-0.7173, -0.6478, -0.5784, -0.5090, -0.4396],
          [-0.3702, -0.3008, -0.2314, -0.1620, -0.0925]],
          ...
         [[ 0.3239,  0.3933,  0.4627,  0.5322,  0.6016],
          [ 0.6710,  0.7404,  0.8098,  0.8792,  0.9486],
          [ 1.0180,  1.0875,  1.1569,  1.2263,  1.2957],
          [ 1.3651,  1.4345,  1.5039,  1.5733,  1.6427],
          [ 1.7122,  1.7816,  1.8510,  1.9204,  1.9898]]]],
       grad_fn=<NativeLayerNormBackward>)
tensor([[[[-1.7584, -1.6890, -1.6196, -1.5502, -1.4808],
          [-1.4114, -1.3420, -1.2725, -1.2031, -1.1337],
          [-1.0643, -0.9949, -0.9255, -0.8561, -0.7867],
          [-0.7173, -0.6478, -0.5784, -0.5090, -0.4396],
          [-0.3702, -0.3008, -0.2314, -0.1620, -0.0925]],
          ...
         [[ 0.3239,  0.3933,  0.4627,  0.5322,  0.6016],
          [ 0.6710,  0.7404,  0.8098,  0.8792,  0.9486],
          [ 1.0180,  1.0875,  1.1569,  1.2263,  1.2957],
          [ 1.3651,  1.4345,  1.5039,  1.5733,  1.6427],
          [ 1.7122,  1.7816,  1.8510,  1.9204,  1.9898]]]])
'''

第二种

直接给出计算代码

注意:我们的输入是(1, 3, 5, 5),如果要完成第二种方法,我们layernorm只需要提供一个参数,即norm = nn.LayerNorm(3),但是如果只提供一个参数,默认为对最后一维进行归一化,所以我们需要将输入进行变化,即变为(1, 5, 5, 3)。

特别的在transformer中我们的数据维度一般在最后一维,也就是(1, 5, 5, 3)的形式,所以可以直接用layernorm函数进行归一化,如果是普通的卷积层,形式为(1, 3, 5, 5)需要手动实现,下面分别实现了这两种方法

from torch import nn
import numpy as np
import torch.nn as nn
from torchvision.transforms import Compose, ToTensor
import torch

def transform():
    return Compose([
        ToTensor(),
    ])

''' 数据初始化 '''
arr1 = np.arange(1,26).reshape(5, 5)
arr2 = np.arange(11, 36).reshape(5, 5)
arr3 = np.arange(31, 56).reshape(5, 5)
arr = np.dstack((arr1, arr2, arr3))
arr = np.reshape(arr,[5,5,3])
arr = arr.astype(np.float32)
arr = transform()(arr)
arr = arr.unsqueeze(0)  # [1, 3, 5, 5]

''' [1, 3, 5, 5] -> [1, 5, 5, 3] '''
arr = arr.permute(0, 2, 3, 1).contiguous()
print(arr.size())       # [1, 5, 5, 3]

''' LayerNorm函数计算 '''
norm = nn.LayerNorm(3)
print(norm(arr))

''' [1, 5, 5, 3] -> [1, 3, 5, 5] '''
arr = arr.permute(0, 3, 1, 2)
print(arr.size())       # [1, 3, 5, 5]

''' 手动计算 '''
# 1. 归一化
u = arr.mean(dim=1, keepdim=True)  # mean     # [1, 1, 5, 5]
s = (arr - u).pow(2)               # sigma^2  # [1, 3, 5, 5]
s = s.mean(1, keepdim=True)				   	  # [1, 1, 5, 5]
x = (arr - u) / torch.sqrt(s + 1e-6)          # layer norm
print(x)
# 2. 加上affine
weight = nn.Parameter(torch.ones(3))  # [1, 3]
bias = nn.Parameter(torch.zeros(3))
print(weight)							
print(weight[:, None, None], weight[:, None, None].size()) # [3, 1, 1]
x = weight[:, None, None]*x + bias[:, None, None]
'''
torch.Size([1, 5, 5, 3])
tensor([[[[-1.0690, -0.2673,  1.3363],
          [-1.0690, -0.2673,  1.3363],
          [-1.0690, -0.2673,  1.3363],
          [-1.0690, -0.2673,  1.3363],
          [-1.0690, -0.2673,  1.3363]],
          ...
         [[-1.0690, -0.2673,  1.3363],
          [-1.0690, -0.2673,  1.3363],
          [-1.0690, -0.2673,  1.3363],
          [-1.0690, -0.2673,  1.3363],
          [-1.0690, -0.2673,  1.3363]]]], grad_fn=<NativeLayerNormBackward>)
torch.Size([1, 3, 5, 5])
tensor([[[[-1.0690, -1.0690, -1.0690, -1.0690, -1.0690],
          [-1.0690, -1.0690, -1.0690, -1.0690, -1.0690],
          [-1.0690, -1.0690, -1.0690, -1.0690, -1.0690],
          [-1.0690, -1.0690, -1.0690, -1.0690, -1.0690],
          [-1.0690, -1.0690, -1.0690, -1.0690, -1.0690]],
		  ...
         [[ 1.3363,  1.3363,  1.3363,  1.3363,  1.3363],
          [ 1.3363,  1.3363,  1.3363,  1.3363,  1.3363],
          [ 1.3363,  1.3363,  1.3363,  1.3363,  1.3363],
          [ 1.3363,  1.3363,  1.3363,  1.3363,  1.3363],
          [ 1.3363,  1.3363,  1.3363,  1.3363,  1.3363]]]])
'''
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 11:02:36  更:2022-02-04 11:04:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 10:36:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码