2

現在、単純なオートエンコーダーを使用していくつかのテストを実行しています。私は自分で Autoencoder を完全に Tensorflow で作成し、さらにこの keras ブログ エントリからコードをコピーして貼り付けました: https://blog.keras.io/building-autoencoders-in-keras.html (別の Autoencoder 実装を使用するため) .

さまざまなアーキテクチャをテストしていたとき、単一のレイヤーと、このレイヤー内のいくつかの非表示ユニットから始めました。隠しユニットの数を 1 つ (!) だけに減らしても、より大きなアーキテクチャ (最大数千の隠しユニット) で得られるのと同じトレーニングとテストの損失が発生することに気付きました。私のデータでは、最悪の損失は 0.5 です。私が試したアーキテクチャはどれも ~ 0.15 です。

好奇心から、唯一存在する隠しレイヤーの隠しユニットの数をゼロに減らしました (これは意味がありません)。ただし、トレーニングとテストの損失は 0.15 です。この奇妙な動作は、デコード層のバイアスが原因である可能性があると想定しました(入力を再構築するとき)。最初に、バイアス変数 (TF 内) を trainable=True に設定しました。したがって、隠れユニットがなくても、モデルはデコード層のバイアスを学習し、損失が 0.5 から 0.15 に減少する可能性があると思います。

次のステップでは、デコード レイヤーのバイアスを trainable=False に設定します。これで、モデル (隠れユニットなし) は、予想どおり、何も学習しません (損失 = 0.5)。しかし、隠しユニットが 1 つあると、テストとトレーニングで約 0.15 の損失が発生します。

この考え方に従って、アーキテクチャがバイアスのみを学習することを避けたかったので、エンコーディング レイヤーのバイアスを trainable=False に設定しました。これで、オートエンコーダーの重みのみがトレーニング可能になりました。これは、単一の非表示ユニット (もちろん、単一の非表示レイヤーのみ) に対しても機能します。驚くべきことに、これは単層ネットワークの場合にのみ機能します。レイヤーの数を増やすとすぐに (隠れユニットの数とは関係なく)、ネットワークは再び何も学習しません (重みのみが更新される場合)。

私が報告したことはすべて、トレーニングの損失だけでなく、テストの損失にも当てはまります (完全に独立したデータセットで、マシンには表示されません)。これにより、私はさらに興味をそそられます。

私の質問は次のとおりです: 1 つのノードの「ネットワーク」から、より大きなネットワークからと同じくらい多くのことを (トレーニングとテストの両方で) 学習するにはどうすればよいでしょうか? 第 2 に、より大きなネットでもオーバーフィットしないように見えるのはどうしてでしょうか (トレーニング エラーとテスト エラーはわずかに変化しますが、常に比較可能です)。どんな提案もとても役に立ちます!どうもありがとう!ニルス

4

0 に答える 0