Transformer - Layer Normalization

news2024/12/23 6:35:23

Transformer - Layer Normalization

flyfish

y = x − E [ x ] V a r [ x ] + ϵ ∗ γ + β y = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta y=Var[x]+ϵ xE[x]γ+β
论文 Layer Normalization

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



x = torch.Tensor([
        [[-1.5256, -0.7502, -0.6540],
         [-1.6095, -0.1002, -0.6092],
         [-0.9798, -1.6091, -0.7121],
         [ 0.3037, -0.7773, -0.2515],
         [-0.2223,  1.6871, -0.3206]],
              
        [[-0.2993,  1.8793, -0.0721],
         [ 0.1578, -0.7735,  0.1991],
         [ 0.0457, -1.3924,  2.6891],
         [-0.1110,  0.2927, -0.1578],
         [-0.0288,  2.3571, -1.0373]]])

batch, sentence_length, embedding_dim = 2, 5, 3
#可以这样简单理解一共有2个句子,每个句子有5个词向量,每个词向量权重维度是3
print("x=", x)


# 该函数是PyTorch中的层归一化操作,主要用于归一化神经网络中的层。它的作用是将输入的特征向量在每个特征维度上进行均值和方差的标准化,然后通过可学习的参数进行缩放和偏移,以保持网络的训练稳定性。

# x:输入的特征张量,形状为 [batch_size, sentence_length, embedding_dim]。
# normalized_shape:归一化形状,指定要归一化的维度大小,这里为 [sentence_length, embedding_dim]。
# weight和bias:可选的缩放因子和偏移量参数,用于对归一化后的特征进行调整。如果未指定,则默认为None,表示不使用缩放和偏移。
# eps:用于避免除以零的小值,添加到分子的方差中
nn_layer_norm = torch.nn.LayerNorm(normalized_shape=[sentence_length, embedding_dim], eps=1e-5, elementwise_affine=True)
print("torch.nn.LayerNorm=", nn_layer_norm(x))

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

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


layer_norm = torch.nn.LayerNorm(normalized_shape=embedding_dim,elementwise_affine=False)
print(layer_norm(x))

mean = torch.mean(x, axis=-1,keepdim=True) 

print("mean:",mean)


# mean: tensor([[[-0.9766],
#          [-0.7730],
#          [-1.1003],
#          [-0.2417],
#          [ 0.3814]],

#         [[ 0.5026],
#          [-0.1389],
#          [ 0.4475],
#          [ 0.0080],
#          [ 0.4303]]])

# 计算输入张量x在指定轴axis上的方差。具体来说:

# var:表示计算的方差结果,是一个张量。
# x:输入的张量。
# axis:指定计算方差的轴,默认为最后一条轴-1。
# unbiased:是否使用无偏估计计算方差,默认为False,即使用有偏估计。
# keepdim:计算结果的维度是否与输入张量相同,默认为True,即保持相同维度。
var = torch.var(x, axis=-1,unbiased=False,keepdim=True) 
print("var:",var)
# var: tensor([[[0.1522],
#          [0.3931],
#          [0.1414],
#          [0.1948],
#          [0.8540]],

#         [[0.9562],
#          [0.2017],
#          [2.8571],
#          [0.0409],
#          [2.0257]]])

div = torch.sqrt(var+1e-05) 
print("div:",div)
# div: tensor([[[0.3902],
#          [0.6270],
#          [0.3760],
#          [0.4414],
#          [0.9241]],

#         [[0.9779],
#          [0.4491],
#          [1.6903],
#          [0.2023],
#          [1.4233]]])

out = (x-mean)/div
print(out)


# tensor([[[-1.4070,  0.5802,  0.8268],
#          [-1.3343,  1.0731,  0.2612],
#          [ 0.3206, -1.3531,  1.0325],
#          [ 1.2357, -1.2135, -0.0222],
#          [-0.6533,  1.4129, -0.7596]],

#         [[-0.8201,  1.4078, -0.5877],
#          [ 0.6606, -1.4132,  0.7526],
#          [-0.2377, -1.0885,  1.3262],
#          [-0.5882,  1.4077, -0.8195],
#          [-0.3226,  1.3537, -1.0312]]])



print("mean keepdim=False", torch.mean(x, axis=-1,keepdim=False) )
# tensor([[-0.9766, -0.7730, -1.1003, -0.2417,  0.3814],
#         [ 0.5026, -0.1389,  0.4475,  0.0080,  0.4303]])
 
  
print((1.6871 -  0.3814) / 0.9241)  #1.4129423222594957        
#验证均值
print((-1.5256 +  -0.7502 + -0.6540)/3)#-0.9766
print((-0.2993 +  1.8793 + -0.0721)/3)#0.5026333333333334

