【pytorch】使用pytorch自己实现LayerNorm

news2025/1/12 1:09:35

pytorch中使用LayerNorm的两种方式,一个是nn.LayerNorm,另外一个是nn.functional.layer_norm

1. 计算方式

根据官方网站上的介绍,LayerNorm计算公式如下。
公式其实也同BatchNorm,只是计算的维度不同。
在这里插入图片描述

下面通过实例来走一遍公式

假设有如下的数据

x=
[
[0.1,0.2,0.3],
[0.4,0.5,0.6]
]
# shape (2,3)

先计算mean和variant

均值:

# 计算的维度是最后一维
mean= 
[
(0.1+0.2+0.3)/3=0.2,
(0.4+0.5+0.6)/3=0.5
]

方差

var=[  mean((0.1-0.2)^2=0.01,(0.2-0.2)^2=0,(0.3-0.2)^2=0.01)+0.00005,
       mean((0.4-0.5)^2=0.01, (0.5-0.5)^2=0, (0.6-0.5)^2=0.01)+0.00005
    ]
   = [ 0.0067+0.00005
       0.0067+0.00005
     ]

sqrt(var) = [ 0.0817,
              0.0817
            ]  

再执行 (x-mean)/sqrt(var)

 (x-mean)/sqrt(var) = [ [(0.1-0.2)/0.0817,   (0.2-0.2)/0.0817,  (0.3-0.2)/0.0817],
                                    [(0.4-0.5)/0.0817, (0.5-0.5)/0.0817, (0.6-0.5)/0.0817]
                                  ]
                              = [  [-1.2238,  0.0000,  1.2238],
                                    [-1.2238,  0.0000,  1.2238]
                                 ]

2. 实现代码

下面代码是分别使用这两种方式以及一种自己实现的方式

import numpy as np
import torch
import torch.nn.functional as F

x = torch.Tensor([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]]) # shape is (2,3)

# 注意LayerNorm和layer_norm里的normalized_shape指的都是shape里的数字,而不是index;
# 在内部pytorch会将这个数字转成index
nn_layer_norm = torch.nn.LayerNorm(normalized_shape=[3], eps=1e-5, elementwise_affine=True)
print("LayerNorm=", nn_layer_norm(x))

layer_norm = F.layer_norm(x, normalized_shape=[3], weight=None, bias=None, eps=1e-5)
print("F.layer_norm=", layer_norm)

# dim是维度的index
mean = torch.mean(x, dim=[1], keepdim=True)
# 这里注意是torch.mean而不是torch.sum 
# 所以通过torch.var函数是不可以的
var = torch.mean((x - mean) ** 2, dim=[1], keepdim=True)+ 1e-5
print("my LayerNorm=", var,(x - mean) / torch.sqrt(var))

结果如下,

在这里插入图片描述

多维实现

如果张量x是3维,应该如何使用?

代码样例如下,

import numpy as np
import torch
import torch.nn.functional as F

x = torch.Tensor([[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]]).view(2,1,3) # shape (2,1,3)

# 注意这里的normalized_shape只能是张量的后面几个连续维度
# 比如这里的1,3 就是 (2,1,3)的最后两维
nn_layer_norm = torch.nn.LayerNorm(normalized_shape=[1,3], eps=1e-5, elementwise_affine=True)
print("LayerNorm=", nn_layer_norm(x))

layer_norm = F.layer_norm(x, normalized_shape=[1,3], weight=None, bias=None, eps=1e-5)
print("F.layer_norm=", layer_norm)

# 这里的dim写最后两维的index
mean = torch.mean(x, dim=[1,2], keepdim=True)
var = torch.mean((x - mean) ** 2, dim=[1,2], keepdim=True)+ 1e-5
print("my LayerNorm=", (x - mean) / torch.sqrt(var))

结果如下,
在这里插入图片描述

多维张量的情况下,需要注意这里的normalized_shape只能是张量的后面几个连续维度,否则会报如下类似错误
RuntimeError: Given normalized_shape=[2, 3], expected input with shape [*, 2, 3], but got input of size[2, 1, 3]

3. 思考

从这里可以看出,这里实际上是最尾部维度做Normalization。
考虑到训练nlp模型的场景,张量维度一般是 (Batch size,Length of Sequence, Embedding size),使用LayerNorm实际上就是在一个mini batch的范围内,以Embedding为维度做正则。

那么为什么在nlp的任务上一般使用LayerNorm呢?
在nlp 任务中,每次batch中的sequnce可能不同,所以包含了batch和sequnce的维度的话,可能也把paddding的数据包含进来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JQuery 高级

目录 1. 动画 1. 三种方式显示和隐藏元素 1. 默认显示和隐藏方式 2. 滑动显示和隐藏方式 2. 遍历 1. js的遍历方式 2. jq的遍历方式 5. 插件:增强JQuery的功能 1 . 实现方式: 1. $.fn.extend(object) * 增强通过Jquery获取的对象的…

java计算机毕业设计ssm学生宿舍管理系统efyug(附源码、数据库)

