機械学習

距離学習(Metric Learning)入門から実践まで

距離学習(Metric Learning)

こんにちは。

現役エンジニアの”はやぶさ”@Cpp_Learningです。距離学習 (metric learning)について勉強したので、備忘録も兼ねて本記事を書きます。

距離学習(Metric Learning)入門から実践まで
  • 第一章:距離(Metric)の基礎
  • 第二章:距離(Metric)によるクラスタリング・異常検知
  • 第三章:距離学習(Metric Learning)によるクラスタリング・異常検知

本記事の文章構成は上記の通りなので、好きな所から読み進めて下さい。

深層距離学習(Deep Metric Learning)の説明はしません

【第一章】距離 (Metric)の基礎

最初に距離とは何か?距離からどんなことが分かるか?について説明します。

同じか否かの判定

人生で一度くらいは以下のような会話を聞く機会があると思ます。

  1. Aさんの顔とBさんの顔はよく似ている
  2. この店の料理は某有名店と同じ味がする
  3. あのモノマネ芸人の歌声は人気歌手にそっくりだ
  4. この地域に生息する動物たちは、日本の動物と同じ特徴がある

❶の顔については、Aさんの顔を基準とし、目・鼻・口などの形や位置が近い場合に似ていると判定できます。

❷の味についても、某有名店の味を数値化したレーダーチャートやグラフを基準とし、それらと同じ数値なら、味も同じといえます。

➌の歌声も同じで、人気歌手の声帯振動や息遣いのタイミングを数値化・基準とし、それに近い数値で唄うことができれば、そっくりな歌声と評価できます。

❹については、ある地域の動物を観察し、行動パターンや身体的特徴の統計量などを把握できたと仮定します。日本で同様の観察を行った結果、似た分布の統計量を観測できたなら「ある地域と日本の動物は特徴が同じ」と判定できます。

距離学習(metric learning)4つの異なる例を挙げましたが、どの例でも「何らかの数値データを基準とし、その基準から遠いか近いかで、同じか否かを判定できる」という部分が共通点といえます。

❶の例は数値データじゃないよね?

と思った人がいるかもしれませんが、視覚情報=画像(この例では顔写真)だと考えれば、画像は画素の集合体で行列(数値データ)として扱えます。

はやぶさ
はやぶさ
画像の基礎については、以下の記事に書いたので、良ければ参考にして下さい
ソーベルフィルタ
【深層学習入門】画像処理の基礎(画素操作)からCNN設計まで画像処理の基礎(画素操作)から深層学習のCNN設計までカバーした記事です。画像処理にはOpenCVとPythonを使用しました。画像処理入門、深層学習入門、どちらも取り組みたい人におすすめの記事です。...

距離や空間について

「基準から遠いか近いかで、同じか否かを判定できる」と説明しました。つまり、基準Aと対象Bの距離を算出できれば、同じか否かを判定できます。

距離といえば、三角形の斜辺を求めるときに使う「三平方の定理」があります。この定理で算出できる距離は、正確にはユークリッド距離と呼ばれています。

距離・空間の違い

引用元:【Day-23】機械学習で使う”距離”や”空間”をまとめてみた|PROCRASIST

ユークリッド距離以外にもマンハッタン距離やチェビシェフ距離などがあります。各距離を比較した面白い記事があるので紹介します。

地球上のA地点に住む織姫とB地点に住む彦星のAB間距離を様々な手法で算出した結果、ユークリッド距離では”16.91km”・マンハッタン距離では”20.9km”となり、演算方法の違いで距離が変わることが分かります。

もし、この記事の登場人物としてC地点に住むデネブ君を追加した場合、演算方法の違いでAB間距離とAC間距離の関係は以下のようになるかもしれません。

距離・空間の違い

デネブ君は織姫に近づくような移動をしていないのに、採用する”距離”によっては彦星よりも織姫との距離が近くなるので、彦星が嫉妬するかもしれません。

