バックプロパゲーションのプログラム例

test 制御データファイル名 構造データファイル名   // C/C++,C#,VB の場合
Java Test 制御データファイル名 構造データファイル名   // Java の場合
PHP test.php 制御データファイル名 構造データファイル名   // PHP の場合
Ruby test.rb 制御データファイル名 構造データファイル名   // Ruby の場合
py -3 test.py 制御データファイル名 構造データファイル名   // Python の場合		
などと入力してやれば実行が開始されます.

  制御データファイルは,バックプロパゲーションの全体の実行を制御するためのものであり,たとえば以下のような形式で作成します.なお,以下,右図に示すようなネットワークにより,排他的論理和を学習させる場合を例として説明を行っていきます.なお,3 行目は,Java のプログラムを実行する場合だけに必要とします.他の言語のプログラムを実行する際には,3 行目を削除してください.なお,
誤差 0.1 出力 -2 出力ファイル kekka
順番 0 η 0.5 α 0.8
画面表示(円の大きさ,フォントサイズ,幅,高さ) 20 20 400 300		
  日本語で記述した部分(「誤差」,「出力」等)は,次に続くデータの説明ですのでどのように修正しても構いませんが,削除したり,または,複数の文(間に半角のスペースを入れる)にするようなことはしないでください(以下の説明においても同様).各データの意味は以下に示す通りです.

誤差

  収束の判定を行うための値です.各出力ユニットの実際の出力値と目標出力値の差がこの値以下になると収束と見なします.

出力

  出力先とその方法を指定します.以下に示すいずれかの値を入力します.
  • =0:誤って認識した数だけ出力
  • =1:認識結果を出力
  • =2:認識結果と重みを出力
なお,負の値を使用すると,結果をファイルへも出力します.この例の場合,-2 となっていますので,認識結果と重みが,ディスプレイとファイルに出力されます.

出力ファイル

  上の「出力」の項目に対して負の値を入力したときに必要となり,出力ファイル名を入力します.なお,ファイルへ出力をしないときは,「出力ファイル kekka 」の項を削除しておいてください.

順番

  学習例をどのような順番で与えるかを指定します.0 を入力すると学習例が入力された順番通り,また,1 を入力するとランダムに学習例が選ばれます.

η,および,α

  重みを修正する際の係数です

3 行目

  これらは,ネットワークの接続状況を図示するためのデータです.最初のデータは,円の大きさ(直径,各ユニットを円で描きます)を意味しています.この値を 0 にすると,接続状況の図示を行いません. 2 番目のデータは,ユニット番号を表示するフォントの大きさです.0 を入力すると,ユニット番号の表示を行いません. 3,および,4 番目のデータは,Windows の大きさです.Windows の幅と高さを入力します.

  構造データファイルは,ネットワークの構造(ユニットの数,接続関係等)を記述するためのものであり,たとえば以下のような形式で作成します.
入力ユニット数 2 出力ユニット数 1 関数タイプ 0
隠れ層の数 1 各隠れ層のユニット数(下から) 1
バイアス入力ユニット数 1
 ユニット番号:出力ユニットから順に番号付け
 入力方法:=-3:固定,=-2:入力後学習,=-1:乱数(default,[-0.1,0.1]))
 値:バイアス値(ー2またはー3の時)または一様乱数の範囲(下限,上限)
1 -1 -0.1 0.1
接続方法の数 2
 ユニット番号:ユニットk1からk2を,k3からk4に接続
 接続方法:=0:接続なし,=1:乱数,=2:重み入力後学習,=3:重み固定
 値:重み(2または3の時)または一様乱数の範囲(1の時:下限,上限)
3 4 1 2 1 -0.1 0.1
2 2 1 1 1 -0.1 0.1		
  各データの意味は以下に示す通りです.

入力ユニット数

  入力ユニット数を入力します

出力ユニット数

  出力ユニット数を入力します

関数タイプ

  各ユニットの出力値を計算するシグモイド関数の形を指定します.0 を入力すると各ユニットの出力値の範囲が [0, 1] となり,また,1 を入力すると [-1, 1] となります.

隠れ層の数

  隠れ層(入力層,出力層は含まれません)の数を入力します.

各隠れ層のユニット数(下から)

  各隠れ層に含まれるユニット数を入力します.たとえば,隠れ層の数が 2 であり(当然,「隠れ層の数」に対応する値も 2 にしなければなりません),1 番目の隠れ層(入力層のすぐ上)に含まれるユニット数が 5,かつ,2 番目の隠れ層に含まれるユニット数が 3 であるときは,この部分は,上で述べた項目も含め,
	隠れ層の数 2 各隠れ層のユニット数(下から) 5 3			
となります.なお,隠れ層の数が 0 の場合は,「各隠れ層のユニット数」以下を削除してください.

バイアス入力ユニット数

  何も指定しなければ,各ユニットのバイアスの初期値は,[-0.1 0.1] 区間の一様乱数によって設定されます.バイアスの初期値を変更したり,または,特定の値に固定したいような場合にこの項を使用します.ここで指定するのは,特別な指定を行いたいユニットの数です.なお,この項に続く 3 行は単なるコメントですが,この項に 0 を入力した場合でも削除しないでください.

