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

【归一化技术】层归一化和批归一化

归一化技术在深度学习中被广泛应用,以加速训练过程、稳定模型收敛,并减少梯度消失或爆炸问题。

一、 层归一化

**层归一化(Layer Normalization)**是一种归一化技术,广泛用于深度学习模型,尤其是在 Transformer 等自然语言处理和序列建模任务中,以加速训练、稳定模型收敛,并减少梯度消失或爆炸的问题。

层归一化是在每个样本的特征维度上计算均值和方差。在处理变长序列时效果更好,并且适合小批次甚至批次大小为 1 的情况。

假设输入张量的形状为 [batch_size, sequence_length, feature_dim],层归一化会在每个特征维度 feature_dim 上进行归一化操作。

1. 计算公式

给定输入张量 x,对于第 i 个特征的每个样本,层归一化的计算公式为:

在这里插入图片描述

其中:

  • μ 和 𝜎2 分别是 x 在特征维度上的均值和方差。
  • γ 和 𝛽 是可学习的缩放和平移参数。
  • ϵ 是一个小常数,用于防止除零错误。

2. 示例

在 PyTorch 中,可以通过 nn.LayerNorm 来使用层归一化。初始化时需要指定特征维度大小,表示在该维度上进行归一化。

import torch
import torch.nn as nn# 假设特征维度大小为 64
feature_dim = 64
layer_norm = nn.LayerNorm(feature_dim)# 输入张量 (batch_size, sequence_length, feature_dim)
x = torch.randn(32, 10, feature_dim)# 应用层归一化
output = layer_norm(x)
print(output.shape)  # 输出: torch.Size([32, 10, 64])

在此示例中,LayerNorm 对每个样本的最后一个维度(即特征维度 feature_dim)进行归一化。

3. 优势

  • 适用于变长序列:在 NLP 和序列建模任务中非常适用,因为它不依赖于批次大小。
  • 稳定模型训练:在 Transformer 等深度网络中,层归一化帮助缓解梯度消失或梯度爆炸问题,加快模型收敛速度。

二、批归一化

批归一化(Batch Normalization)是一种深度学习中的归一化技术,用于加速模型训练、稳定模型收敛,并减轻梯度消失或梯度爆炸问题。它通过在每个批次的样本上计算均值和方差,然后对每层的激活值进行归一化,确保每层输出的激活值在训练过程中保持相对稳定的分布。

1. 计算步骤

假设我们在训练神经网络,某一层的输出张量(激活值)是 x,其形状为 [batch_size, num_features]。批归一化的计算步骤如下:

  1. 计算均值和方差

    • 对当前批次的所有样本在特征维度上计算均值 μ 和方差 σ2。

    在这里插入图片描述

    在这里插入图片描述

    其中,m 是批次大小(batch_size),xi 是每个样本的激活值。

  2. 归一化

    • 使用均值和方差对每个激活值进行归一化,确保每层的激活值具有标准正态分布。

    在这里插入图片描述

    其中,𝜖 是一个小常数,用于防止除零错误。

  3. 缩放和平移

    • 引入可学习的缩放参数 γ 和偏移参数 𝛽,用于恢复模型的表达能力,使网络在归一化的基础上仍能灵活调整数据分布。

    在这里插入图片描述

    其中,γ 和 𝛽 是通过训练学习到的参数,用于控制归一化后的尺度和平移。

2. 示例

在 PyTorch 中,可以使用 nn.BatchNorm1d, nn.BatchNorm2d, 或 nn.BatchNorm3d 来实现批归一化。下面是一个简单的示例:

import torch
import torch.nn as nn# 定义批归一化层
batch_norm = nn.BatchNorm1d(num_features=4)# 输入张量 (batch_size, num_features)
x = torch.randn(8, 4)  # 批次大小为8,特征维度为4# 应用批归一化
output = batch_norm(x)
print(output)

3. 局限性

  • 对小批次的效果较差:当批次大小很小时,批次均值和方差的估计会不稳定,可能影响模型表现。
  • 对变长序列不适用:批归一化依赖批次的统计量,无法在序列建模或自然语言处理中的变长序列上直接使用,这时通常使用层归一化(Layer Normalization)。

三、归一化如何减少梯度消失或爆炸问题

1. 梯度消失和梯度爆炸的原因

在深层神经网络中,梯度消失和梯度爆炸问题会因为层数增加而被放大,主要原因包括:

  • 梯度消失:反向传播过程中,梯度逐层相乘,如果激活值的梯度接近 0,会导致后面的梯度趋向 0,模型难以更新参数。
  • 梯度爆炸:同样的,在反向传播中,如果激活值梯度过大,会导致梯度在逐层相乘时逐渐放大,参数更新变得不稳定。

这两种问题使得深层网络在训练过程中收敛缓慢,甚至无法收敛。

2. 归一化如何缓解这些问题

归一化通过对每一层的激活值进行归一化,使每层输出的激活值都具有相似的分布,这样可以有效缓解梯度消失和爆炸的问题。具体来说,归一化在每一层的激活上计算均值和方差,将激活值标准化。通过这种标准化操作:

  • 保持激活值分布稳定:归一化确保每层的激活值具有相似的分布,减少了由于初始值或数据分布不当导致的梯度不稳定。
  • 保持梯度在合理范围内:梯度在每一层的激活上进行归一化时,反向传播过程中也会保持较为稳定的范围,防止梯度消失或爆炸。

http://www.mrgr.cn/news/60520.html

相关文章:

  • Ribbon解说
  • 线性变换的矩阵表示
  • 部署 Traefik 实现 dashboard 与 原生Ingress使用 CRD IngressRoute使用
  • 【代码优化Tip】关于结构
  • 六:Python学习笔记--基础知识(5)集合
  • Linux操作命令(一)
  • matplot常备设置
  • 【纯血鸿蒙】安装hdc工具
  • MySQL数据库数据类型介绍
  • LSTM模型实现光伏发电功率的预测
  • 机器学习原理与算法图谱问答
  • 中国人寿财险青岛市分公司:创新引领,服务升级
  • 【CSS】边界三角形
  • DEVOPS: 集群伸缩原理
  • MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨
  • k8s 二进制部署安装(二)
  • Docker 常用命令全解析:提升对雷池社区版的使用经验
  • JAVA是世界上最美丽的语言------拒绝焦虑,赶紧背诵!
  • 【学术会议论文投稿】前端框架巅峰对决:React、Vue与Angular的全面解析与实战指南
  • 【考前冲刺】24下软考考试,无非就这2套模拟卷!
  • 用git上传项目到GitHub(最简单的操作)
  • ZDS 数字股票:携手全球高校,吸引行业精英,共创金融未来
  • 【网络安全零基础入门】一文搞懂Javascript实现Post请求、Ajax请求、输出数据到页面、实现前进后退、文件上传
  • 时代新机遇来袭,创客匠人首届全球创始人 IP 领袖峰会定档
  • JNI概要
  • Flutter-Engine 的定制实践:Text 绘制流程浅析及自定义underline的间距