machine learning, week 6

機械学習モデルの検証の話.モデルの評価方法とその改善方法について.

Cross Validation(交差検定)は,集めてきたデータの一部をテスト用に取っておくやり方で,これにより新しくテストセットを取る必要がなくなる.

しかし,このテストセットを使ってパラメータチューニングを行うと,当然そのテストデータにOverfitting(High Variance)してしまう.すなわち,モデルをテストセットに合わせて変えてしまったので、そのモデルがテストセットで良い精度を示すのは当然.こうすると一般化エラー(Generalization error)を甘く見積もってしまう.

そこで,データを三分割する.

  • Training set: 60%
  • Cross validation set: 20%
  • Test set: 20%

こうすると,

  1. Training setだけを使ってモデルパラメーターを探し、モデルを作る
  2. そのモデルの精度を、Cross Validation setを使って確かめる
  3. モデル精度が悪ければ、Cross Validation setでの精度が上がるようモデルを作り直す
  4. 最終的にできたモデルをTest setに適用し、一般化エラー (Generalization Error) を推定する

この時,モデルパラメーターを推定するのにCross Validation set 及び Test set を使ってはいけない.また,Cross Validation setとTest setの違いはCross Validation setではモデルに戻ってモデルパラメーターを変えて精度を上げることが許されているが,Test setは最終的にできたモデルの精度を確認するだけで,その精度を上げるようにモデルを作り変えることはしてはならない.

そして,良いモデルとはTraining setでもCross Validation setでもTest setのいずれでも小さいエラーを示す.

また,Training setでもCross Validation setでもTest setのいずれでも高いエラーを示す場合,そのモデルはUnderfit(High Bias)しているという.

Training setでは小さいエラーであるがCross Validation setやTest setで高いエラーを示す場合,そのモデルはOverfit(High Varianve)しているという.

学習したモデルのエラーは次式で書ける.

 \displaystyle J(\theta)=\dfrac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2+\dfrac{\lambda}{2m}\sum_{j=1}^{m}\theta_j^2

第一項はモデルの予測値h_{\theta}(x) と実際の値yの差の二乗したものの各データでの和

第二項は正規化項で,overfitに対処するために正規化パラメータ\lambda を導入した.

この\lambda は下図のCross validation errorが最小となる点を選ぶ.なぜなら,左の方に行けばTrain error, Cross Validation error共に高くHigh Bias.右の方に行けばTrain errorは低いが Cross Validation errorが高くHigh Varianceを示すから.

Screen Shot 2017-04-02 at 7.02.36.png

対処法のまとめは次の通り

Underfit(High Bias)ならば…

  • 別の説明変数 (feature)を探す
  • 多項変数 (x_1^2, x_1x_2など)を追加する
  • 正規化パラメーター\lambdaを小さくする

Overfit(High Variance)ならば…

  • トレーニングデータ数を増やす
  • 説明変数 (feature)を減らす
  • 正規化パラメーター\lambdaを大きくする

講義中,何度も出てくる表現に「トレーニングデータを増やすのはモデルがOverfitしている時だけだ」というものがある.一般的にトレーニングデータの収集には時間がかかるので,Ng先生のこの忠告はよく覚えておこう.

話は少し変わり,集めてきたデータが偏っているという場合がある.

例えば,二値分類で1が99%,0が1%のTraining setであった時,いつも1を返すモデルは99%の精度を示すが,そのモデルは一般化エラーが低いと言えるだろうか.

このように偏りのあるデータ (skewed data)を扱う場合,分類精度 (Classification Accuracy)は信用できないので,代わりにF値(F score)を使う.

Predicted \ Actual Actual 1 Actual 0
Predicted 1 True Positive(真陽性) False Positive(偽陽性)
Predicted 0 False Negative(偽陰性) True Negative(真陰性)

これが仮にガン検査の結果だとすると,

真陽性:あなたは本当にガンです.

偽陽性:ガンではないがガンだと診断されてしまいました(精密検査でガンじゃないと分かってラッキー)

偽陰性:本当はガンなのにガンではないと診断されてしまった!ぬかよろこび!大変!

真陰性:あなたは本当にガンではないです.良かったですね.

そして,これらに次のPrecision(適合率), Recall(再現率)という指標を入れる.

