逆伝播の仕組み

やりたいことは簡単のニューラルネットワークの逆伝播の仕組みを計算することです。自分の中の整理のためでもあります。 もっともシンプルの例で、猫なのか、猫じゃないなのかを判断するただ一層のニューラルネットワークで、一枚の画像で訓練するとします。下の図で仕組みを表しています。 上の図では $x$ : 入力画像 $w$: 求めたい重み $b$: 求めたいバイアス $z$: 順伝播(Forward Propagation)の線形部分 $a$: $z$に対して活性化関数を適した後 $L$: 損失関数(Lost function) 砕けた言い方にするとニューラルネットワークの目的は損失関数を小さくして、その時に重み($w$)とバイアス ($b$) を求めるだけです。 猫であるかどうかを判断する2分類の問題は損失関数として、クロスエントロピー関数(Cross entropy)を使うことができます。下の形になっています。 $L(a, y) = −(ylog(a)+(1−y)log(1−a))$ $a$: 毎回訓練の結果を表しています。0.2, 0.6, 0.9などを値になります。 $y$: 実際ある画像は猫であるかどうかを示す値で、例えば0か1かになります。 $z$に活性関数(Activation Function)を適応する結果は$a$で、活性関数はシグモイド関数の場合、$a = \frac{1}{1+e^{-z}}$ です。 このネットワークの目的は$dW$ (重みの微分)と $db$(バイアスの微分)を求めることで、これらを求めたら下の式で少しずつ重み$W$と$b$を更新して、損失関数の値を小さくします。$\alpha$は学習率(Learning rate) $W^{[l]} = W^{[l]} - \alpha \text{ } dW^{[l]}$ $b^{[l]} = b^{[l]} - \alpha \text{ } db^{[l]} $ 目標がわかったので、これで$dW$を求めてみます。 $dW = \frac{d}{dW}{L(a, y)}$ 微分法の中で連鎖律があって、$dW$は下の形に書き換えることができます。 $dW = \frac{dL(a,y)}{da}\frac{da}{dz}\frac{dz}{dW}$ タスクをブレイクダウンして、求めると $da = \frac{dL(a,y)}{da} = (−(ylog(a)+(1−y)log(1−a)))‘$

シグモイド関数の微分

シグモイド関数(Sigmoid function)は $f(x) = \frac{1}{1+e^{-ax}} (a > 0) $ の形をしている関数です。下の図で表しています。 値は(0, 1)の間にあるので、よく確率として使われています。例えば 0.7だったら70%の確率という意味をします。 ニューラルネットワークの中で、シグモイド関数はよくTrue/Falseの判定に使われています。例えば画像が猫なのか、猫じゃないなのかを判断する場合、0.7だったら、猫であると判定します。 このようなニューラルネットワークを実装する際に逆伝播(Back propagation)を実装する必要になります。その中の一部として、シグモイド関数の微分を求めることになります。 シグモイド関数の微分は 下の形をしています。これを方程式を使えば、Numpyでかなり簡単に実装できるようなります。 $$ f(x) = \frac{1}{1+e^{-ax}} (a > 0) \\ f(x)’ = af(x)(1−f(x)) $$ 上の方程式を導いてみると $$ (\frac{1}{1+e^{-ax}})’ = \\ \frac{-1} {(1+e^{-ax})^2} (1+e^{-ax}) = \\ \frac{-1} {(1+e^{-ax})^2} (e^{-ax})(-ax)’ = \\ \frac{-1} {(1+e^{-ax})^2} (e^{-ax})(-a) = \\ \frac{ae^{-ax}} {(1+e^{-ax})^2} = \ \frac{a}{(1+e^{-ax})} \frac{e^{-ax}}{(1+e^{-ax})} = \ \frac{a}{(1+e^{-ax})} \frac{1+ e^{-ax} -1 }{(1+e^{-ax})} = \ af(x)(1-f(x)) $$ $a = 1$の時に $f(x)’ = f(x)(1-f(x)) $ になります。

2層のニューラルネットワークをスクラッチから実装

