当前位置: 首页 > news >正文

详解三种常用标准化:Batch Norm、Layer Norm和RMSNorm

在深度学习中,标准化技术是提升模型训练速度、稳定性和性能的重要手段。本文将详细介绍三种常用的标准化方法:Batch Normalization(批量标准化)、Layer Normalization(层标准化)和 RMS Normalization(RMS标准化),并对其原理、实现和应用场景进行深入分析。

一、Batch Normalization

1.1 Batch Normalization的原理

Batch Normalization(BN)通过在每个小批量数据的每个神经元输出上进行标准化来减少内部协变量偏移。具体步骤如下:

  1. 计算小批量的均值和方差
    对于每个神经元的输出,计算该神经元在当前小批量中的均值和方差。

    [
    \muB = \frac{1}{m} \sum{i=1}^m x_i
    ]

    [
    \sigmaB^2 = \frac{1}{m} \sum{i=1}^m (x_i - \mu_B)^2
    ]

  2. 标准化
    使用计算得到的均值和方差对数据进行标准化。

    [
    \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}
    ]

  3. 缩放和平移
    引入可学习的参数进行缩放和平移。

    [
    y_i = \gamma \hat{x}_i + \beta
    ]

    其中,(\gamma)和(\beta)是可学习的参数。

1.2 Batch Normalization的实现

在PyTorch中,Batch Normalization可以通过 torch.nn.BatchNorm2d实现。

import torch
import torch.nn as nn# 创建BatchNorm层
batch_norm = nn.BatchNorm2d(num_features=64)# 输入数据
x = torch.randn(16, 64, 32, 32)  # (batch_size, num_features, height, width)# 应用BatchNorm
output = batch_norm(x)
​

1.3 Batch Normalization的优缺点

优点
  • 加速训练:通过减少内部协变量偏移,加快了模型收敛速度。
  • 稳定性提高:减小了梯度消失和爆炸的风险。
  • 正则化效果:由于引入了噪声,有一定的正则化效果。
缺点
  • 依赖小批量大小:小批量大小过小时,均值和方差估计不准确。
  • 训练和推理不一致:训练时使用小批量的均值和方差,推理时使用整个数据集的均值和方差。

二、Layer Normalization

2.1 Layer Normalization的原理

Layer Normalization(LN)通过在每一层的神经元输出上进行标准化,独立于小批量的大小。具体步骤如下:

  1. 计算每一层的均值和方差
    对于每一层的神经元输出,计算其均值和方差。

    [
    \muL = \frac{1}{H} \sum{i=1}^H x_i
    ]

    [
    \sigmaL^2 = \frac{1}{H} \sum{i=1}^H (x_i - \mu_L)^2
    ]

  2. 标准化
    使用计算得到的均值和方差对数据进行标准化。

    [
    \hat{x}_i = \frac{x_i - \mu_L}{\sqrt{\sigma_L^2 + \epsilon}}
    ]

  3. 缩放和平移
    引入可学习的参数进行缩放和平移。

    [
    y_i = \gamma \hat{x}_i + \beta
    ]

    其中,(\gamma)和(\beta)是可学习的参数。

2.2 Layer Normalization的实现

在PyTorch中,Layer Normalization可以通过 torch.nn.LayerNorm实现。

import torch
import torch.nn as nn# 创建LayerNorm层
layer_norm = nn.LayerNorm(normalized_shape=64)# 输入数据
x = torch.randn(16, 64)# 应用LayerNorm
output = layer_norm(x)
​

2.3 Layer Normalization的优缺点

优点
  • 与小批量大小无关:适用于小批量训练和在线学习。
  • 更适合RNN:在循环神经网络中表现更好,因为它独立于时间步长。
缺点
  • 计算开销较大:每一层都需要计算均值和方差,计算开销较大。
  • 对CNN效果不明显:在卷积神经网络中效果不如BN明显。

三、RMS Normalization

3.1 RMS Normalization的原理

RMS Normalization(RMSNorm)通过标准化每一层的RMS值,而不是均值和方差。具体步骤如下:

  1. 计算RMS值
    对于每一层的神经元输出,计算其RMS值。

    [
    \text{RMS}(x) = \sqrt{\frac{1}{H} \sum_{i=1}^H x_i^2}
    ]

  2. 标准化
    使用计算得到的RMS值对数据进行标准化。

    [
    \hat{x}_i = \frac{x_i}{\text{RMS}(x) + \epsilon}
    ]

  3. 缩放和平移
    引入可学习的参数进行缩放和平移。

    [
    y_i = \gamma \hat{x}_i + \beta
    ]

    其中,(\gamma)和(\beta)是可学习的参数。

