ichigoryume programming blog

プログラミングに関する備忘録。主にHTML5, C#, Swiftなど。

機械学習 備忘録

機械学習、AI、ディープラーニングについて調べたことやわかったことのメモ
Safariでブラウズする際は「環境設定」→「プライバシー」の「サイト超えトラッキングを防ぐ」をオフにしないと画像が表示されない

機械学習で取り扱われる問題の種類

回帰(Regression)

単回帰
  • 1つの目的変数を1つの説明変数で求める
  • Y = aX + b のような1次関数で表される
重回帰
多項式回帰
  • 1つの目的変数を、1つの説明変数を使った次数の異なる複数の変数から求める
  • Y = b_{0} + b_{1}X + b_{2}X^{2} + ... + b_{n}X^{n}のように表される

分類(Classification)

  • 予め与えられたクラスに振り分ける。画像を入力して0~9のいずれかを判断する、など。
  • 学習フェーズでは教師付き学習が行われる。画像に0~9のラベルが付与されている、など。
ロジスティック回帰
  • ある事象の発生確率を説明変数から求める分析手法。
  • 事象がつまりクラスであり、そのクラスである確からしさを求める=分類する、ということになる。

クラスタリング

  • 予めクラスを与えられることなく、データ群からクラスを見出す
  • 学習フェーズでは教師無し学習が行われる。

パーセプトロンと計算式

単純(単層)パーセプトロン(Simple Perceptron)

f:id:ichigoryume:20181221163841p:plain

{
\begin{align} 
 y &= w_{1}x_{1} + w_{2}x_{2} + b \\\
 &= 
\begin{bmatrix}
x_{1} & x_{2}
\end{bmatrix}
\begin{bmatrix}
w_{1}  \\\
w_{2}
\end{bmatrix} +b \\\
 &= XW + b
\end{align}
}

  • w : 重み(Weight)
  • b : バイアス(Bias)
  • 重みはノードへの各入力の伝わりやすさ、バイアスは発火のしやすさを制御するパラメータとしてはたらく

多層パーセプトロン(Multi-Layered Perceptron)

f:id:ichigoryume:20181221165508p:plain

  • 中間層は隠れ層とも
多層パーセプトロンの計算式(入力層と一つ目の中間層を例に)

f:id:ichigoryume:20181222100308p:plain
{
\begin{align} 
y &= XW + b \\\
 &= 
\begin{bmatrix}
 x_{1} & x_{2} & ... & x_{n}
\end{bmatrix}
\begin{bmatrix}
 w_{11} & w_{21} & ... & w_{k1} \\\
 w_{12} & w_{22} & ... & w_{k2} \\\
 ... \\\
 w_{1n} & w_{2n} & ... & w_{kn} 
\end{bmatrix}
+
\begin{bmatrix}
 b_{1} & b_{2} & ... & b_{k}
\end{bmatrix}
\end{align}
}

  • Xが1行n列、Wがn行k列。Xの列数とWの行数は必ず一致し、またその積は1行k列になる

バッチ処理

  • m個のまとまったデータを一気に計算する

f:id:ichigoryume:20181222100835p:plain

{
\begin{align} 
y &= XW + b \\\
 &= 
\begin{bmatrix}
 x_{11} & x_{12} & ... & x_{1n} \\\
 x_{21} & x_{22} & ... & x_{2n} \\\
 ... \\\
 x_{m1} & x_{m2} & ... & x_{mn}
\end{bmatrix}
\begin{bmatrix}
 w_{11} & w_{21} & ... & w_{k1} \\\
 w_{12} & w_{22} & ... & w_{k2} \\\
 ... \\\
 ... \\\
 w_{1n} & w_{2n} & ... & w_{kn} 
\end{bmatrix}
+
\begin{bmatrix}
 b_{1} & b_{2} & ... & b_{k}
\end{bmatrix}
\end{align}
}

  • Xがm行n列、Wがn行k列。Xの列数とWの行数は必ず一致し、またその積はm行k列になる
  • 計算のステップが下層へ進んでいっても、結果はかならずm行(=バッチ数)
  • バイアスの加算は少し特殊で、XWの全行についてbを加算する(=ブロードキャスト。NumPyがかってにやってくれる)

線形分離

活性化関数(Activation Function)

  • パーセプトロンの各層の出力値(XW+b)に適用し、値を成形/変換させる関数。
  • 次の層へどのように値を伝えるか、ネットワーク全体の出力値をどのように整形するか、という観点で関数を選択し使用する。
  • 活性化関数はどれも非線形変換を行う。これは線形変換だと意味がないため
    • 線形変換(=スカラー倍)する層をいくつ繋げたとしても、単一の層で表現できるので意味がない。

恒等関数(Identity Function)

 f(x) = x

  • 入力値をそのまま出力する

