【NLP】Layer-Normalization

最近深入batch normalization的研究,发现了一系列Normalization方法的富矿,深有收获。

从2015年的BN开始,2016年出了LN(layer normalization)和IN(Instance Normalization),2018年也就是今年,Kaiming提出了GN(Group normalization),成为了ECCV2018最佳论文提名。

论文标题:Layer Normalization

论文链接:https://arxiv.org/abs/1607.06450v1

code : https://github.com/ryankiros/layer-norm

从BN -> LN -> IN ->GN,一系列发展,容我慢慢道来。此文主要讨论Layer-Normalization

Layer-Normalization
对于Normalization不了解的同学请移步《batch normalization

LN是Hinton及其学生提出来的,所以这个分量足以我们好好讨论。

BN虽然带来了很多好处,不过BN的缺点还是有一些的:

    1,BN特别依赖Batch Size;当Batch size很小的适合,BN的效果就非常不理想了。在很多情况下,Batch size大不了,因为你GPU的显存不够。所以,通常会有其他比较麻烦的手段去解决这个问题,比如MegDet的CGBN等;

    2,BN对处理序列化数据的网络比如RNN是不太适用的;So,BN的应用领域减少了一半。

    3,BN只在训练的时候用,inference的时候不会用到,因为inference的输入不是批量输入。这也不一定是BN的缺点,但这是BN的特点。

在前面谈到,标准化的作用就是改良数据分布。

BN的操作是,对同一批次的数据分布进行标准化,得出的均值方差,其可信度受batch size影响。很容易可以想到,如果我们对小batch size得出均值方差,那势必和总数据的均值方差有所偏差。这样就解释了BN的第一个缺点:BN特别依赖Batch Size;

LN的操作类似于将BN做了一个“转置”,对同一层网络的输出做一个标准化。注意,同一层的输出是单个图片的输出,比如对于一个batch为32的神经网络训练,会有32个均值和方差被得出,每个均值和方差都是由单个图片的所有channel之间做一个标准化。这么操作,就使得LN不受batch size的影响。同时,LN可以很好地用到序列型网络如RNN中。同时,LR在训练过程和inference过程都会有,这就是和BN很大的差别了。

还有一个叫做Weight Normalization的操作,和LN有着同样的特点。WN是在训练过程中,对网络参数进行标准化。这也是一个很神奇的操作。不过效果表现上,是被LN虐了。还不足以成为主流的标准化方法,所以在这里只是稍微提一下。

本文主要是针对 batch normalization 存在的问题 提出了 Layer Normalization 进行改进的。

这里首先来回顾一下 batch normalization : 
对于前馈神经网络第 l 隐层,神经元的输入为 a, 激活函数为 f, 激活函数输出为 h。权值 w 通过 SGD学习得到。 如下面的公式所示:

深度学习中的一个挑战就是对于上面公式中 一层的权值 w 的梯度 高度依赖于前一层神经元的输出,特别是当这些输出的改变高度相关的时候。(梯度容易受样本数据的影响,导致权值难以快速的收敛,一会向东,一会向西,走来走去,走了半天也没走多少路啊,这样走到全局最优值要走到哪天。这个问题有个名字,叫 covariate shift)。 针对此问题 [Ioffe and Szegedy, 2015] 提出了 Batch normalization 来降低这个 covariate shift 的影响。对于每个隐层的神经元,我们在所有的训练样本上归一化该神经元的输入。

在整个训练样本上计算均值方差,然后对神经元的输入进行归一化。由于对整个训练样本计算均值方差不太有效率(对于训练来说),所以提出了 在最小训练批次上估计 均值方差。 current mini-batch 。 这个约束导致Batch normalization 难以应用于 recurrent neural networks。

3 Layer normalization 
针对前面提到的 Batch normalization 的问题,我们提出了 Layer normalization。

注意到一层输出的改变会产生下一层输入的高相关性改变,特别是当使用 ReLU,其输出改变很大。那么我们可以通过固定一层神经元的输入均值和方差来降低 covariate shift 的影响。

结果
Hinton的文章里,并没有拿LN和BN做比较,它选的比较对象是WN(挑软柿子捏的感觉)。在Kaiming ECCV2018的paper里,实实在在拿LN和BN做了比较,结果是在较大batch size的时候BN的表现比LN好很多。BN也没那么好欺负的,不然怎么大大小小的主流网络都在用BN呢。、

上面公式中 H 是 一层神经元的个数。这里一层网络 共享一个均值和方差,不同训练样本对应不同的均值和方差,这是和 Batch normalization 的最大区别。

Layer normalization 对于recurrent neural networks 的帮助最大。

Layer normalization 对于 Convolutional Networks 作用不是很大,后续研究可以提高其作用。

