通俗话说一说各种Normalization以及用deeplearning4j实现Layer Normalization

Layer Normalization详解
本文深入解析Layer Normalization在深度学习中的应用,特别是在RNN上的效果。介绍了Normalization的基本概念,对比了不同Normalization方法,并详细阐述了Layer Normalization的原理、参数调整及其实现。通过实例展示了在文本分类任务中的表现。
部署运行你感兴趣的模型镜像

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

一、Normalization是什么

    Normalization一句话概括来说就是用一种办法,将一组数据压到均值为0,方差为1的正态分布上去,具体做法是数据集的每一个元素减去均值再除以标准差。公式如下:(请忽略参数g,g的问题很诡异,后面说)

    这个公式说的更直白一点就是,把每一个a,经过平移和缩放,得到一个新值。而这样做的一个理由是,平移缩放并不会改变原始数据的分布情况,原来最大的还是最大,原来最小的还是最小。

    Deeplearning中有很多Normalization的方法,有BN、LN、IN、GN等等,每一种Normalization公式都一样,只是沿着的轴不一样,BN就是沿着minibatch方向,LN就是沿着影藏层的output vector维方向,举个例子,对于四维张量[minibatch,depth、height、width],那就是沿着depth方向,把height、width维约简掉。

二、说说Layer Normalization

    论文地址:https://arxiv.org/pdf/1607.06450.pdf

    Layer Normalization对于时间序列数据有奇效,下面截一段论文的原文。这是在RNN上用Layer Normalization

   

        简短的话说一下论文的变量含义,a表示t时刻点rnn的预输出值(还没有经过激活函数哦),h表示rnn某一个隐层t时刻点的输出。

        那么,这里Normalization是哪一个维度呢?假设RNN的输入张量为[minibatch、layerSize、timesteps],这么这里Normalization的就是layerSize这一维。这样可能还是太抽象,请看下图:

    

 

    这里Normalization的就是红色箭头指向的每一个维度的向量,对于一条数据的每个time step而言,就求出一个均值和方差,进行变换,下一个time step类推下去。那么多个time step就有多个均值和方差。

三、重点说说参数g和b

    这里g和b的维度要和h的维度相同,也就是上图的values per time step这一维度,也就是layer size的大小,这里g和b是跟随着网络参数学出来的。开始实现时,g的所有值一般会初始化为1,b的所有值会被初始化为0,随着训练的进行,g和b就会被修改为任意值了。那么Normalization也就没有了正态分布的效果,相当于layer size维乘以了一个随机向量,注意这里是向量点积,那么就等同于给一个随机的噪声,居然也能起作用,也是一个不能解释的问题。有点没有道理,但就是这么难以置信,居然是work的。

四、deeplearning4j的自动微分实现Layer Normalization

import java.util.Map;

import org.deeplearning4j.nn.conf.inputs.InputType;
import org.deeplearning4j.nn.conf.layers.samediff.SDLayerParams;
import org.deeplearning4j.nn.conf.layers.samediff.SameDiffLayer;
import org.nd4j.autodiff.samediff.SDVariable;
import org.nd4j.autodiff.samediff.SameDiff;
import org.nd4j.linalg.api.ndarray.INDArray;

public class LayerNormaliztion extends SameDiffLayer {

	// gain * standardize(x) + bias

	private double eps = 1e-5;

	private static String GAIN = "gain";
	private static String BIAS = "bias";

	private int nOut;
	private int timeStep;

	public LayerNormaliztion(int nOut, int timeStep) {
		this.timeStep = timeStep;
		this.nOut = nOut;
	}

	protected LayerNormaliztion() {

	}

	@Override
	public InputType getOutputType(int layerIndex, InputType inputType) {
		return InputType.recurrent(nOut);
	}

	@Override
	public void defineParameters(SDLayerParams params) {
		params.addWeightParam(GAIN, 1, nOut, 1);
		params.addWeightParam(BIAS, 1, nOut, 1);
	}

	@Override
	public SDVariable defineLayer(SameDiff sd, SDVariable layerInput, Map<String, SDVariable> paramTable,
			SDVariable mask) {
		SDVariable gain = paramTable.get(GAIN);//论文中的g
		SDVariable bias = paramTable.get(BIAS);//论文中的b
		SDVariable mean = layerInput.mean("mean", true, 1);//均值
		SDVariable variance = sd.math().square(layerInput.sub(mean)).sum(true, 1).div(layerInput.getShape()[1]);//平方差
		SDVariable standardDeviation = sd.math().sqrt("standardDeviation", variance.add(eps));//标准差,加上eps 防止分母为0
		long[] maskShape = mask.getShape();
		return gain.mul(layerInput.sub(mean).div(standardDeviation)).add(bias)
				.mul(mask.reshape(maskShape[0], 1, timeStep));//掩码掩掉多余长度

	}

	@Override
	public void initializeParameters(Map<String, INDArray> params) {
		params.get(GAIN).assign(1);
		params.get(BIAS).assign(0);
	}

	public int getNOut() {
		return nOut;
	}

	public void setNOut(int nOut) {
		this.nOut = nOut;
	}

	public int getTimeStep() {
		return timeStep;
	}

