0

我正在尝试使用本文中描述的正则化方法来实现自动编码器:“饱和自动编码器”,Goroshin 等。等,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 网站上提供的去噪自动编码器代码开始。对其进行了一些基本的修改:

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 的新手,还在赶上符号计算部分。

4

1 回答 1

0

论文中的非线性是在编码过程中应用的,即在计算隐藏值的过程中。因此,给定您的代码示例,它们应该应用在get_hidden_values()函数内部(而不是在get_cost_updates()函数中)。get_hidden_values()它们应该是返回之前进行的最后处理。

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

于 2015-04-30T09:44:46.570 回答