ニューラルネットワークの計算の方法として、自分でパラメータを決めて計算を実行する方法とニューラルネットワークに学習させ計算を実行する方法の二つがあります。
今回は基礎的なニューラルネットワークの学習法である、誤り訂正学習について調べました。
ニューラルネットワークのパラメータ
先日の記事で示した単純パーセプトロンの図と動作式を下に示します。
単純パーセプトロンでは重みを適切な値に設定すれば AND・OR・NAND関数等を表すことができます。
この時重みは人間が適当に設定することもできますが、ニューラルネットワークではプログラムに学習させ重みを適当な値に設定することができます。
ニューラルネットワークには 誤差逆伝播学習 などの有名で効率的な学習法がありますが、今回は基本的な学習法の 誤り訂正学習法について調べ、実行してみました。
誤り訂正学習
誤り訂正学習のアルゴリズムを次に示します。
- 入力x1と重みw1を元に単純パーセプトロンの出力y1を求める。
- 出力y1を正解データt1と比較する。
- y1 = t1 ならば何も実行しない。
- y1 と t1 が一致していないときには重みw1を下記の式をもとに更新する。
- 更新した重みをもと上記の計算を繰り返す。
重みを更新する式を下に示します。
ここでηは学習率といい、一回の学習で更新する量の大きさを決めます。このηの値が大きすぎても、小さすぎても効率的に学習することはできません。
AND関数の誤り訂正学習
それではさっそくAND関数を元に、誤り訂正学習を行ってみたいと思います。
まず次にAND関数の真理値表を示します。
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
この表のyが学習する際の正解データ t となります。
つぎに誤り訂正学習を行うプログラムのコードを示します。言語にはPython 3.x を使用しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
import numpy as np #重み初期値 w = np.array([3.0, 3.0, 3.0]) #入力 input_array = np.array([[1,0,0],[1,1,0],[1,0,1],[1,1,1]]) #正解データ training_data = np.array([0,0,0,1]) #パーセプトロンによるAND関数 def AND(x): temp = np.sum(x*w) if temp <= 0: return 0 else: return 1 #誤り訂正量の計算 def w_update(w,y,i): eta = 0.1 return eta*(training_data[i] - y)*input_array[i] i = 0 zeros = 0 print("init W = {0}".format(w)) #学習ループ while 1: index = i%4 #AND関数の計算 y = AND(input_array[index]) #誤り訂正量の計算 dw = w_update(w,y,index) w += dw #途中計算の表示デフォルトではコメントアウト #print("{5} : x = {3} : y = {0} : t = {1} : w = {2} : dw = {4}".format(y,training_data[index],w,input_array[index],dw,i)) #重みの訂正量が4回続けて0の時学習を終了する if (np.sum(dw) == 0): zeros += 1 else: zeros = 0 if (zeros >= 4): break i += 1 #学習結果表示 print("W = {0}".format(w)) |
今回は学習のパラメータとして次の値を使用しました。
- 初期重み:w=(3.0, 3.0, 3.0)
- 学習率:η = 0.1
プログラムの実行結果を次に示します。
すべての結果を表示すると長くなりますので、途中部分は省略します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
init W = [3. 3. 3.] 0 : x = [1 0 0] : y = 1 : t = 0 : w = [2.9 3. 3. ] : dw = [-0.1 -0. -0. ] 1 : x = [1 1 0] : y = 1 : t = 0 : w = [2.8 2.9 3. ] : dw = [-0.1 -0.1 -0. ] 2 : x = [1 0 1] : y = 1 : t = 0 : w = [2.7 2.9 2.9] : dw = [-0.1 -0. -0.1] 3 : x = [1 1 1] : y = 1 : t = 1 : w = [2.7 2.9 2.9] : dw = [0. 0. 0.] 4 : x = [1 0 0] : y = 1 : t = 0 : w = [2.6 2.9 2.9] : dw = [-0.1 -0. -0. ] ・ ・ ・ 66 : x = [1 0 1] : y = 1 : t = 0 : w = [-1.4 1.3 1.3] : dw = [-0.1 -0. -0.1] 67 : x = [1 1 1] : y = 1 : t = 1 : w = [-1.4 1.3 1.3] : dw = [0. 0. 0.] 68 : x = [1 0 0] : y = 0 : t = 0 : w = [-1.4 1.3 1.3] : dw = [0. 0. 0.] 69 : x = [1 1 0] : y = 0 : t = 0 : w = [-1.4 1.3 1.3] : dw = [0. 0. 0.] 70 : x = [1 0 1] : y = 0 : t = 0 : w = [-1.4 1.3 1.3] : dw = [0. 0. 0.] W = [-1.4 1.3 1.3] |
今回の条件で単純パーセプトロンの学習を行うと、66回目の学習でAND関数を表現することができるようになりました。
パーセプトロンの学習は、パラメータを変えることでより適正に行うことができます。
パーセプトロンの収束定理
今回は単純パーセプトロンに誤り訂正学習を用いてAND関数を学習させました。
この誤り訂正学習を用いれば、様々な関数 を単純パーセプトロンで表現することができます。
ではこの誤り訂正学習を用いれば どんな関数 でも表現することができるのでしょうか?
パーセプトロンの学習で表現できる関数には次のような定理があります。
単純パーセプトロンにおいて線形分離可能な学習データを用いれば、有限回の修正で学習を収束できる。
これをパーセプトロンの学習の収束定理といいます。
線形分離可能については先日の記事で調べました。
まとめ
- ニューラルネットワークの基本的な学習方法として 誤り訂正学習法がある。
- 誤り訂正学習では、正解データとパーセプトロンの出力の差に 学習率 と入力の値をかけたものを重みに足し合わせることで学習する。
- 今回は誤り訂正学習を用いて、単純パーセプトロンにAND関数を学習させた。
- 学習データが線形分離可能なら、有限回の修正で学習は収束する。
関連記事