DeepLearningを0から実装できるようにするための連載 Vol.0


# DeepLearningとは

巷で黒魔術だとかいろいろ騒がれているDeepLearningですがその実は今までの機械学習の延長であり理解するのもそれほど難しくありません。この連載では回帰分析、ロジスティック回帰等の基本的なモデルから出発してそれらを発展させることでNeuralNetworkや最終的にいわゆるDeepLearningまで辿り着けることを見て行きたいと思います。初回はDeepLearningや機械学習全般で使用する数学や概念を説明します。これだけ知っていればDeepLearningまで確実に理解できるはず。

# 基本的な数学

大学1年生レベルの線形代数と微分積分の知識で十分です。

## ベクトル、行列

### ベクトルの内積

```math
(a \cdot b)_{i} = a_i b_i   
```

### 行列とベクトルの掛け算

```math
(Ab)_{i} = \sum_j A_{ij} b_j   
```

### 行列同士の掛け算

```math
(AB)_{ij} = \sum_k A_{ik} B_{kj}   
```

### 行列の転置

```math
(A^T)_{ij} = A_{ji}
```

## 偏微分、合成関数の微分

### 偏微分

```math
f(x, y) = a g(x) + bh(y)
```

の時、

```math
\frac{\partial f}{\partial x} = ag'(x) \\
\frac{\partial f}{\partial y} = bh'(y)
```

### 合成関数の微分

```math
f(z) = f(g(x))
```

の時、

```math
\frac{\partial f}{\partial z} = f'(z) \\
\frac{\partial f}{\partial x} = f'(g'(x)))
```

### 勾配(gradient)

```math
f(x_1, x_2, x_3, ...)
```

に対し、それぞれの$x$で偏微分したものをベクトル上に並べたものを勾配といい、以下のように表します。

```math
\nabla f(x_1, x_2, x_3. ...) = \left ( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \frac{\partial f}{\partial x_3}, ... \right ) 
```


# 機械学習の基礎

機械学習の目的はあるモデルを仮定し、データをそのモデルに当てはめてデータの特徴を分析したり、あるいは未来の事象を予測することです。もう少し形式に書くと機械学習は次の要素からなります。

- 変数 $X$
- モデルとパラメータ $M, \theta$
- 目的関数 $E_M (\theta, X)$

与えられた$X$を用いて$E_M (\theta, X)$を最小にするような$\theta$を探すことを**学習する**、**フィッティングする**などのように表現します。学習したモデルとパラメータを$x$に使用して何らかの予測をします。

例えば線形回帰分析の例では次のようになります。いわゆる最小二乗法です。

- 変数 $X_n = (x_n, y_n),\ X = [ X_n, n=1,...,N ]$
- モデルとパラメータ $y_n^{pred} = ax_n + b$, $\theta = (a, b)$
- 目的関数 $E_M(\theta, X) = \frac{1}{2}\sum_n|y - y^{pred}|^2$ 

目的関数を最小にする$a,b$が見つかれば、$y$が未知の新しい$x$が与えられた時にその$y$の値を$ax + b$で予測することができます。

# 確率モデルと最尤推定

## 確率分布

ある関数$P(x | \theta)$を考えます。ここで$x$は観測変数の値で$\theta$はパラメータです。この関数の値が$x$の確率を表すときに$P$を確率分布、あるいは確率関数と言います。例えばコイントスを表すベルヌーイ分布の場合は表が出る確率パラメータ$p$で指定され、

```math
P(x|\theta) = Bernoulli(x,p) = p^x(1-p)^{1-x}
```

のような式になります。ここで$x$は表の時1,裏の時0とします。上野式の$x$に1や0を代入することで容易に確率が表の時は$p$、裏の時は$1 - p$になることが確認できます。

次に2回コイントスをする例を考えましょう。それぞれの結果を$x_1, x_2$とします。$(x_1, x_2)$が同時に出現する確率を同時確率といい、$P(x_1, x_2)$と表現します。この2回のコイントスを全く同じ条件で行い、特にお互いに影響が無いことを**互いに独立**と言います。この時

