ディープラーニングで用いられるニューラルネットワークという考え方、 アルゴリズムについての基礎知識をメモします。
What's ニューラルネットワーク
ニューラルネットワークとは、人間の脳に模した人口ニューロンの集まり。 人間の脳はニューロンというものが集まって電気信号を渡していると考えられている。
人口ニューロンの計算
ディープラーニングにおける人口ニューロン1つ1つの計算は以下の通り行われる。
y = φ(W1X1 + W2X2 + W3X3 ... + b)
- y: 出力
- φ: 活性化関数
- W: 重み
- X: 入力
- b: バイアス
バイアスは0に調整して省略することもある。
φ(活性化関数)
活性化関数を使用することで、線形な式を非線形にすることができる。 これがないと勾配を探しに行くことができない。
以下のような性質をもつことが求められる。
- 微分可能
- 非線形
代表的な活性化関数
活性化関数は大きく以下の2パターンがある。 - 出力層でよく使用されるもの - 最終的な結果の算出 - 中間層でよく使用されるもの
出力層でよく使用されるもの
-
Linear そのままの値を出力したい時に使用する。 (温度とか)
-
Sigmoid 出力がベルヌーイ分布(0か1)で出力したい時に使用する。 (yes or no)
def sigmoid(x):
return 1 / (1 + np.exp(-x))
- Softmax マルチヌーイ分布(カテゴリカル分布)で出力したい時に使う 要は確率で出したい時
def softmax(a):
x = np.exp(a)
u = np.sum(x)
return x / u
中間層でよく使用されるもの
- ReLU 0以下は0、それ以外はそのままの値を出力する。 基本これを使う。最近はReLUの進化版も出てるが基本これ。
def relu(x):
return np.maximum(0, x)
- Sigmoid, Tanh 一応使われるがあまりない。勾配が消えてしまうから。
損失関数
学習において今のネットワークがいいのか悪いのかを計算するスコアが必要になる。 そのスコアを計算するために、 どれくらい不正解かを算出する関数が必要になる。
つまり、損失関数のスコアが0になるものが最高の結果と言うことになる。
損失関数は基本的に、すでにライブラリにある最適化されたものを使用すれば良い
ミニバッチとエポック
仮にデータの総数が1000個として考え、100件ずつのデータに分けて、学習と検証を行う場合
ミニバッチ
100件ずつを10個のミニバッチに分けて行うと言う
エポック
10個のミニバッチそれぞれで学習と検証を行うことを1エポックといい。 10エポックなら、それを10回繰り返す