## 第6章 バックプロパゲーション・シミュレーター

## 1. BPS とは

BPS (Back-Propagation Simulator) は，多層階層型ニューラルネットワークをワークステーション上で実現するための関数・手続きの集合であり，SATELLITE のシステムモジュールの 1 つです．サポートしているニューラルネットワークモデルは，多層階層型フィードフォワードニューラルネットワーク (以下，ニューラルネットワークまたは単にネットワーク) で，その学習アルゴリズムとしてバックプロパゲーション (誤差逆伝播学習法)，およびその加速化法として提案されている 5 つの学習法を用いることができます．

BPS モジュールの使用にあたっては，ニューラルネットワークおよび学習に関する最小限の予備知識が必要とされています．BPS をはじめてお使いになる方には，例えば Rumelhart らの Parallel Distributed Processing 第 8 章などを参照し，ニューラルネットワークとその学習メカニズムについて知っておくことをお勧めします．

## 2. BPS の特徴

BPS は，以下のような特徴をもっています．

- SATELLITE の提供する会話的環境による会話形式で，ニューラルネットワークの構造を容易に定義することができます．また，ネットワークにおけるパラメータ (結合重み) の設定・変更も簡単にでき，ニューラルネットワークに関するシミュレーションをスムーズに実行できます．

- SATELLITE の inline 関数を使用することにより，ネットワーク構造およびパラメータの設定から学習，ネットワークのテストまたはその内部状態のトレースまでを自動的に一括処理することができます．

- SATELLITE におけるバッファモニタリング機能を利用し，学習時の誤差変化の様子をリアルタイムで見ることができます．また，GPM モジュールを用いることにより，シミュレーション結果の視覚的表示が簡単にできます．

- SATELLITE のディジタル信号処理モジュールISPP を使用することにより，ニューラルネットワークの多角的かつ詳細な解析を行なうことができます．

## 3. BPS で使用するファイルについて

BPS では，ネットワークの学習およびテスト等におけるデータの受け渡しはファイルを介して行なわれます．こうしたファイルには，

1. 学習時にネットワークに提示する入力データを格納する入力データファイル

2. 学習時の入力データに対応する教師出力データを格納する教師データファイル

3. 結合重みの初期値を格納する初期ウェイトファイル

4. 学習時に更新されるネットワークの結合重みを格納するウェイトヒストリファイル

5. 学習時の総和誤差を格納するエラーヒストリファイル

6. テスト時にネットワークに提示する入力データを格納するテストデータファイル

7. テスト時の入力テストデータに対するネットワークの出力を格納するテスト結果ファイル

の 7 種類があります．これらのフォーマットは，すべて SATELLITE のファイルフォーマットに準拠していますが，データの格納形式はそれぞれ異なっています．格納形式については，順次説明します．その他，ネットワーク構造や内部状態の設定，データファイル管理などに関するパラメータを保存しておくためのパラメータファイル (テキストファイル) があります．

表 6.1. 「BPS で使用するファイル」 に，各々のファイルの内容と，そのファイルを使用する関数およびそのファイルを出力する関数を示します．

表 6.1. BPS で使用するファイル

ファイルの種類 | ファイルの内容 | ファイル使用関数
--- | --- | ---
入力データファイル | 学習時の入力データ | bteach, bsetrec
教師データファイル | 学習時の教師データ | bteach
初期ウェイトファイル | 結合重みの初期値 | bwalgo, bwinit, bweight
ウェイトヒストリファイル | 学習時に更新される結合重み値 | bweight, bsetrec, blearn, bwgtload, berrfunc, brvmap, bsigmoid
エラーヒストリファイル | 学習時の総和誤差 | berror, blearn, berrload
テストデータファイル | テスト時の入力データ | bsetrec
テスト結果ファイル | テスト時のネットワーク出力 | bsetrec, brec, bactload

## 4. 使用法

ここでは，ニューラルネットワークに関するシミュレーションの具体的な例を用いてBPS の使用法を解説します．ここで取り上げる例は XOR (Exclusive Or) 問題で，表 6.2. 「XOR」 に示すような 2 の入力と 1 つの出力関係を満たす簡単な論理式をニューラルネットワークにより実現させるという問題です．