```math
\begin{align}
P(x_1, x_2) & = P(x_1)P(x_2) \\
 & = p^{x_1}(1-p)^{1-x_1}p^{x_2}(1-p)^{1-x_2} \\
 & = p^{x_1 + x_2}(1-p)^{2 - x_1 - x_2}
\end{align}
```

となります。もし$N$回互いに独立にコイントスしたら

```math
P(x_1,...,x_N) = P(x_1)\dots P(x_N) = \prod_n P(x_n) = p^{\sum_n x_n}(1-p)^{N-\sum_n x_n}
```
のようになります。

一般には必ずしも互いに独立ではなく、その場合は

```math
P(x_1, x_2) = P(x_1)P(x_2|x_1)
```

となり、$P(x_2|x_1)$を条件付き確率と言います。

以下、確率の基本性質をまとめておきます。

1. $P(x) \geq 0$
1. $\sum_x P(x) = 1$
1. $P(x | y) = \frac{P(x, y)}{P(y)}$ (条件付き確率の定義)
1. $\sum_y P(x, y) = \sum_y P(y)P(x|y) = P(x)$
2. $P(x | y) = \frac{P(y)P(x|y)}{\sum_{y`} P(y')P(x|y') }$ (Bayesの公式)

##最尤推定

```math
P(X|\theta) = \prod_n P(x_n|\theta)
```
を$X$ではなく、$\theta$の関数とみなした時、確率ではなく**尤度**(likelihood)と言います。尤度は$X$というデータを観測した時に事前に仮定したモデルパラメータ$\theta$がどの程度確からしい(尤もらしい)かを表します。そしてこの尤度を最大にするようにパラメータ$\theta$を求めることを**最尤推定**と言います。一般には次のように尤度の負の対数(negative log-likelihood, NNL)をとり、掛け算を足し算に直してそれを**最小**にするような$\theta$を探します。

```math
E(\theta) = - \ln \prod_n P(x_n|\theta) = -\sum_n \ln P(x_n|\theta)
```
 
$N$回のコイントスの例に戻ります。確率関数は以下のような形でした。

```math
P(x_1,...,x_N|p) = p^{\sum_n x_n}(1-p)^{N-\sum_n x_n}
```

これ$p$の関数とみなすと尤度ですので対数尤度は次のような形になります。

```math
\begin{align}
E(p) & = - \sum_n \ln p(x_n|p) \\
 & = - \left( \ln p \sum_n x_n \right) - \left( \ln (1-p) (N - \sum_n x_n) \right) \\
 & = -(M\ln p + (N-M) \ln (1 - p))
\end{align}
```

ここで $M = \sum_n x_n$としました。つまり$M$は表が出た回数です。$E(p)$の最小値とその時の$p$を探せばいいので$p$について微分します。

```math
\frac{\partial }{\partial p}E(p) = - \frac{M}{p} + \frac{N - M}{1-p}
```

この方程式が0になる時の$p$が尤度を最大にする$p$なので$p=M / N$つまり$N$回のコイントスのうち、表が出現した回数$M$の割合という至極当たり前な結果が得られました。このように単純な例では一見なぜこんな手続きをするのか疑問に思うかもしれませんが、複雑な確率モデルのパラーメタを推定するときには非常に有効なフレームワークになります。

## 最尤推定の数値的解法

コイントスの例では対数尤度の微分が解析的に解けましたが、複雑な確率モデルの場合は常にそうなるわけではありません。そのような場合は数値的に反復計算をして徐々に尤度を大きくしていく(NLLを小さくしていく)方法を取ります。まずNNLは以下のような形でした。

```math
E(\theta) = - \ln \prod_n P(x_n|\theta) = -\sum_n \ln P(x_n|\theta)
```

ここで$\theta = (\theta_1, \theta_2, ...)$のようにパラメータが複数あるとします。まず適当な$\theta^0$からスタートし

```math
\theta^t = \theta ^{t-1} - \alpha \nabla E(\theta ^{t-1}), \ (\alpha > 0)
```

のように逐一勾配方向に$\theta$を更新していくことで$E(\theta)$はだんだんと小さな値になった時、勾配の全要素が0になった時にそれ以上動けなくなります。この点を局所最適解(local minimum)といいます。また、このように勾配方向にパラメータを更新する手法を**勾配降下法**(gradient descent)といい、あらゆる数値最適化の分野で用いられています。