トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Cousera 機械学習 - Week1

このエントリーをはてなブックマークに追加

[機械学習]

Week1

  機械学習について

いろいろな分野で機械学習を使った技術が適用されている。それは、目的を満たすために機械学習を選択するしか無いからだ。何かを自動化する場合、人間が全てをプログラミングするのは限界があり、機械自体にその方法を学ばせる、それが最も効率的で今需要がある方法だ。

 「明示的にプログラムすることなしに学ぶという能力をコンピュータに与えることが機械学習の定義である。」
 〜 Arthur Samuel

  教師あり学習(Supervised Learning)

  • 回帰問題(Regression Problem)
    • 将来の予測っぽいやつはこれ
  • 分類問題(Classification Problem)
    • データの分類、どれがどっちのグループに入るかはこれ
複数の特徴に対して使用できる機械学習のアルゴリズムがあるよ、ということでサポートベクターマシン
Support Vector Machine って,なに?

  教師なし学習(Unsupervised Learning)

事前に正解が無い機械学習のこと。

Clustering Algorithm

  • ex) SNSのネットワーク分析
  • ex) ネットワーク使用率
  • ex) マーケティング

Cocktail party problem(カクテルパーティー問題)

2つのマイクで取得された2人の声を解析してクラスタリングする
難しそうに見えるがOctaveならすぐ実装できる、試作がしやすい

ex) svd関数はOctave上ではただの線形代数ライブラリ

  凡例と目的関数(Model and Cost Function)

m
データセットの数
x's
入力値、特徴
y's
出力値、目標
  • 表記は以下のように
    • x(0) = 1919810
    • x(1) = 114514
 
       ---------------
       | Training Set|
       ---------------
              ||
              \/
     ---------------------
     | Learning Algorithm|
     ---------------------
              ||
              \/
 
 Size of ==> { h } ==> Estimated
 house                 price
 
  • hHypothesis (仮説) を意味する

どうやって仮説h を定義するか?、とりあえず h(x) とおく。

→ 線形回帰(Linear Regression)

  目的関数(Cost Function)

  • 簡単な例としては以下のような1次関数

h%5F%5Ctheta%28x%29+%3D+%5Ctheta%5F0+%2B+%5Ctheta%5F1+x+

  • データセットと求めるべき線形回帰の式の差分を最小化する
    • 以下のように書くと、その意味になる
 minimize
  θ0θ1

  目的関数1 (Cost Function - Intuition I)

Hypothesis:

h%5F%5Ctheta%28x%29+%3D+%5Ctheta%5F0+%2B+%5Ctheta%5F1+x+

Parameters:

%5Ctheta%5F0+%2C+%5Ctheta%5F1+

Cost Function:

J%28%5Ctheta%5F0+%2C+%5Ctheta%5F1%29+%3D+%5Cfrac%7B1%7D%7B2m%7D+%5Csum%5F%7Bi%3D1%7D%5Em+%28h%5F%5Ctheta%28x%5E%7B%28i%29%7D%29+%2D+y%5E%7B%28i%29%7D%29%5E2+

Goal:

%5Cunderset%7B%5Ctheta%5F0+%2C+%5Ctheta%5F1%7D%7Bminimize+%7D+J%28%5Ctheta%5F0+%2C+%5Ctheta%5F1%29+

簡素化された目的関数

%5Ctheta%5F1+%3D+1+or+0%2E5+ とすると、上の式から全てのh(x)が求められる。

クイズ

J%28%5Ctheta%5F1%29+%3D+%5Cfrac%7B1%7D%7B2m%7D+%5Csum%5F%7Bi%3D1%7D%5Em+%28h%5F%5Ctheta%28x%5E%7B%28i%29%7D%29+%2D+y%5E%7B%28i%29%7D%29%5E2+

なおかつ %5Ctheta%5F1+%3D+0 のとき、 J%280%29+ は?

ちなみに m のとる値は 3

自分の解答

整理すると、

%5Ctheta%5F1+%3D+0 なので

%5Ctext%7BH%3A+%7D+h%5F%5Ctheta%28x%29+%3D+%5Ctheta%5F1+x+%3D+0+

