深度学习中的规范化-层规范化

news2024/9/23 5:27:31

文章目录

    • 层规范化
    • 层规范化参数与公式
    • normalized_shape传入一个整数
      • 接口函数LayerNorm计算
      • 手动计算
    • normalized_shape传入一个列表
      • 接口函数LayerNorm计算
      • 手动计算

层规范化

在批量规范化这篇文章里详细介绍了批量规范化在卷积神经网络里的使用,本篇文章将继续介绍另一个规范化技术–层规范化。

无论是批量规范化还是层规范化,目的都是对输入数据进行归一化处理,以提高模型的鲁棒性和泛化能力。区别在于,层规范化是在每个样本内进行归一化操作,通常是基于特征维度进行规范化。层规范化的优势在于可以处理变长序列(比如文本数据),因此在自然语言处理任务中(填充前的输入一般是变长序列)批量规范化没有层规范化的效果好,比如在Transformer模型架构中就使用了层规范化。

本文将深入探究层规范化的计算细节、不同参数的作用以及与批量规范化的区别。

层规范化参数与公式

层规范化的公式为:

L N ( x ) = γ ⊙ x − μ σ 2 + ε + β       ( 1 ) LN(x)=\gamma \odot {{x-μ} \over{\sqrt{\sigma^2 + \varepsilon}}}+\beta \ \ \ \ \ (1) LN(x)=γσ2+ε xμ+β     (1)

其中, x x x 是样本内给定维度下的待规范化数据、 μ μ μ 是均值、 σ 2 \sigma^2 σ2 是方差、 ε \varepsilon ε 防止除0; γ \gamma γ 是拉伸参数(scale)、 β \beta β 是偏移参数(shift),这俩是需要模型学习的。

pytorch中提供的层规范化接口是 LayerNorm ,参数为:

torch.nn.LayerNorm(normalized_shape, eps=1e-05, elementwise_affine=True, bias=True, device=None, dtype=None)

  • normalized_shape:规范化的数据范围,指定在哪些维度数据上进行规范化。对于自然语言处理,一般输入 (批量大小-2,时间步-3,特征维度-4) :
    • 如果传入的是一个整数,比如4,需要和输入数据的最后一维保持一致(比如此处的特征维度-4),表示在每个样本的每个时间步的特征数据上进行规范化;

    • 如果输入一个列表,比如[3,4],则列表里的数字从后往前要依次和输入数据维度从最后向前保持一致,比如此处的[3,4]依次对应输入数据的最后两个维度(时间步-3、特征维度-4),表示在每个样本所有时间步的特征维数据上进行规范化;

  • eps:在分母中方差后添加的一个固定值,是为了计算稳定性,防止除0,默认值为1e-5;
  • elementwise_affine:层规范化默认的标准化是均值为0、标准差为1,但对实际数据来说不一定是合适的分布,因此加了可学习的拉伸参数 γ \gamma γ (gamma) 和偏移参数 β \beta β (beta),以期自动学习合适的分布。elementwise_affine用来控制是否需要这两个参数,默认为True,表示需要拉伸参数(初始值为1)和偏移参数(初始值为0),可通过训练学习;其中 γ \gamma γ 的初始值为1,形状和normalized_shape一样、 β \beta β 初始值为0,形状也和normalized_shape一样
  • bias:是否需要偏移参数 β \beta β

注:层规范化不会像批量规范化那样跟踪统计全局期望(running_mean)、方差(running_var),因此在训练模式和预测模式下没有什么不同。

normalized_shape传入一个整数

现在来看看层规范化的计算细节,本次在一个三维张量(batch_size-批量大小, num_steps-时间步数, num_hiddens-特征维度)上分别使用接口LayerNorm函数和手动两种方式计算进行对比。

接口函数LayerNorm计算

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
import torch
from torch import nn
#三维张量:(batch_size-批量大小, num_steps-时间步数, num_hiddens-特征维度)
X=torch.arange(24,dtype=torch.float32).reshape((2,3,4))
X.shape
X

在这里插入图片描述


#实例化一个层规范化类
LN=nn.LayerNorm(4)
LN

#查看是否处于训练模式
print('是否处于训练模式:', LN.training)
#查看初始gamma
print('初始gamma:', LN.weight, '初始gamma形状:', LN.weight.shape)
#查看初始beta
print('初始beta:',LN.bias, '初始beta形状:', LN.bias.shape)

图中打印了训练模式下weight、bias,可以看出数量与normalized_shape数对应。


在这里插入图片描述


计算层规范化。

