8 神経回路網による画像認識 179 ば , そのファイル名を入力する . すると人力 , 中間 , 出力ュニット数 , 教師 信号数の表示の後 , 教師信号を順番に表示する . 続いて乱数の初期化のため の数値 ( 任意 ) を代人後 , 全体の誤差がいくつまで小さくなった時点で学習 を終了するか入力する . 通常 , 0.001 ~ 0.01 程度の値を入力する . 引き続き , 学習に入り , 学習回数と現在の回路網の出力誤差 ( 全教師信号に対する 2 乗 誤差の平均値 ) を画面に文字で出力する . 誤差が指定した値以下になった時 点で学習が終了し , 学習後の神経回路網を保存するときのファイル名を尋ね てくるので , 拡張子として .nn を付け , 例えば xor. nn という名前で保存 すると , 結合荷重のデータをそのファイルに出力して処理が終了する . このプログラムにおいて , 式 ( 8.2 ) のどに相当する関数 BPlearn ⅲ g ( ) の中 の係数 E の値 ( ここでは 0.5 ) , あるいは何回ごとに教師信号を切り替えて 学習するかを指定している同じく関数 BPlearning( ) 中の変数 learning- period ( ここでは 5 ) の値を変えたときの学習の様子について検討してみる とよい . また , 図 8.6 の XOR よりも複雑な教師信号を与えたときの学習の 様子についても実行してみるとよい . 例えば次のようなものがある . ・入力ュニットのビットの並びをそのまま出力する . ・入力ユニットのビットの並びを逆順にして出力する . ・入力ュニット中の 1 の個数が偶数なら 1 , 奇数なら 0 を出力 . ・入力ュニット中の 1 の個数をバイナリ ( 2 進数 ) で出力する . 誤差逆伝播法において , 学習中の時刻ーでの結合荷重修正量△①を , その結 合荷重に対する前回の修正量△セー l) を使って次式のようにすることがある . △ w の = + ル△ w(t ー 1 ) ( 8.3 ) ただし , イは時刻ーでの通常の修正量であり , 川はモーメント係数と呼ばれる定 数値である . 前回の修正量である慣性項ル△ w(t ー l) を加えることによって , 学 習が加速される . ただし , モーメント係数川を大きくし過ぎると , 誤差の極小 値付近で振動してしまうなどの弊害が生じるので注意が必要である . 8.2.3 未知データの識別 8.2.2 で作成した誤差逆伝播法のプログラムによって保存された学習済みの 神経回路網に対して , 学習に用いたデータ , あるいは全く新規のデータを入力 し , 回路網の出力を確かめることによって , 誤差逆伝播法の学習の効果を確認 こでは , 人力用のデータを , 図 8.6 に示した学習用デー することができる . タから出力信号だけを取り除いたデータ形式のテキストとして作成する . 例え ば , 4 ビットから 4 ビットへの恒等変換の場合の入力データの例を図 8.7 に示 す .
8 神経回路網による画像認識 8.1.2 階層型神経回路網の学習について 典型的な階層型神経回路網を図 8.4 に示す . 丸の中に 1 と書かれたユニット は , 中間層と出力層の各ュニットのしきい値 ( 式 ( 8.1 ) ののを決めるために常 に 1 を出力するしきい値設定ユニットである . あるユニットのしきい値 0 は , しきい値設定ュニットとの結合荷重の符号を逆転したものになる . 人力層 中間層 ( 隠れ層 ) 出力層 169 定 設ト きュ 出力信号し用 入力信号 1 1 結合荷重可変部分 図 8.4 典型的な階層型神経回路網 一般に , 入力信号を 0 または 1 として入力層に入力し , 出力層の各ュニット の出力は 0 または 1 に 2 値化して取り出す . このような人出力の組は複数個考 えることができ , 階層型神経回路網をビット列からビット列への入出力フィル タとして用いることによってパターンの分類・識別を行うことができる . なお , ュニットの出力を 0 , 1 に 2 値化せず , 出力値 ( 通常は 0.0 ~ 1.0 の実数値 ) を 直接用いる方法もある . 図 8.4 からわかるように , 階層型神経回路網には多数のユニット間結合荷重 がある . これらを適切な値に設定しなければ , 我々が期待するようなパターン 分類を行うことができない . 最初はこれらの結合荷重の適切な値は不明なため , ランダムな値に設定する . この初期状態から各結合荷重を少しずっ修正してゆ き , 最終的に適切な値に設定することを階層型神経回路網の学習という . ような学習法として現在最もよく用いられているのが Rumelhart らによって 提案された誤差逆伝播法 (Back Propagation; BP 法 ) 42 ) である .
8 神経回路網による画像認識 185 実際に実験で確かめてみるのが一番良いが , 図 8.9 のような変形のない標準 的なパターンを学習しただけでは , 図 8.10 のような変形されたパターンが人力 された場合 , 回路網は我々が期待するような出力を出してくれない場合が多い ことがわかる . 図 8.10 の例では , 。 5 " の変形パターンに対する 5 個の出力ュ ニットのそれぞれの値は , 0.0 , 0.0 , 0.0 , 0.0 , 1.0 というような理想的な値には ならずに , 例えば 0.1 , 0.2 , 0.1 , 0.3 , 0.4 , 0.7 というように , 明確な 2 値化が行 われていない出力になり , 出力値の解釈に困る状況になることが充分ある . これは。教師信号の入出力しか保証しない " 誤差逆伝播法の特徴であるとい える . このため , パターンが変形される可能性がある場合は , あらかじめ変形 されたパターンも教師信号の中に人れておき , 回路網に学習させておく必要が ある . こうすることによって , ある程度変形に強い神経回路網を作ることがで きる . しかし , 逆に教師パターンを多くし過ぎると , 回路網の学習に長い時間 を要する場合があるので注意する必要がある . 産業などにおいて実際に神経回路網を用いる場合は , 元のパターン ( 画像 ) そのものを回路網に入力するのではなく , そのパターンから抽出される複数種 の特徴量を求め , それらの特徴量を神経回路網に入力する 2 段階の方式がとら れることが多い . これは , 若干変形したパターンであっても , 変形によってあ まり変化しない特徴量があれば , 限られた数の教師信号を用いて学習した神経 回路網によって , ある程度の汎用性が獲得されていることが期待できるからで ある . このような場合 , 神経回路網はパターンを識別するために有効な特徴量 の組合せを自動的に選択してくれると考えればよい . 特徴抽出を行うプログラ ムを人が作る必要があるが , 人はパターンから特徴量を計算する部分さえ考え れば良く , その後の複雑な識別アルゴリズムを考えずに済むので , 全体として 見ると非常に楽である . ただし , 認識に無関係な特徴を神経回路網に人力する と一般に認識性能が低くなるので , 神経回路網に入力する特徴量の選別にはあ る程度注意する必要がある . 本章で扱った階層型神経回路網に改良を加えて , より実用的な回路網 43 ) を作 成してみるとよい . また , 本章で扱わなかった相互結合型神経回路網も連想記 憶などの興味深い動作をするので , 別途調べてプログラムを作成してみるとよ
168 8 神経回路網による画像認識 ユニットとの間の結合荷重 , 日 : 注目ユニットのしきい値 . 入出力関数 / ( ) としては , 図 8.2 ( a ) の単純しきい関数や , 同図 ( b ) のシグモイド 関数 f(x)=l/(l + exp(-x)) がよく用いられる . いずれも横軸 , 縦軸がそれぞれュ ニットの入力 , 出力を表しており , 他のユニットからの人力が大きければ自分 自身の出力が大きくなるという実際の神経細胞の特性を模倣している . 1 0 (a) 単純しきい関数 1 0 (b) シグモイド関数 図 8.2 人出力関数の例 ュニットを複数個接続した回路網の構造は次の 2 種類に大分類される . ( 1 ) 階層型 (Feed-Forward 型 ) 神経回路網 38 ) , 39 ) ( 2 ) 相互結合型神経回路網 40 ) , 41 ) ( 1 ) の階層型神経回路網は , 図 8.3 ( a ) に示すようにユニットを何層かに配置して 入力側から出力側へと結合させたタイプのもので , 主としてパターン分類の機 能がある . 一方 ( 2 ) の相互結合型神経回路網は , 図 8.3 ( b ) のように各ュニット間 を相互に結合させたもので , 人出力層の区別がないタイプのものであり , 自己 想起やエネルギー最小化の機能がある . ただし本章では前者だけを扱う . (a) 階層型神経回路網 (b) 相互結合型神経回路網 図 8.3 代表的な神経回路網の型
8 神経回路網による画像認識 8.1 神経回路網の原理 8. 1. 1 神経回路網とは ? 本章では , 神経回路網 35 ) ~ 37 ) を画像認識に用いる方法について述べる . 神経 回路網では , 人間の脳を工学的に模倣することを目的として , 神経細胞を図 8.1 に示すようなユニットとして表す . 0 0 当 OJ 0 図 8. 1 神経細胞ュニット このようなユニットを多数個接続して 1 つの神経回路網を作る . ュニット間に は通常実数値の結合荷重当 ( 区ノ l) が決められている . あるユニットには , 他のユニットからの結合荷重に対応した重み付きの出力当 0 ノ ( 区ノくのが入力 され , それらの総和をある入出力関数、 / 、 ( ) に代人した値を出力する . すなわち , あるユニットの人力信号工と出力信号 ) , の間には次式のような関係がある . ( 8.1 ) ただし , 0 ノ ( 区ノくの : 他のユニットからの出力信号 , 当 ( 区ノくの : 注目
170 8 神経回路網による画像認識 8.1.3 誤差逆伝播法について 階層型神経回路網の学習のために入力する信号と , 回路網からの出力を比較 するための信号の組を教師信号という . 例えば XOR ( 排他的論理和 ) の場合は , ( 入力 ) → ( 出力 ) と書くとすると , 入力ユニット 2 個 , 出力ュニットを 1 個とし て , 教師信号は次のようになる . ( 0 , 0 ) → ( 0 ) , ( 0 , 1 ) → ( 1 ) , ( 1 , 0 ) → ( 1 ) , ( 1 , 1 ) → ( 0 ) 最初 , 結合荷重はランダムに決められているから , 期待する出力信号は出力さ れてこない . すなわち誤差があることになる . 誤差逆伝播法は , 各結合荷重を 出力誤差が小さくなるように少しずつ修正するという方法である . 理論的な解 こではその方法だけを次に示す . 説は他書に譲り , 結合荷重 1 の 1 回の修正量△ w い / i は次式で表わされる . —sd iO △Ⅵ , ノ ~ 、ル r ん = 川 Wi pd ん、し 0 ( 1 ー 0 た . ) ドた川 ん一 1 ん ( 8.2 ) : た - 1 層ノ番ュニットからた層の / 番ュニットの結合荷重 , ん -1 ん ど : 小さな係数 , 川層 : 出力層 , : ん -1 層のノ番目のユニットの出力信号 : / 番目の出力ュニットの教師信号 であり , 式 ( 8.2 ) の導出過程では , ュニットの入出力関数がシグモイド関数 、 / 0 ) = 1/1 + exp ( ー x ) であるとし , / ' ( だ . ) = が , ( 1 ーび . ) を用いている . 8.2 誤差逆伝播法のプログラム 8.2. 1 教師信号設定ファイル 本書ではファイルの入出力を基本にしているため , 教師信号もあらかじめ工 デイタやワープロソフトなどでテキストとして作成し , プログラム中でそれを こでは , 図 8.5 のようなテキス 読み込むことによって設定することにする . トによって教師信号のデータを記述するものとする . なお , 入力・中間ュニッ
8 神経回路網による画像認識 ト数にそれぞれ 1 を加えているのは , しきい値設定ユニット分である . 入力ュニット数 + 1 中間ュニット数十 1 出力ュニット数教師信号データ総数 171 図 8. 6 XOR の教師信号 1 1 () 1 0 1 1 0 1 3 5 1 4 = 5 として図 8.6 に示す . 先に示した XOR の場合の教師信号のテキストデータを , 中間ュニット数十 1 図 8.5 教師信号のテキストデータの形式 教師信号ルの入力文字列出力文字列 教師信号 2 の人力文字列出力文字列 教師信号 1 の入力文字列出力文字列 だ神経回路網に関する定数宣言ツ / * 神経回路網のヘッダ myNN. h * / プログラム用のヘッダを作り , ファイル名。。 myNN. h " として保存してほしい . よる神経回路網の学習を行うプログラムを作成するため , 次に示す神経回路網 図 8.6 のようなテキストファイルから教師信号を読み込み , 誤差逆伝播法に #define MAX INPUT 100 #define MAX HIDDEN 50 #define MAX OUTPUT 20 #define MAX WEIGHT 5.0 だ人力ュニット数の最大値 * / だ中間ュニット数の最大値ま / だ出力ュニット数の最大値 * / / * 結合荷重の初期値の範囲 * / #define MAX LEARN 50 だ - MAX_WEIGHT ~ MAX WEIGHT を / * 教師信号数の最大値 だ神経回路網に関する大域変数の宣言☆ / だ結合荷重 ( 人力層→中間層 ) * / double wght—in—hid[MAX_INPUT][MAX HIDDEN] ; / * 結合荷重 ( 中間層→出力層 ) 響 double wght—hid—out[MAX HIDDEN][MAX OUTPUT] ; / * 教師信号を保存するための配列 double learn—input—data[MAX LEARN][MAX INPUT] ; double learn_output—data[MAX LEARN][MAX OUTPUT] ; / * 人力 , 中間 , 出力ュニット数 * /
8 神経回路網による画像認識 180 4 4 1 1 0 1 0 1 0 1 1 一 1 0 1 1 0 5 1 0 0 1 図 8.7 4 ビットの恒等変換の場合の入力データの例 例題 8 ー 2 : 未知データの入出力用プログラム 例題 8-1 の誤差逆伝播法によって学習し , ファイルとして保存した神経 回路網を読み込み , 図 8.7 の形式の未知データを入力したときの出力を 画面に表示するプログラムを作成せよ . 解答例 : だ神経回路網を使って認識を行うプログラム NNrecog. c * / #include<stdio. h> #include<stdlib. h> #inclu de<math. h> #include"myNN. h" / * for get_data( ) * / void calc—hidden and_output_units( ) / ☆現在の入力に対して中間層 , 出力層のユニットの状態を求める * / だこのルーチンの前に input_unit[] に現在の入力を代入する響 int i,J; / ☆ループ変数 * / double sum; / * 重み付出力の和ま / だ隠れ層の各ュニットを状態遷移させる for ( i = 0 ; i く num_hidden - 1 ; i + + ) { sum = 0.0 ; for ( j = 0 ; j く num_input; j 十十 ) sum = sum + input—unit[j] * wght_in hid[j][i] ; hidden—unit[i] = 1.0 / ( 1.0 + exp( - sum ) ) ; input—unit[num—input - 1 ] = 1.0 ; だしきし、値設定ユニット * / / * 出力層の各ュニットを状態遷移させる * / for ( i = 0 ; i < num_output; i 十十 ) { sum = 0.0 ; for(j=();j<num hidden-l;j + + ) sum = sum + hidden—unit[j] * wght_hid_out[j][i] ; output—unit[i] = 1.0 / ( 1.0 + exp( - sum ) ) ;
8 神経回路網による画像認識 printf("*n 全ての未知信号に対する処理を終了しました . *n"); main( ) 183 Ioad—NN data( ) ; だ結合荷重データの読み込み * / calculation( ) ; / * 未知信号を読み込んで随時出力 * / return 0 ; 実行結果 本プログラムを実行し , 先に保存した神経回路網のデータを読み込んだ後 , 入力するデータのファイルを指定すると , ファイルから 1 組ずつ人力データ を読みながら , その都度 , 回路網に入力して , 出力を表示する . こでは結 果を見易くするために , 出力ュニットが 0.9 より大きいときは“ 1 " , 0.1 よ り小さいときは " 0 " を表示し , 充分に 2 値化されていない 0.1 ~ 0.9 の間 の出力値の出力ュニットについては " で表示する . 図 8.7 に示した 4 ビッ トの恒等変換の人力データに対しては , 例えば図 8.8 のように表示される . 神経回路網のデータを読み込みます . 人力ファイル名 (). (n) : test. nn 結合荷重のデータを読み込みました . 未知信号ファイルを読み込みます . 未知ファイル名 (*.dat) : test. dat 人力ュニット数 = 4 中間ュニット数 = 10 出力ュニット数 = 4 未知信号の総数 = 4 充分 2 値化されていない出力 ( 0.1 ~ 0.9 ) は * で表しています . 未知信号 N 。 .1 1001 → 00 push return key 未知信号 No. 2 0 ド 0 push return key 0110 未知信号 N 。 .3 push return key 0111 → 0101 未知信号 No. 4 push return key 1010 → 1010 全ての未知信号に対する処理を終了しました . 図 8.8 実行結果の表示例 図 8.8 では , 未知信号 No. 4 については正しい恒等変換が得られているが , 未知信号 No. 3 については一部誤りを含んでおり , 未知信号 No. 1 と No. 2 は 充分に 2 値化された出力が得られていないことがわかる . この例からもわか るように , 誤差逆伝播法による神経回路網による学習の汎化能力は高くない . 誤差逆伝播法では , 教師信号に対しては正しい出力を行うよう学習されるが , 未知データに対する出力は , 必ずしも我々が期待するものではない可能性が ある , ということを十分知る必要がある .
8 神経回路網による画像認識 char file_name[256]; / ☆入力ファイル名を代入する文字列 * / だ神経回路網の結合荷重のデータをファイルから読み込む . * / void load_NN_data( ) hidden_unit[num—hidden - 1 ] = 1.0 ; だしきい値設定ユニット * / 181 FILE *fp; float mt i, J; / * ファイルポインタ * / / * 作業変数 * / / * 制御変数☆ / / ☆人力ファイルのオープン * / printf ( " 神経回路網のデータを読み込みます . *n"); printf()A カファイル名 (*.nn) : " ) ; だ拡張子 = . nn としている * / scanf("%s" file name); fp = fopen( file name, "r" ) ; if( NULL = = fp ) { printf ( " その名前のファイルは存在しません . vn"); exit(l); fscanf()p "%d %d %d" &num—input,&num—hidden,&num—output); for ( i = 0 ; i く num_input; i 十十 ) for (j = 0 ; j く num—hidden; j + + ) { fscanf( fp, "%f' &f ) ; wght-in hid[i][j] = for ( i = 0 ; i く num—hidden; i + + ) for ( j = 0 ; j く num—output; j 十十 ) { fscanf( fp, "%f', &f ) ; wght-hid-out[i][j] = fi fclose(fp); printf ( " 結合荷重のデータを読み込みました . YnYn"); void calculation( ) / * 未知信号のデータをファイルから読み込みつつ結果を求めて表示する * / char file name[256]; / * 入力ファイル名を代入する文字列 * / lnt num; FILE *fp; int i, 」 ; int num data; だデータを読み込むときの作業変数 * / だファイルポインタ☆ / / ☆ループ変数 * / / * 未知信号の総数 * /