java计算机毕业设计ssm学生宿舍管理系统efyug(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

取余,模运算,余数的正负问题,1497. 检查数组对是否可以被 k 整除

首先,我们来看数学中对余数的定义 0到除数之间的整数,所以当除数是负数的时候,余数也是负数。 举个例子: 接下来,我们看计算机中余数是怎么求的??? 所有的语言和计算器都遵循了让商…

防火墙豁免实验

♥️作者:小刘在C站 ♥️每天分享云计算网络运维课堂笔记,疫情之下,你我素未谋面,但你一定要平平安安,一 起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放,愿…

单商户商城系统功能拆解44—应用中心—小程序直播

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…

shell 基本语法第四讲之(find(文件查找)、xargs(字符串拼凑)、sed(处理文本)、awk(文本处理)、crontab(系统定时器))

20、find(文件查找) 格式 find pathname -options [-print -exec -ok …] 命令说明举例-name按照文件名查找文件。find . -name “1.txt”-perm按照文件权限来查找文件。find . -perm 660-user按照文件属主来查找文件。-group按照文件所属的组来查找文件。-mtime -n n按照文件…

西电计网实验

《计算机通信与网络》网络实验 阅读须知:计网六次实验均已通过线下操作进行验收(后面两次善意线上了),写报告由于描述流程困难,故采用eNSP对实验内容进行复现,故此报告实验的过程分析都是基于eNSP&#xf…

MBSE和刚亮相的B-21“突袭者”隐形轰炸机

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 12月2日,B-21“突袭者”隐形轰炸机举行揭幕仪式。 摘译一篇来自制造商Northrop Grumman公司(诺斯罗普格鲁曼公司)网站上的文章片段。 利…

stm32cubemx hal学习记录:CAN

一、实验内容 RM C板,can1给can2发送数据 二、CAN总线简介 1、控制器局域网络:Controller Area Network 2、异步半双工通信 3、总线制 CAN由一对差分对(两条线)CANH和CANL组成 CANH电压比CANL高视为逻辑0(显性电…

IDEA插件系列(3):Easy Javadoc插件——快速生成javadoc文档注释

1.插件介绍 Easy Javadoc插件。 能帮助开发者快速生成类、方法、属性等中文javadoc 2.安装方式 第一种安装方式是在线下载安装插件。 第二种安装方式是使用离线插件进行安装。 插件下载地址:https://plugins.jetbrains.com/plugin/12977-easy-javadoc 3.使…

梦开始的地方—— C语言预处理+编译过程

文章目录C语言程序的编译(预处理)1.编译和链接1) 编译的几个阶段预编译阶段编译阶段汇编阶段2) 链接2. 预处理1) 预定义符号2) #define3) #和##4) 带副作用的宏参数5) 宏和函数对比3. 常见预处理命令1) #undef2) 命令行定义3) 条件编译4) 文件包含5) 实现offsetofC语言程序的编…

Spring 中 @Autowired 修饰构造方法时注意事项

代码演示 给定一个类 One,然后看下的几种构造方法什么时候被调用 1、假设现在只有一个默认的空构造方法,代码如下: Component public class One {}然后追踪源码,如下所示: 先拿到所有声明的构造方法 然后挨个判断构…

总结Python设置Excel单元格样式的一切,比官方文档还详细

总结Python设置Excel单元格样式的一切,比官方文档还详细 Python对Excel表格处理非常方便,本文专门对Excel单元格样式设置进行总结,日常用到的设置基本都可以用openpyxl库完成。 创建一个表格 openpyxl是第三方库,如果你还没有安…

如何撰写好的科研论文:摘要(1)

导读 本系列将切片介绍如何写好科研论文,包含了:摘要,背景介绍,方法,结果,讨论等,本文[1]将从摘要开始。 1. 标准 Criteriapointline一般背景听众中的每个人都关心的事情。具体背景从每个人都关…

免费内网穿透工具测评对比,谁更好用 1

文章目录1. 前言2. 对比内容1.1官网主页对比1.2 用户注册对比1.3 用户功能页面对比1.4 客户端对比3. 结语1. 前言 自从接触到内网穿透服务,知道能把自家的电脑、树莓派、NAS等等一堆硬件改造成服务器后,笔者就陷入其中无法自拔,一会儿把树莓…

jmeter接口测试之大家都来我家领豆子

一、测试目的: 2万用户不停请求云豆领取接口时,查看服务器内存占用情况,从而确认服务器内存占用异常的情况是否得到修复。 二、测试策略: 用2万个账号,以每2秒100次请求的速度向服务器发出请求,观察内存…

c#入门-顶级语句和Main方法

程序入口 在你运行程序以后会弹出一个窗口,显示一行文字:Hello world 现在将代码中的所有东西再复制一遍。然后运行,就会得到两行Hello world 显然,我们的程序是写在这里的。 在这里写了什么,什么就会生效。 Main方…

【自动化测试】Pytest+Appium+Allure 做 UI 自动化的那些事

文本主要介绍下 PytestAllureAppium 记录一些过程和经历。 法主要用了啥: Python3 Appium Allure-pytest Pytest Appium 不常见却好用的方法 Appium 直接执行 adb shell 方法 Appium 启动时增加 --relaxed-security 参数 Appium 即可执行类似adb shell的方法 appium -p 4…

短视频账号搭建之Banner图和视频封面

前面在我赢小禾呈序里学了账号名称、头像和个人简介设置,今天把账号搭建的最后两部分一起公开: banner图是你主页上面的这个主图。 同样它的存在可以有三个作用: 第一个作用比较简单,就是让你的主页更好看。 听起来太简单了&am…

【软件测试】测试人在团队中没地位?怎么办?为什么会出现这样的问题?

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 为什么会出现这样的…