3.2 RMS Normalization的实现

在PyTorch中,RMS Normalization没有直接的内置实现,可以通过自定义层来实现。

import torch
import torch.nn as nnclass RMSNorm(nn.Module):def __init__(self, normalized_shape, epsilon=1e-8):super(RMSNorm, self).__init__()self.epsilon = epsilonself.gamma = nn.Parameter(torch.ones(normalized_shape))self.beta = nn.Parameter(torch.zeros(normalized_shape))def forward(self, x):rms = torch.sqrt(torch.mean(x**2, dim=-1, keepdim=True) + self.epsilon)x = x / rmsreturn self.gamma * x + self.beta# 创建RMSNorm层
rms_norm = RMSNorm(normalized_shape=64)# 输入数据
x = torch.randn(16, 64)# 应用RMSNorm
output = rms_norm(x)
​

3.3 RMS Normalization的优缺点

优点
  • 计算效率高:计算RMS值相对简单,计算开销较小。
  • 稳定性好:在某些任务中可以表现出更好的稳定性。
缺点
  • 应用较少:相较于BN和LN,应用场景和研究较少。
  • 效果不确定:在某些情况下效果可能不如BN和LN显著。

四、比较与应用场景

4.1 比较

特性Batch NormLayer NormRMSNorm
标准化维度小批量内各特征维度每层各特征维度每层各特征维度的RMS
计算开销中等较大较小
对小批量大小依赖依赖不依赖不依赖
应用场景CNN、MLPRNN、Transformer各类神经网络
正则化效果有一定正则化效果无显著正则化效果无显著正则化效果

4.2 应用场景

  • Batch Normalization

    • 适用于卷积神经网络(CNN)和多层感知机(MLP)。
    • 对小批量大小有依赖,不适合小批量和在线学习。
  • Layer Normalization

    • 适用于循环神经网络(RNN)和Transformer。
    • 独立于小批量大小,适合小批量和在线学习。
  • RMS Normalization

    • 适用于各种神经网络,尤其在计算效率和稳定性有要求的任务中。
    • 相对较新,应用场景和研究较少,但在某些任务中可能表现优异。

五、总结

Batch Normalization

、Layer Normalization和RMS Normalization是深度学习中常用的标准化技术。它们各有优缺点,适用于不同的应用场景。通过理解其原理和实现,您可以根据具体需求选择合适的标准化方法,提升模型的训练速度和性能。

相关文章:

详解三种常用标准化:Batch Norm、Layer Norm和RMSNorm

在深度学习中,标准化技术是提升模型训练速度、稳定性和性能的重要手段。本文将详细介绍三种常用的标准化方法:Batch Normalization(批量标准化)、Layer Normalization(层标准化)和 RMS Normalization&#…...

linux+docker+nacos+mysql部署

一、下载 docker pull mysql:5.7 docker pull nacos/nacos-server:v2.2.2 docker images 二、mysql部署 1、创建目录存储数据信息 mkdir ~/mysql cd ~/mysql 2、运行 MySQL 容器 docker run -id \ -p 3306:3306 \ --name mysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/…...

如何实现gitlab和jira连通

将 GitLab 和 Jira 集成起来可以实现开发任务与代码变更的联动,提高团队协作效率。以下是实现两者连通的详细步骤: 1. 确保必要条件 在进行集成之前,确保以下条件满足: 你有 GitLab 和 Jira 的管理员权限。Jira 是 Jira Cloud 或…...

利用ML.NET精准提取人名

在当今信息爆炸的时代,文本处理任务层出不穷,其中人名提取作为基础且重要的工作,广泛应用于信息检索、社交网络分析、客户关系管理等领域。随着人工智能不断进步,ML.NET作为微软推出的开源机器学习框架,为开发者提供了…...

Node.js的解释

1. Node.js 入门教程 1.1 什么是 Node.js? 1.1.1 Node.js 是什么? Node.js 是一个基于 JavaScript 的开源服务器端运行时环境,允许开发者用 JavaScript 编写服务器端代码。与传统的前端 JavaScript 主要运行在浏览器端不同,Nod…...

Macos下交叉编译安卓的paq8px压缩算法

官方没有android的编译方法,自己编写脚本在macos下交叉编译. 下载源码: git clone https://github.com/hxim/paq8px.git 稍旧的ndk并不能编译成功,需要下载最新的ndkr27c, 最后是使用clang来编译。 编译build.sh export ANDROID_NDK/Vol…...

如何在data.table中处理缺失值

