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
    • 使用可学习的参数 gammabeta 对标准化后的数据进行缩放和平移,得到最终输出 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 通过简化计算实现了高效的归一化,适用于需要快速训练且不需要偏置项的模型。

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

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

相关文章

分类模型——逻辑回归和Fisher线性判别分析

个人学习笔记,课程为数学建模清风付费课程 目录 一、引例 二、逻辑回归 2.1线性概率模型 2.2Fisher线性判别分析 2.3两点分布(伯努利分布) 2.4连接函数的取法 2.5如何求解 2.6如何用于分类 三、SPSS 3.1二元分类 3.1.1逻辑回…

MySQL内如何改变编码格式

查找数据库的编码格式&#xff1a; show variables like character%;具体内容时这些 在创建表时设定编码格式&#xff1a; create database <要创建的数据库的名字> charset utf8; 修改数据库默认编码&#xff1a; set character_set_databaseutf8mb4; character_…

eclipse ui bug

eclipse ui bug界面缺陷&#xff0c;可能项目过多&#xff0c;特别maven项目过多&#xff0c;下载&#xff0c;自动编译&#xff0c;加载更新界面异常 所有窗口死活Restore不回去了 1&#xff09;尝试创建项目&#xff0c;还原界面&#xff0c;失败 2&#xff09;关闭所有窗口&…

将TP5链接导入笔影个人博客代码

首先第一步&#xff0c;打开界面 第二步&#xff0c;这里卡住了&#xff0c;无法看到源代码&#xff0c;我们使用其他软件看看源代码 调试乱码&#xff0c;因为没有找到相应的笔影个人博客源码。源码在桌面上。询问百度&#xff0c;说了有的没的一大堆。 尝试的结果就是失败…

时间复杂度与O(n)

文章目录 1 复杂度分析1.1 时间复杂度1.1.1 循环执行次数1.1.2 大O(n)表示法 1.2 空间复杂度 1 复杂度分析 1.1 时间复杂度 ​ 时间复杂度用来表示算法运行时间的长短&#xff0c;用来定性的描述程序的运行时间。要了解时间复杂度&#xff0c;我们需要先了解程序执行的次数。…

机器学习(二十二):精度和召回率

一、倾斜数据集 倾斜数据集&#xff1a;一个数据集中的正面和负面例子的比例非常不平衡&#xff0c;比如数据集中&#xff0c;结果为1的占比20%&#xff0c;结果为0的占比80% 例子&#xff1a;如果数据集的结果中只有0.5%是1&#xff0c;其余结果是0。有一个模型的预测准确度…

【信创】udisk2服务异常导致U盘使用中自动移除问题解决

原文链接&#xff1a;【信创】udisk2服务异常导致U盘使用中自动移除问题解决 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在信创终端操作系统上由于udisk2服务异常导致U盘等移动设备在使用中自动移除问题的排查文章。udisk2是一个管理存储设备的服务&#xf…

【计算机网络】OSPF单区域实验

一&#xff1a;实验目的 1&#xff1a;掌握在路由器上配置OSPF单区域。 2&#xff1a;学习OSPF协议的原理&#xff0c;及其网络拓扑结构改变后的变化。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。…

Vue 3 实现左侧列表点击跳转滚动到右侧对应区域的功能

使用 Vue 3 实现左侧列表点击跳转到右侧对应区域的功能 1. 引言 在这篇博客中&#xff0c;我们将展示如何使用 Vue 3 实现一个简单的页面布局&#xff0c;其中左侧是一个列表&#xff0c;点击列表项时&#xff0c;右侧会平滑滚动到对应的内容区域。这种布局在很多应用场景中都…

Llama 3.1 405B 详解

2024 年 7 月 23 日星期二&#xff0c;Meta 宣布推出 Llama 3.1&#xff0c;这是其Llama 系列大型语言模型 (LLM)的最新版本。虽然只是对 Llama 3 模型进行小幅更新&#xff0c;但它特别引入了Llama 3.1 405B——一个 4050 亿参数的模型&#xff0c;这是迄今为止世界上最大的开…

运行ruoyi

nacos 数据库配置 修改nacos/conf/application.properties 单机版运行 startup.cmd -m standalone redis 运行后端 运行gateway,auth,modules/system模块 可能遇到的问题&#xff1a;端口正在使用 解决 netstat -ano | findstr 9200 taskkill -pid 18284 -f

JAVA同城圈子达人交友系统源码支持微信小程序+公众号+H5+APP

&#x1f308; 同城圈子达人交友系统&#xff0c;遇见志同道合的TA&#xff01; &#x1f389; 开篇&#xff1a;告别孤单&#xff0c;同城圈子等你来探索&#xff01; 在这个快节奏的城市生活中&#xff0c;你是否常常感到孤独&#xff0c;渴望找到一群志同道合的朋友&#…

Elasticsearch基础(六):使用Kibana Lens进行数据可视化

文章目录 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 二、基础可视化 1、指标可视化 2、垂直堆积条形图 3、表格 三、高级可视化 1、多图层和索引 2、子桶 3、树状图 使用Kibana Lens进行数据可视化 一、进入Kibana Lens 在Kibana主页&#xff0c;单击页面…

【资料分享】2024钉钉杯大数据挑战赛A题思路解析+代码演示

2024第三届钉钉杯大学生大数据挑战赛今天已经开赛&#xff0c;【A题】思路解析代码&#xff0c;资料预览&#xff1a;

【JAVA学习笔记】找不到依赖项 ‘org.springframework.boot:spring-boot-starter-web:3.0.5‘

如果环境都是跟着教程配的话&#xff0c;并且上网搜了一圈询问gpt都没发现对应长得像的错误&#xff0c;那么试试**刷新一下Maven项目**&#xff0c;可能问题就自己解决了。如果这样解决不了再查到底是什么地方没有配置对。&#xff08;我第一次遇到这个问题的时候搜了半天都不…

遇到 chunk of umi not found 处理办法

1、删除 以下文件 &#xff08;1&#xff09;node_modules 其中快速删除node_modules方法可参考&#xff1a;rimraf快速删除node_modules方法-CSDN博客文章浏览阅读258次。rimraf快速删除node_modules方法https://blog.csdn.net/2401_85955297/article/details/140566245?spm…

微信小游戏之 三消(一)

首先设定一下 单个 方块 cell 类&#xff1a; 类定义和属性 init 方法 用于初始化方块&#xff0c;接收游戏实例、数据、宽度、道具类型和位置。 onWarning 方法 设置警告精灵的帧&#xff0c;并播放闪烁动作&#xff0c;用于显示方块的警告状态。 grow 方法 根据传入的方向…

网络基础之(11)优秀学习资料

网络基础之(11)优秀学习资料 Author&#xff1a;Once Day Date: 2024年7月27日 漫漫长路&#xff0c;有人对你笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的博客-CSDN博客。 参考文档&#xff1a; 网络工程初学者的学习方法及成长之路&#xff08;红…

【视频讲解】后端增删改查接口有什么用?

B站视频地址 B站视频地址 前言 “后端增删改查接口有什么用”&#xff0c;其实这句话可以拆解为下面3个问题。 接口是什么意思&#xff1f;后端接口是什么意思&#xff1f;后端接口中的增删改查接口有什么用&#xff1f; 1、接口 概念&#xff1a;接口的概念在不同的领域中…

【QT】QT 系统相关(事件、文件、多线程、网络、音视频)

一、Qt 事件 1、事件介绍 事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口需要重新绘制…