#层规范化
X_LN=LN(X)
X_LN.shape
X_LN

在这里插入图片描述


上面通过接口计算的层规范化时,normalized_shape=4,表示在每个样本的每个时间步的特征维度的4个数据上(即下图每个颜色的一行作为一组数据做规范化)计算均值、方差,然后规进行范化。

因为weight、bias与normalized_shape数对应,因此将重复使用6次(剩余维度2*3=6)来对每行数据分布进行仿射变换。


在这里插入图片描述


手动计算

下面通过手动计算来看下层规范化的细节。

#计算均值、方差
mean = X.mean(dim=-1,keepdim=True) #均值
var = ((X - mean) ** 2).mean(dim=-1,keepdim=True) #方差
mean.shape
mean
var.shape
var

由下图可知每行对应1个均值、标准差。


在这里插入图片描述


计算批量规范化,可以看到计算结果与上面函数接口计算的一样。

eps=1e-05
X_LN = (X - mean) / torch.sqrt(var + eps)
X_LN.shape
X_LN

在这里插入图片描述


normalized_shape传入一个列表

现在来看下normalized_shape传入一个列表时是如何计算的。

接口函数LayerNorm计算

#实例化一个层规范化类
LN=nn.LayerNorm([3,4])
LN

#查看是否处于训练模式
print('是否处于训练模式:', LN.training)
#查看初始gamma
print('初始gamma:', LN.weight, '初始gamma形状:', LN.weight.shape)
#查看初始beta
print('初始beta:',LN.bias, '初始beta形状:', LN.bias.shape)

图中打印了训练模式下weight、bias,可以看出数量与normalized_shape形状(3,4)相同。


在这里插入图片描述


计算层规范化。

#层规范化
X_LN=LN(X)
X_LN.shape
X_LN

在这里插入图片描述


上面通过接口计算层规范化时,normalized_shape=(3,4),表示在每个样本的所有时间步的特征维度的12个数据上(即下图每个颜色的作为一组数据做规范化)计算均值、方差,然后规进行范化。

因为weight、bias与normalized_shape形状对应,因此将重复使用2次(剩余维度2)来对每组数据分布进行仿射变换。


在这里插入图片描述


手动计算

下面通过手动计算来看下层规范化的细节。

#计算均值、方差
mean = X.mean(dim=[1,2],keepdim=True) #均值
var = ((X - mean) ** 2).mean(dim=[1,2],keepdim=True) #方差
mean.shape
mean
var.shape
var

由下图可知每个样本里所有时间步的数据对应1个均值、标准差。


在这里插入图片描述


计算层规范化,可以看到计算结果与上面函数接口计算的一样。

eps=1e-05
X_LN = (X - mean) / torch.sqrt(var + eps)
X_LN.shape
X_LN

在这里插入图片描述

完!

有空再写下其他规范化。

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

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

相关文章

LVS中NAT模式和DR模式实战讲解

1DR模式 DR:Direct Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源 IP/PORT&#xf…

C++:auto关键字、内联函数、引用、带默认形参值的函数、函数重载

一、auto关键字 在C中,auto关键字是一个类型说明符,用于自动类型推导。 使用 auto 关键字时,变量的类型 是在编译时由编译器 根据 初始化表达式 自动推导出来的。这意味着你 不能在 声明 auto 变量时 不进行初始化 声明 auto 变量时&#x…

“八股文”:是助力还是阻力?

在程序员面试中,“八股文”是一个绕不开的话题。所谓“八股文”,指的是那些在面试中经常出现的标准问题及其答案,例如“解释一下死锁的概念”、“CAP理论是什么”等。这些内容通常被求职者反复练习,以至于变成了某种固定的模式或套…

分享6类10种政务AI大模型应用场景

大模型是指具有大规模参数和复杂计算结构的机器学习模型。这些模型通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数。大模型的设计目的是提高模型的表达能力和预测性能,能够处理更加复杂的任务和数据。大模型在各种领域都有广泛的应用&#xff0…

adword — Recho | pwn题目记录

