本文来自 stanford 组,原文标题
Noisy Neural Network Compression for Analog Storage Devices
Introduction
背景
本文的背景是用模拟器件存储NN weights capacity更大但同时
- 更noisy。一般情况下,这个 noise 是写入 cell 的值的 non-linear function;
- 输入的范围 limited 有最大值最小值限制,也就是说我们得scale input.
Motivation
本文的motivation是说
- 以前的work全都是模拟为AWGN噪声 (Upadhyaya et al., 2019; Zhou et al., 2020),但实际上不是。
- 现有的NN压缩技术 (Han et al., 2016; Oktay et al., 2019) 都没有考虑到存储时一点点噪声就会造成大的性能损失 (Achille et al., 2019),因此本文要提出新的NN压缩技术。
Methdology
本文借用传统信息论来设计编码译码算法以便被压缩后的模型可以存储在模拟设备上。特别的,我们的方法
(a) 使用传统压缩技术如 pruning (Guo et al., 2016; Frankle & Carbin, 2019), knowledge distillation (KD) (Hinton et al., 2015; Polino et al., 2018; Xie et al., 2020) 来学习一个压缩的NN。
(b) 在被压缩的模型上使用不同的编码技术来确保被压缩的网络更robust to存储噪声。我们的目的有两个:一是最小化网络性能损失,二是最小化所需的存储空间。
作者提及在后续的工作中将联合设计(a) (b) (目前还是分开的, (b) 基于 (a))。
结果overview
作者的实验
- 研究了噪声对压缩后的模型的影响,以及一些缓解影响的方法
- 证实了 (Han et al., 2016; Frankle & Carbin, 2019) 的结果:NN的weights对pruning是非常robust的,但是剩余的weights对小的扰动非常敏感。
- 发现存储时
(a) 额外用一个cell保存weights的sign
(b) 对大参数和小参数分别做coding (不同的redundancy)
能使classification结果更好。
举例来说,如果用一种naive的方法来存储pruning后的ResNet-18模型,我们得需要1000cells/weight 来对抗噪声从而achieve无噪时的accuracy;但是作者的方法仅仅需要 1cell/weight 而性能损失只有 0.5%.
具体方法
作者考虑用 PCM 作为模拟存储因为它的输出电导值可以是连续的。一个PCM存储可以看做一个信道,它的输入输出如下图所示。
可以看到,输入输出是非线性关系,但是总体来说可以看做一个nonlinear mean + AWGN
noise. 所以第一步我们做的就是把nonlinear mean给刻画出来并且compensate掉,第二步就是对抗AWGN noise.
Inverting the channel
作者直接根据图1用一个 k-nearest neighbor classifier学习到了mean和输入之间的关系,记作
μ
\mu
μ. 假设这个channel 函数是
C
C
C, 那么我们可以用
μ
\mu
μ 来compensate这个信道得到
ϕ
=
C
∘
μ
−
1
\phi=C\circ \mu^{-1}
ϕ=C∘μ−1
这就相当于把信道变成了一个一条直线,即 ϕ ( x ) = x + ϵ \phi(x)=x+\epsilon ϕ(x)=x+ϵ.
对于任一个输入,我们首先得scale它 (因为输入是有范围限制的 作者说是
[
−
0.65
,
0.75
]
[−0.65, 0.75]
[−0.65,0.75]),紧接着存储进cell (过信道),再经过反scale拿到原始值, giving
w
out
=
ϕ
(
α
w
in
−
β
)
+
β
α
=
w
in
+
ϵ
α
w_\text{out}=\frac{\phi(\alpha w_\text{in}-\beta)+\beta}{\alpha} =w_\text{in}+\frac{\epsilon}{\alpha}
wout=αϕ(αwin−β)+β=win+αϵ
在这个式子中, α \alpha α 越大越好,因为噪声variance越小;但是不能无限大因为输入 α w in \alpha w_\text{in} αwin 必须在给定范围内。显然,越小的weight我们可以用越大的 α \alpha α.
Sign protection
NN的weights一般都是很sparse的 (即使是在prune掉很小的那些值之后),因此在 scaling 之后很多都是趋于零的weights; 经过噪声后很多weights的sign都被改变了。因此作者单独存储weights的sign。而且此时作者可以把 α \alpha α 提高两倍。
Adaptive mapping
一种简单对抗噪声
ϵ
\epsilon
ϵ 的方法是多存储几个cell (相当于repetition code)。
然后作者就说我们可以简单用 0.05 作为weights 大小的界限。大于0.05的我们用小一点的
α
\alpha
α, 小于
0.05
0.05
0.05的我们用大一点的
α
\alpha
α
Adaptive redundancy
然后作者又提出说,我们可以用更多的cell来存储大的参数,因为他们比较少而且又比较重要。在保持average cell不变的情况下,给大的参数更多的cell有更好的性能。
ok,以上就是本文的所有trick,还是比较trivial的。