在AutoEncoder中使用tied weight的训练方法

1:在传统的AutoEncoder中我们知道,输入层到隐层有一个权重W1和bias b1,隐藏到输出层也有一个权重W2和截距项b2,此时我们也知道W1和W2的转置的型是同样大小的。但是在传统的AutoEncoder中我们对于W1和W2是单独训练的。

2:在tied weight中也就是W1和W2是tied的,此时让W2的转置等于W1,也就是两个W其实是一样的,那么我们怎么做?因为如果初始化的时候让W2的转置等于W1,那么经过一次梯度下降由于W2上的grad和W1上的不一样,所以梯度下降一次之后,他们就不一样了怎么办呢?

3:网上找了很多,其实真正的做法并没有找到。后来翻看了别人的代码,发现了做法是这样子的:

4:初始化让W2的转置等于W1,第一次求梯度的时候,对于W2的梯度记到,暂时保存,比如用W2grad,接着计算W1的梯度,用W1grad来表示,那么返回的时候我们这样来返回,让W1grad+W2grad',作为W1的梯度,那么出去的时候就是和W1同型的了,在函数内部进行cost计算的时候还是根据W1,自动扩展一个W2即可。。


5:我觉得在第四部中也可以直接返回W1grad即可。。此时还是有b1和b2的哈。。

你可能感兴趣的:(在AutoEncoder中使用tied weight的训练方法)