Coursera MachineLearning 9週目 まとめ

MachineLearning

機械学習界隈で評判高いCourseraのMachineLearningを受講したので、講義内容を個人的にまとめてみたいと思います。
8週目は、異常検知(Anomaly Detection)とリコメンダーシステム(Recommender System)についてです。


 

異常検知(Anomaly Detection)

製造業でのQCチェックでは、生産される製品の中に基準の満たさない不良品が含まれていないか日々確認しています。
商品を販売するオンラインwebサイトでは、健全な運営のためにも詐欺行為や不正なログインなどの異常な行動をしているユーザーを検知する必要があります。
多くの機械が同時に稼働している工場などでも、通常稼働時のデータを集めてモデルを構築しておけば、装置に異常が発生した場合にすぐ特定でき、監視するのに役立ちます。
例を挙げると様々ですが、このような異常値(anomaly)を検出するために用いられるアルゴリズムが、異常検知(Anomaly Detection)です。

このような異常値を探すために、training set から確率モデル\(p(x)\)を構築します。
あるデータ\(x_{test}\)が異常値かどうかを見るときは、\(p(x_{test})\)が 閾値 \(ε\) より小さいかを確認します。\(ε\)より大きければ正常ですが、もし小さければ、アノマリーとしてフラグを付けます。

データ\(x\)の分布が正規分布(Gaussian distribution)であるとすると、そのデータの平均値と分散および確率モデルは、以下のように表されます。

  • 確率モデル:
  • 平均値:\(μ\) 
  • 分散:\(σ^{2}\)

異常検知アルゴリズム(Anomaly detection algorithm)

異常検知アルゴリズムの流れを見ていきましょう。

 

  1. 異常検知の指標となりうるtraining setを選定する。
    training set : {\(x^{(1)}\), \(x^{(2)}\), … , \(x^{(m)}\)}
    特徴量の数:\(j = 1,2, … , n\)

    1~\(m\) までのデータの用いて、各特徴量についてガウス分布を推定し、確率モデル\(p(x)\)を構築していきます。
    \(p(x)=p(x_{1};μ_{1},σ_{1}^{2}) * p(x_{2};μ_{2},σ_{2}^{2}) * p(x_{3};μ_{3},σ_{3}^{2}) * … * p(x_{j};μ_{j},σ_{j}^{2})\)

  2. 各特徴量のパラメーター\(μ_{j}\)、\(σ_{j}^{2}\)を求める。

    \(n\)個の平均値、分散を求めます。
    (例:\(μ_{1}\)は、1番目の特徴量での、training set に含まれるデータ\(m\)個の平均値)

  3. アマノリーかどうか確認したい新しいサンプル\(x^{(new)}\)を、作成した\(p(x)\)に当てはめて計算する。
  4. 計算値が閾値 \(ε\) よりも小さいなら、アマノリーであると判断する。

アノマリー検出アルゴリズムの評価をどう行うか?

アノマリー検出でも、data set を training set, cross validation set, test set の三種類に分配します。
一般的な比率としては、6:2:2 でした。

このとき、training set に当てはめるサンプルは、アノマリーではないサンプル(\(y = 0\))のみで構成します。
(アノマリーなデータが含まれている training set で\(p(x)\)を構築してしまうと、アノマリー自体をうまく検知できなくなります)
そして、cross validation set と test set にアノマリーのサンプル(\(y = 1\))を分配します(比率としては1:1) 。

(例)
Normal data = 10000 (\(m\) = 10000)
Anomaly data = 20

training set : Nomal data = 6000 , Anomaly data = 0
cross validation set : Normal data = 2000 , Anomaly data = 10
test set : Normal data = 2000 , Anomaly data = 10
(この時、cross validation set と test set で同じデータサンプルを使用しないようにします)

training set は 確立モデル\(p(x)\)を構築するために使用します。(平均値\(μ_{j}\)、分散\(σ_{j}^{2}\)を求めてガウス分布にフィッティングさせます)
そして、cross validation set と test set は、構築した\(p(x)\)を評価するために使用します。

閾値\(ε\)と\(p(x)\)の値を比較して、以下のように分類し、正しく分類できているかを確認します。

これで正しく分類ができそう!となりそうですが…
得られた分類結果からそのままモデルの精度を判断するのではなく、F値を計算して判断するようにしましょう。F値は教師あり学習のときにも出てきました。(過去の記事を参照)
Normal dataが大多数でAnomalyなデータが少ない歪んだデータセット(skewed data set)では、分類の精度(classification accuracy)は良い指標とならないのでした。(上記の例だと、全てy = 0 と答えるアルゴリズムでもエラー率0.2%の分類精度をもつことになります)