如果按照下图的就是
batch, sentence_length, embedding_dim = 2, 1, 256
在这里插入图片描述

`hidden_size`: int=256, units of embeddings and encoders
norm_layer=torch.nn.LayerNorm(hidden_size)

如果用于图像

N, C, H, W = 20, 5, 10, 10
input = torch.randn(N, C, H, W)
# Normalize over the last three dimensions (i.e. the channel and spatial dimensions)
# as shown in the image below
layer_norm = nn.LayerNorm([C, H, W])
output = layer_norm(input)

在这里插入图片描述

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

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

相关文章

【Jenkins】持续集成与交付 (一):深入理解什么是持续集成?

🟣【Jenkins】持续集成与交付 (一):深入理解什么是持续集成? 1、软件开发生命周期与持续集成2、 持续集成的流程3、持续集成的好处4、Jenkins的应用实践5、结语💖The Begin💖点点关注,收藏不迷路💖 1、软件开发生命周期与持续集成 软件开发生命周期(SDLC)是指软…

Redis缓存介绍以及常见缓存问题:穿透、雪崩和击穿

概念 缓存就是数据交换的缓冲区(Cache),是存贮数据的临时地方,一般读写性能较高。 作用: 降低后端负载 提高读写效率,降低相应时间 成本: 数据一致性成本 代码维护成本 运维成本 缓存更…

使用pyqt编写的页面导航框架

使用pyqt编写的页面导航框架 效果 介绍代码 效果 介绍 使用pyqt多种控件编写的导航框架,左边是菜单栏,点击不同的菜单选项可以切换到不同的页面。 代码 import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QP…

微服务之分布式理论zookeeper概述

一、分布式技术相关的理论 CAP理论 CAP定理(CAP theorem),⼜被称作布鲁尔定理(Eric Brewer),1998年第⼀次提出. 最初提出是指分布式数据存储不可能同时提供以下三种保证中的两种以上: (1) ⼀致性(Consistency): 每次读取收到的信息都是最新的; (2) …

Leetcode—1329. 将矩阵按对角线排序【中等】(unordered_map、priority_queue)

2024每日刷题&#xff08;121&#xff09; Leetcode—1329. 将矩阵按对角线排序 实现代码 class Solution { public:vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {const int m mat.size();const int n mat[0].size();unorder…

(51单片机)第十三章-STC系列51单片机功能介绍

13.1 单片机空闲与掉电模式的应用 1. 空闲模式 当单片机进入空闲模式时&#xff0c;除CPU处于休眠状态外&#xff0c;其余硬件全部处于活动状态&#xff0c;芯片中程序未涉及的数据存储器和特殊功能寄存器中的数据在空闲模式期间都将保持原值。假若定时器正在运行&#xff0c;…

【tcl脚本实践Demo 1】文本生成、匹配、修改、读写

引言 在芯片设计的流程中,各种EDA工具在设计、综合、布局布线、验证、时序分析等等环节都会产出大量的文件信息。这些信息是海量的,如果单纯靠程序员自己查看信息效率很低并且很容易纰漏。所以脚本语言可以很好的解决这个问题,可以利用脚本语言匹配到敏感的信息,完成对信息…

C++ 如何实现原子性

1.操作系统如何实现原子性 在单处理器,单核,运行多线程的情况下,我们不使用线程同步工具, 我们会出现,线程之间会互相抢夺,临界区的资源,造成数据不符合我们预期的结果, 后面再说解决办法,那么我们怎么帮助实现原子性 1 屏蔽中断,不让线程之间切换,让它完成再切换 2 底层硬…

算法设计与分析 3.2 牛顿法及改进、迭代法、矩阵谱半径、雅可比迭代、高斯迭代

思考题1 改进cosx&#xff1f;优化算法 关键点在于cos计算过于麻烦&#xff0c;而每次都要求sinx的值 故直接简化为cosx的导数 -sinx 即&#xff1a; 原&#xff1a;//double daoshu(double x) { // return 18 * x - cos(x); //} 改&#xff1a;double daoshu(double x) {retu…

基于ssm+vue开放式教学评价管理系统【ppt·代码·文档报告】