つまり、目的に応じて「どんな距離関数が最適か?」を考える必要があります。ちなみにこの記事では「遠距離恋愛する二人(織姫と彦星)の距離が最も小さくなる距離関数を見つける」という問題設定をしていると感じました。

  • ユークリッド距離以外にも様々な距離がある
  • 物理的な移動がなくても距離関数(演算)の違いで2点間距離が変わる

特徴量と埋め込み空間(Embedding Space)について

織姫と彦星の例は、日常会話でよく使う距離(道のり)の話題だったので、分かりやすかったと思います。同様に、冒頭で説明した4つの例「AとBの数値データ(特徴量)が同じか否かの判定」も距離の話題です。

❷この店の料理は某有名店と同じ味がする

❷の例で説明してみます。味覚には、甘味・酸味・塩味・苦味・うま味の5つの特徴量があると言われています。例えば、A~C店に関する以下のテーブルがあったとします。

店の名前 甘未 酸味 塩見  苦味 うま味
A
B
C 1

※単純な5段階で表記しています

全ての特徴量を使っても良いのですが、簡単に説明するため、2つの特徴量を選定して使います。

Embedding Space

上図のように特徴量を空間(この例では二次元空間)に埋め込むことで、距離を算出できるようになります。つまり、地図上の座標でなくてもデータ(特徴量)を空間に埋め込むことで距離を求めることができます。

また、各ユークリッド距離(三角形の斜辺が最も距離が遠い)を算出すると、埋め込み空間(Embedding Space)の違いで、距離が変わってくることが分かります。

素人なので”味”の正解は判定できませんが、私が料理するときは「うま味」と「甘味」を意識して調理しています。なので「A店と味が近い店はB店・C店どっち?」という問題設定なら『AとBが近く、AとCが遠くなるように埋め込み空間を生成』すると思います。

  • データ(特徴量)を空間に埋め込むことで距離を算出できる
  • 生成する埋め込み空間により、距離は変化する

【第一章】まとめ -距離(Metric)の基礎-

ここまでの内容を整理します。

「何らかの数値データを基準とし、その基準から遠いか近いかで、同じか否かを判定できる」というのが基本かつ重要な概念です。

「基準から遠いか近いか」というのは距離から判定することできます。ただし、様々な距離の表現方法があるので、目的や問題設定に応じて最適な”距離(Metric)”を採用する必要があります。

また、座標情報ではない特徴量でも、空間に埋め込むことで距離を算出できるため、あらゆる特徴量に対し「距離による同じか否かの判定」が可能です。ただし、”距離”と同じように、目的や問題設定に応じて最適な”埋め込み空間(Embedding Space)”を生成する必要があります。

  • ユークリッド距離以外にも様々な距離がある
  • 座標情報ではない特徴量でも、空間に埋め込むことで距離算出が可能
  • 目的・問題設定次第で最適な距離関数や埋め込み空間が変わる
  • 問題設定としては「AB間距離は近く、AC間距離は遠くなる空間・距離を見つける」というものが多い

ここまでが『距離(Metric)の基礎』に関する内容でした。基礎だから単純というわけではなく、奥が深いことが伝わると嬉しいです。

また、データ分析を主軸にした説明を心掛けたので、第一章の内容だけでも「正誤判定」や「クラスタリング・異常検知の前処理」などで役立つと考えています。

はやぶさ
はやぶさ
少しでも参考になれば嬉しいです

第一章(完)

…ここまで読んで、まだ元気な人は第二章 -距離(Metric)によるクラスタリング・異常検知-も読んでみて下さい。

【第二章】距離 (Metric)によるクラスタリング・異常検知

第一章で説明した通り、最適な距離関数と埋め込み空間を採用することが重要です。

第二章では、第一章の内容を踏まえ「距離(Metric)によるクラスタリング・異常検知」について説明します。

分布と距離

第一章では「点A(基準)に近いのは点B・点Cどっち?」という問題設定でいくつか例を説明しました(下図の例など)。

Embedding Space