ε はどう選ぶ?

cross validation set に いくつかの \(ε\) を試して、F値が最大になるような場合のものを採用する、という方法があります。
ここはひとつひとつ確かめるのが良いとのこと。
cross validation set で、誤検出が多すぎる(多くのアノマリーにフラグを立てることができない)ことが判明した場合は、\(ε\)の値を上げる必要があります。反対に、異常でないデータをアノマリーとして検出してしまっている場合は、\(ε\)の値を下げて対応します。

アマノリー検出アルゴリズムはどういう時に使用する?

アノマリー検出アルゴリズムを評価する際に、\(y = 1  or  0\)でラベル付けして、サンプルデータがアノマリーか否かを判断しました。
ここで、「もともと分類できるデータ(ラベル付けされたデータ)があるのなら、なぜ教師あり学習を行わないのか?」という疑問が出てきます。

Positive example(\(y = 1\)) の数に比べて、Negative example(\(y = 0\)) の数がとても多い場合(Positive examples << Negative examples)、つまり、歪んだデータセット(skewed data set)の時はアマノリー検出アルゴリズムを適用した方が良いようです。
\(p(x)\)の構築にはNegative example(アノマリーではないデータ)のみを使用するので、Negative exampleの数が多いということは、より最適なフィッティングを行うことができるということですね。
反対に、Positive example の数と Negative example の数のバランスが取れている時は、教師あり学習が適しているといえます。

もうひとつの考え方として…
Positive example の原因が複数予想される時はアノマリー検出アルゴリズムを使用するべき、という考え方があります。
講義内では航空機のエンジン異常を例に挙げていますが、この例でいうと、様々な部品の欠陥でエンジン異常となる可能性があります。このように Positive example となるパターンがいくつもあると、次に入手するデータサンプルも、新たなパターンのPositive exampleかもしれません。これらを学習するために多くのPositive exampleがあれば良いのですが、それ自体が少ないので学習することも難しそうです…。
このような場合は、Negative exampleのみで\(p(x)\)を構築し分類を行う、アノマリー検出アルゴリズムがより適しているといえそうです。

特徴量(feature)はどのように選定する?

アノマリー検出アルゴリズムでは、複数のfeatureを用いて\(p(x; μ, σ^{2})\)のモデリングを行いますが、そのfeatureはどのように設定すれば良いのでしょうか?
以下のような方法で、良い特徴量を選定できているかどうかのチェックを行うと良いようです。

  1. ヒストグラムを描いて、ガウス分布のようになるか確認してみる。
    多少の凸凹があったとしても、全体がガウス分布のようになっていれば問題なしです。

  2. 描いたヒストグラムが非対称になっている場合は、様々なデータ変換を試して左右対称に近づける。
    それぞれの特徴量で\(log(x)\)をとったり\(\sqrt{x}\)をとったりして、ヒストグラムを変形させます。

  3. \(p(x)\)が、Positive example と Negative example の両方で大きな値を示すときは、新たなfeatureを追加する。

◆多変量ガウス分布(Multivariate Gaussian Distribution)

以下のようなデータの分布について考えます。

❌で示したデータ群から外れている☆で示したデータは、アノマリーなデータ(Positive example)であると分類されたほうが良さそうに見えます(左図)。しかし、これまでのアルゴリズムで得た確率モデル\(p(x)\)ではそこまで低い値を示すことができないので、アノマリーではないデータ(Negative example)と判断されてしまいそうです。(右図)

このような、互いに直線的に上昇するような傾向にあるデータだと、これまでの\(p(x)\)ではうまく検出できない可能性があります。これまでの\(p(x)\)は軸に沿って広がることしかできないので、右上の方にプロットされるデータが、左上や右下にプロットされるデータよりも、アノマリーである確率が高いを判断されてしまいます。データ群が上記のような楕円の形をとったとしても正しく分類するためには、斜めになっている等高線の集合が必要となってきます。

そこで修正版のアルゴリズムとして、多変量ガウス分布(Multivariate Gaussian Distribution)が登場します。多変量正規分布とも呼ばれ、これまでの\(p(x)\)では捉えることができなかったアノマリーを検出できる可能性があります。

これまでは\(p(x)=p(x_{1};μ_{1},σ_{1}^{2}) * p(x_{2};μ_{2},σ_{2}^{2}) * … * p(x_{j};μ_{j},σ_{j}^{2})\)のように1つ1つモデル構築を行い掛け合わせていましたが、多変量ガウス分布では、全てを一度に当てはめてモデルを構築します。

