Deep Learning 4.6 ReLU関数

ReLU(Rectified Linear Unit)(Rectify:正す)関数は、入力が0を超えていれば、
それをそのまま出力し、0以下ならば0を出力する関数である。
現在この関数が主に活性化関数として使用されている。

ReLU関数を数式で表すと、次の式のように書くことができる。

\begin{eqnarray} h(x)= \begin{cases}
x & x > 0 \\
0 & x \leqq 0 \tag{1.7}
\end{cases}
\end{eqnarray}

シンプルな関数で、実装も簡単である。
def relu(x):
return np.maximum(0, x)

maximumという関数は入力された値のうち、大きい方の値を選んで出力する関数である。

戦闘を音ゲーにしようとして 

これをゲームの戦闘にしようとしていたのだが、(実際はタイミングが合えばダメージが増加したり攻撃が成功したりする。

やってみて分かったことだが、私はこれは得意ではない。

さらに、ゲームブック式の戦闘少なめの仕様であるので、いきなりボス戦でよくわからない仕様の戦闘が始まったことを考えると頭痛がする。

ただ一つの可能性が潰せたことは大きな収穫だ。

音が出ます注意してください

http://www.zeroprog.com/wp-content/uploads/bs/index.html

こちらで未完成品のガラクタが遊べるが、とても面白くない。ヒドイ出来だ。

Deep Learning 4.5 シグモイド関数とステップ関数の比較

青い破線がステップ関数、オレンジの曲線がシグモイド関数を表す。出力量を水に例えると、ステップ関数はししおどしのように、水を流すか流さないか、2つの動きのみをするに対して、シグモイド関数は水車のように、流れてきた水の量に比例して、次へ流す水の量を調整する。

見た目は、異なるが、入力が0に近ければ0に近い値を(0を)1に近ければ1に近い値を出力する非線形関数(*1)であり、どんなに入力信号が大きくても出力は0から1の間に押し込める点が共通している。

(*1):線形関数は1本の直線であらわされる関数であり、それ以外は非線形関数である。

ニューラルネットワークでは、活性化関数に非線形関数を使用しなくてはならない。
線形関数を使用すると、どんなに層を深くしても、入力と出力の間に一定の関係ができてしまうことは、直観的にわかるだろう。

例えば、活性化関数にh(x)=cxのみを使用した、3層のネットワーク構造を考えると、y(x) = h(h(h(x))))で表されるが、y(x) =h(h(h(x)))) = h(h(cx))) = h(c*c*x) = c*c*c*xとなり、y(x) = ax(ただし、a=c*c*c(定数))の一回の掛け算で表現でき、実質隠れ層である中間層はいらなくなる。

このため、多層構造の恩恵を得るためには、活性化関数に非線形関数を使用する必要がある。

シグモイド関数は、ニューラルネットワークに古くから利用されていたが、現在使われている活性化関数はReLU(Rectified Linear Unit)関数であり、シグモイド関数よりかなりシンプルである。 次回示すことにする。

Deep Learning 4.4 シグモイド関数の実装とグラフ

4.4.1シグモイド関数の実装

\[ h(x) =  \frac{1}{1+exp(-x)} \tag{1.6}\]

上式(1.6)で表される、シグモイド関数は、Pythonでは次のコードで表される。

np.exp(-x)はexp(-x)に相当、つまり

\[sigmoid(x)= \frac{1}{(1+e^{-x})}\]

を表し、retun で値を返す。繰り返すがeはただの実数の定数であり、
e=2.7182とすると
\[e^{-x}=\frac{1}{(2.7182)^{x}}\]
に過ぎない。

 

他の言語と違ってPythonは(NumPy配列実装は)
exp(-x)の引数-xに配列を入力しても、結果は正しく計算される。

NumPy配列の利便性の確認のため、具体例を下記に示す。

シグモイド関数をグラフ描画してみる。下記、順番に実装、グラフ。

Deep Learning 4.3 ステップ関数のグラフ

4.3.1 ステップ関数のグラフ

どのようなグラフか説明したいため、実装コードの詳細な説明は割愛させていただく。

結果は下図2つのようになる。

上図で表されるように、ステップ関数は0を境に、出力が0から1に(マイナス方向だと1から0)へ切り替わる。
階段状に値が切り替わることから、ステップ関数は「階段関数」と呼ばれることもある。