📊💻【R语言进阶】轻松搞定缺失值,让数据清洗更高效! 👋 大家好呀!今天我要和大家分享一个超实用的R语言技巧——如何在data.table中处理缺失值,并且提供了一个自定义函数calculate_missing_va…...

从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑

文章目录 从零安装 LLaMA-Factory 微调 Qwen 大模型成功及所有的坑一 参考二 安装三 启动准备大模型文件 四 数据集(关键)!4.1 Alapaca格式4.2 sharegpt4.3 在 dataset_info.json 中注册4.4 官方 alpaca_zh_demo 例子 999条数据, 本机微调 5分…...

SQL-leetcode—1164. 指定日期的产品价格

1164. 指定日期的产品价格 产品数据表: Products ---------------------- | Column Name | Type | ---------------------- | product_id | int | | new_price | int | | change_date | date | ---------------------- (product_id, change_date) 是此表的主键(具…...

[Day 15]54.螺旋矩阵(简单易懂 有画图)

今天我们来看这道螺旋矩阵,和昨天发的题很类似。没有技巧,全是循环。小白也能懂~ 力扣54.螺旋矩阵 题目描述: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: …...

HTTP 配置与应用(不同网段)

想做一个自己学习的有关的csdn账号,努力奋斗......会更新我计算机网络实验课程的所有内容,还有其他的学习知识^_^,为自己巩固一下所学知识,下次更新校园网设计。 我是一个萌新小白,有误地方请大家指正,谢谢…...

Quartus:开发使用及 Tips 总结

Quartus是Altera(现已被Intel收购)推出的一款针对其FPGA产品的综合性开发环境,用于设计、仿真和调试数字电路。以下是使用Quartus的一些总结和技巧(Tips),帮助更高效地进行FPGA项目开发: 这里写目录标题 使用总结TIPS…...

VSCode下EIDE插件开发STM32

VSCode下STM32开发环境搭建 本STM32教程使用vscode的EIDE插件的开发环境,完全免费,有管理代码文件的界面,不需要其它IDE。 视频教程见本人的 VSCodeEIDE开发STM32 安装EIDE插件 Embedded IDE 嵌入式IDE 这个插件可以帮我们管理代码文件&am…...

Golang并发机制及CSP并发模型

Golang 并发机制及 CSP 并发模型 Golang 是一门为并发而生的语言,其并发机制基于 CSP(Communicating Sequential Processes,通信顺序过程) 模型。CSP 是一种描述并发系统中交互模式的正式语言,强调通过通信来共享内存…...

HTML 文本格式化详解

在网页开发中,文本内容的呈现方式直接影响用户的阅读体验。HTML 提供了多种文本格式化元素,可以帮助我们更好地控制文本的显示效果。本文将详细介绍 HTML 中的文本格式化元素及其使用方法,帮助你轻松实现网页文本的美化。 什么是 HTML 文本格…...

我谈《概率论与数理统计》的知识体系

学习《概率论与数理统计》二十多年后,在廖老师的指导下,才厘清了各章之间的关系。首先,这是两个学科综合的一门课程,这一门课程中还有术语冲突的问题。这一门课程一条线两个分支,脉络很清晰。 概率论与统计学 概率论…...

五、华为 RSTP

RSTP(Rapid Spanning Tree Protocol,快速生成树协议)是 STP 的优化版本,能实现网络拓扑的快速收敛。 一、RSTP 原理 快速收敛机制:RSTP 通过引入边缘端口、P/A(Proposal/Agreement)机制等&…...

基于Java Web的网上房屋租售网站

内容摘要 本毕业设计题目为《基于Java Web的网上房屋租售网站》,是在信息化时代下充分利用互联网对传统房屋租售方式进行创新,在互联网上进行房屋租售突破了传统方式的局限性。对于房屋租售的当事人都提供了极大的便利。本稳针对了实际用户需求&#xf…...

Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用

QTableView 是QT的一个强大的表视图部件,可以与模型结合使用以显示和编辑数据。QSqlQueryModel、QSqlTableModel 都是用于与 SQL 数据库交互的模型,将二者与QTableView结合使用可以轻松地展示和编辑数据库的数据。 QSqlQueryModel的简单应用 import sys from PySid…...

git常用命令学习

目录 文章目录 目录第一章 git简介1.Git 与SVN2.Git 工作区、暂存区和版本库 第二章 git常用命令学习1.ssh设置2.设置用户信息3.常用命令设置1.初始化本地仓库init2.克隆clone3.查看状态 git status4.添加add命令5.添加评论6.分支操作1.创建分支2.查看分支3.切换分支4.删除分支…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

测试markdown--肇兴

day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...