オートエンコーダ(自己符号化器)とは

オートエンコーダ(自己符号化器, autoencoder)とは、ニューラルネットワークを利用した教師なし機械学習の手法の一つです。次元削減や特徴抽出を目的に登場しましたが、近年では生成モデルとしても用いられています。

単純なオートエンコーダは、下図のように表すことができます。

オートエンコーダのネットワーク構造

図の左側からデータを入力、右側に出力という流れを示しています。図中の円形部分をノード、矢印をエッジと呼びます。ノードに入力された数値は各エッジにおいて固有の重みで重み付けれたのち、次の層のノードに入力されます。各ノードには複数のエッジから入力があり、それらの和が最終的なノードの入力値となります。

オートエンコーダの学習は、入力データと一致するデータを出力することを目的とする教師なし学習です(後述のように教師あり学習とすることもできます)。オートエンコーダのネットワークは、入力したデータの次元数をいったん下げ、再び戻して出力するという構造になっています。このため、入力から出力への単なるコピーは不可能です。オートエンコーダの学習過程では、入出力が一致するように各エッジの重みを調整していきます。この学習を通して、データの中から復元のために必要となる重要な情報だけを抽出し、それらから効率的に元のデータを生成するネットワークが形成されます。こうしてオートエンコーダの前半部分は次元削減、特徴抽出の機能を獲得し、後半部分は低次元の情報をソースとするデータ生成機能を獲得します。前半部分をエンコーダ、後半部分をデコーダと呼びます。

学習後、この2つのネットワークは別々に使うことができます。すなわち、エンコーダは特徴抽出器、デコーダは生成器として独立に用いることができます。

オートエンコーダの種類

オートエンコーダは先に紹介した基本構造を出発点として、様々に派生、進化しています。ここでは、様々なオートエンコーダの中から、下記の4種類を紹介します。

  • 積層オートエンコーダ
  • 畳み込みオートエンコーダ
  • 変分オートエンコーダ
  • 条件付き変分オートエンコーダ

積層オートエンコーダ:Stacked Autoencoder

積層オートエンコーダは、始めに示したシンプルなオートエンコーダのエンコーダおよびデコーダ部分を多層化した構造となります。入力データはエンコーダにおいて段階的に次元を減らし、デコーダで復元されます。エンコーダおよびデコーダを多層化することで、より複雑で高度な特徴量抽出を狙っています。

当初このような深いニューラルネットは、勾配消失という問題によってうまく学習することができませんでした。これは、層を深くしていくと前半の層で勾配がほとんどゼロになってしまい学習が進まなくなる、という問題です。これを解決するために、積層オートエンコーダは、ニューラルネットの各層における学習を一層ずつ行って、最後にすべて積み重ねる、という手順で構築します。下の図ですと、入力層以降の3層の学習のうち、まず初めに1層目(青)部分のみ考えます。入力データセットを復元するように1層目の学習を行った後、得られた重みを固定値として使って次の層である2層目の学習を行います。これを繰り返して、3層目までの重みを得ることができます (事前学習)。最後に1層目から3層目をすべて繋げて元々のネットワークを構築し、得られた重みを初期値として設定したのち、全体の学習を通して重みを微調整(ファインチューニング)します。

積層オートエンコーダの学習の仕組み

このように1層ずつの学習とすることで初期値が最適解に近き、適切な学習が可能となります。他にも、ノードを減らしていくというオートエンコーダのネットワーク構造自体が、ディープニューラルネットワークのもう一つの課題であった過学習の抑止に繋がるというメリットがあります。

しかし、その後の技術の発達により、ディープニューラルネットワークは事前学習無しでも適切な学習が可能となり、積層オートエンコーダをこのような事前学習に用いることはほぼなくなっています。

畳み込みオートエンコーダ:Convolutional Autoencoder (CAE)

畳み込みオートエンコーダは、エンコーダ、デコーダ部分に全結合層ではなく畳み込み層を使ったネットワーク構造になっています。畳み込み層により空間的に意味のある特徴(エッジやテクスチャなど)を抽出できるため、画像に対して用いられます。