m に 実数をあてはめて

J%28%5Ctheta%5F1%29+%3D+%5Cfrac%7B1%7D%7B2+%2A+3%7D+%5Csum%5F%7Bi%3D1%7D%5E3+%28h%5F%5Ctheta%28x%5E%7B%28i%29%7D%29+%2D+y%5E%7B%28i%29%7D%29%5E2+

シグマを原始的な足し算に変えると

J%28%5Ctheta%5F1%29+%3D+%5Cfrac%7B1%7D%7B2+%2A+3%7D+%5Cbigl%7B+%280%2D1%29%5E2+%2B+%280%2D2%29%5E2+%2B+%280%2D3%29%5E2+%5Cbigr

J%28%5Ctheta%5F1%29+%3D+%5Cfrac%7B1%7D%7B6%7D+%5Cbigl%7B+1+%2B+4+%2B+9+%5Cbigr

J%28%5Ctheta%5F1%29+%3D+%5Cfrac%7B14%7D%7B6

  目的関数2 (Cost Function - Intuition II)

  • パラメーターが2つになる。プロットは実際二次関数やもっと高次の関数になるかも。
  • 授業ではこれから等高線図を使う。
  • さっきの h%5F%5Ctheta%28x%29+ を左に、 J%28%5Ctheta%5F0+%2C+%5Ctheta%5F1%29+ を右にしてグラフを描く。
  • すると、右の図における座標(θ0, θ1)が等高図の中心に近づくほど、左の図の関数がデータセットに近くなる

実際はこのような図をプロットすることは、関数が高次になるほど難しいのでやるべきではない。次の章で、右の関数Jを最小化するアルゴリズムを教えてくれるらしい。

  最急降下法 (Gradient Descent)

図解

  • 関数 J%28%5Ctheta%5F0+%2C+%5Ctheta%5F1%29+ があり、それを最小化したい
  • 関数を図示すると3次元の丘みたいな感じになる、θ0とθ1が縦と横、J(θ0,θ1)が高さ
  • 最初θ0とθ1を0とかと仮定して少しずつ変化させてJの最小値を見つける
  • 3次元の丘を降りていく感じ

数学的に

アルゴリズムを数学の式で表したもの

 \coloneqq がGoogle Chart APIになかったぞ…
  • %5Ctext%7Brepeat+until+convergence+%5Cbigl%7B+%5Ctheta%5Fj+%3A%3D+%5Ctheta%5Fj+%2D+%5Calpha+%5Cfrac%7B%5Cdelta%7D%7B%5Cdelta%5Ctheta%5Fj%7D+J%28%5Ctheta%5F0+%2C+%5Ctheta%5F1%29+%5Cbigr%7D+%2C+%5Ctext%7B%28for+j%3D0+and+j%3D1%29%7D+
    • ":=" はプログラミングではおなじみのassignment(代入を意味する)
    • αはlearning rate(学習率)というものらしい、丘の傾きを意味する
    • J()は導関数項、よくわからない
    • 右のj=0, j=1が条件として優先されるのに注意

結構プログラミング的ですね、疑似コードで表すとするとこんな感じ?

std::vector<int> theta;

for (int j = 0; ; j++ ) {
    theta.push_back(theta[j-1] - alpha * J(theta_0, theta_1));
    if (xxx::is_min(theta, theta[j])) {
        std::cout << "this is minimum: " << theta[j] << std::endl;
        break;
    }
}
  • クイズはわりと簡単だったので省略

  最急降下法 (Gradient Descent Intuition)

  • 最急降下法を普通の二次関数に簡略化して、学習率(learning rate)の動きを見る

J%28%5Ctheta%5F0+%2C+%5Ctheta%5F1%29+ ではなく J%28%5Ctheta%5F0%29+ で考える

  • 最急降下法のアルゴリズムをプログラムで実行したとすると
    • アルゴリズム中のθjは二次関数の接点の傾きが正の数であれば負の方に動く
    • アルゴリズム中のθjは二次関数の接点の傾きが負の数であれば正の方に動く

というのは式の一部に注目すればなんとなくわかるはず(ほんとはグラフ書きたい)