パラメータとしては、\(μ\)と\(Σ\)を使用します。\(μ\)はこれまでと変わらず平均値。\(Σ\)は共分散行列を示します。(PCAを行う時に使用しました。[過去の記事を参照])
新たに確率モデルを定義すると以下のようになります。


\(|Σ|\):\(Σ\)の行列式(実数)


\(Σ\)は各特徴量(feature)の分散を示しているので、\(Σ\)内の値を小さくすればグラフはよりシャープになり、反対に値を大きくするとグラフはよりフラットになります。(加えて、\(Σ\)の非対角成分から、使用している特徴量(feature)が正の相関と負の相関、どちらの関係にあるのかということまでわかります)
また、もうひとつパラメータである\(μ\)の値を変化させることで、グラフのピークの位置が変更できます。\(μ\)と\(Σ\)内の値の組み合わせにより、様々な分布にフィッティングすることができるというわけです。


(Andrew Ng, Coursera Machine Learning Week 9より出典)

多変量ガウス分布をどのようにアノマリー検出に適用する?

多変量ガウス分布が便利そうなのは分かったけど、アノマリー検出にどう当てはめていくのでしょうか?
多変量ガウス分布版の異常検知アルゴリズム(Anomaly detection algorithm)を考えます。

  1. 与えられたtraining set から、\(μ\)と\(Σ\)を以下の式を用いて計算する。
    ,

    PCAの時に使用した式と同じで、平均値\(μ\)と共分散行列\(Σ\)を求めてガウス分布にフィッティングさせます。

  2. アノマリーかどうか確認したい新しいサンプル\(x^{(new)}\)を\(p(x)\)に当てはめて計算する。
  3. 計算値が \(ε\) よりも小さいなら、アマノリーであると判断する。

基本的にはオリジナルと同じ流れのようです。

「Gaussian Distribution model」 or 「Multivariate Gaussian Distribution model」?

[Gaussian Distribution model]

  • 計算コストが低いので、特徴量の数が多いとき(\(n\) = 10000 など)でも比較的機能する。
  • training set に含まれるデータ数 \(m\) が少なくても、比較的機能する。

[Multivariate Gaussian Distribution model]

  • 途中で\(Σ\)の逆行列を計算しなけれないけないので、特徴量の数が増えると計算コストが跳ね上がる。
  • \(m > n\) でなければならない。(これも\(Σ\)の逆行列を計算する上で必要な条件。\(m < n\)では非可逆になるとのこと)
  • データの相関を見たいとき、Multivariate Gaussian Distribution modelが便利。feature同士の相関を自動で捉えることができる。

特徴量の相関を捉えたい場合でも、異常な値の組合せを捉える新たな特徴量を設定してオリジナルのモデルを使用する、というケースが一般的だそうです。
特徴量の数と比較して、データ数を大量に持っている場合(\(m > 10n\)など)は、Multivariate Gaussian Distribution model のほうがより上手く機能する可能性が高く試してみる価値がある、とのこと。

リコメンダーシステム(Recommender System)

機械学習の重要な適用例で、ユーザーの好みや行動の傾向を学習し、その人に合った結果(商品など)を示すアルゴリズムです。
「あなたへのおすすめ!」「この商品を買った人は以下の商品も買ってます!」などなど、amazonなどのECサイトでよく見かけるアレですね。ついつい表示されたものも買ってしまう人は多いのではないでしょうか?
企業としては、収益アップのためにもこのアルゴリズムのパフォーマンス向上に注力しない手はない!ということで、優先度の高い課題のようです。

映画のレビューを例に挙げてみていきましょう。
「AさんとBさんの好みは似ているので、Bさん高評価している映画「〇〇」はAさんの好みなのでは?」と推測します。

ユーザー \(j\) が映画 \(i\) のレーティング(星をいくつ付けたか)をしていたら\(r(i, j) = 1\) (していなければ \(r(i, j) = 0\))
\(r(i, j) = 1\)の時、ユーザー \(j\) が映画 \(i\) に星をいくつ付けたかを\(y(i, j) = [0, 1, 2, 3, 4, 5]\)で示します。 (よくあるレビューは1〜5ですが、講義内ではのちの計算を楽にするために、0から始めています)
ユーザー数:\(n_{u}\)
映画数:\(n_{m}\)

この場合のRecommender Systemは、\(r(i, j)\)と\(y(i, j)\)が与えられた時に、まだレビューされていない\(r(i, j) = 0\)映画の\(y(i, j)\)の値が幾つになるかを予測するアルゴリズムと言えます。