畳み込みオートエンコーダのネットワークの概念

変分オートエンコーダ:Variational Autoencoder (VAE)

変分オートエンコーダは、生成モデルとして有名です。通常のオートエンコーダとの大きな違いとして、入力データを圧縮して得られる特徴ベクトル(潜在変数)を確率変数として表します。一般的にはN次元の潜在変数が、N次元正規分布に従うように学習します。これまでに紹介したオートエンコーダでは、次元削減後の特徴ベクトルには特に制約はありませんでした。そのため、特徴空間上でデータがどのように表現されているかはわかりません。しかし、VAEでは、ここに正規分布という制約を設けることでデータの潜在空間上での分布に連続性が生じ、似た潜在変数からは似たデータが生成されるようになります。

ネットワークは下の図のような概念で表されます。エンコーダの出力として平均と標準偏差を推定し、それらで表される正規分布からランダムサンプリングによりデコーダに入力する潜在変数を決めます(図の中央上側のパス)。しかし、このランダムサンプリングという操作は微分不能という問題があります。誤差逆伝搬(バックプロパゲーション)し、ネットワークを学習させるためには、各ノードをつなぐエッジが微分可能な演算でなければいけません。そこでReparameterization trickという方法を用います。標準正規分布からランダムにサンプリングして得る確率変数εを導入し、これを用いて  として潜在変数 を決定します。このようにすることで と は微分可能なエッジで繋がり、バックプロパゲーションが可能となります。

変分オートエンコーダのネットワーク概念

条件付き変分オートエンコーダ:Conditional Variational Autoencoder (CVAE)

条件付き変分オートエンコーダは、変分オートエンコーダを拡張したもので、指定したクラスのデータを生成できるようになっています。変分オートエンコーダでは、デコーダによるデータ生成の際、潜在変数を指定することはできますが、出力データのクラスを直接指定できません。言い換えますと、潜在変数を変えると出力クラスも変わってしまう可能性があります。条件付き変分オートエンコーダは、出力クラスを指定したうえで、潜在変数も自由にコントロールすることができます。

下の図に条件付き変分オートエンコーダのネットワークの概略を示します。

条件付き変分オートエンコーダのネットワーク概念

変分オートエンコーダのネットワークと異なる点は、エンコーダ、デコーダともにラベル情報を入力していることです。ラベル情報の入力にはいくつかやり方があります。例えば、デコーダの場合1次元の潜在変数ベクトルに結合する方法や、足し合わせる方法などです。このようにラベル情報を学習に含めることで、学習後、指定したラベルのデータを生成することができるようになります。

オートエンコーダの利用例

最後にオートエンコーダの実際の利用例を見ていきます。

データ生成

変分オートエンコーダのような生成モデルを用いて、潜在変数をコントロールして、学習させたデータのどれでもないデータ生成することができます。

下に示す図は、CVAEで生成した1-9の手書き文字画像です。各行は共通の潜在変数から生成されたため、クラスによらず線の濃淡や丸み、傾きなどが似た文字が生成されています。

条件付き変分オートエンコーダで生成した手書き数字画像の例

クラスタリング・分類  

オートエンコーダのエンコーダ部分は特徴抽出器として振る舞います。異なるクラスのデータは、異なる特徴を持っていることが期待できますので、エンコーダで得られた特徴ベクトルをもとに、データのクラスタリングが可能となります。クラスタリングの部分は、ニューラルネットを用いてもよいですし、k-means法などの機械学習手法を用いても実現可能です。

エンコーダを使ったクラスタリングの概念

また、積層オートエンコーダによる事前学習を使ったディープニューラルネットワークによる分類の例を下に示します。これは、3軸の加速度センサデータを中間層2層のニューラルネットワークで学習させ、人の活動状態を分類した結果の例です。この例では、中間層の2層を積層オートエンコーダを使って事前学習しています。

3軸加速度センサデータを使った人の活動状態の分類例

