CV【5】:Layer normalization

news2024/11/29 10:40:28

系列文章目录

Normalization 系列方法(一):CV【4】:Batch normalization
Normalization 系列方法(二):CV【5】:Layer normalization


文章目录

  • 系列文章目录
  • 前言
  • 2. Layer normalization
    • 2.1. Motivation
    • 2.2. Method
      • 2.2.1. Standardisation
      • 2.2.2. Calculation preparation
      • 2.2.3. Calculation process
    • 2.3. Implement with PyTorch
  • 总结


前言

对于早前的 CNN 模型来说,大多使用 batch normalization 进行归一化,随着 Transformer 在计算机视觉领域掀起的热潮, layer normalization 开始被用于提升传统的 CNN 的性能,在许多工作中展现了不错的提升

本文主要是对 layer normalization 用法的总结


2. Layer normalization

2.1. Motivation

Batch Normalization 使用 mini-batch 的均值和标准差对深度神经网络的隐藏层输入进行标准化,可有效地提升训练速度

BN 的效果受制于 batch 的大小,小 batch 未必能取得预期效果

  • 对于前向神经网络可以很直接地应用 BN,因为其每一层具有固定的神经元数量,可直接地存储每层网络各神经元的均值、方差统计信息以应用于模型预测
  • RNNs 网络中,不同的 mini-batch 可能具有不同的输入序列长度(深度),比如每句话的长短都不一定相同,所有很难去使用 BN,计算统计信息比较困难,而且测试序列长度不能大于最大训练序列长度

Barch Normalization 也很难应用于在线学习模型,以及小 mini-batch 的分布式模型

Layer Normalization 是针对自然语言处理领域提出的,其计算是针对每个样本进行的, 不像 BN 那样依赖 batch 内所有样本的统计量, 可以更好地用到 RNN 和流式数据上(注意,在图像处理领域中 BNLN 是更有效的,但现在很多人将自然语言领域的模型用来处理图像,比如 Vision Transformer,此时还是会涉及到 LN,有关 Vision Transformer 的部分可以参考我的另外一篇 blog:CV-Model【6】:Vision Transformer)

2.2. Method

2.2.1. Standardisation

网络层的输出经过线性变换作为下层网络的输入,网络输出直接影响下层网络输入分布,这是一种协变量转移的现象。我们可以通过 固定网络层的输入分布(固定输入的均值和方差) 来降低协变量转移的影响

BN 对同一 mini-batch 中对不同特征进行标准化(纵向规范化:每一个特征都有自己的分布),受限于 batch size,难以处理动态神经网络中的变长序列的 mini-bach

RNNs 不同时间步共享权重参数,使得 RNNs 可以处理不同长度的序列,RNNs 使用 layer normalization 对不同时间步进行标准化(横向标准化:每一个时间步都有自己的分布),从而可以处理单一样本、变长序列,而且训练和测试处理方式一致

2.2.2. Calculation preparation

LN 是基于 BN 转化而来的

对于一个多层前向神经网络中的某一层 H i H_i Hi,计算方式如下所示:
a i l = w i l T h l h i l + 1 = f ( a i l + b i l ) a_i^l = w_i^{l^T}h^l \\ h_i^{l+1} = f(a_i^l + b_i^l) ail=wilThlhil+1=f(ail+bil)

针对深度学习,存在 covariate shift 现象,因此需要通过 normalize 操作,使 H i H_i Hi 层的输入拥有固定的均值和方差,以此削弱协方差偏移现象对深度网络的训练时的影响,加快网络收敛。

normalize H i H_i Hi 层输入进行变换,计算方式如下所示:
a ˉ i l = g i l σ i l ( a i l − μ i l ) μ i l = E x ∼ P ( x ) [ a i l ] σ i l = 1 H ∑ i = 1 H ( a i l − μ l ) 2 \bar{a}_i^l = \frac{g_i^l}{\sigma_i^l}(a_i^l - \mu_i^l) \\ \mu_i^l = \mathbb{E}_{x \sim P(x)} [a_i^l] \\ \sigma_i^l = \sqrt{\frac{1}{H} \displaystyle\sum_{i=1}^H (a_i^l - \mu^l)^2} aˉil=σilgil(ailμil)μil=ExP(x)[ail]σil=H1i=1H(ailμl)2