Recommender Systemを作り上げる最初のアプローチ

まずは、Content Based Recommendations と呼ばれる Recommender System について考えます。 
大まかな流れとしては以下のようになります。

  1. 映画の特徴を測る 特徴量(feature)\(x^{(i)}\)を設定する。
    \(x_{1}\):どの程度ロマンティックか? \(x_{2}\) : どの程度アクション要素があるか? などを設定します。
    それぞれの映画を、以下のような特徴量のベクトルで表現できるようにしていきます。
    (n+1 × 1のベクトル)
    (\(x_{0}\)は切片項で1を示します)

  2. パラメーター\(θ\)を使用してレーティング\(y(i, j)\)を予測する。
    モデルが学習した各ユーザーのパラメーター\(θ\)(どんな映画を好む傾向にあるかを示しています)を利用し、ユーザー\(j\) のパラメーターベクトル\(θ^{(j)}\)と映画のパラメーターベクトル\(x^{(i)}\)の内積を計算し、レーティング\(y(i, j)\)を予測します。

この値が高ければ、お勧めできるということになります。

ユーザーのパラメーター\(θ\)としては、予測したレーティングと実際のトレーニングセットのレーティング(ユーザーがすでに評価した映画のレーティング値)の誤差が小さくなるようなものを求める必要があります。
基本は線形回帰と同じことなので、目的関数を設定しましょう。


\(m^{(j)}\):ユーザー \(j\) が評価した映画の数
計算の簡略化のために、実数\(m^{(j)}\)は省略します。よって以下のようになります。


ユーザーは1〜\(n_{u}\) までいるので、目的関数を最小化する各ユーザーのパラメーター\(θ^{(1)}\)〜\(θ^{(nu)}\)を計算するために、総和記号Σを追加します。最終的な式は以下のようになります。



最急降下法も考えます。

これで完成です。

以上が Content Based Recommendations と呼ばれるものでした。
この方法は始めに、映画の特徴を測る特徴量\(x^{(i)}\を設定します。(どれだけロマンティックなのか、アクションテイストが強いのか等々)
映画の本数が少なければそれぞれの特徴量の数値を設定できるかもしれませんが、取り扱っているすべての映画に対して行なうのはとんでもない時間がかかるし実質不可能…。それに人の感性は様々なので、設定する人によって値が変わってきそうです。
ということで、コンテントベースではないリコメンダーシステムについて学んでいきます。

Collaborative Filtering(協調フィルタリング)

Content Based Recommendationsではない Recommender System として、Collaborative Filtering(協調フィルタリング)というモデルを検討します。(feature learning とも呼ばれているそうです)

Content Based Recommendations では、映画の特徴を測る特徴量\(x^{(i)}\)をうけて、ユーザーのパラメーター\(θ^{(j)}\)を学習していました。
協調フィルタリングでは、ユーザーのパラメーター\(θ^{(j)}\)をうけて、映画の特徴を測る特徴量\(x^{(i)}\)を学習するというアルゴリズムが追加されます。
つまり、\(θ\) → \(x\) → \(θ\) → \(x\) … と、\(x\)と\(θ\)を交互に学習し、より良いものにアップデートしていくモデルになるわけですね。

そのためにも\(x\)と\(θ\)を、小さなランダム値に初期化します。
(これは対称性の破れ(ニューラルネットワークのパラメータのランダムな初期化と同様)として機能し、アルゴリズムが互いに異なる特徴を確実に学習するようにします。)
そして、この交互に学習するアルゴリズムである2つの目的関数を合体させて1つにしてしまおう!という考えから、式は以下のようになります。


最急降下法も見ていきましょう。
交互にアップデートしていくイメージでしたが、目的関数を一つの式にまとめたので、二つのパラメーターを同時にアップデートします。(切片項に対応するものを \(x_{0} = 1\) としていたが、以上のような方法で実装すると、特徴量も同時に学習することになるので、\(x_{0}\)を省略することができます。よって、最急降下法の場合分けが必要なくなります)

ユーザー \(j\) が映画\(x\)をまだレーティングしていなければ、パラメーターベクトル\(θ^{(j)}\)と映画のパラメーターベクトル\(x^{(i)}\)の内積を計算しレーティングを求めることで、お勧めできるかどうかがわかるようになります。

我々ユーザーは知らないところで、実は協力し合って、より良いリコメンダーシステムを作り上げていた。ということですね。


 

10週目は、大規模な機械学習(Large Scale Machine Learning)について学習します。よく耳にするようになった「ビックデータ」をどう取り扱うかについて考えていきます。

コメント

タイトルとURLをコピーしました