ココンの情報をいつでも、どこでも。ココントコ。

エンジニア 2018.08.01

少数の例外値を発見する手法について〜例外画像の検出ニューラルネットワーク〜

AI戦略室の坂本です。
AIはその応用範囲の広さから、様々な分野に利用されうるのですが、現状でビジネススキームにマッチングの良い応用分野といえば、ビッグデータ分析・データマイニングなどの分野が挙げられるのではないでしょうか。
機械学習のために用意されたデータセットは、多くの場合ノイズの少ない「きれいなデータ」ですが、実際に利用できるデータには色々なノイズ・例外値が含まれており、それらの検出が重要だったりします。
なので今回は、「学習用データセットに含まれていない」、「少数の例外値を検出する」手法について書きたいと思います。

目次

背景

機械学習を使用してビッグデータの分析を行う際に、「データに含まれているかもしれない少数の例外値」は、なかなか厄介な問題だったりします。
ニューラルネットワークのような手法を使えば、少数の例外値は無視するように学習してくれるのでは?と思う方もいらっしゃるかもしれませんが、なかなかどうして、その例外値に学習が引きづられてしまったり、テストデータで作成したモデルと実際の学習結果で性能が食い違ってしまう原因になったりと、無視できない効果をもたらす場合があるのです。
また無視してくれるなら無視してくれるで困る場合もあり、統計的な解析に使用するのであれば問題なくとも、例外値に対するAIの動作が予測できないものになるなど、ビッグデータの利用目的によってはこの問題はクリティカルなものになり得ます。

ここで問題となるのは、少数の例外値はそのデータが少数であるが故に、学習用のデータとして利用しにくいという点です。上の図のように、大規模なデータから学習用のサブセットを作成する場合など、例外値が含まれないデータで学習を行うこともありますし、リアルタイム処理系で学習できなかったパターンが入力される場合もあります。
また、例外値の具体的な値がどのような範囲になるかも解らない事が多く、全ての生データを検証せずに学習させるのは、セキュリティ的に見ても問題があったりします。

例外値を含んだデータセットの用意

誰が見ても解りやすい例外値として、ここでは画像データを使用します。
使用するデータは、機械学習ではおなじみのMNISTの手書き数字画像に、少数の例外画像をドープしたものを用意しました。
https://github.com/cocon-ai-group/MNIST-with-anomaly-datasets

上記のGitHubからダウンロード出来るデータには、以下のファイルがあります。

・train.zip – ラベル付けされたMNISTの手書き数字画像21,038枚
・test.zip – ラベル付けされたMNISTの手書き数字画像20,962枚
・anomaly.zip – ラベル付けされていない画像28,000枚で、内MNISTの手書き数字画像が27,990枚、例外画像10枚

ここで、train.zip、test.zip、anomaly.zip内のデータは、全て異なる画像ファイルですが、train.zip、test.zipには0から9までのラベルが振られた手書き数字画像のみが含まれています。
そしてanomaly.zip内には、MNISTの手書き数字画像が27,990枚と、例外となる画像ファイルが10枚含まれています。当然、例外画像は手書き数字画像と同じ28×28ピクセル1チャンネルのモノクロ画像で、解像度の判定で例外画像を見つけることは出来ません。

分散表現と例外検出

ここで、今回のお題は、「train.zip内に含まれる画像のみを学習データとして、anomaly.zip内に含まれている例外画像を発見するモデルを作成する事」となります。
このような場合、どのような機械学習モデルが使用できるでしょうか?
まず考えられるのは、以前も少し書いた多様体学習による次元削減です。
多様体学習によってデータの次元数を削減してゆくと、データ内の特徴量に基づいて次元内にデータが分散してゆくので、その分散表現を可視化すれば、データ内に含まれている傾向が見て取れるはずです。
多様体学習で作成されたモデルに例外値を含むデータを入力すれば、他のデータと明らかに異なるデータは、他のデータとは異なる場所にマッピングされるのではないか?という訳です。
根拠は何やら怪しげですが、アイデア自体は上手くゆきそうに思えてきます。
それでは実際に、オートエンコーダーというニューラルネットワークを使用して入力データを2次元に次元削減した結果を見てみましょう。


まずは、train.zip内に含まれる画像に対してオートエンコーダーによる教師なし学習を行い、完成したモデルを使用してanomaly.zip内に含まれている画像全てを次元削減してみました。
そして、画像内の対応する座標にファイル名をプロットして散布図にしたものが上の図になります。さて、上の図の中から、例外画像10枚を発見できるでしょうか?

正解となる例外画像の位置は、上のようになります。
この例では、例外画像をそのほかのMNISTデータから分離できていません。
ここで使用したモデルは、train.zip内に含まれる画像で学習したものなので、anomaly.zipの側にのみ含まれている例外画像は学習には使用されていません。そうすると、例外画像もそのほかの画像とほぼ同じ座標へとマッピングされてしまうことが解ります。