表 6.2. XOR

入力 | 出力
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 0

### 4.1. 入力・教師データファイル，テストデータファイルの作成

ネットワークを学習させるためには，あらかじめ入力・教師データファイル を作成しておく必要があります．入力・教師データファイル，テストデータファイルの格納形式は，図 6.1. 「入力・教師データファイル，テストデータファイル，テスト結果ファイルの格納形式」 に示すように，レコード方向にパターン，データポイント方向に入力 (出力) ユニットを対応させます．brec 関数実行時に生成されるテスト結果ファイル も，この格納形式をとります．パターン数，入力・出力ユニット数には制限がありません．

XOR 問題の場合は，表 6.2. 「XOR」 より，入力ユニット数および出力ユニット数がそれぞれ 2 および 1 であり，パターン数は 4 です．これらのデータは series 型あるいは snapshot 型として与えることができます．いま，入力データを in，教師データを out の変数名で表すと，それぞれの変数の宣言および値は以下のようになります．

図 6.1. 入力・教師データファイル，テストデータファイル，テスト結果ファイルの格納形式

>     series 型                snapshot 型

>     series in[2], out[1];    snapshot in[4][2], out[4];
>     #                        #
>     in:[0] = (0,0);          in[0][0] = 0; in[0][1] = 0;
>     in:[1] = (0,1);          in[1][0] = 0; in[1][1] = 1;
>     in:[2] = (1,0);          in[2][0] = 1; in[2][1] = 0;
>     in:[3] = (1,1);          in[3][0] = 1; in[3][1] = 1;
>     #                        #
>     out:[0] = 0;             out[0] = 0;
>     out:[1] = 1;             out[1] = 1;
>     out:[2] = 1;             out[2] = 1;
>     out:[3] = 0;             out[3] = 0;

これらの入力・教師データを，次のようにしてファイルへ書き込みます．

>     $"in.dat" = in;
>     $"out.dat" = out;

以上より，XOR 問題の場合，in.dat および out.dat がそれぞれ入力データファイルおよび教師データファイルとなります．

また，ネットワークのテスト時には，テストデータファイル が必要となります．ただし，学習時の入力データに対するネットワーク出力を見たい場合は，テストデータファイルとして入力データファイルを用います．

### 4.2. パラメータの設定

学習，ネットワークのテスト等を実行するためには，各種パラメータを設定しておく必要があります．パラメータは大きく分けて以下の 4 つに分けることができます．

1. ネットワーク構造パラメータ

2. 結合重み初期値生成パラメータ

3. 学習パラメータ

4. テストパラメータ

設定したパラメータは，bpsave 関数によりパラメータファイル (表 6.3. 「パラメータファイル」) に保存しておくことができます．これにより，次に同じパラメータでシミュレーションを行う場合には，bpload 関数によりそのファイルからパラメータを読み込むことでパラメータを設定することができます．パラメータファイルはテキストファイルですので，エディタを使用して，パラメータを変更することで，異なる条件の下でのシミュレーションが容易に行なえます．

表 6.3. パラメータファイル

コメント | 内容
--- | ---
number of layer | 層数
number of each layer's cell | 各層のユニット数
status of char.func and bias | 各層の特性関数とバイアス項の有無
init algorithm | 結合重み初期値生成アルゴリズム
init data file name made by init command | 初期ウエイトファイル名
seed | 乱数の種
maximum of init data | 結合重み初期値最大値
minimum of init data | 結合重み初期値最小値
init weight file for learn command | 学習用の初期ウエイトファイル名
weight history file name | ウェイトヒストリファイル名
weight store interval | ウェイトストアインターバル
weight history store mode | ウェイトストアモード
error history file name | エラーヒストリファイル名
error store interval | エラーストアインターバル
store direction for error | エラーストアディレクション
store mode for error | エラーストアモード
input data file name for learning | 学習用入力データファイル名
teach data file name for learning | 学習用教師データファイル名
first pattern No. for learning | 学習用データ開始パターン番号
last pattern No. | 学習用データ最終パターン番号
learning mode | 学習モード
learning algorithm | 学習アルゴリズム
learning rate | 学習率
momentum | 慣性率
increasing factor for learn. rate | Vogl 法用増加係数
reduction factor for learn. rate | Vogl 法用減少係数
threshold for Vogl method | Vogl 法用閾値
factor for Ochiai's method | 落合法用ファクター
min. error for end | 学習終了判定用最小誤差
max. learn count for end | 学習終了判定用最大誤差
display interval (console) | ディスプレイ表示間隔
comment | コメント
weight file name for test | テスト用ウェイトヒストリファイル名
weight history number | テスト用ウェイトヒストリ番号
test data file name | テストデータファイル名
first pattern No. for test | テストデータ開始番号
last pattern No. for test | テストデータ最終番号
input layer No. | テストデータ入力層番号
output layer No. | テストデータ出力層番号
result file name | テスト結果ファイル名

