元理系院生の新入社員がPythonとJavaで色々頑張るブログ

プログラミングや機械学習について調べた事を書いていきます

Pythonでニューラルネットワーク

この記事に書かれている事

Pythonによるニューラルネットワークの実装

はじめに

バックプロパゲーション:入門編

ニューラルネットワークについてとても親切に解説されているサイトが公開されていたので、
Pythonで実装しました。

また、テストコードとしてsin関数の関数近似を行ってみました。

__author__ = 'emoson'
import numpy as np


def sigmoid(x, beta=1.0):
    return 1.0 / (1.0 + np.exp(beta * -x))


def d_sigmoid(x, beta=1.0):
    return beta * x * (1 - x)


def linear(x):
    return x


def d_liner(x):
    return 1


class MultilayerPerceptron:
    def __init__(self, in_size, h_size, o_size):
        self.w1 = np.random.random([h_size, in_size + 1])
        self.w2 = np.random.random([o_size, h_size + 1])

    def fire(self, x):
        h = sigmoid(np.dot(self.w1, np.insert(x, obj=0, values=1.0).T))
        o = linear(np.dot(self.w2, np.insert(h, obj=0, values=1.0, ).T))
        return h, o

    def bp(self, x, t, eta):
        h, o = self.fire(x)
        delta_o = (t - o) * d_liner(x)
        delta_h = d_sigmoid(np.insert(h, obj=0, values=1.0, axis=0)) * np.dot(delta_o, self.w2)

        d_w2 = eta * np.outer(delta_o, np.insert(h, obj=0, values=1.0, axis=0))
        self.w2 = self.w2 + d_w2

        d_w1 = eta * np.outer(delta_h[1:], np.insert(x, obj=0, values=1.0, axis=0))
        self.w1 = self.w1 + d_w1

    def batch(self, X, T, epoch_max):
        for epoch in range(epoch_max):
            for x, t in zip(X, T):
                self.bp(x, t, 1.0 - (epoch / epoch_max))

    def online(self, X, T, epoch_max):
        for epoch in range(epoch_max):
            i = np.random.randint(0, len(X))
            self.bp(X[i], T[i], 1.0 - (epoch / epoch_max))

このプログラムを用いて、sin関数を近似すると次のようになります。
f:id:emoson:20150310034848g:plain

近似関数を求めるとバックプロパゲーションの正しさを比較的容易に確認できるので良いですね。

次は多層パーセプトロンの学習則の記事を書きたいなぁ。