论文笔记:HyperNetworks(arXiv版本)

论文笔记:HyperNetworks ICLR_2017(arXiv版本)

    • 这篇博客是啥?
    • 论文地址
    • 基本思想
      • 说明
    • 方法
      • 静态 HyperNetworks
      • 动态 HyperNetworks

这篇博客是啥?

这篇博文是有关HyperNetworks arXiv版本的笔记,为啥选择arXiv版本呢,因为ICLR官方编辑版本有许多删减,致使我有一部分公式看不懂(可能是因为我个人才疏学浅吧)。 这篇博文主要是讲HyperNetworks的方法,不会对实验进行介绍。


论文地址

arXiv版本: HyperNetworks arXiv
ICLR版本:HyperNetworks ICLR_2017


基本思想

HyperNetworks 的基本思想是想用一个小网络(HyperNetworks)大网络(main Networks) 生成参数, 如下图
论文笔记:HyperNetworks(arXiv版本)_第1张图片
在上图中, 橙色的方块是小网络(HyperNetworks) , 黑色的是大网络(main Networks) 橙色点箭头是小网络为大网络生成的参数矩阵。

说明

我们平常怎么保存一个模型?根据我的经验,以上图为例,一般人会将上图中 [ W 1 , W 2 , W 3 , . . . , W n ] [W_1, W_2, W_3, ...,W_n ] [W1,W2,W3,...,Wn]这些权重矩阵保存下来。于是有人就想这也太浪费空间了吧,我能否找个函数使得 [ z 1 , z 2 , z 3 , . . . , z n ] m a p p i n g [ W 1 , W 2 , W 3 , . . . , W n ] [z_1, z_2, z_3, ..., z_n] \quad mapping \quad [W_1, W_2, W_3, ...,W_n ] [z1,z2,z3,...,zn]mapping[W1,W2,W3,...,Wn]. 这里 z z z的维度远小于 W W W, 这种做法我只需要保存 z z z m a p p i n g mapping mapping函数就行了,这样就可以节省空间了!


方法

作者将HyperNetworks 分为动态的静态的两种模式


静态 HyperNetworks

论文中, 作者拿卷积神经网络(CNN)作为main Network
我们假设每个卷积层:
输入的channel为 N i n N_{in} Nin
卷积核size 为 f s i z e × f s i z e f_{size} × f_{size} fsize×fsize
输出的channel 为 N o u t N_{out} Nout
那么这一层的参数量为 N i n × f s i z e × f s i z e × N o u t N_{in} × f_{size} × f_{size} × N_{out} Nin×fsize×fsize×Nout,第 j j j层参数量记作 K j ∈ R N i n f s i z e × f s i z e N o u t , j ∈ 1 , . . . . , D K^j ∈ \mathbb{R}^{N_{in} f_{size} × f_{size} N_{out}} ,j ∈ {1, ...., D} KjRNinfsize×fsizeNoutj1,....,D这里 D D D为卷积的深度depth
然后,作者提出了一个生成器 g g g使得:
K j = g ( z j ) , ∀ j = 1 , . . . , D (1) K^j = g(z^j), \forall j = 1,..., D \tag{1} Kj=g(zj),j=1,...,D(1)
生成器 g g g是一个两层的线性网络,作者首先将 K j ∈ R N i n f s i z e × f s i z e N o u t K^j ∈ \mathbb{R}^{N_{in} f_{size} × f_{size} N_{out}} KjRNinfsize×fsizeNout拆分成 N i n N_{in} Nin个slices,
K j = c o n c a t i = 1 N i n ( K i j ) , K i j ∈ R f s i z e × f s i z e N o u t , i ∈ 1 , . . . . , N i n , j ∈ 1 , . . . . , D K^j = concat _{i=1} ^{N_{in}}(K^j _i), K^j _i∈ \mathbb{R}^{ f_{size} × f_{size} N_{out}}, i ∈ {1, ...., N_{in}},j ∈ {1, ...., D} Kj=concati=1Nin(Kij),KijRfsize×fsizeNout,i1,....,Nin,j1,....,D
生成器 g g g的公式:
论文笔记:HyperNetworks(arXiv版本)_第2张图片
这里, z j ∈ R N z , W i ∈ R d × N z z^j∈\mathbb R^{N_z}, W_i ∈\mathbb R^{d×N_z} zjRNz,WiRd×Nz, d d d为生成器 g g g的隐藏层的size; a i j ∈ R d , B i ∈ R d , W o u t ∈ R f s i z e × N o u t f s i z e × d , B o u t ∈ R f s i z e × N o u t f s i z e a_i ^j∈ \mathbb R^d,B_i ∈ \mathbb R^d, W_{out}∈ \mathbb R^{f_{size}×N_{out}f_{size}×d}, B_{out}∈ \mathbb R^{f_{size}×N_{out}f_{size}} aijRd,BiRd,WoutRfsize×Noutfsize×d,BoutRfsize×Noutfsize, 运算符<·>表示张量内积:

张量内积
通过这种方法参数分别是: z j : N z × D ; W i : d × N z × N i ; B j : d × N i ; W o u t : f s i z e × N o u t f s i z e × d ; B o u t : f s i z e × N o u t f s i z e z^j: N_z \times D;\quad W_i: d \times N_z \times N_i; \quad B_j: d \times N_i; \quad W_{out}: f_{size}×N_{out}f_{size} × d; \quad B_{out}: f_{size}×N_{out}f_{size} zj:Nz×DWi:d×Nz×Ni;Bj:d×Ni;Wout:fsize×Noutfsize×d;Bout:fsize×Noutfsize
总共 N z × D + d × ( N z + 1 ) × N i + f s i z e × N o u t × f s i z e × ( d + 1 ) N_z \times D + d \times (N_z +1) \times N_i + f_{size}×N_{out}× f_{size} × (d+1) Nz×D+d×(Nz+1)×Ni+fsize×Nout×fsize×(d+1)
不使用HyperNetwork原参数共 D × N i n × f s i z e × N o u t × f s i z e D × N_{in}×f_{size}×N_{out}×f_{size} D×Nin×fsize×Nout×fsize,相比之下,使用HyperNetworks的参数大大减少了


动态 HyperNetworks

作者这里拿(如下图)大RNN(黑色)来作为main network,小RNN作为HyperNetworkRNN(橙色),这里为啥叫动态呢? 是因为RNN时序的,其参数会随时间变化。
论文笔记:HyperNetworks(arXiv版本)_第3张图片
我们知道标准的RNN公式: h t = ϕ ( W h h t − 1 + W x x t + b ) h_t = \phi(W_h h_{t-1} + W_x x_t +b) ht=ϕ(Whht1+Wxxt+b), 这里共有三个参数 W h , W x , b W_h, W_x, b Wh,Wx,b 需要HyperNetwork按时序生成,这就是作者为啥也用时序网络(较小的RNN)作为HyperNetwork的原因,跟静态HyperNetwork一样,作者也用生成器(线性层)生成三个参数 W h , W x , b W_h, W_x, b Wh,Wx,b, 这里生成器分别用 W h ( z h ) , W x ( z x ) , b ( z b ) W_h(z_h), W_x(z_x),b(z_b) Wh(zh),Wx(zx)b(zb)表示,这里 z h , z x , z b z_h,z_x,z_b zh,zx,zb表示时序条件(这里你可以认为生成器是一种条件GAN,或者也可以叫做解码器)。所以main RNN 的公式可以改写成:
h t = ϕ ( W h ( z h ) h t − 1 + W x ( z x ) x t + b ( z b ) ) W h ( z h ) = < W h z , z h > W x ( z x ) = < W x z , z x > b ( z b ) = W b z z b + b 0 (2) h_t = \phi(W_h(z_h) h_{t-1} + W_x(z_x) x_t +b(z_b)) \\ W_h(z_h) = \\ W_x(z_x) = \\ b(z_b) = W_{bz}z_b + b_0 \tag{2} ht=ϕ(Wh(zh)ht1+Wx(zx)xt+b(zb))Wh(zh)=<Whz,zh>Wx(zx)=<Wxz,zx>b(zb)=Wbzzb+b0(2)
这里 W h z ∈ R N h × N h × N z , W x z ∈ R N h × N x × N z , W b z ∈ R N h × N z , b 0 ∈ R N h W_{hz} \in \mathbb R^{N_h \times N_h \times N_z}, W_{xz} \in \mathbb R^{N_h \times N_x \times N_z}, W_{bz} \in \mathbb R^{ N_h \times N_z}, b_0 \in \mathbb R^{N_h} WhzRNh×Nh×Nz,WxzRNh×Nx×Nz,WbzRNh×Nz,b0RNh, 运算符 <·> 表示张量内积(多维矩阵的乘法)。
为了进一步降低存储,条件 z h , z x , z b z_h,z_x,z_b zh,zx,zb也用线性生成器生成(对应上图的橙色的部分):
论文笔记:HyperNetworks(arXiv版本)_第4张图片
貌似终于大功告成了!欸,等会。。 这种方法保存的线性层的权重矩阵也太多了吧!所以作者就想在
标准的RNN公式: h t = ϕ ( W h h t − 1 + W x x t + b ) h_t = \phi(W_h h_{t-1} + W_x x_t +b) ht=ϕ(Whht1+Wxxt+b)上对权重的放缩,而不是完全替换,比如说像这样 W h n e w = d h ( z h ) ⊙ W h o l d , W x n e w = d h ( z x ) ⊙ W x o l d W_h ^{new} = d_h(z_h) \odot W_h ^{old}, W_x ^{new} = d_h(z_x) \odot W_x ^{old} Whnew=dh(zh)WholdWxnew=dh(zx)Wxold, 这里 ⊙ \odot 表示按位乘法:
论文笔记:HyperNetworks(arXiv版本)_第5张图片
这种做法是在原有的参数矩阵上进行缩放,大大降低储存量(我只要储存 W o l d W^{old} Wold和一组缩放向量 d d d即可),提高了内存效率,最后内存高效率版本可以写做:
(疑惑:这与之前的方法相比,必定损失一定精度)
论文笔记:HyperNetworks(arXiv版本)_第6张图片
太好了终于结束了!


你可能感兴趣的:(深度学习,计算机视觉,神经网络)