はじめに
機械学習のために以下のコースを受講中です
ただ見てるだけでは、忘れていくのでメモっていくことにしました。
モチベーションになったもの
-
数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路
この記事がなければ、そもそも上述のコースを知ることもなかったし、つまる部分を知らずに悩み続ける事になったと思います。 -
ニューラルネットワークと深層学習
一番最初のきっかけです。ただ読んでいる時点では肝心の1章が翻訳中でした。翻訳に参加するにも、あんまりわかっていない状態で参加するのは
迷惑な予感がしたので、断念しました。courseraのMachine Learning と同じく、初心者でもわかるようになっているので、こっちもオススメです。わかるようになったら翻訳に参加したい。
学習中+数学を分かっていないので、色々間違えて記載してあるかと思います。
ご了承下さい。
理解したこと
けっこうちゃんと勉強すると、そんなに難しくない。(まだ、勉強中ですが)
機械学習の目的は、テストデータを元に、一番近い数式を導き出す。
直線のグラフは、$y=ax+b$ ですよね。
この時の、$a$ , $b$ の値を求めよう。ってことです。
そのための手法の勉強をひたすらしていくのが、courseraのMachine Learningの内容みたいです。
これは、ニューラルネットワークの場合も同じで、
各ニューロンの入力の重み付け(どの入力を重要とみなすか。)を同じ手法で、
最適化していくってことみたいで、はやりのディープラーニングにつながっていくようです。
線形回帰(Linear Regression Model)
線形回帰の目標は、グラフに打ち込まれたデータに最適なライン(数式)を導くってことです。
数式ができれば、予測も可能になります。
訓練入力$x$ 対応する出力$y$があります。
求める直線の式をいかに定義します。
Hypothesis:
$h_\theta(x) = \theta_0 x_0 + \theta_1 x_1 + ... +\theta_n x_n$ ($x_0 = 1$)
$n=1$であれば、$y=ax+b$と同じです。$\theta = [ \theta_0, \theta_1, ... \theta_n]$が、$a$,$b$に対応しており
つまり、$\theta$を求めるのが目的です。
コスト関数(目的関数) (Cost Function)
コスト関数$J(\theta)$は簡単に書けば
$J(\theta) = |予測値 - 実値|$ってことです。
したがって予測値が近ければそれだけ0に近似します。
J(\theta)= \frac{1 }{ 2m} \sum_{i=1}^{m} (h_\theta(x^{(i)})-y^{(i)})^2
上記コスト関数を最小にする$\theta$を探します。
最急降下法アルゴリズム(Gradient descent algorithm)
先の話で、コスト関数を具体的にどうやって最小に持っていくかという問題があります。
それをこのアルゴリズムで解決します。
値が平滑化するまで繰り返し
\\
\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m}[(h_\theta(x^{(i)} - y^{(i)} )x_{j}^{(i)}]
\\学習率(learning rate): \alpha \\
正規方程式
こちらのほうが簡単に求められるようですが$\theta$の個数(features)が増えるにつけ上記の最急降下法を使ったほうがいいそうです。目安は$\theta $が1万を超えたあたり。
$\theta = (X^T X)^{-1} X^Ty$
theta = pinv(X' * X)*X' * X * y;
Oataveを使う
数式のグラフ化に便利
ベクトル演算が得意。
Octaveインストール
Mac限定です。
brew tap homebrew/science
brew update && brew upgrade
brew install octave
editコマンドでatomが使えるようにします。
EDITOR('atom')
Hypothesisをベクトル演算
元々の定義
h_\theta(x) = \theta_0 x_0 + \theta_1 x_1 + ... +\theta_n x_n
(x_0 = 1)
定義
\theta = \begin{pmatrix} \theta_0 \\ \theta_1 \\ \dots \\ \theta_{n} \end{pmatrix}, x = \begin{pmatrix} x_0 \\ x_1 \\ \dots \\ x_{n} \end{pmatrix}
転置行列に
\theta^T = \begin{pmatrix} \theta_0 & \theta_1 & \dots & \theta_{n} \end{pmatrix}
最終的にこうなる
h_\theta(x) = \begin{pmatrix} \theta_0 & \theta_1 & \dots & \theta_{n} \end{pmatrix} \cdot \begin{pmatrix} x_0 \\
x_1 \\ \dots \\ x_{n} \end{pmatrix} = \theta^T \cdot x
ロジスティック回帰 Logistic Regression Model
線形回帰の場合はデータのプロットに対応する関数を作るために作りました。未来予測など具体的な値を予測するために使います。
該当するデータを分類する分類問題を解くときに使うのがロジスティック回帰です。
Hypothesis
$h_\theta(x) = g(\theta^Tx)$
gはシグモイド関数です。
シグモイド関数 Sigmoid Function(Logistic Funtion)
g(z) = \frac {1}{1 + e^{(-z)}}
$z \to \infty $ の時 $g(z) \to 1$に
$z \to -\infty$ の時 $g(z) \to 0$に
つまり $ 0 \geqq g(z) \geqq 1$ の範囲になることが保証される。
コスト関数(目的関数) Cost Function
Cost(h_{(\theta)},y) = \begin{cases} -log(h_{\theta}(x)) & (y=1) \\ -log(1-h_{\theta}(x)) & (y = 0) \end{cases}
CostFunction:
J(\theta)= \frac{1 }{ m} \sum_{i=1}^{m} Cost(h_{(\theta)},y) = \frac{1 }{ m}[\sum_{i=1}^{m} y^{(i)} log(h_{\theta}(x)) +(1-y^{(i)}) log(1-h_{\theta}(x)) ]
この関数の最小にする$\theta$を探す。
最急降下法アルゴリズム Gradient descent algorithm
値が平滑化するまで繰り返し
\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m}[(h_\theta(x^{(i)} - y^{(i)} )x_{j}^{(i)}]
\\
学習率(lerning rate): \alpha
正規化
上記のまま利用するとあまりにもグラフがフィットしすぎるので、
コスト関数を弄ってペナルティを課す仕組みに変更します。
CostFunction:
J(\theta)= \frac{1 }{ m}[\sum_{i=1}^{m} y^{(i)} log(h_{\theta}(x)) +(1-y^{(i)}) log(1-h_{\theta}(x)) ]
+ \frac{\lambda}{2m}\sum^{n}_{j=1} \theta_j^2
Gradient descent algorithm:
値が平滑化するまで繰り返し
\theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^{m}[ (h_\theta(x^{(i)} - y^{(i)} )x_{0}^{(i)} ] \\
\theta_j := \theta_j - \alpha \sum_{i=1}^{m}[ \frac{1}{m} (h_\theta(x^{(i)} - y^{(i)} )x_{j}^{(i)} + \frac{\lambda}{m}\theta_j]\\
学習率(lerning rate): \alpha, \\
j = 1,2,3,\ldots,n
ページを分割することにしました。今回はここまでで、次はニューラルネットワークに入ります。