LLM:归一化 总结

news2024/9/20 6:34:55

一、Batch Normalization

原理

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

公式

在这里插入图片描述

例子

下面是一个使用 Python 和 NumPy 实现的 Batch Normalization 例子:

import numpy as np

class 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)  # 初始化缩放参数为1
        self.beta = np.zeros(D)  # 初始化平移参数为0
        self.running_mean = np.zeros(D)  # 初始化运行中的均值为0
        self.running_var = np.ones(D)  # 初始化运行中的方差为1

    def 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.beta
        return out

    def __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 np

class 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)  # 初始化缩放参数为1
        self.beta = np.zeros(D)  # 初始化平移参数为0

    def 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.beta
        return out

    def __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.coloradmin.cn/o/1953639.html

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

相关文章

计算机导论速成笔记

【拯救者】计算机导论速成(基础真题)期末/升本均适用 ©无忌教育 ❀适⽤于所有 计算机导论 课本 目录: 好评: 特色: ①先讲本章考点, ②接着下节就讲对应的考题 观看地址:

太美了!智能汽车触摸屏中控让驾驶员和乘客目不转睛

太美了!智能汽车触摸屏中控让驾驶员和乘客目不转睛 引言 艾斯视觉作为行业ui设计和前端开发领域的从业者,其观点始终认为:智能汽车已经成为现代交通的新宠。其中,触摸屏中控系统以其美观、智能、人性化的特点,为驾驶…

GEE:多面板同步缩放查看多源数据,并实现交互选点构建NDVI曲线

一. 目标 ①构建三个面板,分别显示不同来源数据; ②面板1显示哨兵数据面版2显示谷歌高清数据面板3实现用户任意交互选点,并以该点为中心构建正方形,随后生成该正方形的区域NDVI平均值长时序曲线; ③保证前两个面板可…

第 3 章 数据和 C

目录 3.1 示例程序 3.1.1 程序中的新元素 3.2 变量与常量数据 3.3 数据: 数据类型关键字 3.3.1 整数和浮点数 3.3.2 整数 3.3.3 浮点数 3.4 C 语言基本数据类型 3.4.1 int 类型 1. 声明 int 变量 2. 初始化变量 3. int 类型常量 4. 打印 int 值 5. 八进制和十六进…

找工作准备刷题Day8 二叉树 (卡尔41期训练营 7.22)

第一题:Leetcode235. 二叉搜索树的最近公共祖先 题目描述 题解1——递归法 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root nullptr)return nullptr;if (root->val > p->val &&…

01、爬虫学习入门

爬虫:通过编写程序,来获取获取互联网上的资源 需求:用程序模拟浏览器,输入一个网址,从该网址获取到资源或内容 一、入门程序 #使用urlopen来进行爬取 from urllib.request import urlopen url "http://www.ba…

网络地址转换-NAT

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、相关知识 网络地址转换(Network Address Translation,NAT)的基本作用是实现内网 IP 地址与外网 IP 地址的转换…

求职学习day11背八股

本质上我和早睡早上起来玩一早上的游戏没有区别,甚至学习状态更差。得想个办法 12 点睡觉。 第三次 hr 面,为德科和华为的工作效率感到无语。 下周一两场面试。真是要死,这五天时间基本没学什么。八股、项目、手撕。。没一个有能力的感觉。…

代码随想录算法训练营第22天-leetcode-回溯算法part01:

#回溯算法理论基础 能解决的问题: 组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规则全排列&…

[023-2].第2节:SpringBoot中接收参数相关注解

我的后端学习大纲 SpringBoot学习大纲 1.1.基本介绍: SpringBoot接收客户端提交的数据、参数会使用的一些注解: 1.PathVarible2. RequestHeader3.RequestParam4.CookieValue5.RequestBody6.RequestAttribute 1.2.接收参数相关注解与应用实例:…

VirtualBox7.0.18报: IPv6 prefix is not unicast.

VirtualBox7.0.18 报: IPv6 prefix is not unicast. VirtualBox7.0.18 在设置 “NAT网络(Nat Network)” 的IPv6时, 报 IPv6 prefix x::x is not unicast. IPv6 prefix x::x is not unicast. 意思是 x::x 不是IPv6的单播地址 解决办法是: 改为 fcxx 或 fdxx 开头, 如 fc00 ,…

QT Creator下载安装详细教程(保姆级教程)

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

一天一个Harmony Next APP

历史的车轮已经来到太平洋东海岸。 此时如果还不会撸Harmony APP,注定要被碾压。 鸿蒙开发正在如火如荼的开展,抽空看一看吧。 一看就会,一做就废。 这里是一个看废的demo。 主要通过arkts实现鸿蒙关系数据库的封装,实现数据…

搭建自己的金融数据源和量化分析平台(一):系统架构设计

0x00 前言 由于某得的数据实在是太贵,某花顺免费版又不提供专业的数据分析工具,Tushare也开始收费,因此决定基于python和MySQL搭建一个自己的金融数据库。期望做到仅依靠交易所、巨潮资讯网等官方的公开数据实现,尽量不依靠某花顺…

Java中线程池的基本使用

参考这个课程,讲的非常详细 27.线程池使用步骤总结_哔哩哔哩_bilibili 应用场景 商品秒杀 文件上传 订票系统 自定义线程池(让我们了解底层逻辑的) 构造方法 饱和机制 就是我们的队列饱和后我们该怎么处理 是拒绝这个任务还是啥…

API 技术开发分享:连接电商平台数据获取的桥梁

在当今数字化的时代,API(Application Programming Interface,应用程序编程接口)技术成为了实现不同系统之间通信和数据交换的关键。它就像是一座无形的桥梁,使得各种应用能够相互协作,共享资源,…

网页突然被恶意跳转或无法打开?DNS污染怎么解决?

前言 在网上冲浪时,我们时常会遭遇DNS污染这一区域性攻击,几乎无人能幸免。受影响时:尝试访问正规网站可能会被错误导向赌博、色情或其他恶意站点。 1.我们为什么需要DNS 当我们想要访问一个网站时,就像拨打朋友的电话号码一样…

第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024,9月13-15)

第三届人工智能、物联网与云计算技术国际会议(AIoTC 2024)将于2024年9月13日-15日在中国武汉举行。 本次会议由华中师范大学伍伦贡联合研究院与南京大学联合主办、江苏省大数据区块链与智能信息专委会承办、江苏省概率统计学会、江苏省应用统计学会、Sir Forum、南京理工大学、…

docker笔记6-数据卷

docker笔记6-数据卷 一、初识dockerfile1.1 编写镜像1.2 构建镜像1.3 运行镜像 二、案例2.1 多个容器共享数据2.2 多个mysql数据共享 一、初识dockerfile 之前的内容中,我们都是通过pull的方式拉取别人写好的镜像,那么通过编写dockerfile,我…

Linux系统编程:传输层(补充)

1. 用UDP实现可靠传输 在前面介绍了UDP是一种不可靠的面向数据包的传输协议。那么如何实现UDP的可靠传输呢? 其实就是在应用层自己实现像TCP一样的可靠性机制:引入序列号、引入确认应答、超时重传、流量控制、拥塞控制等机制。 2. listen系统接口 在…