Metric Learningによる例外検出

ではどのようにするかというと、ここではMetric Learningという手法を利用し、MNISTのデータと、意味消失したデータとの距離学習を行います。
意味消失したデータとは、画像の場合は単色で塗りつぶした画像や、ランダムな数値のピクセルからなる画像などで、ここでは真っ白と真っ黒の2種類の塗りつぶし画像を使用しました。
Metric Learningとは、Similarity Learningの一種で、複数のデータ間における距離を作成する機械学習の手法です(ちなみに、この手の技術用語は適切な訳語がなかなか出来ないので困ります – Similarity Learningには類似学習という訳語を見つけましたが、この記事を書いている時点でMetric Learningには良い訳語が見つかりませんでした。変な訳を勝手に作って後から別の訳語が一般化すると嫌なので、英語のまま使うことにします)。
ニューラルネットワークでMetric Learningを行うには、Triplet lossという損失関数がよく使われます。

ニューラルネットワークの出力は2次元ベクトルとし、train.zip内に含まれる画像で学習したモデルの、anomaly.zipのデータに対する出力をそのまま散布図にしたものが、以下の図となります。


一見していくらかの例外値が、主たる系統から分離してマッピングされていることが解ります。
上の図の中で、正解となる例外画像の位置は、下の赤い部分になります。


今度は正しく例外画像を分離できています。また、ここまできれいに例外値が分離していると、クラスタリングを使用して機械的に例外を判断することも出来そうです。

実際のプログラムコード

それでは実際のプログラムコードを見てゆきましょう。
なお、このコードは先ほどのGitHub(https://github.com/cocon-ai-group/MNIST-with-anomaly-datasets)にて公開しているので、そちらも参照してください。
まずは学習用データを読み込み、Tripletを作成する関数です。

特に難しい点はありません。get_one_triple関数はTripletとして、MNISTのデータか、意味消失したデータとして白(255)または黒(0)単色で塗りつぶした画像かを選択し、Anchor、Positive、Negativeの順番でタプルを返します。

使用したニューラルネットワークは上のようになります。
画像データなのだから本来は畳み込みニューラルネットワークを使えば良いのですが、28×28のMNISTデータなので、全結合層だけで済ますことにしました。因みにこの構造は、前述のオートエンコーダーにおける前半部分と同じです。なので、オートエンコーダーとMetric Learningの差を評価するという意味合いもありました。

ニューラルネットワークの学習は上のようにカスタムUpdaterを作成し、ミニバッチ分のTripletを作成した後、ニューラルネットワークを3回実行してその結果をTriplet lossで逆伝播させます。
学習するための実行結果はTripletの分だけ必要ですが、Tripletのデータをミニバッチ方向に積み上げれば、ニューラルネットワークの実行自体は1回にすることも出来ます。

最後に、結果をクラスタリングして、散布図にして保存します。
クラスタリングのアルゴリズムとしては、KMeans法などが有名ですが、分散表現化したデータを分離するためには、AgglomerativeClusteringにlinkage=’average’を指定して使用するのが、だいたいの場合良い結果になるようです。

まとめ

今回は、「学習用データセットに含まれていない」「少数の例外となる」データを検出する手法について紹介しました。
機械学習による分析では、ビッグデータを学習用データとすることが多々あるのですが、そのデータが何の検証も受けていない、ウェブから入手したデータだったりすると、セキュリティ的にも問題があるので、機械学習の前にデータの内容を確認することは重要だったりします。
しかしなにぶん、ビッグデータはデータのサイズが本来的にビッグなので、その全てを人が確認するのは事実上不可能です。そうすると、検証すべきデータの’あたり’をつけて、少数のデータのみ検証することで、データセット全体が想定したとおりのデータから成り立っているかを確認しなければなりません。
そういった場合、例外値を見つけ出す手法というのは意外と実用的だったりします。今回紹介した手法が使える場合も多いので、何かの役に立てれば幸いです。

イベント 2018.12.06

手に汗握る!デジタルイラストグランプリ開催

Panda Graphics株式会社の塩田です! Panda Graphicsは、主にスマートフォン向けのソーシャルゲームを中心…

エンジニア 2018.11.14

競馬予想AI再び -後編- 〜アンサンブル学習編〜

AI戦略室の坂本です。 あまりに気合いを入れて作成すると、社内での自分の評価が「競馬予想の人」になって…

エンジニア 2018.11.14

競馬予想AI再び -前編- 〜LambdaRank編〜

AI戦略室の坂本です。 元はといえば忘年会の余興から始まった競馬予想AIですが、ブログ記事のアクセス数も…