はじめに
機械学習の勉強として、「基礎から学ぶ 人工知能の教科書」 を読んでいます。
この本の特徴は、章末問題にPythonの簡単なプログラムが載っていてるところです。
ここでは、それをRubyにて写経しています。
第5章 章末問題
neuralnet.rb
INPUTNO = 2
HIDDENNO = 2
def forward(wh, wo, hi, e)
HIDDENNO.times do |i|
u = 0.0
INPUTNO.times do |j|
u += e[j] * wh[i][j]
end
u -= wh[i][INPUTNO]
hi[i] = f(u)
end
o = 0.0
HIDDENNO.times do |i|
o += hi[i] * wo[i]
end
o -= wo[HIDDENNO]
f(o)
end
def f(u)
return 1.0 if u >= 0
0.0
end
wh = [[-2, 3, -1], [-2, 1, 0.5]]
wo = [-60, 94, -1]
e = [[0, 0], [0, 1], [1, 0], [1, 1]]
hi = [0] * (HIDDENNO + 1)
e.each do |i|
puts "#{i}->#{forward(wh, wo, hi, i)}"
end
単純な階層型ニューラルネットの計算で学習なしですが、26行目のインデントに誤りがありますのでお気を付けください**(2019年9月25日 第1版第1刷発行)**
error.py
for i in range(HIDDENNO): #誤
for i in range(HIDDENNO): #正
ご存知の通り、Pythonでのインデント誤りは致命的と思われますが、幸い、オーム社の書籍ページよりサンプルコードをダウンロードすることができます。
基礎から学ぶ 人工知能の教科書
step.rb
def f(u)
return 1.0 if u >= 0
0.0
end
# 出力例
[0, 0]->0.0
[0, 1]->1.0
[1, 0]->1.0
[1, 1]->0.0
伝達関数fはステップ関数
Sigmoid.rb
def f(u)
1 / (1 + Math::E ** -u)
end
# 出力例
[0, 0]->0.0006265270712940932
[0, 1]->0.6434453861326787
[1, 0]->0.0003334059232134918
[1, 1]->8.512503196901111e-16
伝達関数fはシグモイド関数
ramp.rb
def f(u)
return u if u >= 0
0.0
end
# 出力例
[0, 0]->0.0
[0, 1]->1.0
[1, 0]->0.0
[1, 1]->0.0
伝達関数fはランプ関数
まとめ
- 第5章まで読んだ