ソフトウェアエンジニアが Cousera の機械学習コーシ(9週目)に参加して学んだことをメモ代わりに共有します。今回は、応用例を学びました。協調フィルタリングは使えるところが沢山ありそうなので、実践を通してもっと学びたいなと思いました。
8週目の記事もあるので良かったら読んでみてください。
Density Estimation
この章では、異常検知(Anomaly Detection)について説明します。
Problem Motivation
まず、異常検知(Anomaly Detection)がどういう風に使われているか説明します。異常検知は教師なし学習でありつつ、教師あり学習とも似ている点があります。そして、異常検知は主に「製造業」「ウェブサイト」「データセンターのモニタリング」に使われています。この節では、飛行機のエンジンを例として、もう少し詳細に説明します。
飛行機のエンジンは、以下の2つの特徴量を持ちます。
- x1:エンジンから生成される熱量
- x2:振動
2つの特徴量から正常か異常かを判定する確率のモデル P(x) を学習させます。そして、新しいエンジンの特徴量 xtest に対して、正常である確率を p(xtest) の関数を使って計算し、 閾値 ϵ によって下記のように、正常か異常を識別します。
- p(xtest)<ϵ:異常p(xtest)<ϵ:異常
- p(xtest)≥ϵ:正常p(xtest)≥ϵ:正常
Gaussian Distribution
この節では、ガウス分布(正規分布)について説明します。講義内では、ガウス分布の難しい性質については説明がありませんでした。気になる方は下記のリンクを読んでみてください。
簡単に説明すると、ガウス分布とは最も一般的な確率の取り得る分布のことです。このガウス分布に当てはめて、異常検知のアルゴリズムを導出します。この節では、ガウス分布のより簡単な特徴の焦点を当てて説明します。
まず、ガウス分布は μ と σ の2変数を使って表現します。μ はガウス分布の中央を表し、σ はガウス分布の幅(分散)を表します。幅と言っても、中央から裾の尾まででなく、積分して 68% の値が占められ幅を σ で表しています。上図では、μ を変えると中央が移動し、σ を変えると幅が変わっていることが確認できます。ただ、正規分布は確率の分布なので、全てを積分した結果が1になります。なので、σ が小さくなると、中央で示す確率は高くなります。逆に、σ が大きくなると、中央で示す確率は小さくなります。
そして、上図のように、μ を推計する方法は単に平均をとるだけです。また、σ は、1 から m までに渡り、x(i) から μ を引いた値の二乗の和を計算して算出します。
Algorithm
この節では、異常検知のアルゴリズムを説明します。まず、ラベルなしの各データセットに対して、特徴量ごとにガウス分布に当てはめが確立 p(x) を求めます。次に、その特徴量ごとの p(x) を掛け合せた値を、最終的な p(x) とします。下記に、計算の手順をまとめます。
1 平均値算出
下記の数式で、平均値 μj を求めます。
2 分散算出
下記の数式で、分散 σj を求めます。
3 確率計算と閾値による異常判断
下記の数式で、ガウス分布による確率の積 p(xtest) を求め、閾値 ϵ と比較し異常判断します。ちなみに、下記の数式の Π は、各要素を掛け合わせること意味している。(Σ は足し合わせ)
Building an Anomaly Detection System
この章では、異常検知システムの開発と評価の方法を説明します。
Developing and Evaluating an Anomaly Detection System
この節では、異常検知システムの評価指標を説明します。教師あり学習の時に説明しましたが、評価指標を得ると言うことはとても重要です。何故なら、特徴量を加えた事でパフォーマンスが改善したか悪化したかを教えてくれるからです。そして、異常検知で評価するには、教師あり学習の時と似たことをします。そのためには、ラベルのないデータセットを、ラベル付けされたデータセットだと仮定して評価を行います。以下は、飛行機のエンジンの異常検知を例に説明します。
上記の画像のように、10000個の良いエンジンがあるとします。そして、良いエンジンと比べて圧倒的に少ない20個の不良のあるエンジンがあるとします。この場合、教師あり学習の時のように、良いエンジンのデータセットの60%をトレーニングセット、20%をクロスバリデーションセット、20%をテストセットに分割します。そして、不良のあるエンジンを半々にして、それぞれクロスバリデーションセットとテストセットについかします。
次に、トレーニングセットを使って、前節で説明した p(x) を求めます。その後、クロスバリデーションセットとテストセットでは、良いエンジンに対して y=0、不良のあるエンジンに対して y=1 とラベル付をして、教師あり学習と同様に p(x) の評価を行います。ここで注意するべきなのは、y=1 のデータが圧倒的に少なく、不均衡データになっています。なので、評価指標として、正答率を用いるのは不適切です。単に、いつもy=0と予測するだけで、とても高い分類精度が得られてしまいます。なので、F値という指標を使うのが良いです。F値については下記の記事を見てみてください。
この F値を指標にしながら、特徴量を追加したり、ε の値を調整したりします。これだけ見ると、「教師あり学習でなぜやらないのか?」と思いますが、これは次節で説明します。
Anomaly Detection vs. Supervised Learning
この節では、異常検知と教師あり学習の使い分けについて説明します。異常検知でも評価時に正解ラベル y を使いましたが、だったら教師あり学習でもいいのではないか、という疑問が出ます。端的に言うと、陽性のサンプルがほとんどなく、陰性サンプルが大量にある場合は、異常検知を使います。一方で、陽性も陰性もサンプルが十分にある場合は教師あり学習を使います。
陽性のサンプルが少ないと、そこからパターンを見出して、モデルにすることが難しいです。無理矢理モデルにしたとしても、すぐにモデルにそぐわないデータが出てくるのは容易に想像ができます。そういう場合、「原因は分からないけど、このデータ他と違いそう」という感覚で異常検知を用います。一方で、教師あり学習の時に説明したスパムメールは、世の中に大量のスパムメールがあり、スパムメールだと断定する原因(要素)もはっきりしています。なので、教師あり学習を用います。
下記が、異常検知と教師あり学習を用いる具体例です。
Choosing What Features to Use
この節では、どの特徴量を使うかの選択について説明します。基本的に2つの方法があります。一つは「ガウス分布になるように選択する」と、もう一つは「陰性と陽性の違いを見て選択する」という方法です。
まず、「ガウス分布になるように選択する」を説明します。上記の左下のグラフは、明らかにガウス分布のヒストグラムではありません。この場合、x を log(x) や √x などの処理を加えて、ガウス分布に近づくように変換します。データセットを手に入れたら、そのデータセットのヒストグラムを見て、ガウス分布なのかどうなのかを最初に確認すると良いらしいです。ただ、異常検知では、データセットのヒストグラムがガウス分布になっていなくても、そんなに大きな問題にならないらしいです。ただ、精度を上げたいなら、検討する手法の一つのようです。
次に、「陰性と陽性の違いを見て選択する」を説明します。これは、教師あり学習の時と同じです。例えば、飛行機のエンジンの異常検知だとします。そして、やることとしては、陰性と陽性になっているエンジンを実際に見比べて、違う箇所を特徴量として加えるということです。
Multivariate Gaussian Distribution
この章では、多変量ガウス分布(Multivariate Gaussian Distribution)について説明します。
Multivariate Gaussian Distribution
この節では、多変量ガウス分布がどういうものなのかを感覚的に説明します。詳しい数式の話は次節にします。前章で習った通常のガウス分布では対応できない場合があります。それは下図に左のような分布を持ったデータです。特徴量 x1 と x2 が関連していて中心から同心円状に分布しないような場合です。
上記のように、各特徴量に対して同心円にない場合に、多変量ガウス分布を使います。具体的には、前章までとは違い、モデル p(x1) 、p(x2) と独立して確率を定義しません。その代わりに、p(x) とひとつにまとめたモデルを算出します。そして、パラメータに μ と Σ(共分散行列)をインプットとして使います。これにより、分布を下図のように変化させます。
上記のように、共分散行列 Σ の対角成分を変更すると、各要素を円から楕円にすることができます。
上記のように、共分散行列 Σ の非対角成分を変更すると、非対角成分の傾き方向に円を引き伸ばす(楕円にする)ことができます。
上記のように、μ を変更すると、円の中心を移動することができます。
Anomaly Detection using the Multivariate Gaussian Distribution
多変量ガウス分布(Multivariate Gaussian Distribution)を使った異常検知のアルゴリズムを説明します。
1 平均値算出
下記の数式で、平均値 μj を求めます。(オリジナルと同じ)
2 分散算出
下記の数式で、共分散行列 Σ を求めます。
3 確率計算と閾値による異常判断
下記の数式で、ガウス分布による確率の積 p(xtest) を求め、閾値 ϵ と比較し異常判断します。
また、オリジナルのガウス分布と多変量ガウス分布の特徴を下記に示します。
オリジナルのガウス分布の特徴
- 新たな特徴量をマニュアルで作らなければいけない場合がある
- 計算コストが小さい
- トレーニングセットが少なくても機能する
多変量ガウス分布の特徴
- 特徴量間の関係性を自動で検知してくれる
- 計算コストが高い
- データ数が特徴量の種類数の10倍程度必要
上記の特徴から、オリジナルのモデルの方が、より頻繁に使われます。そして、「特徴量同士の相関を捉える必要があるんじゃないか?」と思った時は、単に人力でそれらの異常な値の組み合わせを捉える追加の特徴量を作って追加します。しかし、とても大量のトレーニングセット m を持っていて、 特徴量数 n がそんなに大きく無いような問題に直面している時は、多変量ガウス分布のモデルを 検討してみる価値があります。その事によって、異常な値の組を捉えるための追加の特徴量を人力で作るのに時間を費やさずに済む可能性があります。
最後に、ティップスを共有します。多変量ガウス分布のモデルを計算する時に、もし共分散行列 Σ が特異行列になってしまったら、特徴量に問題があります。つまり、特徴量が冗長になっている可能性があります。冗長な特徴量とは、単純に等しい二つの特徴量があったり、x3=x4+x5 のような 単純な足し算になっていて特徴的な意味を持たない特徴量のことです。その際は、その冗長な特徴量を取り除けば良いです。
Predicting Movie Ratings
この章では、レコメンダーシステム(Recommender System)について説明します。
Problem Formulation
レコメンダーシステムとは、Amazon や Netflix などで出てくるおすすめを表示する機能です。アカデミアの世界ではたいして話題にならない領域らしいですが、ビジネスの世界では非常に重視されるようです。この節では、記法の説明がメインです。
例えば、下表のような人ごとの5段階での映画評価のマトリックスがあったとします。
上記の表は以下の表記をします。
レコメンダーシステムというのは、これら r(i, j) と y(i, j) が与えられた時に、レーティングが欠けてる映画を探し出し、これらのクエスチョンマークの値がいくつとなるかを予測する問題と言い換えることができます。
Content Based Recommendations
この節では、前節の映画のおすすめの問題を、コンテントベースのレコメンデーション(Content Based Recommendations)を用いて実装します。コンテストベースドレコメンデーションとは、映画などの内容に着目して、レコメンデーションをする手法です。例えば、下表の2種類の映画があったとして、特徴量 x(i) を設定します。下表の例だと、x1 はその映画のアクション度を表し、x2 はその映画のロマンス度を表します。
そして、映画の特徴量を x(i)、学習すべきパラメータを θ(j) とし、線形回帰を用いて、予測するユーザ評価は以下の式で表します。
注意点として、パラメーター θ は各ユーザーごとに最適化させます。なので、θ(j) はユーザ j 専用のパラメーターを表しています。例えば1人目が田中太郎さんだとしたら、 θ1 は田中太郎さんの評価を予測するパラメータです。この θ を正則化をつかい、ユーザー全員に渡って目的関数を足して、下記の目的関数全体を最小化するように算出します。
この目的関数を求めたあとに、通常の線形回帰と同様に、最急降下法を使って、パラメーター θ を算出します。
コンテントベースのレコメンデーション手法の弱点は、すべての評価対象が特徴を持つことができない点です。全映画にロマンスやアクションなどの特徴を定義しておくことは現実的ではありません。
Collaborative Filtering
この章では、協調フィルタリングについて説明します。
Collaborative Filtering
まずは、協調フィルタリングの仕組みについて説明します。コンテントベースの場合は、映画の特徴量 x(i) から、ユーザごとの評価に対するパラメータ θ(i) を学習しました。協調フィルタリングでは、逆にユーザごとの評価に対するパラメータ θ(i) から、映画の特徴量 x(i) の学習をします。
数式は下記で示しますが、基本的に θ に対してやっていたことを、x に置き換えているだけです。
協調フィルタリングの面白い特徴は、θ→x→θ→x→…と交互に学習させていくと、段々と θ と x の両方が改善されていくことが分かっています。(講義内で数学的に証明はされていません。)それは、フィーチャーラーニングと呼ばれています。このフィーチャーラーニングが意味する所は、アルゴリズム自身が、なんのフィーチャーを使うかを自分自身で学習しはじめるということです。
Collaborative Filtering Algorithm
協調フィルタリングのアルゴリズムについて説明します。このアルゴリズムは、θ→x→θ→x→… と交互求めるのではなく、パラメーター θ と特徴量 x を同時に求めます。そのアルゴリズムは、以下の手順です。
1 パラメータ初期化
パラメータ x(1),…,x(nm), θ(1),…,θ(nu) を乱数で初期化します。これは第5週で学んだ、ニューラルネットワークの初期化と同じことをします。興味がある人は下記の記事を読んでみてください。
2 学習
下記の目的関数で両パラメータを同時に学習します。基本的に、前節までに出てきた θ と x を組み合わせただけです。
そして、下記の偏微分を用いて最急降下法によるパラメータ更新します。
特筆する点として、協調フィルタリングの場合、 x0 が必要ないです。何故なら、協調フィルタリングでは特徴量を全て学習することになり、いつも1と等しくなる特徴量(x0)を ハードコードする必要がなくなったからです。 もしアルゴリズムが いつも1となるフィーチャーを本当に必要としているなら、それは自身で勝手にそう学習するようになります。このことによって、偏微分の数式にも、x0 の場合分けがなくなっています。
3 評価値算出
学習したパラメータを使って各ユーザの映画に対する評価値を算出します。
Low Rank Matrix Factorization
この章では、低ランク行列分解について説明します。
Vectorization: Low Rank Matrix Factorization
低ランク行列分解という仰々しい名前がついていますが、要は協調フィルタリングのベクトル化のことです。協調フィルタリングをベクトルを使って実装すると、低ランク行列分解と呼ばれます。特に難しいことはなく、前章までの映画を例に取り、下記のような映画評価表に対して Y という行列を定義します。
そして、評価値の予測するには、以下の行列で表しました。
従って、Y はベクトル化された X と Θ を使って以下のように表されます。
これが、低ランク行列分解です。線形代数に詳しいと何故低ランク担っているのか分かるらしいですが、知らなくても良いそうです。また、単に y の値を求めるだけでなく、映画を x(i) ∈ ℝn の特徴量で表すと、映画同士の類似性を計算できます。||x(i)−x(j)||で計算し、値(距離)が小さければ類似しているということになります。
Implementational Detail: Mean Normalization
この節では、平均標準化(mean Normalization)を使って、アルゴリズムをちょっと良く機能させる説明をします。下記の表のように、Eve が新ユーザ登録して、全ての映画に対して未評価だったと仮定します。平均標準化をせずに、? の値を予測すると 0 になります。
何故なら、下記の目的関数の第一項と第二項は、全て ? なので、無視され θ のみで最小化するようになります。すると、θ の要素は全て 0 になるので、結果的に予測値を全て 0 にします。
しかし、既に評価されている映画を、0 と計算してしまうのは少し乱暴なので、平均標準化を使います。具体的には、? 以外の評価の平均 μ を算出し、それを各要素から引きます。そして、通常通りに協調フィルタリングを行います。最後に、予測値に μ を足します。これは、2週目に学習したフューチャースケーリングと考え方は同じです。ただ、評価の場合は値の最大値と最小値が決まっているのが少し違います。興味あると人は、記事を読んでみてください。
平均標準化をすることで未評価に0を使っても平均値が出力されます(平均を0とするので)。要は、何も分からないユーザーには、その映画の平均値を仮置するのは妥当であると言っています。
最後に今週のぶんの宿題のコードを載せておきます。とりあえず、指示に従ってレコメンドシステムの実装ができましたが、もっと練習が必要だなと思いました。
10週目の記事もあるので良かったら読んでみてください。