LLM:归一化 总结
一、Batch Normalization
原理
Batch Normalization 是一种用于加速神经网络训练并提高稳定性的技术。它通过在每一层网络的激活值上进行归一化处理,使得每一层的输入分布更加稳定,从而加速训练过程,并且减轻了对参数初始化的依赖。
公式
例子
下面是一个使用 Python 和 NumPy 实现的 Batch Normalization 例子:
import numpy as npclass BatchNormalization:def __init__(self, epsilon=1e-5, momentum=0.9):# 初始化BatchNormalization类,设定epsilon和momentum的默认值self.epsilon = epsilon # 防止分母为零的小常数self.momentum = momentum # 用于更新运行中均值和方差的动量self.running_mean = None # 运行中的均值self.running_var = None # 运行中的方差self.gamma = None # 缩放参数self.beta = None # 平移参数def initialize_params(self, D):# 初始化gamma, beta, running_mean和running_var的参数self.gamma = np.ones(D) # 初始化缩放参数为1self.beta = np.zeros(D) # 初始化平移参数为0self.running_mean = np.zeros(D) # 初始化运行中的均值为0self.running_var = np.ones(D) # 初始化运行中的方差为1def forward(self, X, training=True):# 前向传播,X是输入数据,training表示是否为训练模式if self.running_mean is None:# 如果是第一次运行,初始化参数self.initialize_params(X.shape[1]) # X.shape[1]是特征的维度if training:# 训练模式下batch_mean = np.mean(X, axis=0) # 计算mini-batch的均值batch_var = np.var(X, axis=0) # 计算mini-batch的方差# axis=0 代表沿着第一维,也就是行,可以想象成一个尺子,和每行对齐,依次往下移动,得到所有行在这些列上的均值,因此维度是【5】# axis=1 代表沿着第二维,也就是列。同理,最后维度是行的维度。# 更新运行中的均值self.running_mean = self.momentum * self.running_mean + (1 - self.momentum) * batch_mean# 更新运行中的方差self.running_var = self.momentum * self.running_var + (1 - self.momentum) * batch_var# 标准化输入数据X_normalized = (X - batch_mean) / np.sqrt(batch_var + self.epsilon)else:# 测试模式下,使用运行中的均值和方差进行标准化X_normalized = (X - self.running_mean) / np.sqrt(self.running_var + self.epsilon)# 应用可学习的缩放和平移参数out = self.gamma * X_normalized + self.betareturn outdef __call__(self, X, training=True):# 使类实例可以像函数一样被调用return self.forward(X, training)# 示例数据
np.random.seed(0) # 设置随机种子以确保结果可重复
X = np.random.randn(10, 5) # 生成一个随机的10x5的矩阵# 创建BatchNormalization实例
bn = BatchNormalization()# 在训练模式下进行前向传播
output_train = bn(X, training=True)
print("Training Mode Output:\n", output_train) # 打印训练模式下的输出# 在测试模式下进行前向传播
output_test = bn(X, training=False)
print("Testing Mode Output:\n", output_test) # 打印测试模式下的输出
维度变化
假设输入数据 X
的形状是 (batch_size, D)
,其中 D
是特征的维度,batch_size
是 mini-batch 的大小。Batch Normalization 处理后的输出数据形状保持不变,仍然是 (batch_size, D)
。
应用场景
Batch Normalization 可以应用于网络的任意层,常见的应用包括:
- 全连接层后的激活值
- 卷积层后的激活值(在这种情况下,均值和方差是沿着通道维度计算的)
结论
Batch Normalization 是一种强大的正则化和加速训练的方法,通过对 mini-batch 内的数据进行归一化处理,减少了内部协变量偏移,提高了网络的训练效率和稳定性。
BN的基本思想就是:把网络的每个隐含层的分布都归一化到标准正态。其实就是把越来越偏的分布强制拉回到比较标准的分布,这样使得激活函数的输入值落在该激活函数对输入比较敏感的区域,这样一来输入的微小变化就会导致损失函数较大的变化。通过这样的方式可以使梯度变大,就避免了梯度消失的问题,而且梯度变大意味着收敛速度快,能大大加快训练速度。
参考:https://blog.csdn.net/BXD1314/article/details/120148013
https://zhuanlan.zhihu.com/p/244983042
二、Layer Normalization
原理
Layer Normalization 是一种用于标准化神经网络层输出的技术,它与 Batch Normalization 类似,但不同的是它是沿着每个样本的特征维度进行标准化。Layer Normalization 不依赖于 mini-batch 的统计数据,因此在处理 RNN 等时间序列数据时表现更好。
公式
例子
下面是一个使用 Python 和 NumPy 实现的 Layer Normalization 例子:
import numpy as npclass LayerNormalization:def __init__(self, epsilon=1e-5):# 初始化LayerNormalization类,设定epsilon的默认值self.epsilon = epsilon # 防止分母为零的小常数self.gamma = None # 缩放参数self.beta = None # 平移参数def initialize_params(self, D):# 初始化gamma和beta的参数self.gamma = np.ones(D) # 初始化缩放参数为1self.beta = np.zeros(D) # 初始化平移参数为0def forward(self, X):# 前向传播,X是输入数据if self.gamma is None or self.beta is None:# 如果是第一次运行,初始化参数self.initialize_params(X.shape[1]) # X.shape[1]是特征的维度# 计算每个样本的均值和方差mean = np.mean(X, axis=1, keepdims=True) # keepdims=True保持结果的维度一致var = np.var(X, axis=1, keepdims=True) # keepdims=True保持结果的维度一致# 标准化输入数据X_normalized = (X - mean) / np.sqrt(var + self.epsilon)# 应用可学习的缩放和平移参数out = self.gamma * X_normalized + self.betareturn outdef __call__(self, X):# 使类实例可以像函数一样被调用return self.forward(X)# 示例数据
np.random.seed(0) # 设置随机种子以确保结果可重复
X = np.random.randn(10, 5) # 生成一个随机的10x5的矩阵# 创建LayerNormalization实例
ln = LayerNormalization()# 进行前向传播
output = ln(X)
print("Layer Normalization Output:\n", output) # 打印输出
关键点解释
-
计算每个样本的均值和方差:
- 使用
np.mean(X, axis=1, keepdims=True)
计算每个样本的均值,axis=1
表示沿着特征维度计算,keepdims=True
确保输出的形状与输入一致。 - 使用
np.var(X, axis=1, keepdims=True)
计算每个样本的方差,axis=1
表示沿着特征维度计算,keepdims=True
确保输出的形状与输入一致。
- 使用
-
标准化和应用缩放和平移参数:
- 对输入数据进行标准化,得到
X_normalized
。 - 使用可学习的参数
gamma
和beta
对标准化后的数据进行缩放和平移,得到最终输出out
。
- 对输入数据进行标准化,得到
总结
Layer Normalization 是一种有效的正则化技术,特别适用于 RNN 和其他不依赖于 mini-batch 统计的模型。它通过对每个样本的特征维度进行标准化,提供了更稳定的训练过程。
参考:https://pytorch.org/docs/stable/generated/torch.nn.LayerNorm.html
https://zhuanlan.zhihu.com/p/54530247
三、RMSNorm
公式
RMSNorm的思想就是移除层归一化中的均值的计算部分。
代码
import torch
import torch.nn as nn# 假设有一个批次(batch)的嵌入向量
batch, sentence_length, embedding_dim = 20, 5, 10# 生成随机的嵌入向量,形状为 [20, 5, 10]
embedding = torch.randn(batch, sentence_length, embedding_dim)# 创建RMSNorm实例,传入的特征维度是 embedding_dim
rms_norm = nn.RMSNorm(embedding_dim)# 对嵌入向量进行归一化
normalized_embedding = rms_norm(embedding)print("Original Embedding:\n", embedding.shape)
print("Normalized Embedding:\n", normalized_embedding.shape)
参考:
https://mltalks.medium.com/rmsnorm%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB-bfae83f6d464
https://blog.csdn.net/yjw123456/article/details/138139970
https://blog.csdn.net/qq_43814415/article/details/136985115
https://pytorch.org/docs/stable/generated/torch.nn.RMSNorm.html#torch.nn.RMSNorm
四、区别
Batch Normalization (BatchNorm) vs. Layer Normalization (LayerNorm)
Batch Normalization
原理:Batch Normalization 对 mini-batch 内的激活值进行标准化处理,使得每一层的输入分布更稳定。
适用场景:
- 适用于卷积神经网络(CNN),尤其在计算机视觉任务中效果显著。
- 对于大型批次训练效果更好。
缺陷:
- 在小批量训练或在线学习(batch size=1)时表现不佳。
- 依赖于 mini-batch 的统计数据,在循环神经网络(RNN)等序列模型中效果不佳。
Layer Normalization
原理:Layer Normalization 对每个样本的特征维度进行标准化,使得每层的输入特征分布更加稳定。
适用场景:
- 适用于循环神经网络(RNN)和变压器(Transformer)等模型。
- 适合小批量或在线学习,因为不依赖于 mini-batch 的统计数据。
缺陷:
- 计算量较大,增加了训练时间。
- 在某些特定任务中,效果可能不如 Batch Normalization。
Layer Normalization vs. RMS Normalization (RMSNorm)
Layer Normalization
优点:
- 稳定训练过程,适用于各种深度神经网络。
缺陷:
- 计算量较大,因为需要计算均值和方差。
RMS Normalization
原理:RMSNorm 通过计算均方根值对输入进行归一化,而不需要计算均值和方差。
适用场景:
- 适用于不需要偏置项的模型。
- 在处理变压器和RNN等序列模型时表现良好。
优点:
- 计算简便,仅需计算均方根值,计算量小。
- 在一些任务中表现与 LayerNorm 相当,但训练速度更快。
缺陷:
- 在某些特定任务中可能不如 LayerNorm 稳定。
总结
- Batch Normalization 更适合卷积神经网络和大型批量训练,但不适用于小批量训练和序列模型。
- Layer Normalization 更适用于序列模型和小批量训练,虽然计算量较大,但能提供稳定的训练效果。
- RMS Normalization 通过简化计算实现了高效的归一化,适用于需要快速训练且不需要偏置项的模型。
相关文章:

