0

この論文で説明されている正則化方法を使用して、オートエンコーダーを実装しようとしています: "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の初心者で、まだシンボリック計算の部分に追いついています。

4

1 に答える 1

0

論文の非線形性は、コーディング中、つまり隠れた値の計算中に適用されます。したがって、コード例を考えると、それらは関数内に適用する必要がありget_hidden_values()ます(関数内ではありませんget_cost_updates())。get_hidden_values()それらは、戻る前に行う最後の処理である必要があります。

numpy.absまた、 numpy が計算を行う必要があるため、シンボリック式では使用しないでください。代わりに、Theano にそれを実行してもらいたいので、使用するだけで、abs必要に応じて機能するはずです。

于 2015-04-30T09:44:46.570 に答える