1 -1 -0.05 0.05

  バイアス指定データです.上の項で指定した数だけこのようなデータが必要になります.このデータの意味するところは以下の通りです.まず,最初の数字(この例では 1 )は,ユニット番号を表しています.ネットワークの各ユニットは出力ユニットから順番に図に示すような番号付けが行われます.その番号を指定してください.

  次の数字(この例では -1 )は,バイアスの設定方法を示します.-1 の場合は,一様乱数を使用します.この例のように,次に続く 2 つのデータによって一様乱数の区間(この例の場合,[-0.05 0.05] )を指定します.

  -2 や -3 を指定した場合は,一様乱数を使用せず,次に続くデータがそのままバイアスの初期値となります.たとえば,ユニット 1 のバイアスの初期値を 0.1 にしたい場合は以下のようにします.
	1 -2 0.1			
なお,-3 の場合は,与えられた初期値を学習によって変更せず,そのまま固定されます.

接続方法の数

  接続方法を示すデータ群の数を入力します.接続方法を入力しないと,各ユニットは全く接続されない状態となります.従って,この項には必ず 0 より大きい値が設定されるはずです.なお,この項に続く 3 行は単なるコメントですが,絶対に削除しないでください.

3 4 1 2 1 -0.1 0.1
2 2 1 1 1 -0.1 0.1

  各々,接続方法を示すデータ群です.この例の場合,上の項で 2 を入力しているため,これら 2 つのデータ群を必要とします.各データの意味するところは以下の通りです.

  最初の 4 つのデータ( k1, k2, k3, k4 とする)は接続するユニット番号を表しています.ユニット番号が k1 から k2 (その間のユニットも含む)であるユニットを,ユニット番号が k3 から k4 (その間のユニットも含む)であるユニットに接続することを意味しています.たとえば,「3 5 1 2」の入力により,「3-1, 3-2, 4-1, 4-2, 5-1, 5-2」という 6 つの接続が生成されます.この例の場合,どのようになるかは,図と照らし合わせてみれば明らかだと思います.

  5 つ目の数字は,接続方法を表し,0,1,2,および,3 のいずれかの値を設定します.0 を選択すると最初の 4 つのデータで指定されたユニット間の接続が削除されます.それ以外の値を入力した場合は,指定されたユニット間が接続されます.ただし,重みの初期値の設定が指定した値によって異なってきます.その意味は,ユニットのバイアスの項で説明した -1,-2,および,-3 の場合を,重みの初期値に読み替えてみれば明らかだと思います.

  上で説明したデータの元で実行すると,以下に示すようなメッセージが出力されますので,下線部を入力してください.
学習回数は? 5000
何回毎に収束を確認しますか? 500
学習パターンのファイル名は? learn.dat		
  与えられた 1 つの学習例(訓練例,学習パターン)のもとで,重みを修正する手続きを 1 回の学習とします.従って,上の例では,この動作を 5000 回行うことになります.

  このプログラムでは,1 回の学習毎に収束したか否か(すべての例を正しく分類したか否か)の判定を行いません.上の例の 2 行目で与えられた回数毎にその判定を行います.そのとき,収束していれば,学習手続きを終了します.

  3 番目に与えているのが,学習例を記述したファイル名です. この例の場合,ファイル learn.dat は以下のように記述されています.
パターンの数 4 入力ユニット数 2 出力ユニット数 1
入力1 0 0
 出力1 0
入力2 0 1
 出力2 1
入力3 1 0
 出力3 1
入力4 1 1
 出力4 0		
  各データの意味するところは以下の通りです.

パターンの数

  学習例の数を入力します.この例では,2 ビットの排他的論理和を 4 つの学習例を使用して学習を行うことになります.なお,入力ユニット数,および,出力ユニット数に関しては,構造データファイルで指定した値と同じ値に設定してください.

入力1

  各学習例において,各入力ユニットに入力される値を設定します.この例の場合,入力ユニットの数が 2 ですので,2 つの値を必要とします.

出力1

  上の入力が与えられたときの目標出力値を入力します.上の項と同様,出力ユニットの数だけ数値が並ぶことになります.

  以上のデータを与えると,以下のような出力が得られます.
回数 500 誤って認識したパターン数 4
回数 1000 誤って認識したパターン数 4
回数 1500 誤って認識したパターン数 4
回数 2000 誤って認識したパターン数 4
回数 2500 誤って認識したパターン数 4
回数 3000 誤って認識したパターン数 3
回数 3500 誤って認識したパターン数 0		
  収束,または,規定の学習回数を終了すると,以下のような結果がディスプレイ(および,ファイル)に出力されます.なお,ディスプレイ出力は,適宜停止しますが,return キーを押せば次の出力が得られます.
入力パターン   1     0.00 0.00
    出力パターン(理想)        0.000
                (実際)        0.060
入力パターン   2     0.00 1.00
    出力パターン(理想)        1.000
                (実際)        0.911
       ・・・・・・
    重み
      to   1 from      2    -10.700   3     -4.675   4     -4.675
      to   2 from      3     -6.825   4     -6.827

    バイアス      1      7.139   2      2.501		
  出力パターンの理想の右側に書かれた値が目標出力値であり,その下が,実際の出力値を表しています.また,重みの項は,ユニット 2 から 1 への重みが -10.700,3 から 1 への重みが -4.675 等のように読んでください.

  学習が終了すると,
未学習パターンの認識を行いますか?(=1:行う,=0:行わない)		
というメッセージが出力されます.未学習パターンの認識を行う場合は,1 を入力した後,その後で出力されるメッセージに従って,未学習パターンを記述したファイル名(認識データ)を入力してください.なお,未学習パターンファイルの記述方法は,学習例ファイル(学習データ)と全く同じです.添付したプログラム内では,学習データと全く同じデータが与えてありますので,認識データに対しても同じ結果が得られるはずです.