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

手搓多模态-04 归一化介绍

机器学习归一化一个非常重要工具帮助我们加速训练速度我们前面SiglipVisionTransformer 也有用到归一化如下代码所示

class SiglipVisionTransformer(nn.Module): ##视觉模型的第二层,将模型的调用分为了图像嵌入模型和transformer编码器模型的调用
	def __init__(self, config:SiglipVisionConfig):
		super().__init__()
		self.config = config
		self.embed_dim = config.hidden_size

		self.embeddings = SiglipVisionEmbeddings(config) ## 负责将图像嵌入成向量
		self.encoder = SiglipEncoder(config) ## 负责将向量编码成注意力相关的向量

		self.post_layer_norm = nn.LayerNorm(embed_dim, eps=config.layer_norm_eps) ## 层归一化

	def forward(self, pixel_values:torch.Tensor) -> torch.Tensor:
		"""
		pixel_values: [Batch_size,Channels,Height,Width]
		"""
		## [ Batch_size,Channels,Height,Width] -> [Batch_size,Num_Patches,Embedding_size] 
		hidden_states = self.embeddings(pixel_values) ## 将图像嵌入成向量

		# [Batch_size,Num_Patches,Embedding_size] -> [Batch_size,Num_Patches,Embedding_size]
		last_hidden_state = self.encoder(hidden_states) ## 将向量编码成注意力相关的向量

		# [Batch_size,Num_Patches,Embedding_size] -> [Batch_size,Num_Patches,Embedding_size]
		last_hidden_state = self.post_layer_norm(last_hidden_state)

		return last_hidden_state

这里post_layer_norm 就是归一化所以本文一起介绍归一化

归一化解决问题

归一化主要解决神经网络训练过程会出现协变量偏移 问题

协变量偏移(Covariate Shift)是指由于输入样本分布不均匀导致神经网络第一输入剧烈变化第一神经网络输入的剧烈变化又会导致神经网络第一输出产生剧烈变化从而影响传递神经网络之后每一导致每一轮迭代神经网络输出输出剧烈变化从而导致梯度非常不稳定参数找不到一个稳定优化方向从而导致训练缓慢

Batch Normalization

假设有一个 mini-batch 的输入 ,也就是:

  • :batch size
  • :通道数(对全连接层来说是特征维度)
  • :空间维度(在卷积层中)

其实本质上Batch Normalization 希望输入特征变化不再那么剧烈希望样本所有特征基于当前批次做一次归一化这样当前批次特征就不会剧烈变化

值得注意图像输入Batch Normalization普通特征Batch Normalization计算差别假定图像输入 [ N, C, H, W ]那么计算公式所示torch通道维度进行归一化每一个通道像素值通过该通道所有图片像素得到平均值归一化这是因为由于图像处理卷积神经网络里面同一个通道共享同一个卷积核整个通道所有像素看成一个特征

如果普通特征输入形如 N, D 】,NBatch_Size, D特征维度每一个特征通过计算所有N对应特征平均方差归一化

来说如下图所示

问题所在

主要问题在于依赖 mini-batch:批量太小时效果差

  • BatchNorm 的均值和方差是 在 batch 维度上估算 的。
  • 如果 batch size 很小(比如在线学习、NLP中的RNN),统计结果不稳定,归一化效果会变差。
  • 对于 batch size=1 时,根本无法统计 batch 内部分布。

因为BN 尝试一个批次代表整体样本分布但是只有批次样本很大时候才能拟合如果批次样本很小那么又会出现协变量偏移的问题

于是又引申出了layer_normalization....

Layer Normalization

Layer Normalization(层归一化)是为了克服 Batch Normalization 的局限性 而提出的,尤其在 batch size 很小处理序列模型(如 RNN、Transformer) 时非常有用。

LN 核心思想

在一个样本内部的所有特征维度上做归一化,而不是像 BatchNorm 那样在 batch 维度上归一化。

LN做法比较简单

图像卷积场景如果输入N,C,H,W分别代表Batch size通道图像高度宽度此时我们N不同图像图像C特征因为每个通道一整张图像像素都是一个特征一张图像总共C特征每个特征看成 H * W向量于是我们所有特征计算均值方差进行归一化

总结

不管BN还是LN归一化操作使得每一个计算value处于标准0,1)正态分布缓解训练过程协变量偏移问题

相关文章:

  • PDF 转图片,一行代码搞定!批量支持已上线!
  • C++中的内联函数
  • 嵌入式rodata段
  • 解锁异步编程潜能:如何利用 `asyncio` 模块构建高并发 IO 密集型服务
  • PDFBox渲染生成pdf文档
  • 近期Lerobot资料汇总,待整理
  • 在 Ubuntu24.04 LTS 上 Docker Compose 部署基于 Dify 重构二开的开源项目 Dify-Plus
  • 尚硅谷2019版Java集合和泛型
  • Docker 从入门到进阶 (Win 环境) + Docker 常用命令
  • 【Android安卓移动计算】实现项目一[模拟器启动项目]
  • CSRF漏洞利用的小点总结
  • JVM 参数调优指南_优化 Java 应用性能
  • nginx中的limit_req 和 limit_conn
  • WPS宏开发手册——常见问题
  • MySQL基础 [三] - 数据类型
  • Java 大视界 -- Java 大数据在航天遥测数据分析中的技术突破与应用(177)
  • 记录clickhouse记录一次性能优化,从60s到1s
  • JavaScript创建对象与构造函数
  • TPM/HSM/TEE差异分析
  • 浏览器 路由详解
  • 把两个网站合并到一个网页/企业推广公司
  • 怎样建设公司网站小程序/seo成都培训
  • 怎样在网站做视频链接/网上在线看视频为什么卡
  • p2p网站建设cms/中国互联网公司排名
  • 著名b2b网站有哪些/免费域名邮箱
  • 上海智能网站建设设计/咸宁网站seo