据我所知,通常自编码器在编码和解码网络中使用绑定的权重,对吗?
我查看了Caffe的自编码器示例,但我没有看到权重是如何绑定的。我注意到编码和解码网络共享相同的blob,但如何保证权重被正确更新呢?
如何在Caffe中实现权重绑定的自编码器?
回答:
虽然自编码器中使用权重绑定有历史,但如今很少使用(据我所知),我认为这就是为什么这个Caffe示例不使用权重绑定的原因。
尽管如此,Caffe确实支持使用权重绑定的自编码器,并且可以通过两个功能实现:层之间的参数共享和全连接层(Caffe中的InnerProduct)的转置标志。更具体地说,如果两个参数的名称相同,则在Caffe中它们会被共享,可以在param字段下这样指定:
layer { name: "encode1" type: "InnerProduct" bottom: "data" top: "encode1" param { name: "encode1_matrix" lr_mult: 1 decay_mult: 1 } param { name: "encode1_bias" lr_mult: 1 decay_mult: 0 } inner_product_param { num_output: 128 weight_filler { type: "gaussian" std: 1 sparse: 15 } bias_filler { type: "constant" value: 0 } }}
如果另一个全连接层(具有匹配的维度)使用名称“encode1_matrix”和“encode1_bias”,那么这些参数将始终相同,Caffe将负责聚合梯度并正确更新参数。第二部分是使用全连接层的转置标志,以便在乘以其输入之前共享矩阵被转置。因此,扩展上述示例,如果我们希望在解码过程中有一个与“encode1_matrix”具有相同权重矩阵的全连接层,那么我们将这样定义它:
layer { name: "decode1" type: "InnerProduct" bottom: "encode1" top: "decode1" param { name: "encode1_matrix" lr_mult: 1 decay_mult: 1 } param { name: "decode1_bias" lr_mult: 1 decay_mult: 0 } inner_product_param { num_output: 784 transpose: true weight_filler { type: "gaussian" std: 1 sparse: 15 } bias_filler { type: "constant" value: 0 } }}
请注意,偏置参数未共享(由于输出维度不同而无法共享),而矩阵是共享的,并且解码层使用转置标志,这完成了绑定的自编码器架构。
在这里查看使用Caffe实现的绑定自编码器的完整工作示例:https://gist.github.com/orsharir/beb479d9ad5d8e389800c47c9ec42840