Precision=\dfrac{\#(TruePositive)}{\#(TruePositive)+\#(FalsePositive)}

Recall=\dfrac{\#(TruePositive)}{\#(TruePositive)+\#(FalseNegative)}

適合率はy=1と予測したうち,実際にy=1な割合.この例だと,ガンと一次診断した人の中の一体何人が精密検査でガンであったかの割合.

再現率は実際にy=1であるうち,正しくy=1であると予測できた割合.今の例だと,ガンである人の中でガンであると正しく診断できた人の割合.

適合率と再現率は一般的にはトレードオフな関係になっており,モデルの予測値h_{\theta}(x) がある閾値が大きいときy=1と予測したとすると,閾値が小さければ(=疑わしい人は皆ガンと診断すると)再現率は上がり適合率は下がる.逆に大きければ(=確実にガンと思われる人だけをガンと診断すると)適合率が上がり再現率が下がる.

この適合率Pと再現率Rのバランスを定量化したものがF値で,

F=2\dfrac{PR}{P+R}

と表せる.複数のモデルがある場合F値が大きいものを選べば,偏りのあるデータにも対応できる.

広告

machine learning, week 5

今週は

  • NeuralNetworkのコスト関数
  • Backpropagationアルゴリズム
  • 微分チェック

を学ぶ.

まず,ニューラルネットワークのコスト関数を定義する.活性化関数にシグモイド関数を使った場合のニューラルネットワークのコスト関数はロジスティック回帰で使ったコスト関数を,より一般化したものである.

Screen Shot 2017-03-20 at 15.56.53.png

右辺第一項では,K個の出力ユニットがあるのでその和を計算している.第二項は正規化項である.

このコスト関数を最小化することを考える.これを計算するには各レイヤの\Thetaの各要素でJを偏微分したものが必要になる.すなわち,\Thetaを微小変化させた時にコストJの変化を見ていることになる.この偏微分を実行するために,出力と正解値の誤差を,出力層から入力層に向かって各層で誤差を伝播してゆきながら,その誤差が小さくなるようにΘを修正してゆく手法をバックプロパゲーション(誤差逆伝搬法)という.

まずfoward propagationを復習する.

Screen Shot 2017-03-20 at 15.58.33

これは入力層から出力層に向かって各レイヤにおけるz,aを求めている.

Screen Shot 2017-03-20 at 15.58.42

ここからbackpropagationである.出力層における誤差を計算する.

\delta^{(3)}_k = (a^{(3)}_k - y_k)

ここで\delta^{(3)}_kは出力層における誤差である.この誤差は出力値との差を計算することで得られる.

\delta^{(2)}_k = (\Theta^(2))^T\delta^{(3)}\cdot g'(z^{(2)})

次に\delta^{(3)}_kはレイヤ2(隠れ層)における誤差である.

そして各トレーニングレイヤ毎に計算した誤差を蓄積する為に,レイヤー枚に誤差を格納する行列\Delta^{l}=\Delta^{l}+\delta^{(l+1)}(a^l)^Tを計算する.

全てのトレーニングデータについてこれらの手順を実行した後,レイヤ毎に蓄積された誤差\Deltaをトレーニングデータ数で割ったものが,Jの\Thetaにおける偏微分である.

また,自分が実装したbackpropergation のアルゴリズムのJの偏微分が正しく動作しているかチェックするのが,微分チェックである.これは数学の極限の定義式を実装したものである.

Coursera機械学習コース内のForumでもWeek5のプログラミング課題がもっともChallengingだと記載されていおり,ここが最大の山場らしい.

参考:Coursera Machine Learning -Week5-のまとめ(ニューラルネットワークの学習)

Machine Learning, Week4

Multi-class classification と Neural Network を学ぶ

  • 多値分類は one-vs-all 法により,二値分類問題を全てのクラスに対しておこなったものとなる

screen-shot-2017-03-04-at-14-02-53

各dataに対して,class1, class2, class3… それぞれの確率を求め,その中で最も確率が高いものがそのdataが属するクラスに分類される.すなわち,

max_{i} h_{\theta}^{(i)}(x)

仮に,mクラスあったとすればone-vs-all法で行う二値分類の数はm回となる.

  • Neural network

これまではずっと回帰モデルが線形として学習をしてきた.すなわち,分類する境界面が平面であると仮定してきた(二次元だと直線)

しかし,実際には線形であることは少ない.例えば次のようなXNORの場合

Screen Shot 2017-03-04 at 14.21.43.png

どのような境界線を引いても,○と×は分けられないことが分かると思う.

そこで,考案されたのがNeuralNetworkである.

Screen Shot 2017-03-04 at 14.23.14.png

線形の時とは異なり,仮説h_{\theta}(x) の計算に他の次元を織り込む.そして,その織り込み方はbias unitを加えた上図のようなものだ.

大事なことはこれを多段に重ねる.すなわち,あるunitの出力は別のunitの入力として文字通りnetworkを構築することにある.

例えば,冒頭のXNORはどのように表せるかというと

Screen Shot 2017-03-04 at 14.29.16.png

x1 XNOR x2 = (x1 AND x2) OR ((NOT x1) AND (NOT x2))

と分解し,x1 AND x2 と (NOT x1) AND (NOT x2) の二つの出力を得たのち,それらを入力として(bias unitを加え)再び OR のlayerにつなげる.こうすることで,右下の真理値表の通り,XNORが得られる.

ANDやORは線形回帰でも表せるが,それを多段に組み合わせることによってXNORは解決できた.