Я пытаюсь реализовать автоассоциатор, используя метод регуляризации, описанный в этой статье: "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. Начните с denoising autoencoder code, доступных на сайте 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? Как это сделать символически?
Я новичок в Теано и до сих пор догоняю символическую часть вычисления.
Я не думаю, что эта функция является хорошим выбором. Глядя на статью, они используют нелинейности, которые (а) непрерывны (б) имеют градиент в некоторых точках. Ваша функция шага по существу всегда будет давать градиент нуля, поэтому это будет очень плохой выбор для процедуры спуска градиента. –