Coursera Machine Learning: Week7 Support Vector Machines
移転しました。
CourseraのMachine Learningについてまとめています。 前回は、Week6の後半、Machine Learning System Designについてまとめました。
Week7では、SVM(Support Vector Machines / サポートベクターマシン)について学びます。
Week7
Support Vector Machines
Support Vector Machinesは、複雑な非線形の関数を学習する方法の1つです。
SVMを学ぶにあたり、まずは、Logistic Regression(詳細は、Week3前半のまとめを参照ください)について振り返り、それをベースに、SVMがどのようなものか学んでいきます。
Logistic Regressionでは、Hypothesis hを下記の数式で定義しました。
これは、
- y = 1のとき、h ≈ 1と出力したいので、θTx ≫ 0 である必要があり、
- y = 0のとき、h ≈ 0と出力したいので、θTx ≪ 0 である必要がある
ということです。
また、Logistic Regressionでは、コスト関数を下記のように定義し、それぞれの項のグラフは下記のようになっています。
SVMでは、このコスト関数を下記のように変えます。
ここで定義したcost1は、z=1以上で0となり、それ以下では、グラフで示したような直線となります。この直線の傾きはあまり関係ないそうです。cost0の場合も同様で、z=-1以下で0となり、それ以上では、グラフで示したような直線となります。
コスト関数に出てくるCは、パラメータで、1/λと同じような役割のものだとみなすことができるそうです。
SVMでは、コストを上記のように定義するため、y=1のときは、zが1以上(cost1=0)となることを求め、y=0のときは、zが-1以下(cost0=0)となることを求めます。hのことを考えると、y=1のとき、zが0よりも少しでも大きければ、h=1と予測するため、zは0よりも少しでも大きければ良いのですが、SVMの場合は、zが1以上となることを要求します。これは、SVMでは、追加のセーフティマージンを組み込んでいると考えることができるそうです。
コスト関数のパラメータCに、100,000等のかなり大きな数字を用いた場合、コストを最小化するために、y=1のときはz≧1、y=0のときはz≦-1を取ろうとし、下記のようにコスト関数の左側の項は0となります。
この際に、残る右側の項を最小化しようとすると、いい感じの境界線を得られるそうです。具体的には、下記図の緑やオレンジの境界線ではなく、黒色の境界線を得ることができるそうです。各境界線からサンプルまでの距離は、マージンと呼ばれ、黒色の線の方が緑やオレンジの線よりも大きなマージンを持っています。
また、パラメータCの値ですが、トレーニングデータには、外れ値も存在する可能性があるため、通常はそこまで大きなものとはしないそうです。Cが大きすぎると、外れ値に敏感になるため、下記のようなデータの分類の際に、オレンジ色の境界線となってしまいます。
SVMでは、どうしてこのように大きなマージンを取る境界線を引くことが出来るのか。Courseraの講義では、その数学的な説明も行なっているので、興味のある人は見てみてください。(すみません、そこまでちゃんと理解して記述できませんでした。。)
Kernels
SVMを用いて、複雑な非線形の分類器を構築するために、Kernels(カーネル)を用います。
下記のようなデータサンプルがあったとして、その境界線を得たいとします。これを行う方法として考えられるのが、下記の黒字で記載しているような多項式のフィーチャーを用いることです。ここで、多項式以外の、青字で記載したような数式の別のフィーチャーを用いることができないかと考えて作られたのがカーネルです。
新しいフィーチャーf1, f2, f3,,,を定義するために、まず、フィーチャーx1, x2の空間に、新たな点l(1), l(2), l(3)を置きます。このlは、ランドマークと呼ばれるそうです。ここで、新たなフィーチャーf1, f2, f3を、xとlのsimilarity関数として定義します。similarity関数は、xとlがどれだけ類似しているかを測る関数です。このsimilarity関数が、Kernel関数で、今回の関数は具体的には、Gaussian Kernels(ガウスカーネル)と呼ばれます。similarity関数には、ガウスカーネル以外にも様々なものがあるそうです。
similarity関数についてですが、xとlが近い時は、fの値は1に近くなり、xとlが離れている場合には、fの値は0に近くなります。図示すると下記のようになり、xとlの値が同じ場合に、最大値1を取ることがわかります。また、σの値によって、等高線の幅が変わることが分かります。
このカーネルがどのように複雑な非線形の問題に対応できるのか、具体例を用いて見ていきたいと思います。
例えば、下記図のように、フィーチャーx1, x2の空間に、ランドマークl(1), l(2), l(3)を置いたとします。また、予測のパラメータθも下記のように既に決まっていたとします。
このときに、適当な点をいくつか置いてみると、l(1)や l(2)の近くでは、f1もしくは、f2が1となり、予測結果y=1となります。また、そこから離れた点では、y=0となります。
結果として、下記図のように、l(1)や l(2)の近くではy=1となるような非線形の境界線を得ることができます。ランドマークとカーネル関数を定義することで、このように、複雑で非線形な境界線を学習させることが可能となります。
次に、ランドマークlの選び方ですが、基本的には、トレーニングデータをそのまま持ち入れば良いとのことです。
また、カーネルをSVMに適用する際、パラメータとしては、コスト関数に含まれるCと、カーネルに含まれるσ2があります。それぞれがBias、Varianceに与える影響は下記の通りです。
- C
- Large C: Lower bias, high variance
- Small C: Higher bias, low variance
- σ2
- Large σ2: Higher bias, lower variance(fの広がりが緩やかになるので)
- Small σ2: Lower bias, higher variance(fの広がりが鋭くなるので)
Using an SVM
最後に、実際にSVMを利用する際の流れについて学びます。
Multi-class classificationを行いたい場合は、多くのSVMライブラリでそれが実装されているため、それを用いれば良いとのこと。それがない場合は、分類したいクラスの数だけSVMとトレーニングし、one-vs.-allで対応すれば良いとのことです。
最後に、Logistic regressionとSVMのどちらを用いれば良いのかについてです。
- トレーニングデータ数に対し、Featureの数が十分に大きい場合は、Logistic regressionかカーネル無しのSVM(リニアカーネル)を用いる
- Featureの数が少なく、トレーニングデータ数が中くらいの場合は、ガウスカーネルのSVMを用いる
- Featureの数が少なく、トレーニングデータ数が多い場合は、新たなFeatureを追加し、Logistic regressionかカーネル無しのSVM(リニアカーネル)を用いる
- Neural Networkはどの場合でも使えるが、おそらく計算に時間がかかる
プログラミング演習
Week7のプログラミング演習では、SVMを用いて、スパムメールの分類を行います。演習の項目は、具体的には以下のものです。
- Gaussian Kernel
- Parameters (C, σ) for Dataset 3
- Email Preprocessing
- Email Feature Extraction
次回は、Week8の前半、Unsupervised Learning(教師なし学習)についてまとめます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learning: Week6-2 Machine Learning System Design
移転しました。
CourseraのMachine Learningについてまとめています。 前回は、Week6の前半、Advice for Applying Machine Learningついてまとめました。
Week6の後半のまとめです。ここでは、機械学習システムをどう設計していくかについて学びます。
Week6
Machine Learning System Design
受信したEmailがスパムか否かを判別する機械学習システムを構築するとして、精度を上げるためには、何を優先して対応する必要があるのか。下記のようにいくつか対応内容は考えられますが、何を優先すべきかについて今回は学びます。
- 多くのデータを集める
- EmailのHeaderから読み取れるルーティング情報を基に、洗練されたFeatureを開発する
- Emailの本文に関して洗練されたFeatureを開発する(例:"discount"と"discounts"は同じ言葉として扱うべきか、"deal"と"Dealer"の場合はどうか。句読点はどう扱うのか)
- スペルミスを検出するアルゴリズムを開発する。(例:m0rtgage, med1cine, w4tches)
Error analysis
機械学習システムを開発するにあたり、下記の進め方が推奨とのことです。
- 早く実装できるシンプルなアルゴリズムでまずは実装し、Cross validation dataを用いて検証する
- Learning curvesをプロットし、より多くのトレーニングデータが必要なのか、より多くのFeatureが必要なのか等、改善の道筋を探る
- Cross validation dataの中で、エラーが大きかったものに関して、そのエラーの分析を行い、エラーに傾向があるかどうかを検証する
Error analysisの進め方の例として、例えば、Emailのスパム検出で、100件のEmailを間違えて判別してしまった場合、まずは、そのEmailがどのようなカテゴリのEmailなのかを分類します。例えば、分類の結果、カテゴリとそのカテゴリに属するEmailの数が下記の通りであったとします。
- 薬事関連:12件
- 模造品販売:4件
- フィッシング:53件
- その他:31件
この場合、エラー件数の最も多いフィッシング関連のEmailの判別を改善することがシステムの改善に最も影響を与えるので、このカテゴリのEmailに関して、どのような手掛かり(Feature)がアルゴリズムの改善に影響を与えそうか、さらにEmailを分類します。
- ミススペル:5件
- 通常とは異なるルーティング:16件
- 通常とは異なる句読点の使い方:32件
この場合、通常とは異なる句読点の使い方を見分けるFeatureを開発することが、アルゴリズムの改善に役立ちそうだと考えられます。
また、エラー分析をしても、取ろうとしているソリューションがアルゴリズムの改善につながるのかよく分からない場合があり、そのような場合は、Cross validationのエラー値等、特定の数値を指標として、実際にトライ&エラーを繰り返して改善していく必要があるとのことです。
Error metrics for skewed classes
次に、腫瘍が悪性か否かを判別するアルゴリズムについて考えます。
開発したアルゴリズムの精度が99%であった場合、精度としてはかなり高いように思われます。しかしながら、そもそも悪性の割合が0.5%だった場合、この99%が本当に良い値なのか否かが分からなくなります。例えば、全て良性だと判別するアルゴリズムを開発した場合、明らかに意味のないアルゴリズムですが、その精度は99.5%となります。
このような間違った評価を行わないよう、Precision(適合率)とRecall(再現率)といった評価方法・考え方があります。
- Precision(適合率):1と予測・判断した対象のうち、実際に1だったものの割合
- Recall(再現率):実際に1である対象のうち、正しく1と予測・判断できた割合
しかしながら、このPrecisionとRecallには、トレードオフの関係があります。
例えば、確度が高いと判断したもののみ1と予測すると、Precisionは高くなりますが、Recallは低くなります。また、出来るだけ漏れ(False negative)を減らそうとすると、Recallは高くなりますが、Precisionは低くなります。つまり、どの程度の確度で1と判断するかの閾値によって、PrecisionとRecallの値はトレードオフで変わってきます。
このPrecisionとRecallの2つを合わせて評価する指標として、F1 Score(F Score / F値)があります。F1 Scoreは、下記の数式で表されます。
例えば、下記のような3つのアルゴリズムがあった場合、PrecisionとRecallの平均値では、アルゴリズム3の結果が良いですが、F1 scoreでは、アルゴリズム1が最も良いと評価されます。
Data for machine learning
学習に用いるデータ量の話です。
2001年にマイクロソフトのMichele Banko氏とEric Brill氏が自然言語解析において、データ量の与える影響について研究を行ったそうです。複数のアルゴリズムに対し、データ量を増やしていった場合の精度を計測し、その結果、下記のグラフを得たそうです。
このグラフの意味するところは、精度を決めるのは、用いたアルゴリズムではなく、データ量であるということです。データ量を増やすことによって、そこまで優れたアルゴリズムでなくとも、優れたアルゴリズムと同等かそれ以上の結果を出すことができるようです。
講義で参照されている論文は、おそらく、下記の論文だと思われるので、興味のある人は読んでみてください。
Scaling to Very Very Large Corpora for Natural Language Disambiguation
Michele Banko, Eric Brill
https://www.aclweb.org/anthology/P01-1005.pdf
ここで、データ量が重要であるという話をしていますが、前提となるのは、結果を予測するのに十分なFeatureが存在するということです。多くの十分なFeatureがあり(High Biasになりづらい状態)、多くのトレーニングデータがあれば(High varianceを防ぐ)、良い結果を出すことができるようです。
ちなみに、十分なFeatureが存在することを確認する方法として、そのデータから、人間のエキスパートが結果を予測可能かどうかを検証するという方法があるそうです。
Artificial data synthesis
多くのトレーニングデータを準備する方法として、データを作り出すという方法があります。例えば、文字認識では、下記の図のように、画像を歪ませたり、ノイズを加えることによって、データ量を水増しすることが可能なようです。
特に講義で語られている訳ではありませんが、最近は、シミュレータ上でAIのトレーニングデータ生成を行う企業も出てきているようなので、こういった手法でのデータ生成も今後増えていくのだと思います。
プログラミング演習
Week6のプログラミング演習では、 Regularized linear regressionを実装し、異なるBias-Varianceプロパティのモデルを学習します。演習の項目は、具体的には以下のものです。
- Regularized Linear Regression Cost Function
- Regularized Linear Regression Gra- dient
- Learning Curve
- Polynomial Feature Mapping
- Cross Validation Curve
次回は、Week7 Support Vector Machines(サポートベクターマシン)についてまとめます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learning: Week6-1 Advice for Applying Machine Learning
移転しました。
CourseraのMachine Learningについてまとめています。 前回は、Week5 Neural Networks Learningについてまとめました。
Week6の前半のまとめです。ようやく半分まできました。ここでは、機械学習のデバッグ方法等について学びます。
Week6
Advice for Applying Machine Learning
下記のコスト関数のLinear regressionを実装し、住宅の価格予測を行ったとします。
この時に、予測した値が実際の値から大きくずれていた場合、どのように対応すべきでしょうか。例えば、下記のようなオプションがありますが、実際にどのように対応していけば良いのかをここでは学んでいきます。
Evaluating a hypothesis
まずは、仮説の評価方法について。評価するにあたり、トレーニングデータの70%をTraining set、30%をTest setとしてデータを分けて利用するのが良いとのことです。30%をテスト用に残しておくことで、70%のデータでトレーニングした結果の仮説がどのくらいの精度なのかを評価することができます。Linear regressionとLogistic regressionのテストエラーは、下記の数式で計算可能です。
Model selection and training/validation/test sets
何次の多項式のFeatureまで用いるのか、正規化パラメータλをいくつにするのかといった問題は、モデル選択問題と呼ばれています。これを行うために、データをTraining setとTest setの2つではなく、Training set、Cross validation set、Test setの3つに分けます。割合としては、Training set: 60%、Cross validation set: 20%、Test set: 20%くらいにするのが良いそうです。
例えば、何次の多項式のFeatureまで用いるのかを検討する場合、1~10次までのパターンを準備し、それぞれTraining setを用いてトレーニング、その結果をCross validation setを用いて、検証します。検証の際には、上記で記載したテストエラーと同様の数式を用いてコストを算出し、コストが最小となる多項式のパターンを選択します。最後に、そのパターンに対して、Test setを用いて、エラーを検証します。
何次の多項式を選んだかは、Cross validation setを用いてフィッティングしたことになるため、Test setを用いてモデルの汎化誤差を測ることができます。
Diagnosing bias vs. variance
機械学習で、アルゴリズムを走らせていて、期待していたほどの結果が出ていない場合、その問題は、多くの場合、High bias(アンダーフィット)かHigh variance(オーバーフィット)の2つに分けられるそうです。
この検証にもCross validation setを用います。先ほどと同じように、何次の多項式のFeatureまで用いるのかを検討する場合、横軸を多項式の次数とし、縦軸をエラーとして、下記のようなグラフを描画します。グラフの左側では、Training errorが高く、Cross validation errorも同様に高くなっています。この場合は、High bias(アンダーフィット)だと考えられます。一方で、グラフの右側では、Training errorが低くなっているが、Cross validation errorが高くなっており、トレーニングデータにフィットさせすぎている、High variance(オーバーフィット)の状態だと考えられます。High biasやHigh varianceにならないよう、Cross validation errorが最小となる次数を選択する必要があります。
Regularization and bias/variance
次にRegularization λがどのようにBiasとVarianceに影響を与えるかを学びます。λは、各Featureからの影響が大きくなりすぎないよう、High varianceを抑えるために、各パラメータへのペナルティとして導入しました。
λが大きい場合は、λを考慮しないθ0以外の、θ1以降のパラメータがゼロに近くなるため、θ1=0, θ2=0,,, h=θ0 となり、High biasとなってしまいます。一方で、λが小さい場合は、べナルティが小さいため、High varianceになってしまいます。
グラフにすると下記のようになり、λの選択の際も、Cross validation setを用いて、Cross validation errorが最小となるようなλを選択します。
Learning Curves
最後に、Learning curves(学習曲線)について学びます。Learning curvesは、アルゴリズムが正しく機能しているかの確認や、アルゴリズムのパフォーマンス改善に役立ちます。Learning curvesをプロットする際は、Training set mを横軸に取りグラフを描きます。
モデルがHigh bias(アンダーフィット)になってしまっている場合は、トレーニングデータを増やしたとしても意味がなく、下記のようなグラフとなります。
一方で、モデルがHigh variance(オーバーフィット)になってしまっている場合は、トレーニングデータを増やすことに意味があり、Cross validation errorは、トレーニングデータ量に応じて下がっていきます。
Deciding what to try next
最後にまとめです。冒頭で下記のようなオプションを提示しましたが、それらがどのような意味があるのかを整理します。
- トレーニングデータを増やす → High varianceへの対応
- Featureの数を減らす → High varianceへの対応
- Featureの数を増やす → High biasへの対応
- 多項式のFeature(x12, x22, x1*x2 等)を追加する → High biasへの対応
- λを小さくする → High biasへの対応
- λを大きくする → High varianceへの対応
また、Neural Networkのサイズ(Hidden layerの層数とそのUnit数)についても言及があります。
- 小さな Neural Network(Hidden layerの層数が少なく(1層とか)、Unit数が少ない)場合:
- High bias(アンダーフィット)になりやすい
- 必要な計算量が少ない
- 大きなNeural Network(Hidden layerの層数が多く、Unit数が多い)場合:
- High variance(オーバーフィット)になりやすい
- 必要な計算量が多い
- オーバーフィットには、λを用いて対応する
次回は、Week6の後半、Machine Learning System Designで、機械学習システムをどう設計していくかについてまとめます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learning: Week5 Neural Networks Learning
移転しました。
CourseraのMachine Learningについてまとめています。 前回は、Week4 Neural Networks Representationについてまとめました。
Week5では、Week4で学んだNeural Networksをどう学習させるかについて学んでいきます。AIを勉強しているとよく聞く、Backpropagation(バックプロバゲーション)についても出てきます。
Week5
Neural Networks: Learning
Cost Function
Neural NetworkでのMulti-class classificationについて学んでいきます。Week4で触れたように、Multi-class classificationでは、分類するクラスの数だけのOutput unitを持ちます。下記図のように、Kクラスの分類では、K個のOutput unitを持ちます。
この場合のコスト関数は、Logistic regressionの場合と同様に、下記のようになります。
Backpropagation
コスト関数を最小化するため、これまでと同様に、Gradient(コスト関数JのΘでの偏微分)を計算する必要があります。この計算に、Backpropagationを用います。
Backpropagationに入る前に、まずは、Forward propagationの振り返りからです。Week4では、下記のようにForward propagationを計算しました。この計算をBackpropagationでも用います。
まず、各レイヤのエラーδを考えると、下記のように計算できます。ここで、".*"は、Octave/MATLABで用いている、要素ごとの掛け算です。(行列の掛け算ではない)
補足として、gの微分は、下記のように計算できます。
このエラーδにActivationのaを掛けたものが、コスト関数JのΘでの偏微分として扱うことができるので、Backpropagationのアルゴリズムとしては、下記のようになります。Forward propagationとは逆に、Output layerの誤差から、誤差を逆伝播させて各層の誤差を計算していくので、Backpropagationと呼ばれています。
なんか複雑ですね。感覚的には分かるような分からないような。。
Gradient checking
上記で記載したBackpropagationですが、実装する上でミスすることもあるようで、そのミスをチェックするためのGradient checkingについて学びます。
微分は、傾きを求めるものであり、傾きは、十分に小さな幅での変位から近似的に求めることができるので、下記の数式でも近似的に計算することができます。
具体的には、各θについて、下記のように近似的な傾きを計算し、Backpropagationで計算している微分の値とおおよそ一致するか否かをチェックすることで、バグがないかどうかを確認することができます。この近似的な計算は、Backpropagationでの計算と比較し、計算リソースを食い、時間が掛かってしまうので、あくまでもデバッグ用で、実際のAIトレーニングを行う際は、オフにするのが良いとのことです。
Random initialization
Backpropagationの計算を始めるにあたり、Θの値を初期化する必要があります。Θの値を0で初期化してしまうと、各層のActivationが同じ値を取ってしまい、うまく行かないため、-ε 〜 ε の間のランダムな数値で初期化するのが良いとのことです。(ここでのεは、上記のGradient checkingのεとは別)
Putting it together 開発の流れ
最後に、ここまで学んできたことをベースに、どのように開発を進めるのか、その流れを学びます。
- Neural Networkのネットワークアーキテクチャの選択(Hidden layerが何層あり、そのUnit数はいくつか)
・Input layerは、Featureの次元数
・Output layerは、分類するクラスの数
・Hidden layerは、1層以上とし、そのUnit数は、各Hidden layerで共通にするのがおすすめとのこと - Weight Θをランダムに初期化
- Forward propagationを実装
- コスト関数Jの計算を実装
- Backpropagationを実装
- Forward propagationとBackpropagationをトレーニングデータを用いて実行
- Gradient checkingを行い、Backpropagationが正しく計算されているか確認
- Gradient descentか他の最適化手法とBackpropagationを用いて、コスト関数Jを最小化するΘを探索
また、講義の最後に、Neural Networkを利用している例として、自動運転での適用例が紹介されます。興味のある方は、見てみてください。
プログラミング演習
Week5のプログラミング演習では、Neural Network向けにBackpropagationを実装し、手書きの数字認識を行います。演習の項目は、具体的には以下のものです。
- Feedforward and Cost Function
- Regularized Cost Function
- Sigmoid Gradient
- Neural Net Gradient Function (Backpropagation)
- Regularized Gradient
次回は、Week6の前半、Advice for Applying Machine Learningについてで、機械学習のデバッグ方法等についてまとめます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learning: Week4 Neural Networks Representation
移転しました。
CourseraのMachine Learningについてまとめています。 前回は、Week3の後半、Regularizationについてまとめました。
Week4では、Neural Networksの表現について学びます。ついにNeural Networkです。AIっぽいですね。
Week4
Neural Networks: Representation
Neural Networkでは、ここまで学んできたLinear RegressionやLogistic Regressionでは対応できないような、非線形で複雑な仮説を学習させるために用います。例えば、下記の図のような車か否かの判別モデルです。
コンピュータ上で画像を処理する際は、人が目で見ているような画像ではなく、ピクセルごとの数字として処理されます。例えば、50×50ピクセルの画像であれば、2,500ピクセルあり、白黒画像なら2,500の変数となり、それぞれのピクセルが0~255の値を持っています。RGB画像であれば、各ピクセルが赤、緑、青のそれぞれの色について0~255の値を持つので、3倍の7,500の変数となります。50×50の小さな画像でもこれだけの大きさの変数となります。こういった複雑なものを学習させるのにNeural Networkが役に立ちます。
Neural Networkの歴史
Neural Networkは、脳の機能を模倣するアルゴリズムとして開発され、1980年代から90年代前半に広く使われていたそうです。しかしながら、90年代後半から下火になっていき、近年になって再度注目されるようになってきました。再度注目されるようになってきた背景としては、GPUの活用等による計算リソースの増加、トレーニングに用いることができるデータの増加があり、画像認識等様々な分野での活用が始まってきたためと理解しています。
Model representation
Neural Networkは、脳のニューロンを模倣するように作られました。最もシンプルなモデルが下記です。x0はBias Unitと呼ばれ、常に1をとります。ネットワーク上にあえて記載されない場合もあります。入力xに対して、パラメータθ(weights, 重み付け)を掛けて、シグモイド関数を通して、hが出力されます。
このシンプルなモデルに層を加えていくと、よく見るNeural Networkの形になっていきます。追加したLayer 2は、Hidden Layer(隠れ層)と呼ばれます。
Hidden layerのa(activation)やhは、下記のように計算されます。Θ(j)は、レイヤjからレイヤj+1を計算する際のweightのマトリクスです。
下記のようにInput layerから、次のHidden layerの値を順々に計算していき、最終的にOutput layerの値を計算するのが、Forward propagationです。
Intuitions
Neural Networkが非線形問題に対応できることの説明として、XOR/XNORの非線形の分類問題について学びます。XNORの分類は、下記図のような分類です。x1, x2が0か1の値を取るとして、下記のようなyを出力します。XORの場合は、yの値が逆になります。
- x1=0, x2=0 → y=1(下記図の×)
- x1=1, x2=0 → y=0(下記図の◯)
- x1=0, x2=1 → y=0(下記図の◯)
- x1=1, x2=1 → y=1(下記図の×)
XNORを作るために、まずは、AND、OR、NOTを作っていきます。
これらを組み合わせることにより、XNORを作ることができます。
また、Neural Networkを利用した例として、Yann Lecun氏の手書きの数字の文字認識の動画が紹介されました。興味のある人は見てみてください。
Handwritten Digit Classification - Yann Lecun
Multi-class classification
最後に、Neural Networkを用いた場合の、Multi-class classificationについて説明があります。下記図のように、Output layerにそれぞれのクラスを割り当てるようなNeural Networkを構築することにより、Multi-class classificationが実現できるようです。例えば、0~9の手書き文字認識では、10のユニットのあるOutput layerとなります。
プログラミング演習
Week4のプログラミング演習では、one-vs-allのlogistic regressionとNeural Networkを実装し、手書きの数字の認識を行います。演習の項目は、具体的には以下のものです。
- Regularized Logisic Regression
- One-vs-all classifier training
- One-vs-all classifier prediction
- Neural Network Prediction Function
次回は、Week5 Neural Networks Learningについてまとめます。今回学習したNeural Networkを用いて、実際にAIの学習を進めていきます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learning: Week3-2 Regularization
移転しました。
CourseraのMachine Learningについてまとめています。 前回は、Week3の前半、Classificationについてまとめました。
今回は、Week3の後半、Regularizationについてです。
Week3
Regularization
Regularizationは、オーバーフィットを避けるために行います。Linear regressionとLogistic regressionのオーバーフィットのイメージです。
Overfittingを避けるためのオプションとしては以下があります。
- Feature(変数、特徴量)の数を減らす
- どのFeatureを使うのかマニュアルで選ぶ
- Model selection algorithm(本Machine Learningコースで後ほど学ぶそうです)
- Regularization
- 全てのFeatureをキープするが、パラメータの大きさを小さくする(多くのFeatureがあり、それらが少しずつ予測に寄与している場合にうまく動くそうです)
Regularizationでは、Overfitを避けるために、パラメータθにペナルティをかけます。具体的には、下記の図のように、コスト関数にθの二乗を加え、θが大きくなり過ぎないようにします。こうすることで、予測のラインがグニャグニャの複雑すぎるものになることを防ぎます。
Regularizationを行う場合のLinear Regressionのコスト関数は、以下になります。
Regularizationの対象とするθは、θ0(Featureと関係のないバイアス項)を除いた、θ1以降です。また、λはRegularizationパラメータで、マニュアルで決める必要があります。λが大き過ぎると、θが全て0に近くため、Under fitしてしまい、小さ過ぎると、Regularizationの意味がなくなり、Overfitしてしまいます。
Gradient Descentについては、これまでと同様に、コスト関数をθで微分したものにLearning rateを掛けて更新していきます。具体的には下記の数式になります。
Logistic Regressionの場合も、Linear Regressionと同様に考えれば大丈夫です。コスト関数は、下記のものになり、Gradient Descentは、Linear Regressionと同じになります。
プログラミング演習
Week3のプログラミング演習では、前半で学んだLogistic Regressionを実装し、その後、RegularizedされたLogistic Regressionを実装します。演習の項目は、具体的には以下のものです。
- Sigmoid Function
- Compute cost for logistic regression
- Gradient for logistic regression
- Predict Function
- Compute cost for regularized LR
- Gradient for regularized LR
次回は、Week4 Neural Netoworks Representationについてまとめます。ついに、Neural Networkが登場します。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。
Coursera Machine Learning: Week3-1 Classification
移転しました。
CourseraのMachine Learningについてまとめています。 前回は、Week2 Linear Regressionについてまとめました。
今回は、Week3のまとめです。Week3では、Classification(分類)とRegularizationについて学びます。少し長くなりそうなので、2回に分けて記載します。
Week3
Logistic Regression
Classificationは、以下のような問題で利用します。
- Eメールのスパム判定
- オンライン取引が詐欺か否か
- 腫瘍が悪性か否か
具体的には、悪性腫瘍の予測では、下記のように、腫瘍のサイズによって悪性かどうかを判別します。(y=1だと悪性、0だと良性)
結果が0か1かなので、0.5をしきい値として、Hypothesisが0.5以上なら悪性、0.5未満なら良性と判断し、0~1の間の値を取るモデルを構築します。具体的には、Logistic Regressionでは、下記のモデルを用います。シグモイド関数ですね。
シグモイド関数gは、下記グラフのように、z=0で0.5をとります。今回は、hが0.5以上、つまり、θTxが 0以上の際に悪性と判断され、hが0.5未満、θTxが0未満の際に良性と判断されます。
また、パラメータθを求めるためのコストですが、Logistic Regressionでは、以下のように定義します。
緑色のグラフがy=1, Cost = - log(h) で、赤色のグラフが、y=0, Cost = - log(1-h)です。y=1の場合は、hが1となればコストが0となりますが、hが0に近くとコストが無限大に大きくなります。y=0の場合はその逆です。
各トレーニングデータのコストを計算し、平均を取ればLogistic regressionのコスト関数になります。
Logistic regressionのGradient Descentは、このコスト関数をθに関して微分すればよく、計算すると下記の数式になります。
Optimization algorithm
ここまで、Optimization algorithmとしてGradient Descentを用いてきましたが、Week3では、下記の他の手法もさらっと紹介されます。
- Conjugate gradient
- BFGS
- L-BFGS
これらのアルゴリズムの利点としては、Learning rateをマニュアルで設定する必要がない、Gradient Descentより高速な場合が多いといった点が挙げられ、欠点としては、Gradient Descentより複雑だとのことです。各手法の具体的な中身の紹介はありませんが、Octaveで用意されている関数を用いれば、これらのアルゴリズムも簡単に利用できるとのこと。
Multi-class classification
ここまで、Eメールがスパムか否か、腫瘍が悪性か良性かといった1か0の問題を扱ってきましたが、複数のクラスの場合の対応についても説明があります。複数のクラスの場合とは例えば、以下のような分類のケースです。
- Emailのフォルダ分け:仕事関連、友達関連、家族関連、趣味関連
- 医療診断:病気ではない、風邪、インフルエンザ
- 天気:晴れ、曇り、雨、雪
Multi-class classificationでも、やることはBinary classificationの場合と同じで、クラスごとに、そのクラスか否かのBinary classificationを行い、その結果をまとめるとMulti-class classifiationが行えるということのようです。
個人的な疑問ですが、クラスが分からないもの、つまり画像認識とかで今まで見たことがないものが出てきた場合は、どうするんでしょうね。知らないものであれば、Unknownとするのがいいように思えるのですが、このMulti-class classificationでは、一番近いと判断されるクラスに分類されるはずです。今度時間があるときに調べてみようと思います。
次回は、Week3の後半、Regularizationについてまとめます。
コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。