今回から、ニューラルネットワークをつかった株ロボを作成してみようと思います。
ニューラルネットワークは人間の脳に類似した構造をコンピューター内に作り、
インプットされたデータに反応した擬似的な神経細胞を次々と刺激していきます。
刺激を受けた神経は刺激の総量が閾値を超えたら次の細胞へ刺激を伝えます。
実際の神経細胞が、シナプスごとに太さが異なり、つながりの強さが異なるように、
ニューラルネットワークの神経細胞も、関係性の高い神経同士はつながりが強くなるようにします。
基本的なところはこんなところですが、
詳しいことは
ニューラルネットワーク入門
http://www-ailab.elcom.nitech.ac.jp/lecture/neuro/menu.html
に書いてありますので参考にしてください。
設計した脳に、学習データを読み込ませ、正しい場合は通ってきたラインのつながりを強く。
間違っていた場合は通過したシナプスのつながりを弱くします。
今回は初回ということもありますので、
ものすごく簡単なニューラルネットワークを作ってみようと思います。
作るプログラムは、ナップザック問題のようなものを作ろうと思います。
5つの価格の異なるお菓子を用意し、
規定の金額以下ならOK、
規定の金額を超えてしまったらNGとします。
OKの場合は何も変化させず、
NGの場合は閾値を増加させ、通過したシナプスの重み付け変数を下げます。
神経細胞の数ですが、インプットの層と、判断の層のみの2層で作ります。
隠し層と言われる層はややこしくなりそうなので、今回は省略します。
まずインプット層はお菓子の数だけ用意し、お菓子を買い場合は1、買わない場合は0を入力します。
入力情報(0と1)とそれぞれの重み変数を掛けあわせ、閾値を超えたら買うという判断をさせます。
学習データは、ランダムに選んだ5パターンを与えます。
十分に学習させた後、適当なランダムのパターンをインプットして、
学習が成功したかを確かめます。
以下コードです。
import random
import numpy as np
import pylab
def main():
snak =[0] * 5 #お菓子は5つ
snak[0] = [60,10]
snak[1] = [100,40]
snak[2] = [20,5]
snak[3] = [80,60]
snak[4] = [120,25]
#それぞれの重み付け
weight =[]
for i in range(5):
weight.append(random.uniform(0.1,1))
print weight
#閾値の設定
threshold = 0.8
limitAmount = 500
limitVolume = 110
#シグモイド関数
def sigmoid(x):
ans = 1.0/(1.0 + np.exp(-x))
return ans
## xnum = np.arange(0,10.0,0.1)
## ynum = sigmoid(xnum)
## pylab.plot(xnum,ynum)
## pylab.show()
for j in range(100):
buySnakStck =[]
for i in range(5):
#買うお菓子を決める
buySnak = []
for i in range(5):
buySnak.append(random.randint(0,1))
# print buySnak
buySnakStck.append(buySnak)
for buySnak in buySnakStck:
# print buySnak
#刺激計算
stimulate = 0
allStimulate = 0
amount = 0
allVolume =0
for i in range(5):
stimulate = buySnak[i] * weight[i]
allStimulate = allStimulate + stimulate
amount = amount + snak[i][0] * buySnak[i]
allVolume = allVolume + snak[i][1] * buySnak[i]
#興奮制御
if sigmoid(allStimulate) >threshold: #買う場合
# print u"買います"
if amount <= limitAmount:
# print u"この買物は成功です"
flag = 1
else: #正解は買わない
print u"この買物は失敗です",j
threshold = threshold * 1.1 #閾値を上げる
if threshold >1:
threshold = 1
for i in range(5):
if buySnak[i] ==1:
weight[i] = weight[i] * 0.9 #重みを下げる
if weight[i] <0.1:
weight[i] = 0.1
else: #買わない場合
# print u"買いません"
if amount >limitAmount:
# print u"この買物は成功です"
flag = 1
else: #正解は買う
print u"この買物は失敗です" ,j
threshold = threshold * 0.9 #閾値を下げる
if threshold <0.1:
threshold = 0.1
for i in range(5):
if buySnak[i] ==1:
weight[i] = weight[i] * 1.1 #重みを上げる
if weight[i] >1:
weight[i] = 1
if j==5000:
print j
print threshold,weight
if __name__ == '__main__':
main()
今回作成しましたニューラルネットワークでは、値段に関しての条件のみしか設定していません。
2条件以上の条件を判断させたい場合、隠し層の構築や、フィードバック機構の変更をしなければならないと思います。
特にフィードバック機構に関しては今回は適当に上げ下げしているだけですが、
本来ならバックプロパゲーション法なような方法を使うことで、よりちゃんとした物ができると思います。
次回はこのフィードバック機構を作ってみたいと思います。
参考
ニューラルネットワーク
http://www.sist.ac.jp/~kanakubo/research/neuro.html
ゼロから始めるDeepLearning_その1_ニューラルネットとは
http://rishida.hatenablog.com/entry/2014/02/25/110643
ニューラルネットワーク
http://www.geocities.co.jp/SiliconValley-Cupertino/3384/nn/NN.html
マッチ箱の脳(AI)―使える人工知能のお話
http://www.amazon.co.jp/%E3%83%9E%E3%83%83%E3%83%81%E7%AE%B1%E3%81%AE%E8%84%B3-AI-%E2%80%95%E4%BD%BF%E3%81%88%E3%82%8B%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD%E3%81%AE%E3%81%8A%E8%A9%B1-%E6%A3%AE%E5%B7%9D-%E5%B9%B8%E4%BA%BA/dp/4883170802
0 件のコメント:
コメントを投稿