ただし、問題によっては「任意の距離(閾値)よりも遠いか近いかで同じか否かを判定」したいときがあります。

❹この地域に生息する動物たちには、日本の動物と同じ特徴がある

❹の例で説明してみます。まずは、埋め込み空間を生成します。

  • 点A:この地域(地域A)に生息する動物たち
  • 点B:日本以外に生息する動物
  • 点C:日本に生息する動物
Embedding Space

上図(左)の場合、第一章のように点Aとの距離を比較すれば、点Cが近いのは明らかです。しかし、地域Aに生息する”動物たち”と複数形なので、実際には上図(右)になると考えられます。

すると、上図(左)では明らかにAB>ACだったのに対し、上図(右)ではAC>ABにも見えます。これは、基準点および基準距離が曖昧なために、生じた問題です。

最適な距離(閾値)の決め方

基準点の決め方はケースバイケースですが、分布の重心・平均値・中央値などを採用するケースが多く、今回は下図の 点▲を基準点 とします。

Embedding Spaceこの 点▲の基準点 から距離が近いと地域Aに生息する動物(あるいは特徴が同じ動物)距離が遠いと地域A以外に生息する動物(あるいは特徴が異なる動物)という距離による分類ができます。

マハラノビス距離基準点から最も離れた青い点のユークリッド距離を算出し、その距離を半径とする円を描き、円の内側(半径よりも近い)なら、地域Aに生息する動物と同じクラスという分類ができます。

しかし、上図(左)を見て分かる通り、ユークリッド距離を使った場合、赤・緑含め全てが同じクラスという分類になります。

一方、マハラノビス距離は相関関係(分散)を考慮して算出されるため、分布の形にフィットした距離を算出できます。その結果、上図(右)のようになり、緑は地域Aに生息する動物とは違うクラスという分類になります。

このように、機械学習を使わず距離によるクラスタリングや異常検知ができることが分かります。

最適な埋め込み空間の生成と最適な距離関数を採用することで、機械学習を使わず、距離によるクラスタリングや異常検知ができます

実践!マハラノビス距離による異常検知

本記事ではマハラノビス距離の概要しか説明しませんでしたが、以下の記事を読めば、マハラノビス距離の詳細を知ることができます。

また、この記事の(実践編)もあり、マハラノビス距離による異常検知を実践しています。勉強のために、マハラノビス距離関数を自作するも良し、scikit-learnのマハラノビス距離関数を使うも良しです。

はやぶさ
はやぶさ
自前のデータに対し、距離によるクラスタリングや異常検知を実践するのも面白いと思いますよ

第二章(完)

…もう疲れたかな?まだ元気な人は第三章 -距離学習(Metric Learning)によるクラスタリング・異常検知-も読んでみて下さい。

スポンサーリンク

【第三章】距離学習 (Metric Learning)によるクラスタリング・異常検知

第二章で、機械学習を使わず距離によるクラスタリングや異常検知を実践できると説明しました。

しかし、問題によっては距離のみで解決できない場合もあります。

第三章(最終章)では、あらゆる問題解決に役立つ強力な武器「距離学習(Metric Learning)」について説明します。

距離の近いクラスの分類

第二章では「青い点群と同じか否か」という問題に対し、マハラノビス距離による判定ができることを説明しました(下図参照)。

マハラノビス距離しかし、「同じ特徴をもつ動物」ではなく「生息地域別」で分類したい場合、下図のような3クラスに分類する必要があります。

Embedding Space

この場合、距離による分類は困難かもしれませんが、機械学習を使えば分類できそうです。ただし、下図のような場合はどうでしょう?

Embedding Space

AクラスとCクラスの距離が近すぎて、分類困難ですね。

最適な空間を生成できてない可能性もありますが、ラベル(生息地域)が違うだけで同じ特徴をもつ対象(動物)に対し、綺麗に分布が分離している埋め込み空間を生成するのは難しいです。

このような問題を距離学習(Metric Learning)で解決します。

