深層学習入門 ~基礎編~

# 対象者
深層学習について勉強始めたいな〜って考えている人向け。
いきなりライブラリを利用して何か作るのも手ですが、やっぱりちゃんと理解するには「車輪の再発明」しないといけませんね〜
本記事は深層学習の基礎理論メインですが、できるだけ数式を少なくして図メインでざっくり説明します。
実装などは次回以降順番にやっていこうと思います。
次回の記事は[こちら](https://qiita.com/kuroitu/items/884c62c48c2daa3def08)です。


# 目次
- [深層学習とは](#深層学習とは)
    - [ニューロンモデル](#ニューロンモデル)
    - [レイヤーモデルとニューラルネットワークモデル](#レイヤーモデルとニューラルネットワークモデル)
- [活性化関数](#活性化関数)
    - [シグモイド関数(sigmoid)](#シグモイド関数sigmoid)
    - [tanh関数](#tanh関数)
    - [ReLU関数](#relu関数)
    - [ソフトマックス関数(softmax)](#ソフトマックス関数softmax)
- [計算グラフ](#計算グラフ)
    - [足し算の計算グラフ](#足し算の計算グラフ)
    - [掛け算の計算グラフ](#掛け算の計算グラフ)
    - [割り算の計算グラフ](#割り算の計算グラフ)
    - [指数関数の計算グラフ](#指数関数の計算グラフ)
    - [底がネイピア数の指数関数の計算グラフ](#底がネイピア数の指数関数の計算グラフ)
    - [対数関数の計算グラフ](#対数関数の計算グラフ)
    - [底がネイピア数の対数関数の計算グラフ](#底がネイピア数の対数関数の計算グラフ)
    - [sigmoid関数の計算グラフ](#sigmoid関数の計算グラフ)
        - [sigmoid関数の順伝播](#sigmoid関数の順伝播)
        - [sigmoid関数の逆伝播](#sigmoid関数の逆伝播)
        - [sigmoid関数の微分](#sigmoid関数の微分)
- [数3微分](#数3微分)
- [偏微分と連鎖律](#偏微分と連鎖律)
    - [偏微分](#偏微分)
    - [連鎖律](#連鎖律)
- [おわりに](#おわりに)


# 深層学習とは
深層学習はもう半世紀以上も前に提案されたニューラルネットワークを起源に持つ、機械学習の一手法です。
![neuron_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/28117715-4b2e-72e5-0d35-fb681ef4bf46.png "ニューロンのイメージ")
<font>例えば上のグラフでは$x_1, x_2, x_3$が関数$f$に入力されて$y_1, y_2$が出力されていますね。</font>
これはニューロン(神経細胞)のモデルの一つです。式で書くと


```math
f(x_1, x_2, x_3) = \left(
  \begin{array}{c}
    y_1 \\
    y_2
  \end{array}
\right)
```

という感じです。これだとちょっと抽象的＆複雑なので、別のモデルを紹介します。

## ニューロンモデル
まずは基本のニューロンモデルを紹介します。
![sinple_neuron_model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/ed6ee1d2-adec-1878-7365-3494f2c5b0a6.png)
はい、1入力1出力の最もシンプルなモデルですね。数式では

```math
f(x) = y
```

<font>となります。ここではこの関数$f$の実際について掘り下げ、ニューロンの最もシンプルなモデルを作ります。
まず、実際のニューロンの動作について説明します。
ニューロンは電気信号$x$を入力され刺激されることで、それに対応した電気信号$y$を発して次のニューロンに情報を伝達していきます。
このとき、ある一定値以下の刺激の時は電気信号$y$を発しません。この値のことを**閾値(しきいち)**といいます。
ちなみに電気信号を発することを**(ニューロンが)発火する**などと表現することが多いです。
また、ニューロン同士の結合は**シナプス**と呼ばれるのですが、このシナプスによる結合の強さというのは、前のニューロンからの情報伝達回数などに依存して強くなったり弱くなったりします。
つまり、前のニューロンから**よく情報が伝達される(必要/重要な情報が多く伝達される)とシナプス結合が強く**なり、逆に**あまり情報が伝達されない(必要/重要な情報があまり伝達されない)とシナプス結合が弱く**なるということです。
これを簡単に定式化すると</font>

```math
y = f(x) = wx + b = \left\{
  \begin{array}{cc}
    \textrm{ニューロンが発火した} & (wx + b \gt 0) \\
    \textrm{ニューロンが発火しなかった} & (wx + b \le 0)
  \end{array}
\right.
```

のようになります。記号についてざっくりまとめると

- $x \cdots$入力された電気信号
- $y \cdots$出力された電気信号
- $w \cdots$シナプス結合の強さ
- $b \cdots$閾値

という感じです。
これで最もシンプルなニューロンのモデルが完成です。

## レイヤーモデルとニューラルネットワークモデル
さて、[ニューロンモデル](#ニューロンモデル)で解説したモデルではほとんど何もできません。ただの1次関数ですしね〜
そこでこのニューロンをたくさん用意し、つなぎ合わせることでできることを増やしていきます。
![layer_model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/ca5602cd-1a37-aaee-af5c-fc30c4150c5e.png)
それぞれ

- $x\_i \cdots$前のニューロンから発せられた電気信号
- $f\_i \cdots$それぞれのニューロンの発火する/しないを決定する関数
- $y\_i \cdots$このニューロンの出力

となっています。
関数$f\_i$の中身は

```math
f_i(x_1, x_2, x_3) = \sum_{j=1}^{3}{w_{ij}x_j} + b_i
```

のようになります。このレイヤーモデルを積み重ねるとニューラルネットワークのモデルとなります。
<font>(積み重ねる際はもちろんこのレイヤーモデルでの出力$y\_i$を入力$x\_i$に読み替えていきます)。</font>
![neural_network_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/b5e56eff-de03-6a03-7c0d-7edff2904ac5.png)
紛らわしいかもしれませんが、図中の$f'$などは微分を意味する訳ではありませんので注意しましょう。


# 活性化関数
さて、モデルの紹介は以上で終了です。
ニューラルネットワークモデルではレイヤーモデルを積み重ねるわけですが、ここでは以下の画像についてまず考察します。
![single_neuron_network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/11a166e4-7345-2e5d-59dc-4230e526b45b.png)
これを数式で追いかけてみましょう。

```math
\begin{align}
  y' &= f'(x') = f'(y) = f'(f(x))\\
     &= w'y + b' \\
     &= w'(wx + b) + b' \\
     &= w'wx + w'b + b' \\
     &= \hat{w}x + \hat{b} \\
     &= \hat{f}(x)
\end{align}
```

<font>この式変形が意味することとは、$\hat{w} = w'w$および$\hat{b} = w'b + b'$とおくと、1層のネットワークでも表現できてしまうということです。つまり重ねる意味がありません。
この原因はニューロンモデルの関数$f$が線形であるためです。
線形関数[^1]は複数回重ねても、うまくすると1回の処理にまとめることができます。ということで非線形化しましょう。
非線形化[^2]するため(だけではないですが)に用いる関数を**活性化関数**と言います。
記号はよく$\sigma(•)$を用いますね。
これを用いて関数$f$を</font>

```math
f(x) = \sigma(wx + b)
```

とすることで1層のネットワークでは表現できない出力を生成することが可能となります。
では、この活性化関数には一体どのような物があるか、代表的な物をご紹介します。
他にどんなものがあるか気になる方は[こちら](https://qiita.com/kuroitu/items/73cd401afd463a78115a)をご覧ください。

## シグモイド関数(sigmoid)
sigmoid関数はどの入門書でも(多分)最初に紹介される活性化関数でしょう。

```math
\sigma_{sigmoid}(x) = \cfrac{1}{1 + e^{-x}}
```

![sigmoid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/a97d538d-5b89-332d-c4c3-ac3043755156.png)
特筆すべき特徴といえば

- 値域が$0 \le y \le 1$
- <font>微分が$x \rightarrow \pm \infty$で$0$になる</font>
- <font>有限の$x$では微分が$0$にならない(ただし、コンピュータで扱う以上0と見なすべき値にはなります) </font>

といったところでしょうか。
値域の性質から2値分類問題の最後の活性化関数に用いられることがあります。
[ロジスティック関数](https://ja.wikipedia.org/wiki/%E3%83%AD%E3%82%B8%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF%E6%96%B9%E7%A8%8B%E5%BC%8F)の特殊例ですね。


## tanh関数
sigmoid関数と形がよく似た関数ですね。

```math
\sigma_{tanh}(x) = \tanh(x) = \cfrac{e^x - e^{-x}}{e^x + e^{-x}}
```

![tanh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/9afd7f09-4c0e-f14c-a99c-0385753ac26a.png)
sigmoid関数との最大の違いは値域が$-1 \le y \le 1$であることですね。ただし、sigmoid関数とは違って2値分類問題の最後の活性化関数に用いられることはありません(ぼくの知る限り)。
sigmoid関数の線形変換関数ですね。
どうやら最近注目度が増しているようです。

## ReLU関数
ReLU関数は実装・計算の簡単さと速度の観点から非常によく使われる活性化関数です。

```math
\sigma_{ReLU}(x) = \left\{
  \begin{array}{cc}
    x & (x \gt 0) \\
    0 & (x \le 0)
  \end{array}
\right.
```

![ReLU.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/04279c1c-24dd-394c-ec6e-511cf48cf590.png)
特筆すべきは微分の値が

```math
\cfrac{dy}{dx} = \left\{
  \begin{array}{cc}
    1 & (x \gt 0) \\
    0 & (x \le 0)
  \end{array}
\right.
```

<font>のように、非常にシンプルなステップ関数になること、かつその微分値が$1$であることですね。
微分値が$1$であるメリットはいつか別の記事で詳しく説明すると思いますが、**勾配消失問題**[^3]が軽減されることですね。</font>


# ソフトマックス関数(softmax)
最後にソフトマックス関数です。こちらは多値分類問題の出力層の活性化関数に用いられます。
その最大の特徴といえば、出力の総和が$1$になるため出力を確率とみなせることでしょう。

```math
\sigma_{softmax}(x_i) = \cfrac{e^{x_i}}{\displaystyle\sum_{k=1}^{n}{e^{x_k}}} \quad (i = 1, 2, \ldots, n)
```

![softmax.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/b337cf8a-627f-8777-2f27-d1451418de7b.png)
微分に関しては、いずれ紹介する損失関数の誤差関数に**交差エントロピー誤差**というものを用いることで、出力層から伝播する勾配が

```math
Errors = y - t
```

のように非常に単純な値となります。


# 計算グラフ
さて、モデルの紹介と活性化関数の紹介が一通り済んだところで、今後の理解を深めやすくするために**計算グラフ**を紹介します。
計算グラフとは文字通り計算をグラフ化したもので、これを用いると誤差逆伝播における伝播の様子などがより理解できます。
とりあえず模式図は
![ex_cal_figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/7735d82d-e7df-c1b1-d4bb-f353f2ef2f8d.png)
こんな感じです。
真ん中の丸に書かれている$f$は**計算ノード**と呼ばれるものです。ここを左から右に通ることを**順伝播**、逆に右から左に通ることを**逆伝播**といいます。
黒字は順伝播、<font color="red">赤字</font>は逆伝播を表しています。
順伝播で入力される変数の数は可変ですが、出力は大抵1つですね(分岐して複数箇所に流れることはあります)。
そして逆伝播についてですが、計算ノードを通る時にその計算ノードの各入力変数に対して偏微分を乗算した値がそれぞれのルートへと流れます。
偏微分がよくわからない方は[こちら](#偏微分と連鎖律)でざっくり解説しています(数学的な厳密さは全くありません)。

## 足し算の計算グラフ
まずは簡単に足し算の計算グラフです。
![plus_cal_figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/d53e225d-31eb-6de6-b285-b2bea1077b98.png)
順伝播は見ればわかると思うのでカット、逆伝播を数式で追いかけてみましょう。
<font color="red"><div>

```math
\cfrac{\partial z}{\partial x} = 1, \quad
\cfrac{\partial z}{\partial y} = 1 \\
\Leftrightarrow \quad
E \cfrac{\partial z}{\partial x} = E, \quad
E \cfrac{\partial z}{\partial y} = E
```
</div></font>
まあとりあえず、足し算の場合逆伝播はそのまま流れるということだけ把握しておけばOKです。


## 掛け算の計算グラフ
続いて掛け算の計算グラフです。
![mult_cal_figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/d5bd6662-31c1-9403-7bff-3c9a55437ab9.png)
逆伝播は偏微分の知識が必要ですね。
<font color="red"><div>

```math
\cfrac{\partial z}{\partial x} = y, \quad
\cfrac{\partial z}{\partial y} = x \\
\Leftrightarrow \quad
E \cfrac{\partial z}{\partial x} = Ey, \quad
E \cfrac{\partial z}{\partial y} = Ex
```
</div></font>
これもとりあえずもう一方の変数が乗算されると覚えればいいでしょう。
基本形は以上です。

## 割り算の計算グラフ
割り算は逆数の掛け算で表されますが、計算グラフでも書いておきます。
![div_cal_figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/2f3cdc19-45ea-1ae8-ab32-74358c2fe86a.png)
こちらは[数3微分](#数3微分)の知識が必要になります。
<font color="red"><div>

```math
\cfrac{\partial z}{\partial x} = \cfrac{1}{y}, \quad
\cfrac{\partial z}{\partial y} = -\cfrac{x}{y^2} \\
\Leftrightarrow \quad
E \cfrac{\partial z}{\partial x} = \cfrac{E}{y}, \quad
E \cfrac{\partial z}{\partial y} = -E \cfrac{x}{y^2}
```
</div></font>

## 指数関数の計算グラフ
指数関数の計算グラフはこんな感じですね。
まあ滅多に使うことはないでしょう。
![exponential_cal_figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/833f341f-ef5f-2279-cbd8-b4cdaf658b4a.png)
逆伝播には偏微分の知識以前に[数3微分](#数3微分)の知識が必要ですね。
<font color="red"><div>

```math
\cfrac{\partial z}{\partial x} = yx^{y-1}, \quad
\cfrac{\partial z}{\partial y} = x^y \log x \\
\Leftrightarrow \quad
E \cfrac{\partial z}{\partial x} = Eyx^{y-1}, \quad
E \cfrac{\partial z}{\partial y} = Ex^y \log x
```
</div></font>
簡単な覚え方とかはないですね〜
~~強いていうならこのページを思い出してください~~

## 底がネイピア数の指数関数の計算グラフ
底がネイピア数の場合は[指数関数](#指数関数の計算グラフ)よりも簡単になります。
![exp_cal_figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/afd2e7e1-cf1f-149e-f9b3-bf8605af8aba.png)
逆伝播についてはやっぱり[数3微分](#数3微分)の知識が必要ですが、なくても出力をそのまま乗算すると覚えておけばいいですね。
<font color="red"><div>

```math
\cfrac{\partial z}{\partial x} = e^x
\quad \Leftrightarrow \quad
E \cfrac{\partial z}{\partial x} = Ee^x
```
</div></font>

## 対数関数の計算グラフ
一応紹介しますがまず使わないでしょう。基本的に底はネイピア数$e$を用いるので。
![logx_cal_figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/d4e7c2f3-5188-7884-d3f6-74e2f8245346.png)
対数の微分はなかなか複雑です。[数3微分](#数3微分)も併せてご覧ください。
<font color="red"><div>

```math
\cfrac{\partial z}{\partial x} = -\cfrac{\log y}{x \log^2 x}, \quad
\cfrac{\partial z}{\partial y} = \cfrac{1}{y \log x} \\
\Leftrightarrow \quad
E \cfrac{\partial z}{\partial x} = -E \cfrac{\log y}{x \log^2 x}, \quad
E \cfrac{\partial z}{\partial y} = \cfrac{1}{y \log x}
```
</div></font>

## 底がネイピア数の対数関数の計算グラフ
底がネイピア数の対数関数の計算グラフを紹介します。こちらは使われることがあるかも？
![log_cal_figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/044894f6-933e-3a1e-628c-6f393e6eee53.png)
[対数関数の計算グラフ](#対数関数の計算グラフ)よりも随分とすっきりしています。
<font color="red"><div>

```math
\cfrac{\partial z}{\partial x} = \cfrac{1}{x}
\quad \Leftrightarrow \quad
E \cfrac{\partial z}{\partial x} = \cfrac{E}{x}
```
</div></font>

## sigmoid関数の計算グラフ
最後に[sigmoid関数](#シグモイド関数sigmoid)の計算グラフ(の一例)を紹介します。
![sigmoid_cal_figure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/1c90cbfd-8ec1-2932-50cb-b2daa8bce545.png)
<font>逆伝播を考える時、$-1$は定数ですので無視して、変数$x$に関連する物のみを書いています。</font>
ちょっと複雑ですが、順を追って見てみるとこれまでに紹介した計算グラフの計算にそのまま当てはめているだけですね。

ちなみに、計算グラフを辿る練習として無視している$-1$のルートへ流れる逆伝播も考えてみてください。解答は[sigmoid関数の逆伝播](#sigmoid関数の逆伝播)で紹介します。

### sigmoid関数の順伝播
順伝播を追いかけてみましょう。
![forward_first.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/60955296-7462-7f5a-ce25-07a7b89776f7.png)
<font>一番最初の部分は$-1$と$x$を掛け算しています。黒丸(●)は分岐点を表しています。</font>
![forward_second.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/e16ac128-13af-79aa-16a7-42395bd9e086.png)
<font>次に上段では$-1$を二乗して$1$に、下段では$e$の$-x$乗を計算していますね。</font>
![forward_third.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/d79ac336-096c-cc5a-d06d-fbf97c8daf79.png)
<font>その次は$1$と$e^{-x}$を足し算します。これで分母ができましたね。</font>
![forward_last.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/9470bfe1-ca30-89da-94b6-8267e53d9194.png)
<font>最後に$1$と$1+e^{-x}$とを割り算するとsigmoid関数の計算グラフの順伝播が完成です！</font>

### sigmoid関数の逆伝播
続いて逆伝播を追いかけましょう。
![backward_first.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/fa380ff3-0e6b-7147-498f-2c87d2dd3f78.png)
<font>最初は[割り算の逆伝播](#割り算の計算グラフ)ですね。$x=1$および$y=1+e^{-x}$に相当します。</font>
**合成関数の微分などを一切考えなくて済むのが計算グラフの強みです。**
![backward_second.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/3c9712f7-0950-3394-b549-5be3a801462a.png)
次は[足し算の逆伝播](#足し算の計算グラフ)ですね。足し算は流れてきた逆伝播をそのままそれぞれのルートに流します。
また、分岐(●)を通る際は逆伝播の値が足し算されます。
<font color="red"><div>

```math
\cfrac{E}{1+e^{-x}} + \left\{ -\cfrac{E}{(1+e^{-x})^2} \right\} = E \cfrac{(1+e^{-x}) - 1}{(1+e^{-x})^2} = E \cfrac{e^{-x}}{(1 + e^{-x})^2}
```
</div></font>
![backward_third.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/61f442ef-560f-53be-7088-0dc9be9aa2c5.png)
続いて、上段では2乗の逆伝播ですね。
<font color="red"><div>

```math
\cfrac{\partial}{\partial a}a^2 = 2a \\
\Leftrightarrow
E \cfrac{e^{-x}}{(1 + e^{-x})^2} \cfrac{\partial}{\partial a}a^2 = 2aE\cfrac{e^{-x}}{(1 + e^{-x})^2} \\
\xrightarrow{a = -1}
-2E\cfrac{e^{-x}}{(1 + e^{-x})^2}
```
</div></font>
<div><font>下段では[底がネイピア数の指数関数の逆伝播](#底がネイピア数の指数関数の計算グラフ)が行われています。入力$x$が$-x$となっている点だけが違いますね。普通に出力を乗算すればOKです。</font></div>
![backward_last.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640911/52821ce1-a103-2c55-1e68-3f99070fa30d.png)
<div><font>最後は[掛け算の逆伝播](#掛け算の計算グラフ)ですね。もう一方の入力を乗算するだけです。
ちなみに$-1$ヘ流れる逆伝播は</font></div>
<font color="red"><div>

```math
-2E \cfrac{e^{-x}}{(1 + e^{-x})^2} + \left\{ -xE \cfrac{e^{-x}}{(1 + e^{-x})^2} \right\} = -E \cfrac{(x + 2)e^{-x}}{(1 + e^{-x})^2} = -E(x + 2)z(1 - z)
```
</div></font>
のように表せますね！

### sigmoid関数の微分
<font>計算グラフで計算したところ、$E = 1$の時の値(sigmoid関数を微分しただけの値)は$z(1 - z)$となりますが、実際に微分計算してみるとどうでしょう？</font>

```math
z = \cfrac{1}{1 + e^{-x}}
\Rightarrow
\begin{align}
  \cfrac{\partial z}{\partial x} &= \cfrac{-(-e^{-x})}{(1 + e^{-x})^2} = \cfrac{e^{-x}}{(1 + e^{-x})^2} \\
  &= \cfrac{1}{1 + e^{-x}} \cfrac{e^{-x}}{1 + e^{-x}} \\
  &= \cfrac{1}{1 + e^{-x}} \left\{ 1 - \cfrac{1}{1 + e^{-x}} \right\} \\
  &= z(1 - z)
\end{align}
```

ご覧の通り、しっかり一致しますね！sigmoid関数の最大の利点は**逆伝播の計算が出力のみから単純に求まること**ですね。

以上までで深層学習の一通りの基礎知識は紹介し終わったと思います。
次回以降は実装も交えて色々と詳細に説明していくつもりです。


# 数3微分
数3微分覚えてない...という方向けの数3微分一覧です。
全く知らない人はそういうもんなんか〜くらいで納得してください。

| 関数 | $\cfrac{d}{dx}$ |
|:-:|:-:|
|$a^x$|$a^x \log a$|
|$e^x$|$e^x$|
|$\log_a x$|$\cfrac{1}{x \log a}$|
|$\log x$|$\cfrac{1}{x}$|
|$\sin x$|$\cos x$|
|$\cos x$|$-\sin x$|
|$\tan x$|$-\cfrac{1}{\cos^2 x}$|
|$f(x)g(x)$|$f'(x)g(x) + f(x)g'(x)$|
|$\cfrac{f(x)}{g(x)}$|$\cfrac{f'(x)g(x) - f(x)g'(x)}{g^2(x)}$|
|$\cfrac{1}{g(x)}$|$- \cfrac{g'(x)}{g^2(x)}$|
|$f(g(x))$|$g'(x)f(g(x))$|

全部微分の定義式である

```math
\lim_{h \to 0}{\cfrac{f(x+h) - f(h)}{h}}
```

に代入して計算すれば導出できますね。
ただしそれぞれ必要な知識が数2とかで出てきているので復習をお忘れずに。


# 偏微分と連鎖律
ここではウルトラ簡単に偏微分について説明します。**数学的な厳密さは0**です。あくまで深層学習の理解メインですので、深層学習を理解する上で必要な理解の仕方だけ説明します。

## 偏微分
偏微分とは多変数関数において**ある一つの変数だけを変数であるとみなして、他の変数を全て定数だとして微分すること**です。
以下で例を挙げて説明します。

```math
f(x, y, z) = x^2y + \cfrac{y}{z + x} + z^x
```

3変数関数ですね。偏微分してみましょう。

```math
\cfrac{\partial f}{\partial x} = f_x
```

などと書くことにすると、

```math
\begin{align}
  f_x &= 2xy - \cfrac{y}{(z + x)^2} + z^x \log z \\
  f_y &= x^2 + \cfrac{1}{z + x} \\
  f_z &= - \cfrac{y}{(z + x)^2} + xz^{x - 1}
\end{align}
```

のようになります。
以下では$f_x$に注目して説明します。

<font>そもそも$f_x$の意味は「関数$f$を$x$だけ変数とみなし、$y, z$を定数とみなして微分する」ということです。ということで極端に</font>

```math
y = 1, \quad z = 2
```

とおいてしまいましょう。すると

```math
f(x, 1, 2) \rightarrow f(x) = x^2 \times 1 + \cfrac{1}{2 + x} + 2^x
```

のようになります。これなら[数3微分](#数3微分)を用いれば計算できますね。

```math
f_x = 2x \times 1 - \cfrac{1}{(2 + x)^2} + 2^x \log 2
```

あとはこの式のもともと$y, z$だったところを書き戻してやると

```math
f_x = 2xy - \cfrac{y}{(z + x)^2} + z^x \log z
```

となり、$x$についての偏微分の計算ができました！
他の変数についても同様に考えればできるでしょう。ぜひやってみてください。

## 連鎖律
連鎖律は、実際は小難しい証明があったはずですが、めんどくさいので雑な説明をします。
微分って

```math
\cfrac{\partial f}{\partial x}
```

とかって書けますよね？
どこからどう見ても分数ですよね？(違うけど)
ということは約分(みたいなことが)できるわけです。

```math
\cfrac{\partial f}{\partial x} = \cfrac{\partial f}{\partial y} \cfrac{\partial y}{\partial x} = \cfrac{\partial f}{\partial z} \cfrac{\partial z}{\partial y} \cfrac{\partial y}{\partial x} = \ldots
```

こんな感じで鎖のように増やしていけるので**連鎖律**と呼ばれています。
これが誤差逆伝播法の肝となる定理です。
詳しくはまた別の記事で逆伝播に触れた時に紹介します。


#おわりに
今回で大体必要な事前知識は説明できたかな〜と思います。
足りなければ今後補足していくかもしれません。

P.S. 結局数式ばっかり...


# 参考
- [第11回　ディープラーニングとニューラルネットワークの歴史](https://book.mynavi.jp/manatee/detail/id=89172)


# 深層学習シリーズ
- [深層学習入門 ~基礎編~](https://qiita.com/kuroitu/items/221e8c477ffdd0774b6b)
- [深層学習入門 ~コーディング準備編~](https://qiita.com/kuroitu/items/884c62c48c2daa3def08)
- [深層学習入門 ~順伝播編~](https://qiita.com/kuroitu/items/d22c8750e34d5d75fb6c)
- [深層学習入門 ~逆伝播編~](https://qiita.com/kuroitu/items/ea6ed8f614e65ec44976)
- [深層学習入門 ~学習則編~](https://qiita.com/kuroitu/items/ab5ad4ac716ae7a04891)
- [深層学習入門 ~ローカライズと損失関数編~](https://qiita.com/kuroitu/items/a6725ac0139d8eeb1e19)
- [深層学習入門 ~関数近似編~](https://qiita.com/kuroitu/items/4a8badcf7d3139d9ec7b)
- [深層学習入門 ~畳み込みとプーリング編~](https://qiita.com/kuroitu/items/48bf6bc42e4dfee52cde)
- [深層学習入門 ~CNN実験編~](https://qiita.com/kuroitu/items/d4716e754594a29b059d)
- [深層学習外伝 ~GPUプログラミング編~](https://qiita.com/kuroitu/items/2618c598f46d6ab3889c)
- [深層学習入門 ~ドロップアウト編~](https://qiita.com/kuroitu/items/d1bed8c216950d87be74)
- [活性化関数一覧 (2020)](https://qiita.com/kuroitu/items/73cd401afd463a78115a)
- [勾配降下法一覧 (2020)](https://qiita.com/kuroitu/items/36a58b37690d570dc618)
- [見てわかる！最適化手法の比較 (2020)](https://qiita.com/kuroitu/items/6695e0c79e888543e150)
- [im2col徹底理解](https://qiita.com/kuroitu/items/35d7b5a4bde470f69570)
- [col2im徹底理解](https://qiita.com/kuroitu/items/7877c002e192955c7857)
- [numpy.pad関数完全理解](https://qiita.com/kuroitu/items/51f4c867c8a44de739ec)

[^1]: いわゆる1次関数。数学での厳密な定義は省きますが、要するに線形性を満たす関数のことを言います。
[^2]: 2次関数などのグラフが曲線となったりする関数や、途中のある点で途切れていたりする(ある点で微分不可能な)関数のことを言います。
[^3]: 勾配消失とは、多層のニューラルネットワークにおいて逆伝播するはずの誤差(勾配)がレイヤーを通るごとに減衰され、ほとんど$0$になってしまうことです。また逆に勾配爆発という現象も存在します。