やりたいことは2階層のニューラルネットワークを実装して、猫なのか、猫じゃないなのかを判断するモデルを作ることです。CNN(畳み込みネットワーク)は使わず、スクラッチからNumpyでForward PropagationとBack propagationを実装します。 209枚の画像訓練データと50枚の画像テストデータを使います。 訓練データtrain_catvnoncat.h5とテストデータ test_catvnoncat.h5両方とも HDF5フォーマットです。 とりあえず訓練データを読み込んで中身を確認します。 import numpy as np import h5py train_dataset = h5py.File('./images/train_catvnoncat.h5', "r") print(list(train_dataset.keys())) 結果 ['list_classes', 'train_set_x', 'train_set_y'] 訓練データの画像セットとラベルをそれぞれ抽出します。訓練用の画像は209枚があって、どれも3つの色チャンネルで、 横 x 縦 64 x 64の画像です。 train_x_orig = np.array(train_dataset["train_set_x"]) # 訓練データ画像セット自体 train_y = np.array(train_dataset["train_set_y"]) # 訓練データ画像セットのラベル train_y = train_y.reshape(train_y.shape[0], -1).T print(train_x_orig.shape) print(train_y.shape) 結果: (209, 64, 64, 3) (1, 209) 訓練データと同様にテストデータを準備します。テストの画像データは50枚があって、どれも3つの色チャンネルで、 横 x 縦は 64 x 64の画像です。 test_dataset = h5py.File('./images/test_catvnoncat.h5', "r") test_x_orig = np.

Hugoに使われる数式のMarkdown

例1 $$ T = S((1 + \frac{E}{R})^{F} - 1) $$ $$ T = S((1 + \frac{E}{R})^{F} - 1) $$ 例2 $T = S((1 + \frac{E}{R})^{F} - 1)$ $T = S((1 + \frac{E}{R})^{F} - 1)$ 例3 $$ \begin{align} \dot{x} & = \sigma(y-x) \newline \dot{y} & = \rho x - y - xz \newline \dot{z} & = -\beta z + xy \end{align} $$ $$ \begin{align} \dot{x} & = \sigma(y-x) \newline \dot{y} & = \rho x - y - xz \newline \dot{z} & = -\beta z + xy \end{align} $$

(WIP)統計&機械学習&画像関連のメモ

Machine Learning If you suspect your neural network is over fitting your data, that is you have a high variance problem, one of the first things you should try probably is regularization. The other way to address high variance, is to get more training data that’s also quite reliable. Model developers tune the overall impact of the regularization term by multiplying its value by a scalar known as lambda (also called the regularization rate).

ベイズ公式メモ

ベイズ統計入門の15-3章を読んでベイズの公式どうやって出てきたかを勉強になったので、それを簡単にまとめるメモ 問題1 目の前にツボが一つあり、AのツボかBのツボであることはわかっているが、見た目ではどちらかわからない。知識として、Aのツボには9個の白球と1個の黒球が入っており、Bのツボには8個の黒球と2個の白球が入っていることを知っている。今、ツボから1個球を取り出したら、黒球だった。目の前のツボはどちらのツボか。 黒球取り出して、Bツボである確率を計算してみると P(B|黒) = P(B & 黒) / P(黒) = ( P(B) x P(黒|B) ) / P(黒) = ( P(B) x P(黒|B) ) / ( P(A & 黒) + P(B & 黒)) = ( P(B) x P(黒|B) ) / ( ( P(A) x P(黒|A) ) + ( P(B) x P(黒|B) ) ) 補足 P(A|B) = P(AとBの重なり) / P(B) 問題2 珍しい病気の診断問題で、仮に千人の中に一人がこの病気にかかるとする。検査ではヒット率が99%で、つまり人が本当に病気にかかって、さらに検査で99%の精度でpositive(病気にかかってる)の結果が出る。逆に病気にかかっていないにも関わらずpositiveの検査結果が出る確率は5%。このようなデータに基づいて一人を選んで、検査して、検査結果はpositiveの場合、この人本当に病気にかかっている確率はどのぐらい。 分母は二つの確率の和で、1) 病気かかって、さらにpositiveと診断される確率 2) 病気かかっていないけどpositiveと診断される確率。