LLM:归一化 总结
一、Batch Normalization 原理 Batch Normalization 是一种用于加速神经网络训练并提高稳定性的技术。它通过在每一层网络的激活值上进行归一化处理,使得每一层的输入分布更加稳定,从而加速训练过程,并且减轻了对参数初始化的依赖。 公式 …...

蓝桥杯 2024 年第十五届省赛真题 —— 最大异或结点
目录 1. 最大异或结点1. 问题描述2. 输入格式3. 输出格式4. 样例输入5. 样例输出6. 样例说明7. 评测用例规模与约定 2. 解题思路1. 解题思路2. AC_Code 1. 最大异或结点 1. 问题描述 小蓝有一棵树,树中包含 N N N 个结点,编号为 0 , 1 , 2 , ⋯ , N − 1 0,1,2,…...

AV1技术学习:Loop Restoration Filter
环路恢复滤波器(restoration filter)适用于64 64、128 128 或 256 256 像素块单元,称为 loop restoration units (LRUs)。每个单元可以独立选择是否跳过滤波、使用维纳滤波器(Wiener filter)或使用自导滤波器&#…...

如何使用python实现自动化办公?干货满满!
Python作为一种简单而强大的编程语言,不仅在数据科学和软件开发领域广受欢迎,还在办公自动化方面发挥了巨大作用。通过Python,我们可以编写脚本来自动执行各种重复性任务,从而提高工作效率并减少错误。在本文中,我们将…...

