NLP任务中-layer-norm比BatchNorm好在哪里

2023-10-24 12:12
文章标签 norm 任务 layer nlp batchnorm

本文主要是介绍NLP任务中-layer-norm比BatchNorm好在哪里,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NLP任务中,layer-norm比BatchNorm好在哪里

本文主要是讲一下,为什么NLP任务中,比如Transformer,使用LayerNorm而不是使用BatchNorm

这个问题其实很有意思,理解的最核心的点在于:为什么LayerNorm单独对一个样本的所有单词做缩放可以起到效果。

大家往下慢慢看,我说一下我自己的理解,欢迎大佬拍砖,如果觉得我说的还行,点个在看鼓励一下。

为啥BN在NLP中效果差

上一个文章有说 BN的使用场景,不适合 RNN这种动态文本模型,有一个原因是因为batch中的长度不一致,导致有的靠后面的特征的均值和方差不能估算。

这个问题其实不是个大问题,可以缓解。我们可以在数据处理的时候,使句子长度相近的在一个batch,就可以了。所以这不是为啥NLP不用BN的核心原因。

回忆一下上个文章中,BN在MLP中的应用。 BN是对每个特征在batch_size上求的均值和方差。记住,是每个特征。比如说身高,比如说体重等等。这些特征都有明确的含义。

但是我们想象一下,如果BN应用到NLP任务中,对应的是对什么做处理?

是对每一个单词!

也就是说,我现在的每一个单词是对应到了MLP中的每一个特征。

也就是默认了在同一个位置的单词对应的是同一种特征,比如:“我/爱/中国/共产党”和“今天/天气/真/不错”

如何使用BN,代表着认为 "我"和“今天”是对应的同一个维度特征,这样才可以去做BN。

大家想一下,这样做BN,会有效果吗?

不会有效果的,每个单词表达的特征是不一样的,所以按照位置对单词特征进行缩放,是违背直觉的。

layner-norm 的特点

layner-norm 的特点是什么?layner-norm 做的是针对每一个样本,做特征的缩放。换句话讲,保留了N维度,在C/H/W维度上做缩放。

也就是,它认为“我/爱/中国/共产党”这四个词在同一个特征之下,所以基于此而做归一化。

这样做,和BN的区别在于,一句话中的每个单词都可以归到一个名字叫做“语义信息”的一个特征中(我自己瞎起的名字,大家懂就好),也就是说,layner-norm也是在对同一个特征下的元素做归一化,只不过这里不再是对应N(或者说batch size),而是对应的文本长度。

上面这个解释,有一个细节点,就是,为什么每个单词都可以归到“语义信息”这个特征中。大家这么想,如果让你表达一个句子的语义信息,你怎么做?

最简单的方法就是词语向量的加权求和来表示句子向量,这一点没问题吧。(当然你也可以自己基于自己的任务去训练语义向量,这里只是说最直觉的办法)

上面这个方法就是出于每个单词都是语义信息的一部分这个insight。

引申-为啥BN在CNN可以而在NLP不可以

但是,我还想问一个问题,CNN中证明BN效果是很好的,NLP中的文本可以类比为图像,为什么BN在图像中效果好,在文本上效果差。

我是这样理解的。还是回到刚才,BN是对单词做缩放,在NLP中,单词由词向量来表达,本质上是对词向量进行缩放。词向量是什么?是我们学习出来的参数来表示词语语义的参数,不是真实存在的。

这就是NLP和图像的一个区别,图像的像素是真实存在的,像素中包含固有的信息。比如说,一张图像,最上面的一行像素,可以归为背景这个特征(这里只是为了理解,CNN做BN是基于整个feature map,而不是单独某一行像素)。

这个理解不确保正确,只是我自己的理解(记得是从一个知乎答案看到的,改天好好找一找)

简答说一下

写到这里,我写文章不是为了推导公式,因为这种推导文章太多了,而是想让大家看了我的文章之后再去看这些推导公式能够更加容易理解。

然后大家有问题的话,私信和我说,我也知道我自己写的哪里有问题,好改进。

点个在看再走呗,老弟

列一下参考资料:

各种Normalization - Mr.Y的文章 - 知乎 https://zhuanlan.zhihu.com/p/86765356

这个文章关于BN和LN如何应用讲解的比较好,就是CNHW

NLP中 batch normalization与 layer normalization - 秩法策士的文章 - 知乎 https://zhuanlan.zhihu.com/p/74516930

这个文章也还行,我在看的时候,看到中间那个图给了我点启发,就是在理解BN的时候,仅仅是在这个时候啊,我们的C,在CNN中是通道数,在理解BN的时候,理解为句子长度,这样”,每个样本通道数为 C,高为 H,宽为 W。对其求均值和方差时,将在 N、H、W上操作,而保留通道 C 的维度。具体来说,就是把第1个样本的第1个通道,加上第2个样本第1个通道 …… 加上第 N 个样本第1个通道,求平均,得到通道 1 的均值“这句话才比较好理解。

一般NLP来说,C为1吧。

模型优化之Layer Normalization - 大师兄的文章 - 知乎 https://zhuanlan.zhihu.com/p/54530247

推荐一下这个文章,总结了对比实验:”这里我们设置了一组对照试验来对比普通网络,BN以及LN在MLP和RNN上的表现“,我还没细看,之后看。

transformer 为什么使用 layer normalization,而不是其他的归一化方法? - pymars的回答 - 知乎 https://www.zhihu.com/question/395811291/answer/1260290120

推荐这个答案,很好

这篇关于NLP任务中-layer-norm比BatchNorm好在哪里的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/275098

相关文章

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Python Invoke自动化任务库的使用

《PythonInvoke自动化任务库的使用》Invoke是一个强大的Python库,用于编写自动化脚本,本文就来介绍一下PythonInvoke自动化任务库的使用,具有一定的参考价值,感兴趣的可以... 目录什么是 Invoke?如何安装 Invoke?Invoke 基础1. 运行测试2. 构建文档3.

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五