#### 4.2.1. ネットワーク構造パラメータ

ネットワーク構造パラメータは，結合重み初期値生成，学習，ネットワークテスト，トレース等全ての場合において設定しておく必要があります．ネットワーク構造パラメータは，層数，各層のユニット数 と特性関数 です．これらのパラメータは，blayer，bfunction 関数により設定します．なお，特性関数については，入力層 (第 0 層) は必ず線形関数 となります．また，bfunction 関数は，blayer 関数で層数を設定した後に実行して下さい．

XOR 問題の場合では，ネットワークの構造は 2 入力 1 出力となります．XOR 問題では，中間層を付加し，中間層にシグモイド関数を特性関数とする 2 個のユニットを配置する必要があります (文献 [1] 参照)．また，ここでは，出力数の特性関数を線形関数とし，中間層，出力層の各ユニットにしきい値 (バイアス) を設定します．したがって，以上のネットワーク構造パラメータの設定は，次のようになります (リファレンスマニュアル参照)．

>     blayer(3,2,2,1);
>     bfunction("LN","SA","LA");

#### 4.2.2. 結合重み初期値生成パラメータ

学習時の結合重み初期値を格納した初期ウェイトファイルは，bwinit 関数により生成されます．bwinit 関数を実行するために設定しておかなければならないパラメータが，結合重み初期値生成パラメータです．このパラメータには，初期値 (乱数) 生成アルゴリズム，初期ウェイトファイル名 (格納形式については後に説明します)，乱数の種，初期値の最大値，および，最小値 があります．初期値生成アルゴリズムには，与えられた種から生成される乱数をそのまま用いる方法 (RANDOM) と，本研究室で考案されたアルゴリズム (JIA) の 2 つが選択できます．(JIA のアルゴリズムを用いる場合には，各層にバイアス項を必ず付加して下さい.) これらのパラメータは，bwalgo 関数により設定します．

XOR 問題の場合は，例えば，以下のように結合重み初期値生成パラメータを設定します．

>     bwalgo("R","initwf",1,1.0,-1.0);
>     bwinit();

#### 4.2.3. 学習パラメータ

学習の条件を決めるパラメータは，bweight，berror，bteach，blalgo，blend，bdisp 関数により設定します．

bweight 関数では，初期ウェイトファイル名 (学習時には，このファイルから結合重み初期値が読み込まれる)，ウェイトヒストリファイル名 (学習時に更新される結合重みの履歴が格納されるファイル)，ウェイト・ストアインターバル (履歴の格納間隔)，ウェイト・ストアモード (格納方法 : アペンド と オーバーライト の 2 種類から選択する) を設定します．この場合の初期ウェイトファイルには，新たに生成したファイルではなく，前回のウェイトヒストリファイルを設定しても結構です．その場合には，ヒストリファイルに書き込まれている最後の履歴を初期値として用います．ストアモードは，ウェイトの履歴が必要なければオーバーライトにして下さい．なお，ウェイトヒストリファイルの格納形式，ストアモード等については，後に説明します．

berror 関数では，エラーヒストリファイル名 (学習時の総和誤差の履歴を格納するファイル)，エラー・ストアインターバル，エラー・ストアディレクション (格納方向 : レコード方向 とデータポイント方向 の 2 種類から選択する)，エラー・ストアモード を設定します．エラーストアディレクションをレコード方向とすると，各出力ユニットの誤差と総和誤差が出力されますが，データポイント方向とすると，総和誤差のみを出力します．エラーヒストリファイル，ストアディレクション等については，後に説明します．

