我正在尝试使用本文中描述的正则化方法来实现自动编码器:“饱和自动编码器”,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 的新手,还在赶上符号计算部分。