NLP任务中-layer-norm比BatchNorm好在哪里
这就要理解为什么LN单独对一个样本的所有单词做缩放可以起到效果
为啥BN在NLP中效果差BN的使用场景,不适合RNN这种动态文本模型,有一个原因是因为batch中的长度不一致,导致有的靠后面的特征的均值和方差不能估算。这个问题其实不是个大问题,可以缓解。我们可以在数据处理的时候,使句子长度相近的在一个batch,就可以了。所以这不是为啥NLP不用BN的核心原因。
BN在NLP中的应用。BN是对每个特征在batch_size上求的均值和方差。比如说身高,比如说体重等等。这些特征都有明确的含义。但是我们想象一下,如果BN应用到NLP任务中,对应的是对什么做处理?
是对每一个单词!也就是说,我现在的每一个单词是对应到了NLP中的每一个特征。
也就是默认了在同一个位置的单词对应的是同一种特征,比如:“我/爱/中国/共产党”和“今天/天气/真/不错” 如果使用BN,代表着认为“我”和“今天”是对应的同一个维度特征,这样才可以去做BN.
这样做BN不会有效果的,每个单词表达的特征是不一样的,所以按照位置对单词特征进行缩放,是违背直觉的。
layner-norm的特点
layner-norm的特点是什么?layner-norm做的是针对每一个样本,做特征的缩放。换句话讲,保留了
N维度,在C/H/W维度上做缩放。也就是,它认为“我/爱/中国/共产党“这四个词在同一个特征之下,所以基于此而做归一化。
这样做,和BN的区别在于,一句话中的每个单词都可以归到一个名字叫做“语义信息”的一个特征中,也就是说,layner-norm也是在对同一个特征下的元素做归一化,只不过这里不再是对应N(或者说batch size),而是对应的文本长度。
上面这个解释,有一个细节点,就是,为什么每个单词都可以归到”语义信息”这个特征中。可以这么
想,如果让你表达一个句子的语义信息,你怎么做?最简单的方法就是词语向量的加权求和来表示句子向量
上面这个方法就是出于每个单词都是语义信息的一部分这个insight.
在下图中 N 表示样本轴, C 表示通道轴, F 是每个通道的特征数量。BN如右侧所示,它是取不同样本的同一个通道的特征做归一化;LN则是如左侧所示,它取的是同一个样本的不同通道做归一化。