涉及到以前没接触过的点,记录下。 checksec: IDA: 很明显的一个栈溢出,但是一直有一个while循环,就算劫持控制流后也出不了这个循环。这里学到了一个新方法: pwntools的shutdown(send) def shutdown(…

C++现代教程四

float转string不带多余0 float a 1.2; std::tostring(a); // 1.200000 std::ostringstream strStream; strStream << a; // 1.2 if (!strStream.view().empty()) // 判定流有数据// 边框融合 float measureText(std::u8string text, FontTypes::Rectangle &recta…

Marin说PCB之1000-BASE-T1上的共模电感的选型知多少---02

今天刚刚好是立秋的第一天&#xff0c;天气还是有点炎热的。不知道诸位老铁们有没有买今年秋天的第一杯奶茶&#xff0c;反正小编我是下班到家吃饭的时候买了一杯伯牙绝弦&#xff0c;喝起来味道还是不错的&#xff0c;而且奶茶店里今天几乎爆满&#xff0c;我足足等了30分钟才…

计算机网络面试-核心概念-问题理解

目录 1.计算机网络OSI协议七层结构功能分别是什么&#xff1f;如何理解这些功能 2.物理层、数据链路层、网络层、传输层和应用层&#xff0c;这五个层之间功能的关系&#xff0c;或者说是否存在协调关系 3. 数据链路层功能理解 4.MAC地址和以太网协议 5.以太网协议中的CSMA…

第十八节、野猪撞墙判定和等候计时

一、野猪撞墙修改 1、判断地面 2、检测半径迁移至头部 3、设置前后的监测点 二、自动调整检测半径 玩家的检测半径实现自动调整 bounds 是正常世界窗口的碰触体外框 这一章节很复杂观看代码physicalcheck和enemy

IT治理体系:构建企业数字化转型的基石

随着信息技术的飞速发展&#xff0c;企业数字化转型已成为不可逆转的趋势。在这一进程中&#xff0c;IT治理体系作为指导、控制和监督信息技术资源使用与管理的框架&#xff0c;其重要性日益凸显。它不仅关乎企业信息系统的稳定运行&#xff0c;更是推动业务创新、提升竞争力、…

计算机毕业设计选题推荐-基于网页开发和数据抓取技术的在线新闻聚合平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

从源码剖析Java线程池的工作机制

文章目录 从源码剖析Java线程池的工作机制一、序言二、基础概念1、线程调度模型2、线程池创建方式&#xff08;1&#xff09;Executors工具类&#xff08;2&#xff09;ThreadPoolExecutor构造方法2.1 核心参数2.3 拒绝策略实现 三、源码剖析1、状态控制变量ctl2、线程执行exec…

MindSearch:AI 时代的“思考型”搜索引擎

随着AI技术的飞速发展&#xff0c;搜索引擎领域也迎来了新的变革。继 OpenAI 发布 SearchGPT 之后&#xff0c;国内也涌现出一批优秀的AI搜索引擎&#xff0c;其中&#xff0c;由中科大和上海人工智能实验室联合研发的 MindSearch&#xff08;思索&#xff09;尤为引人注目。这…

php收银系统源码-线上下单,门店接单

1.收银系统开发语言 核心开发语言: PHP、HTML5、Dart后台接口: PHP7.3后合管理网站: HTML5vue2.0element-uicssjs线下收银台&#xff08;安卓/PC收银、安卓自助收银&#xff09;: Dart3框架&#xff1a;Flutter 3.19.6助手: uniapp商城: uniapp 2.线上商城下单&#xff0c;门…

theaterjs使用

import theaterJS from "theaterjs"; interface ITheaterOptions {autoplay?: boolean;minSpeed?: {type: number;erase: number;};maxSpeed?: {type: number;erase: number;}; } export default function useTheater(id: string, options: ITheaterOptions, addS…

变压器耦合放大器(低频应用+高频应用)

2024-8-7&#xff0c;星期三&#xff0c;22:49&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。下班抽出点时间看看书&#xff0c;话不多说&#xff0c;学习开始啦。 今日继续学习模电自选教材的第六章&#xff0c;多级放大器、RF放大器和功率放大器。主要学习…

【Linux】进程概念—环境变量

目录 一、冯诺依曼体系结构 二、操作系统(Operator System) 1 .概念 2 .设计OS的目的 3 . 定位 4 . 系统调用和库函数概念 三、进程 1 .基本概念 2 .描述进程-PCB&#xff08;process control block&#xff09;进程控制块 3 . 组织进程 4 . 查看进程 5 .通过系统调用获取进程…

【iMSTK】第一期 imstk配置过程

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 公众号&#xff1a;VTK忠粉 前言 本文分享imstk的配置和使用过程&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&…

man手册安装

1.什么是man手册 &#xff08;输入man man) linux系统提供的有关函数或指令介绍的相关帮助手册&#xff0c;可以在该手册也中查看函数、指令功能&#xff0c;说白了就是相关操作说明书&#xff0c;一共有七章&#xff0c;主要使用前三章&#xff0c;第一章是shell指令相关说明…

TPS和QPS达到多少才算高并发?

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…