作者MXNet (MXNet)
看板DataScience
标题[徵文] Self-Normalizing Neural Networks
时间Mon Jul 9 01:02:19 2018
既然都报名了,所以就读了。
以下会用我自己的理解、用比较口头的叙述,若用字不精确、还请见谅。
----
arXiv:
https://arxiv.org/abs/1706.02515
I. Abstract
Deep Learning 中有两个很成功的 model,CNNs 在 vision 上、RNNs 在 NLP tasks 上。
那麽传统的 Feed-forward NN (以下称 FNNs) 的 Deep Learning 成功故事却极少。
FNN 表现好的状况都是 shallow (对比於其他两个 deep model) 的,
里面的 abstract representation 没办法做得 high-level,因爲 shallow。
本篇提出 self-normalizing neural networks (SNNs) 的方法,
让 FNNs 有能力做出 high-level abstract representation 的能力。
这个 SNNs 你只要躺着用,每一层 layer 的 output 都会自动收敛到
mean = 0, variance = 1 ,对比其他 normalization 方法是需要主动去
做 normalization 操作的(笔者注:像是 batch norm 你要导入额外的参数
γ 跟 β,而且是需要学习的参数,所以 SNNs 也太爽了吧,躺着用)
本篇 proposed 这个 SNNs 使用的 activation function 是
"scaled exponential linear units" (SELUs),这个 activation function 有
self-normalizing 的特性。这篇用 Banach fixed-point theorem (笔者注:?)
证明,SNNs 把 layer output 收敛到 mean = 0, var = 1 的能力,而且是能够
抵抗 noise 跟有的没的 perturbations。
SNNs 的收敛性带来以下好处:
1) 网路能够变 deep
2) 能够导入 strong regularization scheme (笔者注:e.g. dropout 像是 noise term)
3) learning 的稳定性高
即使在尚未把网路收敛到 var = 1 的状况,本篇证明这个 var 是有上下界的,因此
不会出现 gradient exploding 或 vanishing 的状况。
本篇火力展示:
1) 121 tasks from the UCI machine learning repository
2) drug discovery benchmarks
3) astronomy tasks with standard FNNs
本篇有 code:
https://github.com/bioinf-jku/SNNs
II. Introduction
这里前两段在讲 CNN、RNN 成功的故事,麻烦各位有兴趣自行阅读,里面就是大量的 citation。
在 training deep 的 CNN 方面,有 batch normalization、layer normalization、
weight normlization。但是这些 normlization 的技术会受到来自 SGD、
stochastic regularization (e.g. dropout) 等的干扰。
CNN 与 RNN 的 model 因为有 weight sharing 的关系,training 过程中受到的干扰
比较少,而且整个 model 比较稳定。而这些干扰对 FNNs 就影响很大,
如 figure 1 所示。本篇认为 FNNs 因为对干扰很敏感,而比 CNN、RNN 不好训练。
SNNs 则够 robust 去抵抗这些干扰,如 Figure 1 所示。
III. Self-normalizing Neural Networks (SNNs)
先定义一堆符号:
1) actvation function
f
2) weight matrix
W
两个 layer 中间的 weight matrix
3) activations in lower layer
x
就是两个 layer 之间,前面的 layer 的 output
4) input
z = Wx
後面 layer 的会拿到 乘完 weight matrix 的东西
5) activation in higher layer
y = f(z)
後面 layer 的 output
6) activations 的 mean
μ = E(x_i)
~
μ = E(y_i)
7) activation 的 variance (注:这里的 notation 是 $nu$)
ν = Var(x_i)
~
ν = Var(y_i)
8) weight vector 的 mean 为 ω
9) weight vector 的 var 为 τ
10)
g 是个 function,代表两个 layer 之间 mean 跟 variance
的关系。
~ ~
g(μ, ν) = (μ, ν)
batch normalization、layer normalization 或 weight normalization
则是去确保这个 g function 会把东西 mapping 到 predefined values,
通常是 (0, 1)。
Definition 1:
我们称一个网路是 self-normalizing 需满足以下条件。
它的每一个 activations
y 必须有一个 mapping
g: Ω→Ω,
而且这个
g 拥有一个好的 fixed point
(ω, τ)。
Ω定义成
Ω = { (μ, ν) | μ ∈ [μ_min, μ_max],
ν ∈ [ν_min, ν_max]}
而
g(Ω) ⊆ᆪ[。
当
g 被多次重复的 apply 到
Ω,
Ω里面的每个点,会收敛到
fixed point
(ω, τ)。
Definition 1 笔者注
这里我们的
g function 就是 normalization 的手段。
数学上的 fixed point 定义成
g(ω, τ) = (ω, τ),
即不管怎麽 apply mapping,其结果不动的点。
这个 fixed point 是由 layer 中间 weight vector 的 mean 跟 var 组成。
如果整个 networks 的 activations (就是每个 layer 的 y)的 mean and var 都在
predefined intervals 里面,那麽我们会说整个网路被 normalized 了。
现在我们单看两个 layer 之间的 activations
x and y,
如果
x 的 mean 跟 var 值域已经在 predefined intervals
那麽
y 的 mean 跟 var 也会在 predefined intervals。
因此我们的 normalization 有 transitive 的特性,横跨整个网路。
最後,如果
g 被 iteratively apply,这些 mean 跟 var
会收敛到 fixed point。
SSNs 能够使 activations
x 的 nomalization propagating 到整个网路。
每个 layer 的 fixed point
(ω, τ) 可以一样,也可以不同,没限制。
建构一个 SNNs 的网路:
其实就是针对
g function 做设计,那麽要从两个地方下手,互相搭配
1) 精心设计的 activation function
2) weight matrix 的 initialization function
先来讲第一种 approach,本篇提出了 "scaled exponential linear units" (SELU)
来达成 FNNs 的 self-normalizing。见本文 equation 2
selu(x) = λ( x > 0 ? x : (αe^x - α) )
我们研究过其他 activation function,以下皆不能作出 SNNs:
ReLUs, sigmoid, tanh, leaky ReLUs 都不适用。
在设计这个 activation function 有以下几个要点:
1) function 的值域要包含正负,好让我们控制 mean
2) 要有 saturation regions,即微分接近 0 的区域 (笔者注:
像是 sigmoid 的两边,对於 大 跟 很大 的 x 的 output 都是趋近 1),
这样才能吸收 variance 过大的状况
3) 要有斜率大於 1 的 regions,来处理 vaiarnce 过小的状况
4) 是个 continuous curve
根据这些要点,我们 proposed 的 SELU 的 λ 的选择上要大於 1 。
g function 的推导:
前面我们已经选出了我们的 activation function
f(x) = selu(x)
那麽
g 与
f 之间的关系就很明确了。透过
z
把整件事情连起来。推导在 paper 的 equation 3 ~ 5。
详细的推导这里不叙述了。
这里做了些假设在
z 上面,只要整个隐藏层的 node 数量够多,
Deep Learning 中上百个 node 很常见,那麽
z 的 distribution,
根据中央极限定理,会形成一个 normal distribution,文中是用 normal dist.
下去推导的。
对 fixed point
(0, 1) 的讨论:
假设我们的 weight matrix 已经 normalized 出
ω = 0, τ = 1。
也就是 fixed point
(μ ,ν) = (0, 1)。
现在我们把这个
μ 跟
ν 带入上一段写出来的
equation 4 跟 5,可以解出我们 selu(x) 里面的参数
α 约为 1.6733 与
λ 约为 1.0507
笔者注:底下还有些对於这个 fixed point 选择的证明,使
g 是个
contraction mapping,即这个 mapping stable 会收敛。
fixed point 对 unnormalized weights 的讨论:
在网路 training 的过程中,weight vector 可能被更新了,然後就不 normalized 了。
而在我们采用上一段得出的两个参数
α, λ 的状况下,
如果 weight vector 的 mean 跟 var
(ω, τ) 够接近
(0, 1),
这个
g function 的 fixed point 尽管不是
(0, 1),
但也会很接近
(0, 1)。
而且这段接下来讲述各种不同的 variance ν的状况,全部的证明都附在 appendix。
简单来说,这里证明了 SNNs 的
g 的 fixed point 在
unnormalized weights 的状况下是存在的。
而且对於各种
ν 过大或过小的状况都能够处理,而能防止网路的更新上的
gradient exploding 或是 vanishing。证明就麻烦各位有兴趣自行研读了。
笔者注:所以大家在 init 完 weights 後,即使 training 过程中的 weights
不 normalized 也没关系。我们的
g 够厉害。
weight initialization:
基本上就是你能够作出
ω = 0, τ = 1 的方法都可以,本篇提了几个:
uniform distribution、truncated Gaussian distribution,还有一篇
前人的 MSRA initialization 都有相似的效果。
"Alpha-dropout"
本篇提出一个新的 dropout 技术,来用在 SNNs 中。
这个 Alpha-drouput 会随机把 output 改成
-λα(在使用 SELU 的状况下),
而能够维持 activations 的 mean 跟 variance 不变。
在我们的经验中 dropout rate 设定成 0.05 或 0.1 有不错的效果。
III. 实验
在这个 section 中,跑了些不同的 normalization 技术的比较,
这个部分就麻烦各位有兴趣再来读这里的表格了。
IV. 结论
我们的 SNNs 让 FNNs 能够在 training 上大跃进。而且在越 deep 效果越好。
解决了 gradient exploding 跟 vanishing 的问题。
----
个人心得:
大概花了两天来写这个 post,就不管有没有符合徵文标准的字数了。
大家觉得有学到点啥比较重要。
而有些个人的理解与见解已经混在文中了。
要不我们也来提出个啥 SNNs 的 activation function 就叫 PTT 好了?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.73.135
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1531069344.A.95A.html
1F:推 GCWShadow: 推同校 07/09 02:44
2F:推 yoyololicon: 校友推 07/09 06:16
3F:推 aszx4510: 未看完先推 改天有时间一次补完 感谢心得 07/09 07:26
4F:推 goldflower: 推个 话说之前处理个问题用SeLU结果差用BN不少 07/09 09:59
5F:推 sma1033: 用过SELU的就知道,有的时候RELU换SELU反而会变差 07/09 11:20
6F:→ MXNet: 我觉得看 data,我自己用 ReLU 在时间序列上效果不好 07/09 11:27
7F:推 jason860421: 推 07/09 12:00
8F:推 st1009: 推参与活动 07/09 12:08
9F:推 jojojen: 推 07/09 12:14
10F:推 johnny8376: 推活动首po 07/09 13:03
11F:推 wilson85771: 推 07/09 13:24
12F:推 PyTorch: 借问一下 那把selu用在convolution layer也有normalize的 07/09 13:34
13F:→ PyTorch: 效果吗? 07/09 13:35
14F:推 liang1230: Selu 会变差常常是因为你忘了normalize你的input 07/09 18:56
15F:推 goldflower: 忘记normalize input就像有没有忘记加分号一样了吧XD 07/10 01:52
16F:→ goldflower: 没normalize input通常结果就直接爆的可能性比较高 07/10 01:52
17F:推 AndrewNg: 小弟认爲你整篇po文写成英文会比现在这样好读。但还是 07/23 14:31
18F:→ AndrewNg: 推个首po 07/23 14:31