bteach 関数では，入力データファイル名，教師データファイル名，使用パターン番号 (入力・教師データの何番のパターンから何番のパターンまでを使用するか) を設定します．使用パターン番号は，0 から 0 番目までと設定すると，全パターンを使用することになります．

blalgo 関数では，学習モード (逐次，一括学習の選択)，学習アルゴリズム (Steep，Momentum 等合計 6 つの学習方法から選択できる)，学習率 および各学習法において必要なパラメータを設定します．

blend 関数では，学習終了条件である学習回数，最小誤差 を設定します．

bdisp 関数では，学習回数，誤差値等をディスプレイに表示する間隔 およびコメント を設定します．

XOR 問題での学習パラメータは，例えば以下のように設定します．

>     bweight("initwf","wgt",200,"A");
>     berror("err",200,"D");
>     bteach("in","out",0,0);
>     blalgo("S",6,0.005,0.6,0.0003,0.75,0.6);
>     blend(0.0,5000);
>     bdisp(200,"I'M LEARNING!");

#### 4.2.4. テストパラメータ

ネットワークのテストを行うためのパラメータには，テスト用ウェイトファイル名 (学習後のネットワークの結合重みを格納したウェイトヒストリファイル)，ウェイトヒストリ番号，テストデータファイル名，使用するパターン番号，データの入力層,出力層，テスト結果ファイル名 があります．使用するパターン番号については，bteach 関数と同様に，0 から 0 番目までと設定すると，全パターンを使用することになります．これらのパラメータは，bsetrec により設定します．

例えば，XOR 問題の場合，

>     bsetrec("wgt",0,"in",0,0,0,2,"res");

により，ネットワークのテストにおけるパラメータは設定されます．

### 4.3. 結合重み初期値生成

学習を行うには，初期ウェイトファイルが必要ですが，前回の学習時に生成されたウェイトヒストリファイルに格納されている履歴を使用して学習を始める場合には，bwinit 関数を実行する必要はありません．

図 6.2. bwinit 関数実行の様子

図 6.2. 「bwinit 関数実行の様子」 に bwinit 関数を実行した様子を示します．実行時には，まず，ネットワーク構造と結合重み初期値生成パラメータが表示されます．次に，設定した初期ウェイトファイルが存在しなっかった場合には，新たにファイルを作成した旨のメッセージが表示されます．ファイルが存在した場合には，次のようなメッセージが表示され，オーバーライトしても良いか聞いてきます．

>     *** File [ filename ] is already exist.  ***
>         Overwrite ?  ( y/n ) :

この時に y を入力すれば，オーバーライトした旨のメッセージが表示されます．

>     File [ filename ] is overwrited.

n を入力すれば，エラーメッセージを表示して関数が終了し，ファイル名を設定し直すことになります．

### 4.4. 学習

学習は blearn 関数を実行することにより行われます．blearn 関数は，入力・教師データ，ネットワークの結合重み初期値をファイルから読み込み，学習時に更新される結合重みの履歴，誤差は設定した学習パラメータに従いファイルに書き込まれます．

また，総和誤差を変数 (バッファ) に書き込むこともできます．したがって，バッファモニタリング機能を利用し，誤差をリアルタイムにグラフ表示することができます．この場合には，series 型変数 (あるいは snapshot 型変数) x をバッファモニター関数 mon および blearn 関数に与えることが必要です．すなわち，

>     series x;   または snapshot x[lc] (lc=学習回数)
>     mon(x);
>     blearn(x);

とすればよいわけです．総和誤差を変数に書き込まない場合には，blearn(0) とします．

学習時に更新される結合重みの履歴はウェイトヒストリファイルへ，出力誤差はエラーヒストリファイルへ格納されます．ウェイトヒストリファイルの格納形式には，格納順にデータを追加していくアペンドモードと，前回のデータの上に上書きするオーバーライトモードがあります．これらの格納形式を説明するために，図 6.3. 「ネットワーク構造例」 のネットワークを例として用います．

図 6.3. ネットワーク構造例

このネットワークは，3 層でユニット数は入力層から 2--2--1 であり，中間層と出力層にバイアス項が付加されています．ここで，図中の円はユニットを，正方形はバイアスユニット，また各結合線の上に書かれている数字は結合のファイルに格納される順番を示しています．このネットワークの結合重みをファイルに格納すると 図 6.4. 「結合重み格納フォーマット」 のようになります．

図 6.4. 結合重み格納フォーマット

学習の中断 / 再開機能を実現するため，結合重みを格納する毎に，結合重みのデータの後ろに前回の学習の結合重み補正量のデータを格納します (図 6.5. 「ウェイトヒストリファイルフォーマット」)．ここで，初期値データを格納する初期ウェイトファイルにおいては，補正量に相当する部分をすべて 0.0 としています．以下では，1 つの結合重み，あるいは補正量のデータの集まりをデータブロックと呼ぶことにします．図 6.5. 「ウェイトヒストリファイルフォーマット」 では，レコード n からの m レコード，あるいはレコード n+m+1 からの m レコードが 1 データ 1 ブロックとなります．bwinit 関数は，結合重みの初期値と全てが 0.0 の 2 データブロックを生成し，blearn 関数は，初期ウェイトファイルの最後の 2 データブロックを読み込んで処理を行います．これにより，学習を中断した後あるいは学習終了後に，その時点から継続して学習を行うことが可能となります．

図 6.5. ウェイトヒストリファイルフォーマット

次に，アペンドとオーバーライトの 2 つの格納モードについて解説します．アペンドモードは，前回のヒストリから 1 データブロック後ろに，結合重みと前回補正量を書き込むモードです．この概念図を 図 6.6. 「アペンドモード概念図」 に示します．このような格納方法をとることにより，最新のデータをファイルの最後に置くことができ，また学習開始から現時点までの履歴を格納することが可能となります．オーバーライトモードは，アペンドモードのように前回のヒストリデータから 1 データブロック後ろに格納するのではなく，ネットワークの初期化に用いたデータの上に重ね書きするモードです．これは，ネットワークの規模が大きく結合数が多い場合，あるいは結合重みの履歴を見る必要がない場合などに使用します．この概念図を 図 6.7. 「オーバーライトモード概念図」 に示します．

図 6.6. アペンドモード概念図

図 6.7. オーバーライトモード概念図

エラーヒストリファイルの格納形式は，レコード方向とデータポイント方向に格納する 2 種類の格納方法が用意されています．また，ウェイトヒストリファイルと同様に格納モードとしてアペンドとオーバーライトが用意されています．

レコード方向への格納は，出力層の各ユニットの誤差とそれらの総和をデータポイント方向に格納する方法です．図 6.8. 「レコード方向格納フォーマット」 にその概念図を示します．図のように，出力層各ユニット毎の誤差に総和誤差を加えて格納するため，1 つのヒストリのデータ長 (data_num) は，出力層のユニット数 +1 となります．

図 6.8. レコード方向格納フォーマット

図 6.9. 「blearn 関数実行の様子」 にblearn 関数を実行した様子を示します．

図 6.9. blearn 関数実行の様子

実行時には，まず，ネットワーク構造と学習パラメータが表示されます．次に，設定したウェイトヒストリファイル，エラーヒストリファイルが存在しなっかった場合には，新たにファイルを作成した旨のメッセージが表示されます．どちらか一方のファイルでも存在した場合には，それを伝えるメッセージが表示され，設定したストアモードに従ってオーバーライトまたはアペンドしても良いか聞いてきます．ストアモードが，オーバーライトの場合には y を入力すれば，オーバーライトしますというメッセージが表示されますが，n を入力した場合には，次のメッセージを表示して関数が終了し，ファイル名を設定しなおすことになります．ストアモードがアペンドの場合には，y を入力すればアペンドされます (メッセージは表示されない) が，n を入力した場合にはメッセージを表示し，オーバーライトされることになります．

さらに，学習が開始されると学習回数と総和誤差値，前回の誤差との差，コメントが表示されます．ここで，表示される総和誤差値は以下のように計算されています．

全パターン数を とし，出力ユニット数を 個，教師データを ，出力を とすると，あるパターンを入力した時の二乗誤差 は，

