Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Python DeepLearningに再挑戦 2 ニューラルネットワーク

概要

Python DeepLearningに再挑戦 2 ニューラルネットワーク

参考書籍

ニューラルネットワークについて

パーセプトロンで、手動で決めていたw1とかw2とかの重みをデータから自動で学習できる。 めっちゃ便利そう(^ ^)

図で表すと以下のような感じらしい。

f:id:riikku:20161219153406p:plain

パーセプトロンの式をシンプルなものに変換しておくと便利らしい。

y = h(b + w1x1 + w2x2)

            0 (x<=0)
h(x) = {
            1 (x>0)

これはステップ関数と呼ばれるらしい。

活性化関数

入力信号の総和を出力信号に変換する関数を、活性化関数という。(activation function)

入力信号の総和を活性化関数に変換する場合の式を丁寧にかくと以下の通りになる。

a = b + w1x1 + w2x2 
y = h(a)

図に表すと以下の通り!

f:id:riikku:20161219154311p:plain

シグモイド関数

ニューラルネットワークでよく使われるのは、シグモイド関数らしい。

h(x) = 1 / 1+exp(-x)

式の意味は全然わからないけど、とりあえずこれを使うことが多いようだ。

ステップ関数を実装してみる。

def step_function(x):
    if x > 0:
        return 1
    else:
        return 0

ただ、これでは、実数しか取れないため、numpyの配列を取れるように修正する。

def step_function(x):
    y = x > 0 # x > 0の時の、boolean値を返す。True=1, False=0
    return y.astype(np.int) # astypeで、np.int(整数)を指定して変換する。

ステップ関数のグラフ

import numpy as numpy
import matplotlib.pylab as plt

def step_function(x):
    return np.array(x > 0, dtype=np.int) # もっと省略して、x>0の時に、true,falseをintで返すようにしてある。

x = np.arange(-5.0, 5.0, 0.1) # -5.0 ~ 5.0 までを、0.1きざみで配列にしていく。
y = step_function(x) # step_functionの結果
plt.plot(x, y)
plt.ylim(-0.1, 1.1) # y軸の範囲
plt.show()

確かに階段ぽい感じになった。

シグモイド関数の実装

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

グラフを出力する。

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1)
plt.show()

すげー!曲線グラフきた!

シグモイド関数と、ステップ関数は曲線か直線かは違うが、どちらとも、入力が小さい場合は出力も小さく、大きい場合は出力も大きくなる。あとは、両方非線形関数という点も一緒。

ReLU関数

最近は、ReLU(Reactifiled Linear Unit)という関数が主に用いられるらしい。 ReLUは、入力が0より大きい場合は、その入力をそのまま出力して、0以下ならば0を出力する関数。

         x ( x > 0)
h(x) {
         0 (x <= 0)

ReLU関数の実装は以下の通り

def relu(x):
    return np.maximum(0,x) # maximumは、数字を比較して大きい数字を表示する。

numpy便利やなぁw