距離学習(Metric Learning)とは

距離が近すぎて分類が困難なら「同じクラスは距離が近く、違うクラスは距離が遠くなるように移動」させれば良いのです。

距離学習に限らず、ある空間の任意の点を移動させる場合、行列演算を使います。

距離学習(Metric Learning)距離学習では、上図のように最適な距離にする行列(の各要素)を学習します。

どんな行列を学習させるの?

というのが気になる人は、以下の記事が参考になります。行列Mまたは行列Lを学習することで、各クラスの距離を最適化できることが分かります。

実践!距離学習(Metric Learning)

scikit-learn-contrib/metric-learnを使えば、様々な距離学習を簡単に実践できます。

今回は、第二章で説明したマハラノビス距離の学習を実践します。

scikit-learn-contrib/metric-learnをインストール

最初に、以下のコマンドで距離学習用のパッケージをインストールします。

pip install metric-learn

前準備はこれだけです。以降からはソースコードを作成していきます。

Import

必要なライブラリをimportします。

Loading our dataset and setting up plotting

距離学習したくなるようなダミーデータを検討します。

【ダミーデータ】

  • 100 points in 3 classes with 2 clusters per class
  • 5 features, among which 3 are informative (correlated with the class labels) and two are random noise with large magnitude

以下のコードでダミーデータを生成します(本当は何らかの実データを使いたかった…)

Visualization

第一章の例「A店と味が近い店はB店・C店どっち?」で5つある特徴量から2つを選定して埋め込み空間の生成および可視化を行いました。実は、全ての特徴量を使わなかったのは、以下ような理由があったからです。

  • 特徴量選定の重要性を伝えたい
  • 5次元データの埋め込み空間を図で表現できない

今回は、t-SNEで5次元データを次元削減し、2次元データにすることで可視化を行います。

本記事では説明の都合上、2次元データの例を多用しましたが、多次元データでも距離学習を適用できるし、次元削減することで2Dの可視化が可能なことを理解して頂けると嬉しいです。

Plot the dataset

先ほど定義した関数で3クラス(100プロット)のデータを2Dで可視化します。

t-SNEによる次元削減クラスタリング困難な距離の近いデータセットであることが分かります。

このような各クラスの距離が近すぎるデータはクラスタリング困難なので、同じクラスのデータは距離が近く、違うクラスのデータは距離が遠くなるように距離学習を行います。

Mahalanobis Metric for Clustering

様々な距離学習がありますが、今回はマハラノビス距離学習を実践します。

【アルゴリズム概要】

MMC(Mahalanobis Metric for Clustering) is an algorithm that will try to minimize the distance between similar points, while ensuring that the sum of distances between dissimilar points is higher than a threshold. This is done by optimizing a cost function subject to an inequality constraint.

引用元:plot_metric_learning_examples.py

以下のコードで学習します(すごく簡単!さすがscikit-learnですね)

マハラノビス距離学習

マハラノビス距離学習により、同じクラスの距離が近くなってますね。あとは機械学習などを使えば、分類できそうですね。

KISSME(Keep ISimple and Straightforward MEtric)の理論から実践まで

scikit-learn-contrib/metric-learnには、様々な距離学習関数がありますので、本記事で説明していない距離学習も是非実践してみてください。

また、scikit-learnにはないKISSMEKeep ISimple and Straightforward MEtric)は以下の記事で理論から実践まで説明していますので、こちらも是非実践してみて下さい。

まとめ

当初、深層距離学習(Deep Metric Learnig)に関する記事を書く予定でした。

しかし、深層距離学習を理解するための前知識として、距離学習(Metric Learnig)を先に説明した方が良いと考えました。

また、距離学習を理解するには「距離とは?空間とは?」といった基礎の説明も必要だと思い、以下の文章構成で本記事を書きました。

距離学習(Metric Learning)入門から実践まで
  • 第一章:距離(Metric)の基礎
  • 第二章:距離(Metric)によるクラスタリング・異常検知
  • 第三章:距離学習(Metric Learning)によるクラスタリング・異常検知