	public void setTimeStep(int timeStep) {
		this.timeStep = timeStep;
	}

}

    五、实战的结果

    就用RNN做文本分类而言,加上LN,收敛会更平稳,但准确率大大下降了。

    在deeplearning的世界里,任何一种方法被提出来,只是在解当前的问题,对于每一种具体的问题,肯定是case by case。

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读/书籍书单大全:

(点击右侧 即可打开个人博客内有干货):技术干货小栈
=====>>①【Java大牛带你入门到进阶之路】<<====
=====>>②【算法数据结构+acm大牛带你入门到进阶之路】<<===
=====>>③【数据库大牛带你入门到进阶之路】<<=====
=====>>④【Web前端大牛带你入门到进阶之路】<<====
=====>>⑤【机器学习和python大牛带你入门到进阶之路】<<====
=====>>⑥【架构师大牛带你入门到进阶之路】<<=====
=====>>⑦【C++大牛带你入门到进阶之路】<<====
=====>>⑧【ios大牛带你入门到进阶之路】<<====
=====>>⑨【Web安全大牛带你入门到进阶之路】<<=====
=====>>⑩【Linux和操作系统大牛带你入门到进阶之路】<<=====

天下没有不劳而获的果实,望各位年轻的朋友,想学技术的朋友,在决心扎入技术道路的路上披荆斩棘,把书弄懂了,再去敲代码,把原理弄懂了,再去实践,将会带给你的人生,你的工作,你的未来一个美梦。

您可能感兴趣的与本文相关的镜像

EmotiVoice

EmotiVoice

AI应用

EmotiVoice是由网易有道AI算法团队开源的一块国产TTS语音合成引擎,支持中英文双语,包含2000多种不同的音色,以及特色的情感合成功能,支持合成包含快乐、兴奋、悲伤、愤怒等广泛情感的语音。

### Layer Normalization 是什么? Layer Normalization(层归化)是种用于深度学习模型的归化技术,旨在加速训练过程并提高模型的稳定性。它过在每个样本的特征维度上进行归化操作,使得每个样本的特征分布具有零均值和单位方差 [^1]。 在深度神经网络中,每层的输入分布可能会随着训练过程而发生变化,这种现象被称为**内部协方差偏移**。Layer Normalization 过对每个样本的特征进行标准化,减少了这种分布变化,从而使得训练更加稳定 [^3]。 ### Layer Normalization 的作用 Layer Normalization 的主要作用是减少训练过程中梯度消失或梯度爆炸的问题,从而提高模型的收敛速度和稳定性 [^3]。它特别适用于序列模型,如循环神经网络(RNN)和长短期记忆网络(LSTM),因为这些模型的输入长度可能会变化,而 Layer Normalization 不依赖于批次维度 [^2]。 与 Batch Normalization 不同,Batch Normalization 是在 mini-batch 维度上进行归化,而 Layer Normalization 则是在每个样本的特征维度上进行归化。这种差异使得 Layer Normalization 更适合处理变长序列或小批量数据 [^1]。 ### Layer Normalization 的工作原理 对于输入张量 $ x $,Layer Normalization 的标准化过程如下: 1. **计算均值**:对每个样本 $ x_i $,计算其所有特征的均值 $ \mu_i $。 2. **计算方差**:计算每个样本 $ x_i $ 的特征方差 $ \sigma_i^2 $。 3. **标准化**:使用计算出的均值和方差对每个样本进行标准化,得到标准化后的张量 $ \hat{x}_i = \frac{x_i - \mu_i}{\sqrt{\sigma_i^2 + \epsilon}} $,其中 $ \epsilon $ 是个小的常数,用于防止除以零的情况。 4. **缩放和平移**:标准化后的张量过两个可学习参数 $ \gamma $ 和 $ \beta $ 进行线性变换,以恢复模型的表达能力。变换公式为 $ y_i = \gamma \cdot \hat{x}_i + \beta $。 ### Layer Normalization 的代码实现 以下是个简单的 Python 实现示例,展示了如何对个张量应用 Layer Normalization: ```python import numpy as np def layer_normalization(x, gamma, beta, epsilon=1e-5): # 计算每个样本的均值 mean = np.mean(x, axis=1, keepdims=True) # 计算每个样本的方差 variance = np.var(x, axis=1, keepdims=True) # 标准化 normalized = (x - mean) / np.sqrt(variance + epsilon) # 缩放和平移 result = gamma * normalized + beta return result # 示例输入张量 x = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]) # 初始化缩放和平移参数 gamma = np.ones((1, 3)) beta = np.zeros((1, 3)) # 应用 Layer Normalization normalized_x = layer_normalization(x, gamma, beta) print(normalized_x) ``` ### Layer Normalization 的优势 Layer Normalization 在处理序列数据和生成任务中表现尤为出色,特别是在 Transformer 和 RNN 等模型中。它能够有效减少内部协方差偏移,从而加速训练过程并提高模型的稳定性 [^3]。 此外,Layer Normalization 在推理时也能够保持模型的性能,因为它不依赖于批量数据的统计特性,而是基于每个样本自身的特征进行标准化 。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值