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

相关文章

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

Django之定时任务django-crontab的实现

《Django之定时任务django-crontab的实现》Django可以使用第三方库如django-crontab来实现定时任务的调度,本文主要介绍了Django之定时任务django-cront... 目录crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务@符号

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

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

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

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at