ステップ関数(Step Function)

{
f(x) = \left\{ \begin{array}{ll}
0 \ (x \leq 0 ) \\
1 \ (x > 0 )
\end{array}\right.
}

  • 入力値を0か1に変換する
  • 入力値が何かに該当する/しないを判定する問題などで使われる(ex: スパムか、スパムじゃないか)

シグモイド関数(Sigmoid Function)

{
\displaystyle
 f(x) = \frac{1}{1 + e^{-x}}
}

f:id:ichigoryume:20181226204322p:plain

ソフトマックス関数(Softmax Function)

{
\displaystyle
 f(x) = \frac{e^{x_{k}}}{\sum_{i=1}^n e^{x_i}}
}

  • 分類問題で用いる
  • x^iは、ソフトマックスを適用する層のi番目のニューロンの出力
  • 0から1の間の実数に正規化した値が得られる。これを確率として扱う。
  •  \sum_{i=1}^n f(x)は必ず1になる。つまり、全ての事象の発生確率の総和がちゃんと1になってくれる。
  • 実際の実装では、オーバーフロー抑制のため、最も大きいxの値でオフセットしてからべき乗することが多い

{
\displaystyle
 f(x) = \frac{e^{x_k - max(x)}}{\sum_{i=1}^n e^{x_i - max(x)}}
}

ReLU/ランプ関数(Rectified Linear Unit)

{
f(x) = \left\{ \begin{array}{ll}
x \ (x > 0 ) \\
0 \ (x \leq 0 )
\end{array}\right.
}

損失関数(Loss Function)

  • 目的関数、エラー関数(Error Function)とも
  • ネットワークの出力結果と正解データを付き合わせて、どの程度妥当かを算出するために使う。
  • 良い結果ほど値が低くなるように設計されている
  • 損失関数から得られる値を最小化するパラメータ(W,b)を求めることが即ち学習。
    • W,bの偏微分により傾きを求めて、それを元にW,bを更新する(→勾配下降法)

二乗和誤差関数(Mean Squared Error)

 {
\displaystyle
 E = \frac{1}{2} \sum_{k} (y_k - t_k)^2 
}

  • y_kはk番目の入力データに対するネットワークの出力、t_kはその正解データ。この差を2乗したものの和を求める。
  • 2条するのは、差がマイナスになるケースがあるので、これを絶対値的な値に変換するため(平方根とるのは計算コスト的に無駄があるのでやってない)
  • 1/2するのは、勾配下降法において微分した際にすっきりするように
  • 全入力値に対するネットワークの出力値が必要なため、計算コストが高い。
  • 回帰問題などで用いる

交差エントロピー誤差関数(Cross Entropy Error)

 {
\displaystyle
 E = - \frac{1}{N} \sum_{n} \sum_{k} t_{nk} log\ y_{nk}  
}

  • y_{nk}はn番目の入力データに対するネットワークの出力のk番目の要素。t_{nk}はその正解データ。
  • 演算には全入力に対する出力が必要なので計算コストが高い。
  • 尤度関数と呼ばれ、分類問題(ロジスティック回帰)に用いる。
  • t_{nk} = 1 となる要素はある正解データの中では唯一でそれ以外は0。このため実質t_{nk} = 1である-log\ y_{nk}の平均に等しい。
  • y_{nk}の値は0から1の間なので、-log\ y_{nk}y_{nk}が1に近くほど0に近づいていく(log1は0)。
  • 乱暴に解釈するとy_{nk}の平均だと最大化問題になるので-logを付加して最小化問題に変換している。

学習

学習データと正解データを使って、パラメータW, bを自動的に最適化すること(=誤差関数の値を最小化するパラメータをみつけること)。

勾配下降法(Gradient Descent Method)

{
\displaystyle
w_{k+1} = w_{k} - η\frac{\partial w}{\partial E}
}
{
\displaystyle
b_{k+1} = b_{k} - η\frac{\partial w}{\partial b}
}

  • Eは損失関数
  • kは学習回数
  • ηは学習率(Learning Rate)。0.01や0.001のような小さい値が用いられる
  • 偏微分は、E、bの全ての要素について行う
  • 学習の反復回数はエポック(epoch)と呼ぶ
  • 1回の学習に全学習データを用いるため計算量が高い

確率的勾配下降法(Stochastic Gradient Descent - SGD)

  • 毎回ランダムに選んだ一つの学習データで勾配を計算する方法

ミニバッチ勾配下降法(Mini-Batch Gradient Decent)

  • 毎回一定数のランダムに選んだ学習データで勾配を求める方法
  • 通常の勾配下降法と比べてメモリ消費が抑えられ、計算コストも下げられる。
  • 確率的に学習データを選んでいることにはかわりないので、書籍によってはこちらもSGDと呼んでいる