%5Ctheta%5Fj+%3A%3D+%5Ctheta%5Fj+%2D+%5Calpha+%5Cfrac%7B%5Cdelta%7D%7B%5Cdelta%5Ctheta%5Fj%7D+J%28%5Ctheta%5F0+%2C+%5Ctheta%5F1%29 ← 分数でδになってるとこ、高校数学の微分積分でやった接点の傾きです。

というわけで、接点の傾きに従ってθjをどんどん更新していくと、最終的に局所的最小値に達する。

そんでもって、局所的最小値に達すると接点の傾きが0になるので、それ以上θjは更新されない。丘(というより谷)の底に達する。

(´-`).。oO (局所的最小値ということは、関数が複雑だとホントの最小値が見つからないことがあったりするのかな??)

  線形回帰のための最急降下法 (Gradient Descent For Linear Regression)

最急降下法を線形回帰のために使う。難しい式変形をしていく。

結果的にシータが0と1のときの場合分けをしないと解けないらしい。

  • %5Ctheta%5Fj+%3D+0+ : %5Cfrac%7B%5Cdelta%7D%7B%5Cdelta%5Ctheta%5F0%7D+J%28%5Ctheta%5F0+%2C+%5Ctheta%5F1%29+%3D+%5Cfrac%7B1%7D%7Bm%7D+%5Csum%5F%7Bi%3D1%7D%5Em+%28h%5F%5Ctheta%28x%5E%7B%28i%29%7D%29+%2D+y%5E%7B%28i%29%7D%29+
  • %5Ctheta%5Fj+%3D+1+ : %5Cfrac%7B%5Cdelta%7D%7B%5Cdelta%5Ctheta%5F1%7D+J%28%5Ctheta%5F0+%2C+%5Ctheta%5F1%29+%3D+%5Cfrac%7B1%7D%7Bm%7D+%5Csum%5F%7Bi%3D1%7D%5Em+%28h%5F%5Ctheta%28x%5E%7B%28i%29%7D%29+%2D+y%5E%7B%28i%29%7D%29+%5Ccdot+x%5E%7B%28i%29%7D+

最急降下法 & 線形回帰のアルゴリズム

%5Ctext%7Brepeat+until+convergence+%5Cbigl%7B+%5C%5C+%5Cth%5F0%3A%3D+%5Cth%5F0+%2D+%5Calpha%5Cfr%7B1%7D%7Bm%7D%5Csum%5F%7Bi%3D1%7D%5Em%28h%5F%5Cth%28x%5E%7B%28i%29%7D%29%2Dy%5E%7B%28i%29%7D%29+%5C%5C+%5Cth%5F1%3A%3D%5Ctheta%5F1%2D%5Calpha%5Cfr%7B1%7D%7Bm%7D%5Csum%5F%7Bi%3D1%7D%5Em%28h%5F%5Cth%28x%5E%7B%28i%29%7D%29%2Dy%5E%7B%28i%29%7D%29+x%5E%7B%28i%29%7D+%5C%5C+%5Cbigr%7D+

よくわからんけど、これでアルゴリズムが使える。

アルゴリズムの性質

  • この関数は必ずグローバル最適になる(局所的最小値ではない)、これを凸型関数(Convex function)と呼ぶ
  • 最急降下法 & 線形回帰のアルゴリズムで解くような機械学習のことをバッチ最急降下法(Batch Gredient Descent)とか呼ぶらしい

振り返り

  • 元々データセットの集まりに対して直線や曲線を引いて、ちょうどデータセットの位置を予測するような線を求めたかった
  • それをhθ(x)とおいた、とりあえず
  • 各データセットとその線hθ(x)に対しての差分の絶対値の合計値をJ(θ0,θ1)とおいた、これが最小になればデータセットの位置を予測するような線なるぞ
  • J(θ0,θ1)を最急降下法 & 線形回帰のアルゴリズムで最小になるように求めるぞ
  • グローバル最適になるし最高や ← いまここ

  クイズ

  • 正直線形回帰のための最急降下法を実際に使って当てはめることは、クイズの中では必要なさそう
  • グラフを書いて推測で解いたら受かった

→ Week2へ!

お名前: コメント: