ろむめも

気になったこととか、調べたことをゆるくまとめます。主にプログラミング関連の話題が多いです。

最低限のニューラルネットワークの実装で原理を理解する

背景

もはや言わずもがなですが、Deep Learning、来てますよね。
ですが、その原理を学習しようと思った場合に、全くの素人が本当の意味での第一歩から勉強したいと思った時に、
レベルに見合ったサンプルコードを見かけることができません。
というか、私がそうでした。

MNISTとか、代表的なサンプルはありますし、動きもなんとなくわかるんですが、
具体的に裏でどう動いているのかというところが一発で分かるようなものはありませんでした。

今回、最低限のニューラルネットワーク(というかニューロン)を用意して、その挙動について説明を入れて、その原理をまとめます。
(今回の記事は次の記事を参考に作成しております)
Neural networks and deep learning

やったこと

ニューラルネットというより一つのニューロンを用意します。
入力は1固定で、出力が0になるように学習させます。
今回、ニューロンの活性関数にはシグモイド関数を用いました。

f:id:romth:20161110213542j:plain

一般的なNNの話ですが、シグモイドの変数は
y = weight * x + bias
としています。

結果

f:id:romth:20161110213553p:plain
横軸が学習回数、縦軸が出力値です。
学習を進めると出力値が0に近づいていることがわかると思います。
学習回数は50回です

考察

今回1つのニューロンに学習させましたが、weightとbiasについて少しわからないところがありました。
以下に示すようにアップデートされていきましたが、どこかで収束するような気配がありません。
両者の絶対値が完全に一致したら収束するのかもしれませんが、
みた感じ収束する気配がありません。
ただ、もっとイテレーション回すと出力は0に近づくのでそういうものなのかもしれません。
f:id:romth:20161110213604p:plainf:id:romth:20161110213608p:plain

サンプルコード

python:2.7.10

# -*- coding: utf-8 -*-

import math
import random


# cost function of cross entropy
def fun(a):
    return -math.log(1 - a)

# differential of fun
def dfun(a):
    return 1 / (1 - a)

# sigmoid function
def sigmoid(x):
    return 1 / (1 + math.exp(-x))

eta = 0.15
weight = random.random()
bias = random.random()
epoch = 0
maxEpoch = 50

print 'out, delta, weight, bias'
for i in range(maxEpoch):

    # calculate sigmoid function by current parameter
    a = sigmoid(weight + bias)
    # get value of difference
    delta = dfun(a)
    # update parameters by delta and eta, eta is learning rate
    weight += -eta * delta
    bias += -eta * delta

    print str(sigmoid(weight + bias)) + ', ' + str(delta) + ', ' + str(weight) + ', ' + str(bias)