今回はディープラーニングが内部的にどのような計算を行っているのかディープラーニングの数学の基礎について解説したいと思います。計算の流れを一つずつ説明していきますので、本記事がこれからディープラーニングを学びたい方、数学が苦手で挫折してしまった方の手助けとなりましたら幸いです。
ディープラーニングとは
ディープラーニングはニューラルネットワークという機械学習のアルゴリズムであり、以下の図のように複数の層からなっています。本記事では分かりやすいように入力層、隠れ層、出力層の3層でご説明しますが、実際は隠れ層が複数あり層が深いことからディープラーニングと呼ばれています。
ディープラーニングの計算の流れ

- 各入力値に重みを掛けた結果を全てを足し合わせ、隠れ層に渡す
- 隠れ層にて活性化関数を用いてデータに非線形変換を行う
- 2のデータに重みを掛けた結果を全て足し合わせ出力層に渡す
- 損失関数を用いて3で求めた予測値と教師データから誤差を求める
- 逆伝播を行い、誤差がなるべく小さくなるようにパラメータ(重み・バイアス)を調整する
- 損失関数の結果がなるべく小さくなるように1から5までの処理を繰り返す
問題設定と変数の意味
それでは、今回は駅からの距離と広さ、築年数を元に家賃を予測する回帰問題だと仮定して説明していきたいと思います。 それぞれの変数は以下を表しています。
\begin{align} x_{n}が入力値(距離、広さ、築年数)\\ w_{n}が重み\\ u_{n}が隠れ層の値\\ yが予測値(家賃)\\ \end{align}
それでは、上記の流れを順番にみていきましょう。
STEP1
上の図にあるように各入力値に重みを掛けた結果を全てを足し合わせ、隠れ層に渡します。まずは隠れ層u_{n}unから計算していきましょう。
u_{11} = w_{11} \times x_{1} + w_{12} \times x_{2} + w_{13} \times x_{3} = 2 \times 1 + 1 \times 2 + 3 \times 3 =13
u_{12} = w_{21} \times x_{1} + w_{22} \times x_{2} + w_{23} \times x_{3} = (-3) \times 1 + (-1) \times 2 + (-1) \times 3 = -8
u_{n}の計算は上記のように求められます。
補足
実際は上記のような数式として表すのではく、機械学習で扱い安いように線形代数(行列)の形に変換されることになります。この処理を線形変換といいます。また、足し算と掛け算で表せない部分をb(バイアス)b(バイアス)で表します。分かりにくいと思いますので、以下のように数式で表します。
u_{11} = w_{11} \times x_{1} + w_{12} \times x_{2} + w_{13} \times x_{3} + b_{1}
u_{12} = w_{21} \times x_{1} + w_{22} \times x_{2} + w_{23} \times x_{3} + b_{2}
線形変換すると以下のようになります。
\begin{bmatrix} u_{11} \\ u_{12} \end{bmatrix} = \begin{bmatrix} w_{11} & w_{12} & w_{13} \\ w_{21} & w_{22} & w_{ 23} \end{bmatrix} \times \begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \end{bmatrix} + \begin{bmatrix} b_{1} \\ b_{2} \end{bmatrix}
STEP2
続いて、隠れ層にて活性化関数を用いてデータに非線形変換を行います。活性化関数を用いてを変換することで機械学習の精度が向上します。活性化関数には様々な種類がありますが、その目的は計算結果を一定の範囲に統一することで比較しやすくしたり、値を際立たせることで比較しやすくするといった点にあるそうです。
それでは、代表的な活性化関数の一つであるReLU関数についてみていきましょう。Relu関数は以下のように表されます。

図のように値が0より小さい場合は0を返し、0より大きい場合はそのまま値を返します。数式で表すと以下のようになります。
maxでは0とu_{n}のうち最大の値を返します。
z_{n} = max(0, u_{n})
この式にSTEP1で求めた値を当てはめると以下のようになります。
z_{11} = max(0, u_{11}) = max(0, 13) =13
z_{12} = max(0, u_{12}) = max(0, -8) =0
STEP3, 4
ここではSTEP3, 4をいっきにみていきましょう。まずSTEP1と同様に隠れ層で求めた値に重みを掛けた結果を全てを足し合わせ、予測値を計算します。
y = w_{14} \times z_{11} + w_{15} \times z_{12} = 2 \times 13 + 1 \times 0 =26
予測値26
が求まりました。教師データが10
であることを想定しているので、かなり結果に差があることが分かると思います。ディープラーニングではこの差を直接誤差として利用するのではなく、損失関数を用いて誤差を求めることになります。損失関数の結果はどれだけ結果が正しいか評価します。今回は回帰でよく利用される損失関数の平均二乗誤差(MSE)を用います。
全ての予測値と教師データの差の二乗を足し合わせ、データのサンプル数で割ります。差を二乗するのはデータからマイナスの値をなくすためです。(誤差に-は不要なため)
L = \frac{1}{N}\sum_{n=1}^{n} (y_{n} - t_{n})^2
\begin{align} L: 損失関数 \\ N: サンプル数\\ y_{n}: n番目の予測値\\ t_{n}: n番目の教師データ(正解の値) \end{align}
それでは実際に上記の式に値をあたはめてみましょう。
L = \frac{1}{1} \times (26 - 10)^2 = 256
STEP5, 6
ここまで図の左から右へ順伝播を行い、予測値と誤差を計算する流れをみてきました。計算された予測値が26でした。教師データ10との差が16となりますので、こちらのモデルの精度は悪い状態だと分かるかと思います。ここで感覚的にw14の値がもう少し小さくなれば良いのではないかなどが検討できるかと思います。
(例:w_{14}を1とすれば予測値が13となる)
そこで今度は図の右から左へ逆伝播を行い、誤差を各層に伝えて行くことで重みの値を最適化していきます。逆伝播の計算は数学的に難しい部分でありますので、今回は説明を割愛します。処理のイメージのみ理解するようにしてください。
そして、再度順伝播を行い、予測値と誤差を計算し、誤差ができる限り最小となるように順伝播と逆伝播を繰り返し行います。これがディープラーニングの基本的な計算の流れとなります。
まとめ
今回は数学の視点からディープラーニングの処理の流れを説明しました。この流れをしっかり理解しておくことで実際にディープラーニングを実装する際も、スムーズに処理の流れを実装することができると思います。各STEPをしっかり抑えるようにしてください。