参考: Davide Anguita, Alessandro Ghio, Luca Oneto, Xavier Parra and Jorge L. Reyes-Ortiz. Human Activity Recognition on Smartphones Using a Multiclass Hardware-Friendly Support Vector Machine. International Workshop of Ambient Assisted Living (IWAAL 2012). Vitoria-Gasteiz, Spain. Dec 2012.

異常検知

オートエンコーダは異常検知に用いることもできます。入出力に正常データを与えて学習すると、正常データに含まれる特徴を学習します。学習の結果、正常データを入力した場合、その正常データを正確に復元できるようになります。

このオートエンコーダに異常データを入力するとどのような出力となるでしょうか。理想的には、ネットワークは正常データに含まれる特徴をうまく拾い上げ、それらから元のデータを復元するものになっているため、異常データの特徴をうまく抽出することはできません。同様に、出力データにも異常データの特徴は反映されません。したがって、入出力データを比較し、大きな違いがあればその入力は異常データであると言えます。この方法では、入出力の差が大きい箇所も特定できるため、異常個所の特定まで可能です。

下の図は、正常なECG波形を学習したオートエンコーダを使って、正常な波形と異常な波形をそれぞれ入力した場合の出力との比較です。正常な波形は入出力がほぼ一致しているのに対して、異常な波形は入出力信号が大きく異なっており、異常であることが明確に判断できます。

オートエンコーダを使った時系列信号の異常検知の例

このように教師なし学習によって異常検知を行うことが可能ですが、少数の異常データをラベル付きで学習させるといった半教師あり学習を用いることによって、さらに精度を高めるといったことも可能です。

同様の異常検知を画像に対して実行することも可能です。この場合は、畳み込みオートエンコーダを用います。次の図は、畳み込みオートエンコーダを使って実施した異常検知の一例です。この例では、正常なナットを学習、復元するCAEを構築しました。このCAEに異常を含むナット画像を通すと、図に示す通り、異常個所を特定することができます。なお、この例ではネットワークにSegNetというセマンティックセグメンテーション用のネットワークを使いました。

CAEを用いた異常検知の例

ノイズ除去(デノイジングオートエンコーダ)

デノイジングオートエンコーダの学習では、人為的にノイズを加えたデータを入力として、ノイズ追加前のオリジナルのデータを出力するよう学習します。このような学習を経ると、オートエンコーダはノイズが含まれたデータの中から、オリジナルデータを表す主要な特徴だけを取り出すことができるようになります。この特徴量をデコーダに通すことで、クリーンなデータを復元することができます。

下の図は、十字状のノイズが含まれた画像に対しての、オートエンコーダを使ったデノイズ例です。オリジナルの画像として手書き数字文字、ノイズとしてランダムに十字状の欠損を与えた画像を入力として、オリジナル画像を出力する用学習します。このように学習して、十字欠損が入った画像を適切にデノイズするオートエンコーダを作成できます。

オートエンコーダを用いた画像のデノイズ概念

MATLABを使用したオートエンコーダ

積層オートエンコーダのような段階的な学習を実装するのは、比較的手間がかかります。MATLAB®のオプション製品であるDeep Learning Toolbox™にはオートエンコーダネットワークの生成、それらのスタッキング(積層化)などの機能が関数として備わっています。これら関数を組合わせることで、素早く、手軽にオートエンコーダを試すことができます。さらに、MATLABは画像のみならず時系列信号のディープラーニングにも使うことができ、LSTM レイヤも関数一つで呼び出すことができますので、LSTMオートエンコーダの構築も可能です。

また、比較的新しいVAEといった方法では、エンコーダとデコーダの間にランダムサンプリングが必要となるなど、より柔軟な処理が必要となります。Deep Learning Toolboxには、カスタマイズ可能な学習ループを回す仕組みがありますので、目的に合ったネットワークや学習手順を構築できます。

MATLABは産業界で広く使われてきたという歴史から、最終成果物の実装、共有までをサポートしています。作成したネットワークのGPUコード(CUDAコード)自動生成アプリ化までを含む、ワークフロー全体をMATLABがワンストップでカバーします。


オートエンコーダにおける製品使用例および使い方


ソフトウェアリファレンス