QT Creator下载安装详细教程(保姆级教程)
qt下载安装 1.下载网址 通过清华大学开源软件镜像站进行下载:链接: https://mirrors.tuna.tsinghua.edu.cn/qt/development_releases/online_installers/ 这里我选的是4.4版本的,也可以选择4.7版本,问题不大。 根据电脑系统选择下载linux…...

无人机公司销售需要什么资质
国家民航局于2024年1月1日实施了《无人驾驶航空器飞行管理暂行条例》,根据这个管理条例里面的 第十一条 使用除微型以外的民用无人驾驶航空器从事飞行活动的单位应当具备下列条件,并向国务院民用航空主管部门或者地区民用航空管理机构申请取得民用无人驾…...

代码自动化重构工具OpenRewrite介绍
OpenRewrite 是一个用于大规模自动化代码重构的开源框架,它极大地提升了开发人员的研发效率,通过自动化地进行代码重构和转换,帮助开发人员消除代码库中的技术债务。 通过 LST、访问器和配方的结合,OpenRewrite 能够实现准确的代…...

Win11安装Docker
下载Docker Desktop for Windows 下载 下载连接:Install Docker Desktop on Windows | Docker Docs 地址在国外,需要科学上网。也可使用我提供的,百度网盘:https://pan.baidu.com/s/1232TTkkzLsoZyFjC3bmgiQ 安装 下载完成之后…...