第三章もある長文ですが、距離学習の入門から実践までカバーできてと思います(結構書くの大変でした!)

深層距離学習についても、いつか書きたいと思います(いつか…)

本記事をきっかけに、距離学習(Metric Learning)を実践しました!という人が現れたら最高に嬉しいです。

はやぶさ
はやぶさ
理系応援ブロガー”はやぶさ”@Cpp_Learningは頑張る理系を応援します!

第三章(完)

おまけ -問題解決に使える武器たち-

くるる
くるる
ちょっと待ったーーーー!

(突然でてきたフクロウの”くるる”@kururu_owl が今日も可愛い)

本記事の冒頭で4つの例を提示しているに…

➌あのモノマネ芸人の歌声は人気歌手にそっくりだ

➌の例だけ、一切触れてないよね?

はやぶさ
はやぶさ
…確かに!

でも以下ことは説明済みだよ。

➌の歌声も同じで、人気歌手の声帯振動や息遣いのタイミングを数値化・基準とし、それに近い数値で唄うことができれば、そっくりな歌声と評価できます。

くるるちゃん振動や信号処理については以下の記事で勉強済みでしょ?

機械学習未使用!Pythonでゼロから始める振動解析
振動の基礎
【データ分析入門】機械学習未使用!Pythonでゼロから始める振動解析機械学習(深層学習含む)によるデータサイエンスが流行っていますが、フーリエ解析などの振動解析により、異常検知を行うこともできます。本記事はデータ分析/振動解析学ぶための実践的なチュートリアル記事です。...
機械学習未使用!Hampelフィルタで外れ値検出(異常検知)
信号処理におけるフィルタのイメージ
【信号処理入門】機械学習未使用!Hampelフィルタで外れ値検出(異常検知) -Python-機械学習(深層学習含む)による異常検知が流行っていますが、信号処理のフィルタで外れ値検出(異常検知)を行うこともできます。本記事は信号処理の基礎から実践(フィルタ設計)まで実践的に学べるチュートリアル記事です。...
くるる
くるる
おう!

深層学習(LSTM)による時系列データ予測もやったことあるよね?

MXNetとLSTMで時系列データ予測
MXNetとGluonTSによる時系列データ予測
MXNetとLSTMで時系列データ予測 -入門から実践まで-こんにちは。 ディープラーニングお兄さんの”はやぶさ”@Cpp_Learningだよー 前回『MXNetで物体検出』に関する...
くるる
くるる
まぁねー♪

それで、今回は距離学習入門もしたと…

くるるちゃんは既に問題解決に使える「信号処理」・「振動解析」・「機械学習」・「距離学習」など、たくさんの武器を持ってる状態だよ。今のくるるちゃんなら、自力で➌の例を実践できると思うよ。

くるる
くるる
武器いっぱい…!!!
くるる
くるる
くるる
ちょっと自力で実践してみる!音=振動だし、まずはFFTで…
くるる
くるる
あ!はやぶさ先生 最初は口出さないでよね

あらあら。好奇心旺盛に成長して先生は嬉しいです!笑

本サイト:はやぶさの技術ノートで公開している記事を自分なり理解・吸収できれば、問題解決の武器になります。

問題に対し、あらゆる解決手段を提案・実践できるエンジニアってカッコイイと思いますよ!くるるちゃんのように➌の例を色々なアプローチで実践してみませんか?

改めて…

はやぶさ
はやぶさ
はやぶさの技術ノート著者:はやぶさ@Cpp_Learningは頑張っている全ての人を応援します!

おまけ(完)

LINEスタンプ配信中!

フクロウのLINEスタンプ

当サイトのマスコットキャラクター

「フクロウのくるる」が

LINEスタンプになりました!

勉強で疲れたあなたに癒しをお届け☆

お迎え待ってます(*・ω・)ノ♪

今すぐお迎えする

40個セットがたったの50コインとお得です