Applied Deep Learning-Part3:Autoencoders

Applied Deep Learningシリーズのパート3へようこそ。 第1部は、人工ニューラルネットワークの実践的な紹介であり、理論とアプリケーションの両方をカバーし、多くのコード例と視覚化をカバーしました。 第2部では、実世界のデータセットにディープラーニングを適用し、ケーススタディとして最も一般的に遭遇する3つの問題をカバーしました。

ここでは、最も単純なAutoencodersから始めて、特定のディープラーニングアーキテクチャに飛び込むことから始めます。

  1. はじめに
  2. アーキテクチャ
  3. 実装
  4. 自動エンコーダーのノイズ除去
  5. スパース自動エンコーダー
  6. ユースケース
  7. 結論

この記事のコードは、Jupyter Notebookとしてここで入手できます。

はじめに

オートエンコーダーは、入力が出力と同じフィードフォワードニューラルネットワークの特定のタイプです。 入力を低次元コードに圧縮し、この表現からの出力を再構築します。 このコードは、入力のコンパクトな「要約」または「圧縮」であり、潜在空間表現とも呼ばれます。

オートエンコーダは、エンコーダ、コード、デコーダの3つのコンポーネントで構成されます。 エンコーダは入力を圧縮してコードを生成し、デコーダはこのコードのみを使用して入力を再構築します。

オートエンコーダを構築するには、エンコーディング方法、デコード方法、および出力をターゲットと比較する損失関数の3つが必要です。 私たちは、次のセクションでこれらを探求します。

オートエンコーダーは、主にいくつかの重要な特性を持つ次元削減(または圧縮)アルゴリズムです:

  • データ固有:オートエンコーダーは、訓練されたものと同様のデータのみを意味的に圧縮することができます。 彼らは与えられたトレーニングデータに固有の機能を学習するので、gzipのような標準的なデータ圧縮アルゴリズムとは異なります。 そのため、手書きの数字で訓練された自動エンコーダーが風景写真を圧縮することは期待できません。
  • : Autoencoderの出力は入力とまったく同じではなく、近いが劣化した表現になります。 可逆圧縮が必要な場合は、それらは行く方法ではありません。
  • 教師なし:オートエンコーダーを訓練するために、私たちは空想何もする必要はありません、ちょうどそれに生の入力データをスローします。 Autoencodersは、訓練するために明示的なラベルを必要としないため、教師なし学習技術とみなされます。 しかし、より正確には、彼らは訓練データから独自のラベルを生成するので、彼らは自己監督されています。

アーキテクチャ

エンコーダ、コード、デコーダの詳細を見てみましょう。 エンコーダとデコーダの両方が完全に接続されたフィードフォワードニューラルネットワークであり、基本的には第1回で説明したAnnです。 コードは、私たちが選択した次元を持つANNの単一の層です。 コードレイヤー内のノードの数(コードサイズ)は、オートエンコーダーをトレーニングする前に設定したハイパーパラメータです。

これは、オートエンコーダーのより詳細な視覚化です。 最初に、入力は完全に接続されたANNであるエンコーダを通過してコードを生成します。 同様のANN構造を持つデコーダは、コードのみを使用して出力を生成します。 目標は、入力と同じ出力を取得することです。 デコーダのアーキテクチャは、エンコーダのミラーイメージであることに注意してください。 これは要件ではありませんが、通常はそうです。 唯一の要件は、入力と出力の次元が同じである必要があることです。 真ん中のものは何でも遊ぶことができます。

オートエンコーダーをトレーニングする前に設定する必要がある4つのハイパーパラメータがあります:

  • コードサイズ:中間層のノード数。 サイズを小さくすると、より多くの圧縮が得られます。
  • レイヤーの数:オートエンコーダーは好きなだけ深くすることができます。 上の図では、入力と出力を考慮せずに、エンコーダとデコーダの両方に2つの層があります。
  • レイヤーごとのノードの数:私たちが取り組んでいるautoencoderアーキテクチャは、レイヤーが次々に積み重ねられているので、積み重ねられたautoencoderと呼ばれています。 通常、スタックされたautoencodersは”sandwitch”のように見えます。 レイヤあたりのノード数は、エンコーダの後続のレイヤごとに減少し、デコーダ内で増加します。 また,復号器は層構造の点で符号器と対称である。 上記のように、これは必要ではなく、これらのパラメータを完全に制御しています。
  • 損失関数:平均二乗誤差(mse)またはバイナリクロスエントロピーを使用します。 入力値が範囲内にある場合、通常はクロスエントロピーを使用し、そうでない場合は平均二乗誤差を使用します。 詳細については、このビデオをチェックしてくださ

オートエンコーダーは、逆伝播を介してAnnと同じ方法で学習されます。 ニューラルネットワークがどのように訓練されているかの詳細については、パート1の導入をチェックしてください。

実装

次は、次のアーキテクチャのための自動エンコーダーを実装しましょう。

私たちは、入力として非常に人気のあるMNISTデータセットを使用します。 これは、手書きの数字の白黒画像が含まれています。

それらはサイズ28×28であり、それらを間の784個の数字のベクトルとして使用します。 詳細については、jupyter notebookを確認してください。

kerasでautoencoderを実装します。 ハイパーパラメータは、隠れ層の128ノード、コードサイズは32、バイナリクロスエントロピーは損失関数です。

これは私たちが取り組んだANNsと非常によく似ていますが、今はKeras functional APIを使用しています。 詳細については、このガイドを参照してくださいが、ここでは簡単な比較です。 Sequential APIを使用してレイヤーを追加する前は、次のようにしていました:

model.add(Dense(16, activation='relu'))
model.add(Dense(8, activation='relu'))

機能的なAPIを使用すると、これを行います:

layer_1 = Dense(16, activation='relu')(input)
layer_2 = Dense(8, activation='relu')(layer_1)

より冗長ですが、複雑なモデルを定義するためのより柔軟な方法です。 私たちは簡単に私たちのモデルの一部、例えばデコーダだけをつかむことができ、それを扱うことができます。 Denseメソッドの出力は呼び出し可能な層であり、機能的なAPIを使用して入力を提供し、出力を保存します。 レイヤーの出力は、次のレイヤーの入力になります。 シーケンシャルAPIでは、addメソッドが暗黙的にこれを処理しました。

すべての層は深いニューラルネットワークの標準であるため、relu活性化関数を使用していることに注意してください。 最後の層は、出力が間にある必要があるため、シグモイド活性化を使用します。 入力も同じ範囲にあります。

また、Fit関数の呼び出しに注意してください。:

model.fit(x_train, y_train)

しかし、今、私たちは行います:

model.fit(x_train, x_train)

autoencoderのターゲットは入力と同じであることに注意してください。 そのため、トレーニングデータをターゲットとして提供します。

可視化

ここで、オートエンコーダーが入力を再構築する方法を視覚化しましょう。

kerasのpredict関数を使用するだけで、テストセットで自動エンコーダーを実行します。 テストセット内のすべての画像について、autoencoderの出力を取得します。 出力は入力と非常によく似ていると予想しています。

彼らは確かにかなり似ていますが、まったく同じではありません。 最後の桁”4″でより明確に気づくことができます。 これは簡単な作業だったので、私たちのautoencoderはかなりよく実行しました。

アドバイス

オートエンコーダーのアーキテクチャを完全に制御しています。 レイヤーの数、レイヤーごとのノード、そして最も重要なのはコードサイズを増やすことで、それを非常に強力にすることができます。 これらのハイパーパラメータを増やすと、オートエンコーダはより複雑な符号化を学習できます。 しかし、我々はそれがあまりにも強力にしないように注意する必要があります。 それ以外の場合、autoencoderは、意味のある表現を学習せずに、入力を出力にコピーすることを単に学習します。 それはちょうどidentity関数を模倣します。 Autoencoderはトレーニングデータを完全に再構築しますが、新しいインスタンスに一般化することができずに過剰適合しますが、これは私たちが望むものでは

これが、私たちが”sandwitch”アーキテクチャを好み、意図的にコードサイズを小さく保つ理由です。 符号化層は入力データよりも次元が低いため、オートエンコーダーはアンダーコンプリートと呼ばれます。 入力を出力に直接コピーすることはできず、インテリジェントな機能を強制的に学習させられます。 入力データにパターンがある場合、たとえば、数字”1″には通常やや直線が含まれ、数字”0″は円形である場合、この事実を学習し、よりコンパクトな形式でエンコード 入力データが内部相関や依存関係なしに完全にランダムであった場合、アンダーコンプリート自動エンコーダーはそれを完全に回復することはできません。 しかし、幸いなことに、現実の世界では多くの依存関係があります。

オートエンコーダーのノイズ除去

コード層を小さく保つと、オートエンコーダーはデータのインテリジェントな表現を学習するようになりました。 これは、入力にランダムノイズを追加し、元のノイズフリーデータを回復させることです。 このようにして、入力にはランダムノイズも含まれているため、自動エンコーダーは入力を出力に単純にコピーすることはできません。 私たちは、ノイズを減算し、基礎となる意味のあるデータを生成するように求めています。 これはノイズ除去オートエンコーダーと呼ばれます。

一番上の行には元の画像が含まれています。 ランダムなガウスノイズを追加し、ノイズの多いデータがオートエンコーダへの入力になります。 Autoencoderには元の画像はまったく表示されません。 しかし、その後、オートエンコーダはノイズのない元の画像を再生成することを期待しています。