Windows电脑如何启动RTSP服务实现本地摄像头数据共享
技术背景 提起Windows共享本地摄像头,好多人想到的是通过ffmepg或vlc串流到服务器,实际上,用轻量级RTSP服务更简单,本文就介绍下,如何用大牛直播SDK的Windows轻量级RTSP服务,采集摄像头,生成本…...

探索 Spring WebFlux:构建响应式 Web 应用
探索 Spring WebFlux:构建响应式 Web 应用 随着互联网的发展,传统的同步编程模型已经难以应对高并发和高吞吐量的需求。为了解决这些问题,响应式编程逐渐成为主流。Spring WebFlux 是 Spring 5 引入的一个响应式 Web 框架,它基于…...

C# 植物大战僵尸
Winform 版本开发 高效率、流畅植物大战僵尸 git地址:冯腾飞/植物大战僵尸...

css 作业 2
文章目录 前言第四题第五题第六题第七题第八题第九题第十题(子标签) 前言 昨天写了前面三次作业,今天把剩下的七个作业写完 第四题 http://127.0.0.1:5500/index1.html,就用这个网址查看代码在网页的展示效果 代码评测过不了&…...

axios在vue中的使用
文章目录 一、axios是什么?二、使用步骤2.1 下载2.2 引入2.3 使用Get请求Post请求Forms 三、封装 一、axios是什么? Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和no…...

FastAPI(七十七)实战开发《在线课程学习系统》接口开发-- 课程编辑和查看评论
源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 课程编辑 先来看下课程编辑 1.判断是否登录 2.判断课程是否存在 3.是否有权限(只有自己可以修改自己的课程) 4.名称是否重复…...

【JavaEE初阶】线程的概念及创建
目录 📕 前言 📕 认识线程(Thread) 🚩 概念 😊线程是什么 🙂 为啥要有线程 😭 进程和线程的区别(面试题重点) 🤭 Java的线程和操作系统线程…...

0727,学什么学,周六就应该休息!!!!!
周六就应该休息,一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01:使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器!!! 今天到此为止&#x…...

【C#】获取DICOM图像像素的像素值
8位像素深度的像素值 public byte GetGreyValue(int x, int y) {x Math.Min(x, m_nWidth - 1);y Math.Min(y, m_nHeight - 1);unsafe{byte* greyValue (byte*)m_pDicomData.ToPointer() y * m_nWidth x;return *greyValue;} } 16位像素深度的像素值 public ushort GetG…...

