この論文で説明されている正則化方法を使用して、オートエンコーダーを実装しようとしています: "Saturating Auto-Encoders", Goroshin et. 他、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 Web サイトで入手できるノイズ除去オートエンコーダ コードから始めました。それにいくつかの基本的な変更を加えました:
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の初心者で、まだシンボリック計算の部分に追いついています。