<think>好的,用户现在问的是Layer Normalization(层归一化),也就是Layer-Norm。我需要先回顾之前对话的历史,看看之前的交流是否有关联。用户之前问过L1范数,现在转向了深度学习的归一化技术,可能是在学习机器学习或深度学习的基础知识,尤其是模型训练中的优化技术。 首先,我要确定用户对Layer-Norm的了解程度。可能用户已经了解过Batch Normalization(批归一化),因为Layer-Norm通常和它对比讲解。用户可能想知道Layer-Norm是什么,它的作用,与BN的区别,以及应用场景等。 接下来,我需要组织回答的结构。通常介绍一个概念可以从定义、动机、计算方法、与BN的区别、优点、应用场景和代码示例这几个方面展开。需要确保内容清晰,层次分明,同时避免过于技术化的术语,保持易懂。 要确认Layer-Norm的核心思想:针对单个样本的所有特征进行归一化,而不是像BN那样针对一个批次的数据在同一个特征上进行归一化。这有助于解决BN在小批次或动态网络中效果不佳的问题,尤其在NLP和RNN中应用广泛。 需要注意用户可能的潜在需求,比如为什么需要Layer-Norm,它解决了什么问题,实际中如何应用。例如,用户可能在训练Transformer模型时遇到了问题,需要了解Layer-Norm的作用。 同时,要对比Layer-Norm和Batch Norm的区别,强调各自的适用场景。比如,BN依赖于批次大小,在批次较小时效果差,而LN不依赖批次,适合动态网络结构。 可能还需要提到Layer-Norm的数学公式,即对每个样本的均值和方差进行计算,然后标准化,并加入可学习的参数gamma和beta。这部分需要简明扼要,避免数学细节过多,但要让用户理解基本步骤。 在应用场景方面,可以举例如Transformer中的使用,RNN中的稳定性提升,以及小批量或在线学习的情况。这些例子能帮助用户更好地理解其实际用途。 最后,给出一个简单的代码示例,比如用PyTorch实现Layer-Norm,这样用户可以参考代码加深理解。同时,总结优缺点,帮助用户权衡何时使用Layer-Norm。 需要检查是否有遗漏的重要点,例如Layer-Norm的变体(如Group Norm等),但可能用户现阶段只需要基础内容,所以可以暂时不提,保持回答的简洁性。 最后,确保语言口语化,避免使用专业术语堆砌,用通俗易懂的中文解释概念,让用户能够轻松理解。</think>以下是关于 **Layer Normalization(层归一化)** 的详细介绍: --- ### **1. 层归一化的定义** **Layer Normalization**(Layer-Norm)是一种用于深度神经网络中的归一化技术,旨在解决训练过程中因数据分布变化(Internal Covariate Shift)导致的梯度不稳定问题。 它通过对 **单个样本** 的所有特征进行归一化,使网络各层的输入分布保持稳定,从而加速训练并提升模型泛化能力。 --- ### **2. 核心思想** - **与BatchNorm的区别**: - **BatchNorm**:对同一批次(batch)中所有样本的 **同一特征** 进行归一化(依赖批次维度)。 - **LayerNorm**:对 **单个样本** 的所有特征(即同一层的神经元输出)进行归一化(独立于批次维度)。 - **适用场景**: - 小批次(Batch Size较小)或动态网络结构(如RNN、Transformer)。 - 自然语言处理(NLP)任务中广泛使用(如BERT、GPT等模型)。 --- ### **3. 数学公式** 对于一个输入向量 \(\mathbf{x} \in \mathbb{R}^d\)(d为特征维度),Layer-Norm的计算步骤如下: 1. **计算均值和方差**: \[ \mu = \frac{1}{d} \sum_{i=1}^{d} x_i, \quad \sigma^2 = \frac{1}{d} \sum_{i=1}^{d} (x_i - \mu)^2 \] 2. **标准化**: \[ \hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2 + \epsilon}} \quad (\epsilon \text{为防除零的小常数,如} 10^{-5}) \] 3. **缩放和平移**: \[ y_i = \gamma \hat{x}_i + \beta \] 其中,\(\gamma\) 和 \(\beta\) 是可学习的参数,用于恢复归一化后特征的表达能力。 --- ### **4. 核心优势** - **不依赖批次大小**:对批次大小不敏感,适合动态网络(如RNN不同时间步的输入长度不同)。 - **稳定训练过程**:缓解梯度消失/爆炸,允许使用更大的学习率。 - **适合序列数据**:在NLP中,同一层的特征(如词向量)具有相似语义,归一化更合理。 --- ### **5. 与BatchNorm的对比** | **特性** | **LayerNorm** | **BatchNorm** | |------------------|---------------------------------------------------|---------------------------------------------------| | **归一化维度** | 对单个样本的所有特征(横向) | 对批次中所有样本的同一特征(纵向) | | **依赖关系** | 不依赖批次大小,适合小批次或在线学习 | 依赖足够大的批次,小批次时效果差 | | **适用场景** | RNN、Transformer、NLP任务 | CNN、图像分类任务 | | **参数数量** | 每层需学习 \(\gamma\) 和 \(\beta\)(参数少) | 每层每个通道需学习 \(\gamma\) 和 \(\beta\)(参数多) | --- ### **6. 实际应用示例** #### **(1) Transformer模型** - **位置**:Transformer的每个子层(自注意力层、前馈层)后均使用Layer-Norm。 - **作用**:稳定训练,防止梯度异常。 #### **(2) RNN/LSTM** - **位置**:在每个时间步的隐藏状态后应用Layer-Norm。 - **作用**:缓解梯度随时间步衰减的问题,提升长序列建模能力。 #### **(3) 小批次训练** - **场景**:当批次大小受限时(如GPU显存不足),Layer-Norm比BatchNorm更稳定。 --- ### **7. 代码实现(PyTorch)** ```python import torch import torch.nn as nn # 定义LayerNorm层(d_model为特征维度) layer_norm = nn.LayerNorm(d_model) # 输入数据(batch_size=2, 特征维度=512) x = torch.randn(2, 512) y = layer_norm(x) # 输出归一化后的结果 ``` --- ### **8. 总结** - **核心价值**:通过特征维度的归一化,稳定深度网络的训练,减少对超参数(如学习率)的依赖。 - **适用领域**:NLP、RNN、小批次训练、动态网络结构。 - **局限性**:在图像任务中效果通常不如BatchNorm,需根据任务选择归一化方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值