です．全パターンを入力したときの総和誤差 は，

となります．学習は，0 回目から始まりますが，0 回目の誤差は，結合重みを全く更新しない初期状態での，ネットワーク出力と教師データとの誤差です．

学習は，総和誤差値が設定した最小誤差以下となった場合，もしくは設定した学習回数に到達した場合に終了します．終了時には，次のようなメッセージを表示します．

>     *** Learning is done !  ***

### 4.5. ネットワークのテスト

ネットワークのテストは，brec 関数を実行することにより行われます．brec 関数は，テストデータ，結合重みをファイルから読み込み，出力結果をファイルに書き込みます．同時に，ユニットを正方形で表し，ユニット間を線で結ぶことによりネットワーク構造を表示できます．また，ユニットの活性値を正方形の大きさの変化，または色の変化で表すことができます．この場合は，あらかじめ wopen 関数を使用し，ウィンドウを開いておくことが必要です．ネットワーク構造は，GPM モジュールを用いて大きさ，位置等を調節することができます．size でネットワークの大きさを，origin で位置を，color で線の色を設定することが可能です．

図 6.10. 「brec 関数実行の様子」 に，brec 関数を実行している様子を示します．

図 6.10. brec 関数実行の様子

実行時には，まず，ネットワーク構造とテストパラメータが表示されます．次に，設定したテスト結果ファイルが存在しなっかった場合には，新たにファイルを作成した旨のメッセージが表示されます．ファイルが存在した場合には，それを伝えるメッセージが表示され，オーバーライトしても良いか聞いてきます．この時に y を入力すれば，オーバーライトしましたというメッセージが表示されますが，n を入力すれば関数が終了し，ファイル名を設定しなおすことになります．

### 4.6. 誤差値，結合重み値等のトレース

BPS のロード関数と SATELLITE のGPM モジュールを組み合わせることにより，ネットワーク内部パラメータのトレースを実現します．具体的には，以下のような手順により行います．まず，学習時に生成されたウェイトヒストリファイル，エラーヒストリファイル，およびネットワークテスト時に生成されたテスト結果ファイルから，以下のロード関数を用い，トレースに必要なデータを，SATELLITE の変数 (バッファ) にロードします．

berrload : エラーヒストリファイルからデータをロードする
bwgtload : ウェイトヒストリファイルからデータをロードする
bactload : テスト結果ファイルからデータをロードする

さらに，グラッフィックウィンドウを使用するため，wopen 関数を実行し，バッファのデータに対して，cont，graph，gsolm，map 等のGPM モジュールを用いて表示を行うことができます．

### 4.7. ネットワーク内部状態の解析

ネットワーク内部状態の解析は，SATELLITE のISPP 関数を用いても行うことができますが，BPS 専用の関数として，brvmap，bsigmoid，berrfunc，bcor 関数が用意されています．

- brvmap

  結合荷重逆投影演算を行い，その結果を SATELLITE の 2 次元バッファへ格納します．そのデータに対しては，GPM モジュールを用いて表示を行うことが可能です．

- bsigmoid

  この関数は，まず，テストパラメータに従ってテストを行います．次に，特性関数にシグモイド関数を使用しているある任意のユニットに関して，横軸にユニットの入力総和 (ネット値) を，縦軸に活性値をとりシグモイド曲線を描きます．さらに，その曲線上にデータを入力した時の活性値をプロットします．また，入力データ数が多い場合には，ネット値をヒストグラムとして描くこともできます．

- berrfunc

  ある任意のユニット間の結合重みを 2 カ所選択し，他の重みの値は固定しておき，選択された場所の重みの値を少しずつ変化させていきます．そのときに，ネットワークに順次データを入力し，出力の二乗誤差を計算します．その値は，SATELLITE のバッファへ格納するため，GPM モジュールを用いて表示することが可能となります．

- bcor

  SATELLITE のバッファデータに対し，相関マトリックスを求める関数です．ウェイトヒストリファイルより，bwgtload 関数を使用し，データをバッファへロードしておき，本関数を実行すれば，結合重みの相関値を求めることが可能です．

Last updated: 2005/03/31