轻松读论文——层规范化技术 Layer Normalisation

作者

Jimmy Lei Ba, Jamie Ryan Kiros, University of Toronto Geoffrey E. Hinton, University of Toronto & Google


摘要

训练目前性能最好的深度神经网络计算代价高昂. 一种减少训练时间的方法是规范化神经元的激活值. 近期引入的批规范化(batch normalisation)技术对一个训练样本批量集使用了求和的输入分布来计算均值和方差,然后用这两个来规范化那个神经元在每个训练样本的求和输入. 这个方法显著减少了前驱神经网络的训练时间. 然而,批规范化的效果依赖于 minibatch 的大小,而且对于循环神经网络 RNN 无法下手. 本文将批规范化转换成层规范化——通过计算在一个训练样本上的一层上的神经元的求和输入的均值和方差.

像批规范化那样,我们同样也给每个神经元自身的适应偏差 bias 和增益 gain,这两个东西在规范化后非线性变换前使用. 和批规范化不同的是,层规范化在训练和测试时执行同样的计算. 另外也能够通过在每个时间步分别计算规范化统计信息从而直接应用在循环神经网络上. 实验结果表明,层规范化和之前的技术相比可以显著降低训练时间.

1 引言

主要介绍了一下历史,以及层规范化在 RNN 上的表现好过其他技术。

2 背景

这里虽然看起来吓人,但使用的时候用的却是从当前的 mini-batch 中采样出来的实验样本.

3 层规范化

(2) 和 (3) 中的不同很容易看出,在层规范化中,所有的隐藏元共享同样的规范化项 μ 和 σ,不同的训练样本就会有不同的规范化项.

3.1 层规范化的循环神经网络

标准的 RNN 中,求和输入的平均量度在每个时间步会增长或者缩小,从而产生爆炸或者消逝的梯度现象. 在层规范化 RNN 中,规范化项会使得模型对所有求和输入的重整化操作保持不变,这可以得到更加稳定的隐藏层之间的动力特性.

4 相关工作

批规范化技术此前已经被扩展到了 RNN 上 [Laurent et al., 2015,Amodei et al., 2015, Cooijmans et al., 2016]. [Cooijmans et al., 2016] 的工作说明循环批规范化的最佳表现是通过保持每个时间步的独立规范化统计量达成的. 作者展示了初始化循环批规范化层中增益 gain 参数为 0.1 在模型最终的性能上起到了重要的作用. 我们的工作也和权重规范化关系紧密[Salimans and Kingma, 2016]. 在权重规范化中,并没有使用方差,而是采用了输入权重的 L2 范数来对求和输入进行规范化进入神经元. 使用期望统计量应用权重规范化或者批规范化都等价于对原始前驱神经网络进行了一个不同的参数化. 在 ReLU 网络中的重参数化技术在路径规范化 SGD [Neyshabur et al., 2015] 有了探讨. 我们的层规范化技术不是一个重参数化方法. 所以它和其他方法相比有着独特的不变性,这个在后面再详解.

5 分析

这里是对不同规范化方法的不变形的比对.

5.1 权重和数据变换的不变性

层规范化和批规范化技术及权重规范化技术相关. 尽管他们的规范化使用的标量计算方式不同,但是这些方法可以归类成规范化求和输入 ai 通过两个标量 μ 和 σ. 同样还要在规范化之后对每个神经元学习适应偏差 b 和增益 g

注意,对层规范化和批规范化,μ 和 σ 通过方程 (2) 和 (3) 计算得出. 在权重规范化中, μ 为 0 和 σ = ||w||2.

从上表 1 中我们可以看到不同的规范化方法的不变性情况.

5.2 学习中的参数空间几何特性

前面讲完了模型预测在重中心定位和重比例下的不变性. 然而,学习在不同的参数化下表现差别很大,甚至是那些有着相同基本函数的模型. 本节通过参数空间的几何和流形来分析学习行为. 我们说明规范化标量 σ 可以隐式地降低学习率,让学习更加稳定.

5.2.1 黎曼度量

在统计模型中可学习的参数会形成一个平滑的流形,包含了模型所有可能的输入-输出关系. 对于输出是一个概率分布的模型来说,一种自然度量两个点在流形上分隔(seperation) 的方法就是他们模型输出分布的 Kullback-Leibler 散度. 在 KL 散度度量下,参数空间就是一个黎曼流形.

黎曼流形的曲率由黎曼度量完全刻画,其二次形式表示为 ds2. 这是在参数空间的点处切线空间的无穷小距离. 直觉上说,它衡量了在参数空间中模型输出沿着一个切线方向的变动. KL 下黎曼度量此前有过研究[Amari,1998],并证明可以在二阶泰勒展开下使用 Fisher 信息矩阵很好地近似:

实验部分没有加上,主要是各种 RNN 上超过之前的方法.

可能有用的参考: https://www.wikiwand.com/en/Fisher_information

实现参考: https://github.com/LeavesBreathe/tensorflow_with_latest_papers/blob/master/normalization_ops_modern.py

原文发布于微信公众号 - UAI人工智能(UniversityAI)

原文发表时间:2016-09-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

422
来自专栏聊聊技术

原 初学图论-Kahn拓扑排序算法(Kah

2878
来自专栏Hongten

ArrayList VS Vector(ArrayList和Vector的区别)_面试的时候经常出现

1692
来自专栏学海无涯

Android开发之奇怪的Fragment

说起Android中的Fragment,在使用的时候稍加注意,就会发现存在以下两种: v4包中的兼容Fragment,android.support.v4.ap...

3155
来自专栏Phoenix的Android之旅

Java 集合 Vector

List有三种实现,ArrayList, LinkedList, Vector, 它们的区别在于, ArrayList是非线程安全的, Vector则是线程安全...

662
来自专栏xingoo, 一个梦想做发明家的程序员

AOE关键路径

这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间。 从而算出活动最早开始的时间和最晚开始的时间,如果这两个...

2507
来自专栏xingoo, 一个梦想做发明家的程序员

20120918-向量实现《数据结构与算法分析》

#include <iostream> #include <list> #include <string> #include <vector> #include...

1716
来自专栏项勇

笔记68 | 切换fragmengt的replace和add方法笔记

1444
来自专栏后端之路

LinkedList源码解读

List中除了ArrayList我们最常用的就是LinkedList了。 LInkedList与ArrayList的最大区别在于元素的插入效率和随机访问效率 ...

19510
来自专栏xingoo, 一个梦想做发明家的程序员

Spark踩坑——java.lang.AbstractMethodError

百度了一下说是版本不一致导致的。于是重新检查各个jar包,发现spark-sql-kafka的版本是2.2,而spark的版本是2.3,修改spark-sql-...

1200

扫码关注云+社区