在theano中实现饱和自动编码器

时间:2015-03-20 10:37:20

标签: theano autoencoder

我正在尝试使用本文所述的正则化方法实现自动编码器:"Saturating Auto-Encoders", Goroshin et. al., 2013

基本上,这会尝试最小化隐藏层的输出与用于计算隐藏层输出的非线性函数的平坦部分之间的差异。

假设我们使用阶跃函数作为非线性,步长为0.5,可能是一个简单的实现:

for i in range(len(y)):
    if y[i] < 0.5:
        y_prime[i] = 0
    else:
        y_prime[i] = 1

然后,正规化成本可以简单:

(numpy.abs(y-y_prime).sum()

我正在尝试在Theano中实现此功能。已经开始使用Theano网站上提供的denoising autoencoder code。对它做了一些基本的修改:

def get_cost_updates(self, learning_rate, L1_reg):
    # I do not want to add noise as of now, hence no input corruption.
    # Directly compute the hidden layer values.
    y = self.get_hidden_values(self.x)
    z = self.get_reconstructed_input(y)

    # Also, the original code computes the cross entropy loss function.
    # I want to use the quadratic loss as my inputs are real valued, not
    # binary. Further, I have added an L1 regularization term to the hidden
    # layer values.

    L = 0.5*T.sum((self.x-z)**2, axis=1) + L1_reg*(abs(y).sum())
    ... # Rest of it is same as original.

上面的损失函数对隐藏层输出施加了L1惩罚,这应该(希望)将它们中的大部分驱动为0.代替这个简单的L1惩罚,我想使用上面给出的饱和惩罚。

知道怎么做吗?我在哪里计算y_prime?如何象征性地做到这一点?

我是Theano的新手,并且仍在追赶符号计算部分。

1 个答案:

答案 0 :(得分:0)

在编码期间,即在计算隐藏值期间,应用纸张中的非线性。因此,根据您的代码示例,它们应该应用于get_hidden_values()函数内部(不在get_cost_updates()函数中)。它们应该是get_hidden_values()在返回之前所做的最后一段处理。

另外,请勿在符号表达式中使用numpy.abs,因为这需要numpy进行计算。相反,你希望Theano这样做,所以只需使用abs,我认为它应该可以根据需要运作。