2015-03-20 5 views
0

Я пытаюсь реализовать автоассоциатор, используя метод регуляризации, описанный в этой статье: "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? Как это сделать символически?

Я новичок в Теано и до сих пор догоняю символическую часть вычисления.

+0

Я не думаю, что эта функция является хорошим выбором. Глядя на статью, они используют нелинейности, которые (а) непрерывны (б) имеют градиент в некоторых точках. Ваша функция шага по существу всегда будет давать градиент нуля, поэтому это будет очень плохой выбор для процедуры спуска градиента. –

ответ

0

Нелинейности в документе применяются во время кодирования, то есть при вычислении скрытых значений. Поэтому, учитывая ваш пример кода, они должны применяться внутри функции get_hidden_values() (НЕ в функции get_cost_updates()). Они должны быть последней частью обработки, которую get_hidden_values() делает до возвращения.

Кроме того, не используйте numpy.abs в своем символическом выражении, потому что это требует, чтобы numpy выполнял расчет. Вместо этого вы хотите, чтобы Theano сделал это, поэтому просто используйте abs, и я думаю, что он должен работать по мере необходимости.

 Смежные вопросы

  • Нет связанных вопросов^_^