项目演示视频 项目名称&#xff1a;开放式教学评价管理系统 系统介绍&#xff1a;本系统是通过java的SSM框架来实现的&#xff0c;前端采用vue框架进行实现 管理员通过登录进入到系统操作界面&#xff0c;结合需求可以对个人信息进行在线修改维护&#xff0c;也可结合需求进行…

深入剖析Redis哨兵模式的原理和应用

【更多精彩内容,欢迎关注小米的微信公众号“软件求生”】 大家好,我是小米!今天我们来聊一聊Redis中一个非常重要的话题——哨兵模式。相信大家在使用Redis时一定遇到过一些分布式系统的问题,而哨兵模式正是解决这些问题的关键之一。让我们一起来深入了解一下哨兵模式的原…

Notion是什么,Notion软件下载,Notion官方网站在哪里?国内用户Notion怎么订阅升级会员?

Notion是什么 Notion&#xff0c;一款强大的多功能工具&#xff0c;可用于组织笔记、任务、项目、数据库和文档等。 Notion软件下载 这个到Notion官方网站下载就可以了。 怎么订阅Notion会员 注册好了Notion的账号&#xff0c;来到首页&#xff0c;点击设置&#xff0c;左边…

13.Blender 界面介绍(下) 雕刻、纹理绘制及属性

界面介绍 1. 布局 物体的移动旋转和缩放等操作 2. 建模 里面就是有一些建模常用的功能 里面的功能对于做MMD来说不是必备的操作 3. 雕刻 使用里面的工具可以对物体本身进行修改 4. UV编辑 如果想要编辑UV贴图 将编辑模式改为纹理绘制 再点击右边的工具 如果进行编…

WordPress缓存插件有哪些?好用的缓存插件分享

目前WordPress缓存插件有&#xff1a;WP Rocket、WP Super Cache、W3 Total Cache、Sucuri、NitroPack、SiteGround Optimizer、LiteSpeed Cache、WP-Optimize、Hummingbird、Cache Enabler、Comet Cache。 在当今的数字世界中&#xff0c;拥有一个高效的网站对于吸引和留住用…

刷机维修进阶教程-----红米note7 修复基带 更改参数 nv损坏故障 实例步骤操作解析

在前面的博文中我有说过。不管刷更改参数还是修复基带,尽可能的情况下备份一些主要分区,上期讲了小米6x 小米5 小米6这些机型更改参数的具体步骤。今天的教程以红米note7为例解析下改参数和修复nv损坏的具体步骤,两者操作实际没有什么冲突。有兴趣的友友建议多看下我关于…

10GMAC层设计系列-(1)10G Ethernet PCS/PMA

一、引言 对于10G以太网MAC层的实现&#xff0c;Xilinx提供了 3种IP核&#xff0c;分别是 10G Ethernet MAC、10G Ethernet PCS/PMA、10G Ethernet Subsystem。 10G Ethernet MAC只包含MAC层&#xff0c;外部需要提供一个PHY芯片进行数据对齐&#xff0c;10G Ethernet MAC与P…

Hadoop之路---伪分布式环境搭建

hadoop更适合在liunx环境下运行&#xff0c;会节省后期很多麻烦&#xff0c;而用虚拟器就太占主机内存了&#xff0c;因此后面我们将把hadoop安装到wsl后进行学习,后续学习的环境是Ubuntu-16.04 &#xff08;windows上如何安装wsl&#xff09; 千万强调&#xff0c;创建完hado…

管理十大定律:深入解析与实战应用

在复杂多变的管理实践中&#xff0c;管理者面临着无数的挑战和机遇。为了成功应对这些挑战并抓住机遇&#xff0c;管理者需要掌握一系列有效的管理定律和原则&#xff0c;帮助管理者更好地把握管理精髓&#xff0c;提升组织效能。 1、手表定律&#xff1a;明确目标&#xff0…

STM32 实时时钟(RTC)

必要知识&#xff1a; 1、Unix时间戳 2、time.h localtime()&#xff1a;将秒寄存器的值转化为当地时间 mktime()&#xff1a;将指向的结构体转化为自1970年1月1日的秒数 注&#xff1a;在STM32中两函数换算出的时间均是0时区伦敦时间 一、BKP&#xff08;Backup Registers&…

将阿里云中数据传输到其他超算服务器

目录 方法一&#xff1a;在阿里云中连接超算&#xff0c;然后使用rsync&#xff08;速度慢&#xff09; 方法2&#xff1a;rclone(速度很快&#xff0c;100G只花了大约20min) 方法一&#xff1a;在阿里云中连接超算&#xff0c;然后使用rsync/scp&#xff08;速度慢&#xff0…