论文笔记:HyperNetworks ICLR_2017(arXiv版本)
*
– 这篇博客是啥?
– 论文地址
– 基本思想
–
+ 说明
– 方法
–
+ 静态 HyperNetworks
+ 动态 HyperNetworks
这篇博客是啥?
这篇博文是有关HyperNetworks arXiv版本的笔记,为啥选择arXiv版本呢,因为ICLR官方编辑版本有许多删减,致使我有一部分公式看不懂😭(可能是因为我个人才疏学浅吧)。 这篇博文主要是讲HyperNetworks的方法,不会对实验进行介绍。
论文地址
arXiv版本: HyperNetworks arXiv
ICLR版本:HyperNetworks ICLR_2017
基本思想
HyperNetworks 的基本思想是想用一个 小网络(HyperNetworks) 为 大网络(main Networks) 生成参数, 如下图
在上图中, 橙色的方块是 小网络(HyperNetworks) , 黑色的是 大网络(main Networks) 橙色点箭头是小网络为大网络生成的参数矩阵。
; 说明
我们平常怎么保存一个模型?根据我的经验,以上图为例,一般人会将上图中[ W 1 , W 2 , W 3 , . . . , W n ] [W_1, W_2, W_3, …,W_n ][W 1 ,W 2 ,W 3 ,…,W n ]这些权重矩阵保存下来。于是有人就想这也太浪费空间了吧,我能否找个函数使得[ 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 ][z 1 ,z 2 ,z 3 ,…,z n ]m a p p i n g [W 1 ,W 2 ,W 3 ,…,W n ]. 这里z z z的维度远小于W W W, 这种做法我只需要保存z z z和m a p p i n g mapping m a p p i n g函数就行了,这样就可以节省空间了!
方法
作者将 HyperNetworks 分为动态的静态的两种模式
静态 HyperNetworks
论文中, 作者拿卷积神经网络(CNN)作为 main Network。
我们假设每个卷积层:
输入的channel为N i n N_{in}N i n ;
卷积核size 为f s i z e × f s i z e f_{size} × f_{size}f s i z e ×f s i z e ;
输出的channel 为N o u t N_{out}N o u t
那么这一层的参数量为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}N i n ×f s i z e ×f s i z e ×N o u t ,第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}K j ∈R N i n f s i z e ×f s i z e N o u t ,j ∈1 ,….,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}K j =g (z j ),∀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}}K j ∈R N i n f s i z e ×f s i z e N o u t 拆分成N i n N_{in}N i n 个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}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
生成器g g g的公式:
这里,z j ∈ R N z , W i ∈ R d × N z z^j∈\mathbb R^{N_z}, W_i ∈\mathbb R^{d×N_z}z j ∈R N z ,W i ∈R d ×N z , 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}}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 , 运算符
通过这种方法参数分别是: 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}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
总共 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)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 )
不使用 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 ×N i n ×f s i z e ×N o u t ×f s i z e ,相比之下,使用HyperNetworks的参数大大减少了
; 动态 HyperNetworks
作者这里拿(如下图)大RNN(黑色)来作为 main network,小RNN作为 HyperNetworkRNN(橙色),这里为啥叫动态呢? 是因为RNN时序的,其参数会随时间变化。
我们知道标准的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)h t =ϕ(W h h t −1 +W x x t +b ), 这里共有三个参数W h , W x , b W_h, W_x, b W h ,W x ,b 需要HyperNetwork 按时序生成,这就是作者为啥也用时序网络(较小的RNN)作为HyperNetwork的原因,跟静态HyperNetwork一样,作者也用生成器(线性层)生成三个参数W h , W x , b W_h, W_x, b W h ,W x ,b, 这里生成器分别用W h ( z h ) , W x ( z x ) , b ( z b ) W_h(z_h), W_x(z_x),b(z_b)W h (z h ),W x (z x ),b (z b )表示,这里z h , z x , z b z_h,z_x,z_b z h ,z x ,z b 表示时序条件(这里你可以认为生成器是一种条件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) = 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 ∈ 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}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 , 运算符 表示张量内积(多维矩阵的乘法)。
为了进一步降低存储,条件z h , z x , z b z_h,z_x,z_b z h ,z x ,z b 也用线性生成器生成(对应上图的橙色的部分):
貌似终于大功告成了!欸,等会。。 这种方法保存的 线性层的权重矩阵也太多了吧!所以作者就想在
标准的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)h t =ϕ(W h h t −1 +W x x t +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}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 , 这里⊙ \odot ⊙表示按位乘法:
这种做法是在原有的参数矩阵上进行缩放,大大降低储存量(我只要储存W o l d W^{old}W o l d和一组缩放向量d d d即可),提高了内存效率,最后内存高效率版本可以写做:
(疑惑:这与之前的方法相比,必定损失一定精度)
太好了终于结束了!
Original: https://blog.csdn.net/weixin_45775432/article/details/125261372
Author: 星光点点wwx
Title: 论文笔记:HyperNetworks(arXiv版本)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/688628/
转载文章受原作者版权保护。转载请注明原作者出处!