自動エンコーダーのノイズ除去の実装と通常の実装との間には、わずかな違いが1つしかありません。 アーキテクチャはまったく変更されず、fit関数のみが変更されます。 通常のautoencoderを次のように訓練しました:

autoencoder.fit(x_train, x_train)

自動エンコーダーのノイズ除去は、次のように訓練されます:

autoencoder.fit(x_train_noisy, x_train)

それと同じように単純な、他のすべてはまったく同じです。 オートエンコーダーへの入力はノイズの多いイメージで、期待されるターゲットは元のノイズのないイメージです。

可視化

ここで、ノイズのない画像を回復できるかどうかを可視化しましょう。

かなり良さそうだ 一番下の行はautoencoderの出力です。 畳み込み自動エンコーダーなど、より複雑な自動エンコーダーアーキテクチャを使用することで、より効果的に実行できます。 次の記事で畳み込みについて説明します。

スパースオートエンコーダー

オートエンコーダーに便利な機能を強制的に学習させる2つの方法を導入しました。 第三の方法は、正則化を使用しています。 ノードの一部だけがアクティブノードと呼ばれるゼロ以外の値を持つように、スパース性制約を使用してオートエンコーダーを正規化できます。

特に、損失関数にペナルティ項を追加して、ノードの一部のみがアクティブになるようにします。 これにより、autoencoderは各入力を少数のノードの組み合わせとして表現し、データ内の興味深い構造を検出するように要求します。 このメソッドは、ノードの小さなサブセットのみがいつでもアクティブになるため、コードサイズが大きい場合でも機能します。

kerasでこれを行うのは非常に簡単です。 メモとして、以前は次のようにコードレイヤーを作成しました:

code = Dense(code_size, activation='relu')(input_img)

正則化強度を指定して、activity_regularizerという別のパラメータを追加します。 これは通常、範囲内の値です。 ここでは10e-6を選択しました。

code = Dense(code_size, activation='relu', activity_regularizer=l1(10e-6))(input_img)

スパースモデルの最終的な損失は、正則化項が追加されたため、標準モデルよりも0.01高くなります。

正則化されたモデルによって生成されたエンコーディングが実際にスパースであることを示しましょう。 テストセット内の画像のコード値のヒストグラムを見ると、分布は次のようになります:

標準モデルの平均は6.6ですが、正則化モデルの場合は0.8で、かなり大きな減少です。 正則化されたモデルのコード値の大きな塊が実際には0であることがわかります。 正則化されたモデルの分散もかなり低いです。

ユースケース

ここで、次の質問をするかもしれません。 Autoencodersは入力を圧縮するのにどれくらい良いですか? そして、彼らは一般的に使用される深い学習技術ですか?

残念ながら、自動エンコーダーは現実世界のアプリケーションでは広く使用されていません。 圧縮方法として、彼らはその代替よりも優れて実行しない、例えばjpegはオートエンコーダーよりも優れた写真の圧縮を行います。 そして、autoencodersがデータ固有であるという事実は、一般的な技術としては実用的ではありません。 彼らはしかし、3つの一般的なユースケースを持っています:

  • データノイズ除去:私たちは、画像上でこの例を見てきました。
  • 次元削減:高次元データの可視化は困難です。 t-SNEは最も一般的に使用される方法ですが、多数の寸法(通常は32以上)で苦労します。 そのため、自動エンコーダーは次元を減らすための前処理ステップとして使用され、この圧縮された表現はt-SNEによって2D空間内のデータを視覚化するた T-SNE上の偉大な記事については、こことここを参照してください。
  • Variational Autoencoders(VAE):これはautoencodersのより現代的で複雑なユースケースであり、別の記事でそれらをカバーします。 しかし、簡単に要約すると、vaeは、バニラの自動エンコーダーの場合に任意の関数を学習するのではなく、入力データをモデル化する確率分布のパラメータを学 この分布から点をサンプリングすることにより、VAEを生成モデルとして使用することもできます。 ここに良い参考文献があります。

結論

オートエンコーダーは非常に有用な次元削減技術です。 彼らは、そのシンプルさのために最も可能性の高い、入門深い学習コースの教材として非常に人気があります。 この記事では、我々は詳細にそれらをカバーし、私はあなたがそれを楽しんで願っています。

この記事のコード全体は、自分でハックしたい場合はここで入手できます。 あなたが任意のフィードバックを持っている場合は、twitterで私に手を差し伸べること自由に感じ

コメントを残す

メールアドレスが公開されることはありません。

Previous post New England Diary
Next post 外食時の転倒へのグローバルガイド