直接使用上式进行 normalize 不现实,因为需要针对整个 trainingset 来进行计算,因此,BN 通过 mini-batch 的输入样本近似的计算 normalize 中的均值和方差,因此成为 batch normalization

2.2.3. Calculation process

BN 不同,LN 是针对深度网络的某一层的所有神经元的输入按以下公式进行 normalize 操作

如图所示。它综合考虑一层所有维度的输入,计算该层的平均输入值和输入方差,然后用同一个规范化操作来转换各个维度的输入

在这里插入图片描述
对于 RNN 的每个时间步,其输入都会包含两部分,即当前的输入 x t x^{t} xt 和上一个时刻的隐藏状态 h t − 1 \mathbf{h}^{t-1} ht1,记 a t = W h h h t − 1 + W x h x t \mathbf{a}^{t}=W_{h h} h^{t-1}+W_{x h} \mathbf{x}^{t} at=Whhht1+Wxhxt,其中, W h h W_{hh} Whh W x h W_{x h} Wxh 为对应的权重矩阵,则在每一个时刻,Layer Normalization 对每一个样本都分别计算所有神经元的均值和标准差如下:

在这里插入图片描述
参数含义:

  • a t \mathbf{a}^{t} at 表示输入向量(前层网络输出加权后的向量)
  • H H H 表示隐藏单元数量(RNN 层的维度)

对于标准 RNN,若当前输入为 x t \mathbf{x}^{t} xt,上一隐藏状态为 h t − 1 \mathbf{h}^{t-1} ht1,则加权输入向量(非线性单元的输入)为:

在这里插入图片描述
对输入向量进行层标准化,再进行缩放和平移(用于恢复非线性)得标准化后的输入 y \mathbf{y} y

在这里插入图片描述
将标准化后的输入传入非线性激活函数:

在这里插入图片描述
其中, g g g b b b 为引入的自适应增益和偏置参数,其作用与 batch normalization 中的参数一样,为了保留模型的非线性能力, g g g b b b 的维度均为 H H H

值得注意的是,在每个时间步,同层网络的所有隐藏单元共享均值和方差

Layer Normalization g g g b b b 的初始化不敏感,一般默认将 g g g 初始化为 1,将 b b b 初始化为 0

2.3. Implement with PyTorch

在 Pytorch 的 LayerNorm 类中有个 normalized_shape 参数,可以指定你要 Norm 的维度(注意,函数说明中 the last certain number of dimensions,指定的维度必须是从最后一维开始)。

比如我们的数据的 shape [ 4 , 2 , 3 ] [4, 2, 3] [4,2,3],那么 normalized_shape 可以是 [ 3 ] [3] [3](最后一维上进行 Norm 处理),也可以是 [ 2 , 3 ] [2, 3] [2,3]Norm 最后两个维度),也可以是 [ 4 , 2 , 3 ] [4, 2, 3] [4,2,3](对整个维度进行 Norm),但不能是 [ 2 ] [2] [2] 或者 [ 4 , 2 ] [4, 2] [4,2],否则会报以下错误(以 normalized_shape = [2] 为例):

RuntimeError: 
Given normalized_shape=[2],         
expected input with shape [*, 2],    
but got input of size[4, 2, 3]

提示我们传入的 normalized_shape = [2],接着系统根据我们传入的 normalized_shape 推理出期待的输入数据 shape 应该为 [ ∗ , 2 ] [*, 2] [,2]即最后的一个维度大小应该是 2 2 2,但我们实际传入的数据 shape [ 4 , 2 , 3 ] [4, 2, 3] [4,2,3] 所以报错了

