最低限のニューラルネットワークの実装で原理を理解する
背景
もはや言わずもがなですが、Deep Learning、来てますよね。
ですが、その原理を学習しようと思った場合に、全くの素人が本当の意味での第一歩から勉強したいと思った時に、
レベルに見合ったサンプルコードを見かけることができません。
というか、私がそうでした。
MNISTとか、代表的なサンプルはありますし、動きもなんとなくわかるんですが、
具体的に裏でどう動いているのかというところが一発で分かるようなものはありませんでした。
今回、最低限のニューラルネットワーク(というかニューロン)を用意して、その挙動について説明を入れて、その原理をまとめます。
(今回の記事は次の記事を参考に作成しております)
Neural networks and deep learning
やったこと
ニューラルネットというより一つのニューロンを用意します。
入力は1固定で、出力が0になるように学習させます。
今回、ニューロンの活性関数にはシグモイド関数を用いました。
一般的なNNの話ですが、シグモイドの変数は
y = weight * x + bias
としています。
結果
横軸が学習回数、縦軸が出力値です。
学習を進めると出力値が0に近づいていることがわかると思います。
学習回数は50回です
考察
今回1つのニューロンに学習させましたが、weightとbiasについて少しわからないところがありました。
以下に示すようにアップデートされていきましたが、どこかで収束するような気配がありません。
両者の絶対値が完全に一致したら収束するのかもしれませんが、
みた感じ収束する気配がありません。
ただ、もっとイテレーション回すと出力は0に近づくのでそういうものなのかもしれません。
サンプルコード
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)