Coursera Machine Learning: Week11 Application Example: Photo OCR
移転しました。
CourseraのMachine Learningについてまとめています。 前回はWeek10 Large Scale Machine Learningについてまとめました。
今回は、Week11 Application Example: Photo OCRについて学びます。
Week11
Application Example: Photo OCR
Week11で、本Machine Learningのコースは終わりです。最後は、機械学習の応用例として、Photo OCR(Photo Optical Character Recognition / 画像中の文字認識)について学びます。
Photo OCRでは、下記のように、画像中のどこに文字があるかを検出し、そのテキストを読み取ります。
Photo OCRでは、下記のように文字認識を行います。まず、画像中から文字列を検出し、その検出した文字列を文字ごとに分割、最後にその文字を認識します。
Sliding windows
Photo OCRでは、まず文字列の検出を行いますが、その文字列の大きさや形状は画像によって様々です。そのような中で文字列を検出するために、Sliding windowsを用います。 Sliding windowsでは、画像の一部分を特定のサイズ(82×36等)で切り出し、その画像に文字が含まれているかどうかをチェックし、その切り出す箇所を4ピクセル、8ピクセル等の特定のステップサイズで動かしていき、画像全体をスキャンします。また、特定のサイズの切り出しだと、それより大きな文字を見逃してしまう可能性があるため、より大きなサイズで切り出し、決めておいたサイズ(82×36等)に縮小して文字が含まれているかどうかをチェックします。これを行うことで、最終的に、画像中のどこに文字列が含めれているかを検出することができます。
文字列検出の後は、文字分割です。ここでもSliding windowsを用いて、下記図のように文字が分割できるかどうかを分類します。
Getting lots of data
Photo OCRを行うにも、大量のデータが必要になります。データを集める方法としては、Week6の後半で紹介したような、人工的にデータを増量する方法や、人手でデータを集めてラベル付けする方法、人手で行うにしても、Amazon Mechanical Turk等のクラウドソーシングを利用する方法等があります。これらの方法を比較し、コスト的に見合う方法を選択します。
また、データを増やすことに労力を使う前に、Learning Curves等を確認し、モデルがLow Biasであり、データを増やすことに効果があることを確認しておくことが重要です。
Ceiling analysis
今回のPhoto OCRでは、文字列検出、文字分割、文字認識の3つの機械学習のモデルを開発しますが、最終的な精度を上げるために、どの機能を改善すべきなのか。開発に使えるリソースは限られているため、どこに注力するかを見極めるのが重要になります。そこで使えるのがCeiling analysisです。
Ceiling analysisでは、下記画像のように、各コンポーネントをプロセスに沿って、精度100%に模擬的に置き換えて行き、どのくらいシステム全体の精度が改善されるかを確認します。下記の例では、文字列検出の精度が100%になった場合、全体の精度が17%向上されるので、ここの改善に労力を使おうとなります。
また、各コンポーネントを模擬的に精度100%に置き換える方法ですが、各コンポーネントの出力を手動で正解のものに置き換えてしまいます。
プログラミング演習
Week11では、プログラミング演習はありません。(Week9でプログラミング演習は最後となります。)
以上で、Coursera Machine Learningのコースは終了です。11週のコースを通して、機械学習の基礎を学ぶことができました。Andrew Ng先生ありがとうございました。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learning: Week10 Large Scale Machine Learning
移転しました。
CourseraのMachine Learningについてまとめています。 前回はWeek9の後半、Recommender Systemsについてまとめました。
今回は、Week10 Large Scale Machine Learningについて学びます。
Week10
Large Scale Machine Learning
Week6の後半で、大量のデータを学習に使うことにより、そこまで優れたアルゴリズムでなくとも、優れたアルゴリズムと同等かそれ以上の結果を出すことができるといったことを学びました。Week10では、そのような大きなデータをどのように扱うかについて学びます。
Stochastic gradient descent
これまで、様々な場面でGradient descentを用いてきましたが、ここではそれを改変した、Stochastic gradient descent(確率的最急降下法)について学びます。
まず、線形回帰モデルにGradient descentを適用した場合は、Hypothesisやコスト関数、Gradient descentは下記の数式で表せます。
このとき、トレーニング用のデータ量mがかなり大きい場合、上記の数式で青の破線で囲んだコスト関数の微分項の計算コストがかなり大きくなってしまいます。ちなみに、これまで使ってきたこのGradient descentのことを、"Batch gradient descent"と言います。"Batch"とは、毎回の計算で全てのトレーニングデータを用いることを表しています。
このBatch gradient descentでは、全てのトレーニングデータを用いているのですが、計算量を減らすために、各イテレーションで1つのトレーニングデータだけを用いるのがStochastic gradient descentです。Stochastic gradient descentでは、コスト関数をトレーニングデータ全体に対するコスト関数ではなく、下記のようにトレーニングデータx(i), y(i)に対するコスト関数として定義します。ちなみに、このコスト関数をトレーニングデータ1~mまで計算し、平均をとれば、Batch gradient descentのコスト関数と一致します。
Stochastic gradient descentでは、まずは、トレーニングデータをシャッフルし、各トレーニングデータに関して、上記で記載した数式(定義したコスト関数の微分 × Learning rate)を用いてパラメータθを更新します。1~mまで全てのトレーニングデータを用いてパラメータをアップデートし、それを複数回繰り返します。これで、パラメータをフィットさせていきます。
Batch gradient descentでは、全てのトレーニングデータを用いるため、最適解(コストのGlobal minimum)に向けてパラメータが更新されていきますが、Stochastic gradient descentでは、ランダムにシャッフルされたトレーニングデータを1つずつ用いてパラメータを更新していくため、まっすぐにGlobal minimumに向かうわけではなく、蛇行しながら最適化されていくような形になります。また、Stochastic gradient descentでは、最終的には収束せず、Global minimumの周囲をうろちょろするような形になります。ただし、Global minimumのすぐそばの領域であれば、Global minimumに極めて近いため、仮説としては十分なようです。
また、パラメータの更新を繰り返す回数ですが、1~10回程度が一般的なようです。
Mini-Batch Gradient Descent
Batch gradient descentでは、全てのトレーニングデータを用いてパラメータを更新し、Stochastic gradient descentでは、1つのトレーニングデータを用いてパラメータを更新しました。その間の手法として、いくつかのトレーニングデータを用いてパラメータを更新していく手法のことを"Mini-batch gradient descent"と言います。また、その際に用いるデータの数をMini-batch sizeと言います。トレーニングデータのサイズmが1,000、ミニバッチサイズbが10の場合、Mini-batch gradient descentのアルゴリズムは、下記のように記載できます。
ミニバッチサイズは、2~100の間で、10程度が一般的なようです。
Stochastic gradient descent convergence
ここまで、Stochastic gradient descentとMini-batch gradient descentのアルゴリズムについて学びました。次に、Stochastic gradient descentにおいて、どのように収束しているかを確認するのかについて学びます。また、Learning rate αの小技も紹介されます。
収束の確認をする際、Batch gradient descentでは、イテレーション数に対してコスト値をプロットし、収束を確認していました(Week6前半のLearning Curves参照)。Stochastic gradient descentでは、その確認のために、全てのトレーニングデータを加味したコストをそのために計算するのであれば、せっかく1つだけのデータを用いて計算量を減らしたのに、計算量が増えてしまいます。そのため、本記事の上の方で定義したトレーニングデータx(i), y(i)に対するコスト関数を用いて、ある程度の計算ごとに、その平均のコストを計算、プロットし、収束しているかを確認します。例えば、1,000個分のデータに対して計算するごとに、その1,000個分のデータのコストの平均を計算し、プロットします。
次に、Learning rate αについて。Stochastic gradient descentでは、最終的には収束せず、Global minimumの周囲をうろちょろするような形になります。これをよりGlobal minimumに近づけるために、Learning rateを定数ではなく、下記のような数式に置き換え、イテレーションに合わせて減少させていくという手法があるそうです。
ここで、Const1、Const2は定数です。ただ、そこまでGlobal minimumにこだわらなければ、αを定数としてしまっても十分なようです。
Online learning
これまでは、すでに準備されたトレーニングデータから学習するアルゴリズムについて学んできました。ここでは、次々と新しいデータが得られ、それを用いてモデルを更新していく場合に用いる、オンライン学習について学びます。
例えば、Web上で受け付ける配達サービスを運営しており、出荷元から出荷先までの地点をもとに、配達価格を提示していたとします。ユーザーがサービスを利用した場合をy=1、利用しなかった場合をy=0とし、Logistic regressionの問題として扱い、どのような場合にy=1となるのかを予測し、配達価格を最適化したいとします。この時に扱うFeatureは、ユーザーのプロパティや出荷元/出荷先、提示価格のデータで、新たにユーザーのデータが得られるたびに、下記のように計算し、予測のパラメータを更新していきます。
Map-reduce and data parallelism
これまでは、1台のPCで計算を行うことを前提としてきましたが、複数台のPCに作業を割り振り、計算時間を短縮することも可能です。
その1つの方法が、Map-reduceで、例えば400のトレーニングデータがあるとして、下記のように4つのPCで100ずつ計算し、その結果をマスターのサーバで集め、パラメータの更新を計算するといったことを行います。これにより、およそ4倍のスピードアップを行うことができます。
プログラミング演習
Week10では、プログラミング演習はありません。(Week11もなく、Week9でプログラミング演習は最後となります。)
次回は、Week11 Application Example: Photo OCRについてまとめます。長かった講義も次で最後です。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learning: Week9-2 Recommender Systems
移転しました。
CourseraのMachine Learningについてまとめています。 前回はWeek9の前半、Anomaly Detectionついてまとめました。
今回は、Week9の後半、Recommender Systemsについて学びます。
Week9
Recommender Systems
Recommender systemは、機械学習の重要な適用例の1つです。例えばAmazonの書籍のリコメンドやNetflixの映画のリコメンド等。今回は、このリコメンドシステムをどう構築するかについて学んでいきます。
リコメンドシステムの1例としてあげられるのが、下記図のような映画評価の予測です。各ユーザーが視聴済みの各映画に対して0~5のレート付けを行っており、評価していない映画については、"?"を記載しています。この未評価の映画について、各ユーザーがどの程度の評価を付けるかを予測し、評価が高くなりそうな映画を次に観る映画としてリコメンドします。下記の例では、上3つの映画が恋愛映画に分類でき、下2つの映画がアクション映画に分類できます。このカテゴリと各ユーザーの評価をもとに、未評価の映画がどのくらいの評価になりそうかを予測します。
Content-based recommendations
最初のアプローチとして、コンテンツベースリコメンデーションについて学びます。
まず、各映画にx1とx2の二つのFeatureがあるとします。x1はその映画がどのくらいロマンティックな映画なのか、x2はその映画がどのくらいのアクション映画なのかを測る指標です。
これにバイアス項のx0を加えて、例えば、Cute puppies of loveのFeatureベクトルx(3)は下記のように表せます。
また、各ユーザーの評価を予測するために、各ユーザーのパラメータベクトルθ(1), θ(2), ... , θ(j)を学習する必要があります。例えば、Aliceのパラメータθ(1)が既に下記のように得られていたとして、AliceのCute puppies of loveの評価を予測するために、x(3)とθ(1)を掛け合わせ、4.95の評価が得られると予測できます。
この後コンテンツベースリコメンデーションのアルゴリズムを説明するにあたり、必要な項目を下記のように定義、整理します。
パラメータθ(j)を求める方法としては、Linear regressionと同様に考えれば良く、下記のコスト関数で求めることができます。ここで、i:r(i, j)=1とは、r(i, j)=1となる(ユーザーが映画の評価を行っている)全てのiに対して総和を取るという意味です。
また、実際には、1人のユーザーjに対するパラメータを求めるのではなく、全てのユーザーのパラメータを学習する必要があるため、ユーザーの総数をnuとして、コスト関数は、下記のように書き換えることができます。
Gradient descentについては、下記のように計算することができます。
以上が、コンテンツベースリコメンデーションのアルゴリズムで、各ユーザーの映画への評価を予測することができます。しかしながら、この方法は、映画のコンテンツ(どのくらいロマンチックなのか、アクションなのかが定義されたフィーチャー)が分かっている前提のアルゴリズムです。この後、そうでない場合のアルゴリズムについて説明していきます。
Collaborative filtering
Feature含めて学習する方法として、Collaborative filtering(協調フィルタリング)について学びます。
まず、各映画のFeature x1、x2が下記のように不明な状態であり、一方で、各ユーザーの好みは把握することが出来ていて、パラメータθが分かっている状態だと仮定します。
この場合、映画iのFeatureは、コンテンツベースリコメンデーションの時と同様に下記のコスト関数で求めることができます。
また、全ての映画についても、同様に下記のコスト関数で求めることができます。
つまり、パラメータθが分かっていれば、Feature xを求めることができ、Feature xが分かっていれば、パラメータθを求めることができます。最初にランダムにパラメータθの値を推測しておき、θ → x → θ → x → θ ... と繰り返すことで、リーズナブルなパラメータとFeatureに収束させることができます。これが協調フィルタリングのアルゴリズムの考え方です。ちなみに、これが可能なのは、各ユーザーが複数の映画をレーティングしていて、全ての映画が複数のユーザーにレーティング場合のみとのことです。
θとxを行ったり来たりしながら解いていくと記載しましたが、より効率的な方法として、下記数式のように、2つのコスト関数を合わせてしまうことも可能とのことです。
協調フィルタリングを利用する際には、下記のように進めます。
- x(1), x(2), ... , x(nm)とθ(1), θ(2), ... , θ(nu)を小さな値でランダムに初期化
- 下記のGradient descent、もしくはその他の最適化アルゴリズムを用いてコスト関数Jを最小化
- θとxを用いて、映画の評価を予測(θTxを計算)
プログラミング演習
Week9のプログラミング演習では、まずは、異常検知アルゴリズムを実装し、ネットワーク上のサーバーの障害検知に適用します。次に、協調フィルタリングを用い、映画のリコメンドシステムの構築を行います。演習の項目は、具体的には以下のものです。
- Estimate Gaussian Parameters
- Select Threshold
- Collaborative Filtering Cost
- Collaborative Filtering Gradient
- Regularized Cost
- Gradient with regularization
プログラム演習は、今回で最後であり、Week10, 11は講義のみとなります。
次回は、Week10 Large Scale Machine Learningについてまとめます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
2019国際ロボット展のAI関連の展示を観てきました
移転しました。
こんにちは! うしじです。
最近は、空いた時間にCoursera Machine Learningの講義内容のまとめを行っていたのですが、なかなか時間が掛かってしまい、気分転換に別の記事を書いてみたいと思います。
AIの適用分野として、個人的に興味を持っているのが、産業用ロボットです。2019国際ロボット展(iREX)を観てきたので、AIを用いた展示をいくつか紹介したいと思います。
国際ロボット展を観に行くにあたり、興味があったのが、下記のAI関連企業の3社。
PFNさん、Exawizardsさんは日本の有名なAI企業ですが、OSAROさんはアメリカの企業です。この3社に加えて、見ていて面白そうだった、安川電機さんの展示について紹介したいと思います。
PFN
PFNさんは、Fanucさんと提携しており、Fanucさんのブースで展示を観ることができました。今回展示されていたのは、取り出し位置教示による深層学習バラ積み取出し、AI良品判定の2つです。
取り出し位置教示による深層学習バラ積み取出し
こちらの展示は、おそらく、PFNさんが下記のブログで記載されている内容の展示だと思われます。取出したい対象物の位置を3Dカメラで認識し、ロボットで吸着しに行きます。ここで、吸着に成功したか否かのデータを取っておき、そのデータを用いて教師あり学習で取出しをどんどん改善していくようです。
AI良品判定
こちらは、下記の記事で記載されているものの展示です。OKとNGの画像が数枚〜数十枚あれば学習できるらしいです。どのようにやっているんでしょうね。
Exawizards
Exawizardsさんは、マルチモーダルAI COREVERYを展示されていました。人が手でロボットを動かし、それを学習データとして収集、収集したデータからAIモデルを生成し、粉体や液体の秤量、サラダ等の盛り付け、タオルの折りたたみ等に利用できるそうです。また生成したAIモデルを追加の学習データを用いて再学習を行うことも可能とのこと。従来ロボットで対応することが難しかった作業を、人が簡単に教えられるようになると、ロボットの活用の幅が広がりそうですね。
OSARO
OSAROさんは、デンソーウェーブさんのブースで、OSARO Visionの新機能、オリエンテーションチェッカの展示を行っていました。認識が難しい透明なものを認識し、ピッキングすることが可能で、今回さらに、対象物の方向も認識できるようになったそうです。
安川電機
安川電機さんのブースでは、AIとデジタル環境の活用によるバラ積みピッキングが展示されていました。
安川電機さんのAIで面白いなと思ったのが、教師データの生成方法。シミュレータの中で対象物のバラ積みの様子を生成するのですが、実世界とシミュレータの差を埋めるために、シミュレータのデータを実世界のデータのように変換しています。GANか何かの技術でしょうか。
まとめ
今回、iREXのAI関連の展示を観てみて、各社、データの準備方法を工夫してるなと思いました。ロボット自身の行動の結果をデータとして残したり、人の行動をもとにデータを作成したり、シミュレータを用いてさらに現実に近づけたり。やはりAIを開発する上で、いかにデータを準備するかが重要ですね。
また、本記事で紹介した以外にも、外観検査やピッキング向け等の様々なAIが展示されていました。他企業含め、機会があれば継続的にチェックしていきたいと思います。
Coursera Machine Learning: Week9-1 Anomaly Detection
移転しました。
CourseraのMachine Learningについてまとめています。 前回は、Week8の後半、Dimensionality Reductionについてまとめました。
今回は、Week9の前半、Anomaly Detectionについて学びます。
Week9
Anomaly Detection
今回は、Anomaly detection(異常検出)について学習します。Anomaly detectionには、教師なし学習のものと教師あり学習のものがありますが、今回は、教師なし学習のAnomaly detectionを主に扱います。(ただし、Featureの選択において、一部教師あり学習のようなことも行います。)
Anomaly detectionは、下記のような場面で用いられます。
- 不正検出
- Webサイト上で奇妙な行動を取っているユーザーを検出する等
- 製造業での異常品検出
- 航空機のエンジンを製造し、品質保証テストを行う場合、熱や振動等を計測し、通常と異なる値になっていないか確認する等
- データセンターのコンピュータのモニタリング
- メモリやディスクアクセス、CPU負荷等をモニタリングし、コンピュータが落ちる可能性がないか確認する等
例えば、上記の航空機エンジンの異常品検出では、下記のように、熱や振動のFeatureを見て、通常と異なる発生確率のものをAnomalyとして検出します。
Gaussian distribution
Anomaly detectionを学ぶにあたり、まずは、ガウス分布(正規分布)から学びます。
ガウス分布は、統計学等様々な場面で用いられる確率分布で、下記の数式で表されます。また、確率変数xが平均μ、分散σ2の正規分布に従うことを、x~N(μ, σ2) と記載するそうです。
また、ガウス分布をグラフにすると下記のようになります。
また、平均μと分散σ2を変化させると、下記のような分布に変わります。
Anomaly detection algorithm
ここで学ぶAnomaly detectionのアルゴリズムは、あまり複雑なものではなく、簡単なものです。各Featureの確率分布を計算し、それを掛け合わせた確率分布と閾値εを比較し、小さなもの(確率分布的にほとんど発生しないもの)を異常として検知します。具体的には、下記のような流れ、数式で異常検知を行います。ここで演算子Πは、Σの掛け算バージョンです。
次に、このAnomaly detectionのアルゴリズムを実際に開発する場合ですが、これまで行ってきた教師あり学習のように、データをTraining set、Cross validation set、Test setに分けます。割合は、60%、20%、20%程度とし、Training setには、正常(Anomalyでない)なデータのみを用い、平均や分散を計算し、p(x)を準備します。その後、Cross validation setを用い、p(x)を評価し、用いたFeatureがそれで良いか否かを確認します。評価には、Week6で学んだPrecision/RecallやF scoreを用います。
また、閾値であるεを選択する方法として、様々なεの値を用い、F1 scoreを最大化するεを選ぶという方法があります。
Anomaly Detection vs. Supervised Learning
上記では、Featureやεの値を選ぶために、ラベル付きデータを用いました。ラベル付きデータがあるのであれば、教師あり学習を行うこともできます。どのような場合にAnomaly detectionを使い、どのような場合に教師あり学習を使うべきなのか、下記がその指標になるとのことです。
- Anomaly detectionを使うべき場合
- 異常(y=1)のデータが少ない
- 正常(y=0)のデータが多い(ガウス分布のパラメータをフィッティングし、p(x)を推計する場合には、y=0のデータしか必要としないため)
- 様々な種類の異常があり、異常(y=1)のデータの特徴を学習しづらい場合
- 教師あり学習を使うべき場合
- 異常(y=1)と正常(y=0)の双方のデータが大量にある
- 異常時のデータがどのようなものなのか、特徴を学習できると思われる場合(今後発生すると想定される異常データと同様の異常データがトレーニングデータに存在する)
Choosing what features to use
次に、どのFeatureをAnomaly detectionに用いるかについてです。
Featureを選択する際に、まずはそのデータのヒストグラムを確認してみることが良いそうです。分布がガウス分布のように分散していればそのまま用いても良いのですが、非対称で、ガウス分布と異なる分布の場合は、そのFeatureを変換して用いるのが良いそうです。変換には、Logを取ったり、2乗や0.5乗等のべき乗を取る方法等があるそうです。
また、異常検知では、正常データではp(x)が大きな値となり、異常データではp(x)が小さな値となる必要があります。あるFeatureをもとに異常検知を行ってみて、p(x)が正常データでも異常データでも大きな値となってしまった場合、異常時はp(x)が小さくなるような、他のFeatureを追加する必要があります。そのFeatureは、複数のFeatureを組み合わせて新たに作ることも可能で、例えば、データセンターのPCのモニタリングの場合は、CPU負荷をネットワークトラフィックで割ったFeature(トラフィックが少ないのに、CPU負荷が高い場合に大きな値となる)を使うことなどが考えられます。
Multivariate Gaussian distribution
下記のようなデータがあった際に、ガウス分布を用いた異常検知では、オレンジの線のように異常検知を行い、青い線のような異常検知は行えず、緑色の異常データは、正常と判断されます。このような場合に青い線のように異常検知を行うには、Multivariate Gaussian distribution(多変量正規分布)を用います。
多変量正規分布を用いた場合のAnomaly detectionのp(x)は、下記の数式で計算可能です。ここで出てくる変数Σは、n×nの行列で、Week8で出てきた共分散行列です。
正規分布を用いたAnomaly detectionでは、Featureを組み合わせて新たなFeatureを作る必要がありましたが、多変量正規分布を用いた場合は、Feature間の相関関係を自動で加味してくれます。しかしながら、計算量が多くなるといった問題や、トレーニングデータ数mがFeatureの次元nより十分に大きい必要があります。
次回は、Week9の後半、Recommender Systemsについてまとめます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learning: Week8-2 Dimensionality Reduction
移転しました。
CourseraのMachine Learningについてまとめています。 前回は、Week8の前半、Unsupervised Learning(教師なし学習)ついてまとめました。
今回は、Week8の後半、Dimensionality Reductionについて学びます。
Week8
Dimensionality Reduction
今回は、クラスタリングとは別の教師なし学習である、Dimensionality Reduction(次元削減)について学びます。主に、PCA(Principal Component Analysis / 主成分分析)について扱います。
次元削減を行う動機の1つとしては、データ量の圧縮があり、データの圧縮を行うことにより、必要なメモリやディスク容量を削減し、また学習アルゴリズムの高速化も行うことができるそうです。
次元削減の分かりやすい例として、cmとinchの2のFeatureがあったとします。両方が長さの情報であり、下記図のように、この2つのFeatureを近似した緑の直線上に、cmとinchのデータを射影させれば、1つの長さの情報として扱うことができ、2次元から1次元へ変換することが可能です。
3次元から2次元への次元削減も同様で、下記のような3次元のデータがあったとして、そのデータを近似できるz1, z2で定義できる平面を新たに定義すれば、3次元から2次元のデータへ、次元を減らすことができます。
また、次元削減を行うもう一つの動機として、Data Visualization(データの可視化)があげられるそうです。例えば、6次元のデータがあったとして、それをみても人が理解しやすいようにプロットすることは難しいので、そのデータを2次元や3次元に次元を削減することによって、人が理解しやすいように、データを可視化することが可能になるとのことです。
Principal Component Analysis (PCA / 主成分分析)
ここから、次元を削減するためのアルゴリズムの1つである、主成分分析について学んでいきます。
例えば、2次元を1次元に削減したい場合、下記図のような黒丸のデータがあったとして、次元を削減するために、2次元のデータを射影するための直線を引く必要があります。赤線がその直線のよい例で、この場合、各データとの距離(青い実線)は小さくなります。この距離は、射影誤差とも呼ばれ、これを最小化する線(3次元から2次元では、平面)を探すことがPCAが行うことです。一方で、オレンジ色の線は、射影誤差(青い点線の長さ)が大きく、良くない例と言えます。
PCAがやることをもう少し数学的に記載すると、n次元からk次元へ次元削減を行いたい場合、データの射影誤差を最小化する、k次元の平面(k個のベクトルu(1), u(2), … , u(k))を探すということです。
また、PCAを適用する際には、まず平均標準化(平均値を0にする)とフィーチャースケーリングを行っておくのが良いとのことです。
次に、実際のPCAの計算方法を学んでいきます。数学的な導出や証明は本コースでは特に学習せず、どのように利用するかを学習します。
平均標準化、フィーチャースケーリング後に、PCAで次元を削減(n次元からk次元へ削減)する際に行うことは、まずは、Covariance matrix(共分散行列)を計算することです。共分散行列(Σ)は下記の数式で表され、x(i)がn×1のベクトルのため、Σはn×nの行列となります。
次に、得られた共分散行列Σに対し、Eigenvectors(固有ベクトル)を計算します。固有ベクトルの計算は、Matlab/Octaveでは、下記のコマンドで行うことができます。
- [U,S,V] = svd(Sigma)
svdは、Singular Value Decompositionの略です。
固有ベクトルの計算の結果、下記のようなn×nの行列であるU行列を得ることができます。
このU行列に対し、先頭からk個分のベクトル(次元削減後の次元数分)を抜き出し、xを掛ければ、次元削減後のk次元のベクトルであるzを得ることができます。
Reconstruction from compressed representation
次元削減後のzから、次元削減前のxの近似値xapproxを求めるには、下記図式のように計算を行えば求めることができます。
Choosing the number of principal components(主成分の数kの選び方)
次元削減後の次元数kは、主成分の数とも呼ばれ、ここではその選び方を学びます。
まず、Average squared projection error(二乗射影誤差の平均)と、Total variation in the data(データ全体の分散)は、下記の式から得ることができます。
kを選ぶ際には、これらの値の比を0.01以下(1%以下)にするのが良いとのことです。1%以下にした場合には、99%の分散が保持されていると言い換えられ、どれだけの分散を保持したいかによって、0.01を小さくしたり大きくしたりするそうです。(0.05以下にすれば、95%の分散が保持される。95%も良く使われるらしい)
また、この値は、固有ベクトルを計算した際に用いた下記のコマンドから得られるS行列からも得ることができるそうです。
- [U,S,V] = svd(Sigma)
S行列は、n×nの正方行列であり、対角成分以外は0の下記のような行列とのことです。このS行列を用いることにより、先ほどの数式を下記のように書き直すことができるとのことです。
PCAを用いて、99%の分散を保持して、次元を削減する場合は、上記の数式が0.99以上となる最小のkを選べば良いということになります。
ここまでPCAについて学んできましたが、前半部分で記載した通り、PCAを用いて次元を削減する目的は、メモリやディスクの容量を削減し、トレーニングの速度を向上させる、もしくは、可視化のために次元数を減らすということです。
分散をある程度維持したとしても、PCAを用いることにより、データの内容関係なく、データを削減することとなり、重要なデータを削減してしまう可能性もあるため、オーバーフィッティングに対応するため等、PCAの目的外での利用はやめた方が良いとのことです。機械学習システムを構築する場合は、まずは、PCAを用いずにオリジナルのデータを用いてトレーニングを行い、メモリやディスク容量、トレーニング速度の問題があった場合のみPCAを利用するのが良いとのことです。
プログラミング演習
Week8のプログラミング演習では、まずは、K-meansクラスタリングアルゴリズムを構築し画像の圧縮を行い、次に、PCAを用いて次元削減を行った顔画像の生成を行います。演習の項目は、具体的には以下のものです。
- Find Closest Centroids
- Compute Centroid Means
- PCA
- Project Data
- Recover Data
次回は、Week9の前半、Anomaly Detectionについてまとめます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learning: Week8-1 Unsupervised Learning
移転しました。
CourseraのMachine Learningについてまとめています。 前回は、Week7 Support Vector Machines(サポートベクターマシン)についてまとめました。
今回は、Week8の前半、Unsupervised Learning(教師なし学習)について学びます。
Week8
Unsupervised Learning(教師なし学習)
教師なし学習とは何でしょうか。これまでの講義で扱ってきたのは、教師あり学習で、下記図のようにラベル付き(y=0 or 1とか)のデータが与えられ、それを基に境界線を引いたり、予測を行ったりしてきました。
教師なし学習では、このようなラベルは無く、ラベル付けされていないトレーニングセットから、データの特徴を探し出すことを行います。例えば、下記図のように、各データがどのようにグループ化できそうか、クラスタを探すクラスタリングアルゴリズムが教師なし学習です。
このようなクラスタリングには、下記のような使い道があります。
- マーケティング分析(マーケットのセグメンテーション)
- ソーシャル・ネットワーク分析(同質なグループを見つけ出す)
- コンピュータのクラスタの分析(どのPCがデータセンターにある他のクラスタと一緒に仕事をする傾向にあるか等の分析を行い、リソース配分等に活用する)
- 銀河の形成を理解するための研究
K-means algorithm
クラスタリングアルゴリズムとして人気のアルゴリズムの1つがK-means algorithmです。K-means algorithmでは、下記図のようにクラスタリングを行います。
K-meansアルゴリズムでは、下記の2つの入力を必要とし、下記図のように計算を進めます。
また、K-meansアルゴリズムは、下記のようなTシャツのサイズ分け等にも利用可能とのことです。S, M, Lサイズをどのくらいのサイズにするのか検討するのに用います。
Random initialization
Cluster centroidsをランダムに初期化する際に、よく用いられる方法としては、トレーニングデータの中から、ランダムにK個取り出し、それをCluster centroidsに用いるという方法があるそうです。
しかしながら、ランダムに初期化した場合に、うまく全体最適できれば良いのですが、下記図のように局所最適解に陥ってしまう場合もあります。
これを解決するためには、K-meansを複数回初期化し、複数回実行するのが良いとのことです。例えば、100回初期化してそれぞれK-meansを実行すると、100個の異なるクラスタリングの結果が得られます。最後に、この結果から、一番コスト(下記の式。各データから属しているCentroidまでの距離の二乗の平均)の低いものを選べば、良いクラスタリングが得られます。
次回は、Week8の後半、Dimensionality Reductionについてまとめます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。