接着,我们再来看个示例,分别使用官方的 LN 方法和自己实现的 LN 方法进行比较:

import torch
import torch.nn as nn


def layer_norm_process(feature: torch.Tensor, beta=0., gamma=1., eps=1e-5):
    var_mean = torch.var_mean(feature, dim=-1, unbiased=False)
    # 均值
    mean = var_mean[1]
    # 方差
    var = var_mean[0]

    # layer norm process
    feature = (feature - mean[..., None]) / torch.sqrt(var[..., None] + eps)
    feature = feature * gamma + beta

    return feature


def main():
    t = torch.rand(4, 2, 3)
    print(t)
    # 仅在最后一个维度上做norm处理
    norm = nn.LayerNorm(normalized_shape=t.shape[-1], eps=1e-5)
    # 官方layer norm处理
    t1 = norm(t)
    # 自己实现的layer norm处理
    t2 = layer_norm_process(t, eps=1e-5)
    print("t1:\n", t1)
    print("t2:\n", t2)


if __name__ == '__main__':
    main()

经测试可以发现,结果是一样的


总结

参考资料1
参考资料2

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

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

相关文章

【C++】多态详解

声明: 本节课件中的代码及解释都是在vs2013下的x86程序中,涉及的指针都是4bytes。如果要其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题等等 文章目录多态的概念多态的定义及实现多态的…

Javaweb之Http协议andTomcatandServelt的内容~

JavaWeb技术栈: B/S架构;Browser/server:浏览器/服务器架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端,浏览器只需要请求服务器,获取Web资源,服务器把Web资源发…

2023全球市场份额排名前五的浏览器,国产的为何没上榜

数据研究机构statcounter发布了PC端浏览器在2023年1月份的最新数据统计。Chrome浏览器凭借66.39%的全球份额稳居第一,Edge第二,Safari第三,Firefox第四,Opera第五。不难看出,在浏览器市场全球占有率排名前5中&#xff…

LeetCode 刷题系列 -- 304. 二维区域和检索 - 矩阵不可变

给定一个二维矩阵 matrix,以下类型的多个请求:计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, col1) ,右下角 为 (row2, col2) 。实现 NumMatrix 类:NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初…

我去,竟可直接用命令行操作ChatGPT

ChatGPT 确实杀疯了,已经有 1亿 月活用户了,毕竟它真的有智能的样子。 我前些年还开发过智能客服系统,要是早点遇到 ChatGPT,估计可以省了不少事。 我想接下来有许多业务场景都会使用到它,比如教学,内容创…

OpenCV-PyQT项目实战(5)项目案例01图像模糊

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列,持续更新中 OpenCV-PyQT项目实战(1)安装与环境配置 OpenCV-PyQT项目实战(2)QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战(3)信号与槽机制 …

毫米波雷达人体存在感应营造更智能的生活

毫米波雷达人体存在感应的工作原理基于多普勒效应,精准度高、稳定性强,其可以穿透非金属物质,比如薄木板、衣服、塑料等物质。 科技改变生活,营造更智能化的生活,最重要的是能够对人体存在进行精准检测,人体…

Git多人协同远程开发