k8s多集群管理工具kubecm
文章目录 一、概述二、安装1、官网链接2、各平台安装2.1、MacOS2.2、Linux2.3、Windows 三、实例1、验证2、配置kubecm自动补全(选做)2.1、Bash2.2、Zsh2.3、fish2.4、PowerShell 3、创建存放kubeconfig文件的目录4、添加到 $HOME/.kube/config4.1、kube…...

通过 WSL 2 在Windows 上挂载 Linux 磁盘
原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换,效率过低,所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本(Build 19041 及更高版本)或 Win…...

【C#】在一个给定的宽、高范围内,获取到该多边形内部的所有坐标集合?
问题点 使用C#语言在一个给定的宽、高范围内,获取到该多边形内部的所有坐标集合? 这个多边形可能存在交叉及互相重叠部分 图像的宽、高可以定义为:2000*2000 多边形坐标集合:Point[] polygon_points new Point[] { new Point…...

json的数据结构
JSON 的数据结构 JSON 由两种数据结构组成:对象(字典)和数组。 一、对象 对象(object)是由键值对组成的无序集合。 键是字符串,值可以是任何类型,包括对象和数组;对象由一对花括…...

html-docx-js和file-saver实现html导出word
依赖html-docx-js,file-saver,html2canvas import { asBlob } from html-docx-js/dist/html-docx; import { saveAs } from file-saver; import html2Canvas from html2canvas;const handleImageToBase64 (cloneEle) > {let imgElements cloneEle.…...

三维影像系统PACS源码,图像存储与传输系统,应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统
PACS,即图像存储与传输系统,是应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统。目标是支持在医院内部所有关于图像的活动,集成了医疗设备,图像存储和分发,数字图像在重要诊断和会诊时的显示&a…...

Golang | Leetcode Golang题解之第292题Nim游戏
题目: 题解: func canWinNim(n int) bool {return n%4 ! 0 }...

Redis在SpringBoot中配置
lettuce redis的使用方法有两种,jedis和lecttuce,jedis用的不是很多,下面讲解用lettuce的使用方法。 首先导包: <!--redis依赖--> <dependency><groupId>org.springframework.boot</groupId><artif…...

linux 网络子系统
__netif_receive_skb_core 是 Linux 内核网络子系统中一个非常重要的函数,它负责将网络设备驱动层接收到的数据包传递到上层协议栈进行处理。以下是对该函数的一些关键点的详细解析: 一、函数作用 __netif_receive_skb_core 函数是处理接收到的网络数据…...

JVM:垃圾回收器演进
文章目录 一、演进二、Shenandoah三、ZGC 一、演进 二、Shenandoah Shenandoah是由Red Hat开发的一款低延迟的垃圾收集器,Shenandoah并发执行大部分GC工作,包括并发的整理,堆大小对STW的时间基本没有影响。 三、ZGC ZGC是一种可扩展的低延…...

全新微软语音合成网页版源码,短视频影视解说配音网页版系统-仿真人语音
源码介绍 最新微软语音合成网页版源码,可以用来给影视解说和短视频配音。它是TTS文本转语言,API接口和PHP源码。 这个微软语音合成接口的源码,超级简单,就几个文件搞定。用的是官方的API,试过了,合成速度…...

大语言模型-对比学习-Contrastive Learning
一、对比学习概念 对比学习是一种特殊的无监督学习方法。 旨在通过拉近相关样本的距离并且推远不相关样本的距离,来学习数据表示。 通常使用一种高自由度、自定义的规则来生成正负样本。在模型预训练中有着广泛的应用。 二、对比学习小案例 对比学习主要分为三个…...

C++ 封装的用法
C(七)封装 封装,可以达到,对外提供接口,屏蔽数据,对内开放数据。 权限控制 struct 中所有行为和属性都是 public 的(默认),此举也是为了 C兼容 C 语言, 因为 C 语言中没有权限的概念。 C中的 class 可以…...