視覚情報処理過程のモデル化
パンデモニウム(伏魔殿)モデル
パンデモニウムとはセルフリッジ(Selfridge, O. G.) が考案したパターン認識のモデルである。 パンデモニアムとは万魔堂のことであり, 特定の処理を担うデーモン(情報処理モジュールを比喩的に示す) が階層的に多数連結されて構成されている。 文字認識を行うパンデモニアムでは, イメージ・デーモンから送られた入力情報を特徴デーモンが分析し,垂直線,水平線, 角などの有無がチェックされる。それらの出力を各文字に対応する認知デーモンが受け, マッチする認知デーモンの出力は大きくなる。 それらの出力を評価して,最終的に決定デーモンが判定を下す。 並列的であるが,基本的な情報処理の流れは,特徴抽出から解釈にいたるボトムアップ型である。
パーセプトロン
パンデモニウムモデルを素直に実現したニューラルネットワークモデルとしてパーセプトロンが挙げられる。 パーセプトロンは工学の分野でパターン認識との関連で長い研究の歴史がある。
パーセプトロン perceptron とはローゼンブラットによって提 案された上図のような 3 層の階層型ネットワークモデルである。 パーセプトロンはマッカロック・ピッツの形式ニューロンを用いて学習則にヘッブ則を使ったモデルで, 単純な認識能力を獲得することができる。
パーセプトロンは 3 層の階層型ネットワークでそれぞれ,S(sensory layer), A(associative layer), R(response layer) と呼ばれる層からなっている。 S → A → R のうちパーセプトロンの本質的な部分は A → R の間の学習にある。 最下層の入力層は外界からの刺激入力を表現している。 中間層では入力情報の変換が行われ,最上位層である出力層で認識に到る。
パーセプトロンとは,入力パターンに現われる P+ と P- という 2 つのパターンを識別する問題を考えたとき, P+ が入力されたとき 1 を, P- のとき 0 を出力する機械である。 あるいは,出力ユニットが 1 つしかない場合を考えれば, パーセプトロンは入力層に現われるパターンを 1 と 0 に 2 分する機械であるということができる。
パーセプトロンによる受容野の形成
パーセプトロンに次のような 5×5 の受容野を考えて, 線分を学習させることを考える。
パーセプトロンとは,入力データを受け取って,その活性値を結 合係数 w によって重み付けられた値の関数として自身の出力値 y が定まる2層のモデルである。
図では簡単に入力が3,出力が1の場合を示してあるが,入力ユニットの数も, 出力ユニットの数もいくつでもよい。
さて,縦線5本, 横線5本, 斜線2本 の計12パターンをパーセプトロンに 学習させてみよう。入力は 5×5 の正方格子の線分とし, 出力及び教師信号の次元は 12 次元のベクトルとする。各々の線分に 対して一つの出力層ユニットが対応するように訓練する。
上の図では,最初の行の5つが縦線,次の行の5つが横線,最後の二つが斜め線 を表している。これを 1-0 の行列で表現したものである。例えば,上図の一番左上の 縦線の場合,
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0
という表現されていることになる。すなわちこの5行5列のデータ行列の一番左の列だけ 1 で 残りの要素はすべて 0 である。パーセプトロン,あるいはバックプロバゲーションに与える データは,全部で 12 ということになる(縦線5つ,横線5つ,斜め線2)。 すなわち5行5列のデータが12個あることになるが, ANNS♥ に与えるデータは, 1 行で 1 データでなければならないという制約がある。
そこで,5 行 5 列(=25 個のデータ)を一列に並べて 1 行のデータを作らなければならない。 1行目の5列のデータの隣りに2行目のデータを置くことにすれば,
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0
となる。この操作を5 行分繰り返せば,
1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0
という l 行 25 列のデータができあがる。 これが一番左側に縦棒がある入力パターン(上の一番左上の図) ということになる。 同様にして,上の図で2行目の一番左,すなわち横線のデータは,
1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
という1行25列のデータということになる。このようにして,全部で12本の線分のデータ があるわけだから,12行25列のデータができあがる。以上が入力データの作成方法とそのデータ表現である。下の入力(訓練)データ bar.input はこうして作ったものである。
ニューラルネットワークに学習させる場合には,入力データをどう解釈すればよいのか について教えてやるデータ(教師信号データという)が必要である。 簡単に考えるのであれば,12本の線分があるわけだから,それぞれ別個に12個の概念を用意して (1行で1つの線分を表していた)その入力データを,それぞれの教師信号とすれば よいことになる。12本の線分が入力データであるから,12種類の教師信号が必要となる。
12本の線分,すなわち12個の概念があるのであるから,ある概念のときに 1 であり,その他は 0 であるようなデータを作れば良い。すなわち 1 行 12 列のデータを作って,
1 0 0 0 0 0 0 0 0 0 0 0
などとすれば,一番左だけが 1 であり,他はすべて 0 である 1 行 12 列のデータができあがる。 全部で12本分の線分があるわけだから,教師信号も 12 個(データとしては12行)必要であり, 全部で 12 行 12 列の教師信号データを作ることになる。このようにしてできあがったのが, 下の「単純な教師信号データ(bar.teach)」である。
ところが,教師信号の作り方はこの一通りだけではない。5本ある縦線をすべて「縦」という 概念として学習させたい。同様に5本ある横線分を「横」という概念として,2本の斜め線を 「斜め」という概念として学習させることも可能である。
この場合には,学習させる概念は12とおりではなく,3とおり(縦,横,斜め)だけである。 そこで,縦線であれば 1 0 0,横線であれば, 0 1 0,斜め線であれば 0 0 1 などとすればよい。 入力データは最初の5つが縦線であったわけだから,最初の5行は 1 0 0,と同じデータが5行繰り返されればよい。 同様に次の5行は横線を表していたわけだから, 0 1 0が5行並べば良い。最後の2行は斜め線なので, 0 0 1 が2行あれば全部で12行3列の教師信号データ ができあがる。これが,上の bar-cat.teach という教師信号データである。
この場合には,ニューラルネットワークの学習は難しくなるはずである。なぜならば, 縦線分はどの位置に表示されても「縦」と答えなければならないし, 同様に,横線は,どの位置に表示されても「横」と出力しなければならないからである。 ちょうど第一次視覚野の単純型細胞が方位選択性をもっており,その受容野に最適方位の 線分が提示されれば,反応するような特性を持つニューロンを形成することを意味する。
ところが,視覚野のニューロンは単純型細胞ばかりではない,複雑型細胞とよばれる ニューロンは,最適方位の線分が提示されれば,受容野のどの位置に線分が提示されても 応答するのである。このような複雑型細胞は,網膜上の位置の情報を取捨し,最適方位の 線分を検出する役割をになっている。 パーセプトロンに複雑型細胞と同じ振る舞いをする認識をさせることができるだろうか? 以下で実験してみることにする。
データの処理以前にコマンドの説明
それぞれのファイルの中身を見るには cat というコマンドを使う。
cat bar.input 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 # vertical 1 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 # vertical 2 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 # vertical 3 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 # vertical 4 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 # vertical 5 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 # horizontal 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 # horizontal 2 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 # horizontal 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 # horizontal 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 # horizontal 5 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 # left oblique 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 # right oblique cat bar.teach 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 cat bar-cat.teach 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1
cat コマンドは,引数(ひきすう)を一つとり, そのファイルの内容を端末エミュレータ上に表示するコマンドである。従って 上の例では,cat bar.input で bar.input というファイルの中身を表示さ せ,cat bar.teach で bar.teach というファイルの中身を表示させ, cat bar-cat.teach というコマン ドで bar-cat.teach というファイルの内容を 表示させている,という意味である。
ANNS♥では,シャープ(#)から行末までは コメントとして扱われ,実際の動作には関係がない。
bar.input の一行目は受容野の一番左端に縦線があるという意味である。グラフィック表示させたければ以下のようにタイプする。
./mattrim 1 1 1 25 bar.input | ./matresize 5 5 | ./PSHinton > bar1.ps convert bar1.ps bar1.jpg display bar1.jpg
それぞれのコマンドの意味は,./mattrim が, 行列(mat)をトリミング(trim) するコマンドである。この場合, bar.input が 12 行 25 列の行列(1行で1デー タである)なので,その行列の 1 行 1 列目から 1 行 25 列目までをトリミン グ(取り出して)して次のコマンドに渡す(|)という意味である(当然2行目のデータ を取り出したければ,./mattrim 2 1 2 25となる。2行1列目から2行25列目までのデータを取り出すと言う意味である)。次のコマン ド ./matresize は行列(mat)を別の行列のに 整形(resize)するというものである。この場合 5 行 5 列の行列に変換して 次のコマンドに繋げている。次のコマンド は ./PSHinton であるが,これは,ヒントン (Hinton)グラフと呼ばれるグラフを作って,ポストスクリプト(PS)形式の画 像にするコマンドである。その結果を bar1.ps というファイルに格納している。以上が一行目の説明である。
2行目のコマンドは ImageMagic のコマンドである。 コマンドの意味は bar1.ps というファイルを bar1.jpg というファイルに変換(convert)す るという意味である。
3行目のコマンドも ImageMagic のコマンドである。このコマン ドdisplay は,画面上に画像を表示するコマン ドである。すなわち bar1.jpg という画像ファ イルを画面上に表示している。
以上がシミュレーションの前の下準備である。したがって,bar.inputの6行目を可視化したければ以下のようにタイプすれば良い。
./mattrim 6 1 6 25 bar.input | ./matresize 5 5 | ./PSHinton > bar2.ps convert bar2.ps bar2.jpg display bar2.jpg
bar2.jpg というファイルを作って表示させるコマンドである。 ./mattrim の引数(ひきすう)6 1 6 25 は,6行1列目から6行25列目までを取り出すというコマンドである。
パーセプトロンによる学習
ANNS♥ではパーセプトロン は ./perceptron というコマンドで実行できる。 サンプルオペレーションは以下の通りである。
./perceptron -input bar.input -teacher bar.teach
コマンドの意味は,perceptron に入力データ (-input) が bar.inputであり,教師信号データが bar.teachというファイルを読み込んで 学習させよという意味になる。
ここでもう一度データファイルの形式を説明しておく。 ANNS♥ではほとんどのデータは mat 形式である。 mat 形式とはテキストファイル(従ってエディタやワープロで読み込み可能で あり,エクセルなどでも読み込み可能な)形式であり,n 行 m 列の行列を単に数値 として表現しただけの形式である。上の例でも分かる通り, bar.input は,12 行 25 列の行列である(縦線 が5, 横線が5, 斜め線が2)。1 行で 1 データを構成している。同様にし て bar-cat.teach は,12 行 3 列の mat 形式 である。1訓練データに対して1教師信号が必要となるので,入力(訓練)デー タの行数と教師信号データの行数は等しくなければならない(この場合12行)。 mat 形式のデータ中 # から行末まではコメント として扱われ,データの処理には関係がない。
学習結果をファイルとして保存したければ,リダイレクションという方法を使う。 たとえば,上記のパーセプトロンの学習結果を bar.wgt というファイル(パーセプトロンが学習した結合の重み係数行列という意味で weight を表す英単語の省略形として .wgt を用いた)で 保存したければ,以下のようにする。
./perceptron -input bar.input -teacher bar.teach > bar.wgt
この結果,学習結果は画面に表示されず bar.wgt というファイルに保存される。 この学習結果を再度利用する場合には,-init オプションを用いれば良い。
./perceptron -input bar.input -teacher bar.teach -init bar.wgt
とすれば,最初から学習するのではなく,bar.wgt に記された結合係数を初期値として シミュレーションが実行される。実際の結果は例えば次のようになる。
./perceptron -input bar.input -teacher bar.teach -init bar.wgt ...中略... ### Learning completed in 0 time(s) ### Final MSE = 0.049871 at iter=0
英語で表示されているが,最後の2行は,学習が 0 回で成立したというメッセー ジであり,最終的な,平均自乗誤差(Mean Square Error:MSE)が 0 回目の繰 り返しiter(ration)で 0.049871 であったことを示している。 ANNS♥では,平均自乗誤差が 0.05 以下に なったことを持って学習成立基準としている。この学習成立基準は -error オプションを指定することで変更することができる。
学習結果である bar.wgt ファイルもまたANNS♥ で扱われる一般的な形式である mat 形式である。bar.wgt の行数と列数を知りたければ, ./matsizeコマンドで調べることができる。
./matsize bar.wgt ### bar.wgt 12 26
などと表示され,12 行 26 列のデータであることが分かる。
コマンドライン引数
ANNS♥ のコマンドはほとんどが --help をつけて起動すると簡単な使用法が表示される。
$ ./perceptron --help ### Program name: ./perceptron - A Perceptron simulator ### Creator: Shin-ichi ASAKAWA <asakawa@ieee.org> Usage: ./perceptron -input <filename> -teacher <filename> [-init <initial_weight_file_name>] [-error <double>] [-learn <double>] [-epoch <int>] [-to <int>] [-seed <int>] [-rand_range <double>] [-slope <double>] [-allowable_error <double>] Arguments: input, input file name to be learned teacher, teacher file name to be learned default settings of options: learn = 0.1: learning ratio error = 0: error limit allowable_error = 0: allowable error limit epoch = 200: epoch slope = 1.7: slope of sigmoid curve to = 10000: max iterations rand_range: = 0.1: range for initial values seed: seed of random number generator
Usage の行で表示されている引数とオプションの意味は次のとおりである。カッコ[]で囲まれたものはオプションであり省略可能である。それぞれの意味は以下の通りである。
- -input
- 訓練データを指定する
- -teacher
- 教師信号を指定する
- -init
- 結合荷重データの初期行列を指定する
- -error
- どこまで学習させるのかを指定する(平均自乗誤差の上限値を指定する) 0から1の間の実数(デフォルトは0)
- -learn
- 学習係数を指定する(デフォルトは0.1)
- -epoch
- 学習途中の平均自乗誤差(MSE)を表示する回数を指定する。100 を指定すれば100回ごとにMSEを画面に表示する(デフォルトは200)
- -to
- 繰り返し学習回数の上限を指定する(デフォルトは10000)
- -seed
- 乱数の種を指定する(省略した場合現在時刻を種とする)
- -rand_range
- 初期値の乱数の範囲を指定する(デフォルトは 0.1)
- -slope
- シグモイド関数の傾きを指定する(デフォルトは1.7)
- -allowable_error
- 絶対許容誤差を指定する(デフォルトは0)
実習 入力データをbar.input 教師信号をbar.teach として ./perceptron に学習させてみよ。
実習 入力データをbar.input 教師信号をbar-cat.teach として ./perceptron に学習させてみよ。
学習結果の可視化
上の実習で,学習結果を可視化したければ次のようにすれば良い。
./perceptron -input bar.input -teacher bar.teach > bar.wgt ./matsize bar.wgt ./mattrim 1 2 1 26 bar.wgt | ./matresize 5 5 | ./PSHinton > result-bar1.ps convert result-bar1.ps result-bar1.jpg display result-bar1.jpg
1 行目はパーセプトロンに学習させるコマンドである。学習結果は bar.wgt というファイルに格納される。
2 行目は,データファイルbar.wgt という mat 形式のデータ行列のサイズを調べている。このコマンドはなくてもよい。
3 行目ではbar.wgt の 1 行 2 列目から 1 行 26 列目までをトリミング(mattrim)して取り出し,その結果を 5 行 5 列の 行列に整形し(matresize),その結果をヒントングラフに変換し,その結果 をresult-bar1.ps というポストスクリプトファイルに 格納している。トリミングする範囲は 1 行 1 列目からではなく 1 行 2 列目 からであることに注意されたい。学習の結果できた行列の 1 列目は切片項であるため (ニューロンのしきい値であると解釈しても良い)結果の表示には不要だから である。
4 行目では,ImageMagic の convert コマンドを使って, result-bar1.ps というポストスクリプトファイルを result-bar1.jpg という jpeg ファ イルに変換している。 そして,最終行で画面に表示させている(display コマンド)。
ヒントングラフ
直上の操作でできたファイルを画面に表示させると例えば次のようになるであろう。
ヒントングラフは G. Hinton によって考案された結果の表示方法である。 白丸は正の結合を,黒丸は負の結合を表しており,それぞれの円の直径が結合荷重 の大きさを表している。従って大きな丸ほど結果に与える影響が大きい。この例の場合, 一番左端の列だけ正の結合で,他は負の結合になっていることから,左端の縦線を検出する 受容野細胞が形成されたと見なすことができる。
バックプロパゲーション法による受容野の形成
直上の例は,いわば第一次視覚野の単純型細胞の例であると見なすことができる。 これに対して,複雑型細胞は,受容野のどの位置に提示されても縦線,あるいは横線に反応する。 パーセプトロンでは教師信号データをbar.teach から, bar-cat.teach に換えることで,パーセプトロンに 縦,横,斜めという3つの線分の概念を学習させるシミュレーションを実行することができる。
上の実習で行えば分かるとおり,パーセプトロンではこの学習は成立しない。 このような複雑型細胞を形成するにはバックプロバゲーションによる3層のネットワークである必要がある。
バックプロパゲーション法(./bp3)でも試すと以下のようになる。
./bp3 -hidden 4 -input bar.input -teacher bar-cat.teach
./bp3 で は -hidden 引数が必須である。入力ユニット 数と出力ユニット数はデータ行列のサイズで自ずと決まってくるが,中間層の ユニット数は任意だからである。上の例では中間層のユニット数を 4 にしてあ る(-hidden 4)。中間層のユニット数が多ければ 学習は容易になる。しかし,ユニット数が多いと結果の解釈が困難になることが多い。
結果を可視化したければ以下のようにする。
./bp3 -hidden 4 -input bar.input -teacher bar-cat.teach > bar.result ./mattrim 1 2 1 26 bar.result | ./matresize 5 5 | ./PSHinton > bar1.eps convert bar1.eps bar1.jpg display bar1.jpg
演習 バックプロバゲーション法による学習結果を可視化してみよ。
演習 バックプロバゲーション法によるアルファ ベット26文字の認識実験を行え。データは訓練データ が alpha-upper26x1024.input であり,教師信号 は alpha-26.teach である。 結果からどのようなことが言えるか考えよ。
$ ./bp3 -input alpha-upper26x1024.input -teacher alpha-26.teach -hidden 80 -to 50000 > alpha-upper26.wgt 2>alpha-upper26.err
alpha-upper26x1024.input という入力データは,アルファベットの大文字 26 文字を 32 行 32 列にラスタライズしたデータを元にしている。 すなわち 26 行 1024 列の入力データである。その証拠に ./mattrim,./matresize と ./PSHinton とを使ってデータを可視化してみれば,
./mattrim 1 1 1 1024 alpha-upper26x1024.input | ./matresize 32 32 | ./PSHinton > A.ps convert A.ps A.jpg display A.jpg
というオペレーションにより,A.jpg というファイルができる。これは,alpha-upper26x1024.input というファイルから,1行1列目から1行1024列目を取り出し,それを32行32列の行列に変換し,PSHiton によってポストスクリプトファイルとして書き出しているからである。 このファイルを jpeg 形式に変換し表示しさせている。結果は例えば次のようになる。
Exercise01 というディレクトリにはひらがな46文字を32行32列にラスタライズしたデータ aiueo32x32.data がある。これを ANNS 用の入力データに変換したものが aiueo46x1024.inputである。教師信号は aiueo46x1024.teach である。
同様に,学習漢字全1006文字をラスタライズしたデータはGakusyuKanji24x24.data である。 ANNS 用の入力データは GakusyuKnaji1006x576.input,教師信号データは GakusyuKnaji1006.teach である。
さらに,常用漢字1945文字をラスタライズしたデータ JyouyouKanji32x32.data もある。 ANNS 用の入力データは JyoukyouKanji1945x1024.input であり,教師信号データは JyouyouKanji1945.teacher である。
実習 入力データをaiueo46x1024.input 教師信号をaiueo46x1024.teach として ./bp3 に学習させてみよ。 中間層の数は幾つなら学習が成立するか。
./bp3 -input aiueo46x1024.input -teacher aiueo46x1024.teach -hidden 100 \ -to 100000 >aiueo46x1024-h100.wgt 2>aiueo46x1024-h100.err
なお,行末のバックスラッシュ(\)は,次の行に続くが書ききれないので折り返した ことを示している。実際に実行する際には,1行で実行する。
実習 学習漢字のデータを学習させてみよ。
./bp3 -input GakusyuKanji1006x576.input -teacher GakusyuKanji1006.teach \ -hidden 100 -to 100000 > GakusyuKanji1006x576-h100.wgt \ 2>GakusyuKanji1006x576-h100.err
実習 常用漢字のデータは学習できるだろうか。
./bp3 -input JyouyouKanji1945x1024.input -teacher JyouyouKanji1945.teacher \ -hidden 200 -to 100000 >JyouyouKanji1945-h200.wgt 2>JyouyouKanji1945-h200.err