1. 李四(项目负责人)操作步骤 在github中创建远程版本库testgit将基础代码上传⾄testgit远程库远程库中基于main分⽀创建dev分⽀将 githubleaflife/testgit 共享给组员李四继续在基础代码上添加⾃⼰负责的模块内容 2. 张三、王五(组员&…

【树和二叉树】数据结构二叉树和树的概念认识

前言:在之前,我们已经把栈和队列的相关概念以及实现的方法进行了学习,今天我们将认识一个新的知识“树”!!! 目录1.树概念及结构1.1树的概念1.2树的结构1.3树的相关概念1.4 树的表示1.5 树在实际中的运用&a…

SpringBoot:拦截器,过滤器,打包与运行

目录 一、拦截器 1、创建实现类实现HandlerInterceptor 接口 2、注册拦截器对象 二、过滤器 拦截器与过滤器区别 三、打包运行windows版(jar包,war包) 1、打包为jar包 2、打包为 war包 一、拦截器 拦截器(Interceptor )是一种动态拦截…

二叉搜索树——BinarySearchTree

致前行的人: 要努力,但不要着急,繁花锦簇,硕果累累,都需要过程! 目录 1.二叉搜索树 1.1二叉搜索树概念 1.2二叉搜索树的操作 1.3二叉搜索树的实现 2.4二叉搜索树的应用 2.5二叉搜索树的性能分析 2.二…

不用U盘 重装系统(别再浪费钱去电脑城装系统了)

不用U盘 重装系统(别再浪费钱去电脑城装系统了) 首先打开浏览器,搜索MSDN回车,选择第一个网站 点击操作系统 往下拉找到win10专业版 选择(business editions)和 (x64) 打开迅雷,点击新建&a…

高德地图开发实战案例:使用Loca数据源展示海量点标注(海量点、自定义分类图标、聚合、信息提示、3D控件)

系列文章目录 高德地图开发实战案例:弧线连接线标注高德地图开发智慧社区网格化数据格式产生的无法单击事件的解决方案高德地图进阶开发实战案例(1):webAPI坐标转换和jsAPI批量转换高德地图进阶开发实战案例(2):电子围栏(多边形的绘制)的展示高德地图进…

与chatGPT的第一次亲密接触

最近,chatGPT火了,不管传统媒体,还是各种自媒体平台都在说它。今天我突然也想注册一个玩玩,注册前2步还行,但是等点开邮箱校验时,打开网页显示: 上网查了一下,没向中国开放服务&…

Java高手速成 | 对象-关系的映射、映射对象标识符与JPA API的级联操作

01、对象-关系的映射概念 Java对象和关系数据库存在一些简单的映射关系,比如Customer类与CUSTOMERS表映射,一个Customer对象与CUSTOMERS表中的一条记录映射,Customer类的name属性与CUSTOMERS表的NAME字段映射。 但是,毕竟对象模型…

有了独自开,一个人就是一个团队

文章目录 简单介绍优点 优秀案例平台福利总结 简单介绍 独自开是一个基于商品与服务交易全流程的PaaS开发平台。对于开发者,独自开可以协助开发者一个人独自开发一套系统。 优点 独自开有独创的分层标准化平台架构,可以满足系统的任何个性化需求。 …

PICT:一款功能强大的信息收集和事件响应工具

关于PICT PICT是一款功能强大的信息收集和事件响应工具,该工具可以帮助广大研究人员在受感染的终端节点中收集各种信息,以辅助进行网络安全事件应急响应。这些数据可能不够完整,但确实能够捕捉到很多有价值的取证信息。如果你想要获取完整的…

搜广推 隐语义模型(LMF)与矩阵分解(MF)

😄 MF的出现就是为了解决CF处理稀疏矩阵能力弱的问题,增强泛化能力。挖掘用户和物品的隐含兴趣和隐含特征。 ⭐ 在这里隐语义模型LMF在这里也就是利用MF对用户评分矩阵分解出来的用户隐向量矩阵、物品隐向量矩阵,然后基于这两个矩阵就可以计算得分,完成推荐任务。 🚀 MF…

我猜这将是程序员副业接单赚外快的最好的平台!

文章目录一、前言二、【独自开】介绍2.1 分层标准化平台架构2.2 集成第三方数字接口2.3 支持各个行业的系统定制开发三、如何在【独自开】赚钱获取收益?3.1 如何称为【独自开】开发者?3.2 如何领取任务赚取收益四、【独自开】优秀案例4.1 家政服务平台4.2 优选商城五、【独自…

设计模式之观察者模式,以C++为例。

今天来准备浅浅的过一下观察者模式,观察者模式也叫作:发布者订阅者模式。该模式的特点是多个对象依赖一个对象,为一对多依赖关系,每当一个对象改变时,所有依赖它的对象都会得到通知并自动更新,该模式主要维…