機械学習の中の一分野、ディープラーニングについてお勉強中。
ディープラーニングとは入力値を複数階層にわたり分析、評価して分類、予測に紐づく出力をするための概念といったところか。
まずは初歩の初歩としてパーセプトロンとニューラルネットワークについて学んだ。
※ちょいちょいコードに出てくるnpはpythonのNumPyライブラリ
活性化関数について
前層の出力値を次の層に渡す際に、活性化関数を通してから渡す。
この活性化関数の違いにより、パーセプトロンなのか、ニューラルネットワークなのかが変わる。
パーセプトロン
まず抑えておくとニューラルネットワークをより理解しやすくなると思う。
パーセプトロンは活性化関数としてステップ関数を使う。
ステップ関数
ステップ関数は入力値に対して重み、バイアスを使って総和を出し、それが0より大きいか否かを判定する。
総和(入力値 * 重み) + バイアス > 0 = 1
総和(入力値 * 重み) + バイアス <= 0 = 0
パーセプトロンを使って、AND、NAND、OR、XORを表現しようとすると、XORだけ多層で処理しないと判定できない。
ニューラルネットワーク
ニューラルネットワークもパーセプトロンと同様に、入力値に対して重みをかけ、バイアスを加算し、活性化関数を通して次の層へ値を渡す。最終的な出力値を出すそうは出力層として活性化関数を使わずに恒等関数、またはソフトマックス関数を使用する。
ニューラルネットワークの活性化関数
ニューラルネットワークでは活性化関数としてシグモイド関数を使用する。が、最近ではrelu関数が主に使用されるとのこと。ニューラルネットワークではこれらの非線形関数で層を掘っていくが、線形関数じゃ何で駄目なのかと言われると、線形関数だと中間層(隠れ層)がなくなっちゃうから。h(x)=cxの線形関数を使うとして、y(x) = h(h(h(x))) = c * c * c * x = ax (a=cの3乗)
と一回の掛け算で算出できちゃうので中間層なんてないものとできちゃう。そもそもディープラーニングの概念じゃなくなっちゃうってこと・
シグモイド関数
y = 1 / (1 + np.exp(-x))
exp(-x)は自然対数e(ネイピア数)に対して-x乗した値が入る
relu関数
y = np.max(0, x)
恒等関数とソフトマックス関数
最終的な出力を行う際、解析したい問題に応じて関数を使い分ける必要がある
恒等関数
出力層の直前層から送られてきた値をそのまま出力する。
データから、値を予測するといった回帰問題で使用する。
ソフトマックス関数
犬の画像を探し出すなど、分類問題で使用する。
def softmax(x):
x = x - np.max(x) # overflow対策
exp_x = np.exp(x)
sum_exp_x = np.sum(exp_x)
return exp_x / sum_exp_x
x = np.array([0.5,2,3.5])
y = softmax(x) # [ 0.03911257 0.17529039 0.78559703]
sum = np.sum(y) # 1.0
ソフトマックス関数で変換された出力値は総和が1になる。
これにより、各出力値を確率として扱うことが出来るので犬である確率が何%かといった分類が可能になる。