Location : Home > Languages > Perl > Package
Title : AI::Perceptron
Toolbox Logo

名称

 AI::Perceptron - ニューラルネットワークのノードの例


概要

use AI::Perceptron;

my $p = AI::Perceptron->new
          ->num_inputs( 2 )
          ->learning_rate( 0.04 )
          ->threshold( 0.02 )
         ->weights([ 0.1, 0.2 ]);

my @inputs  = ( 1.3, -0.45 );   # 入力は任意の数値
my $target  = 1;                # 出力は常に -1 または 1 
my $current = $p->compute_output( @inputs );

print "current output: $current, target: $target\n";

$p->add_examples( [ $target, @inputs ] );

$p->max_iterations( 10 )->train or
  warn "couldn't train in 10 iterations!";

print "training until it gets it right\n";
$p->max_iterations( -1 )->train; # 無限ループにならないことを確認

説明

 本モジュールはニューラルネットワークのあるノードがどのように機能するかを示すために作成された。
 学習は確率的降下(Stochastic Approximation of the Gradient-Descent)モデルによりなされる。

モデル

 パーセプトロンのモデル

             +---------------+
X[1] o------ |W[1]      T    |
X[2] o------ |W[2] +---------+         +-------------------+
 .           | .   |   ___   |_________|    __  Squarewave |_______\  Output
 .           | .   |   \     |    S    | __|    Generator  |       /
 .           | .   |   /__   |         +-------------------+
X[n] o------ |W[n] |   Sum   |
             +-----+---------+

     S  =  T + Sum( W[i]*X[i] )  as i goes from 1 -> n
Output  =  1 if S > 0; else -1

 Where X[n] がパーセプトロンの入力であり、W[n] は対応する入力に適用される重み(Weights)であり、T は閾値である。
 squarewave generator は正または負の値を結果として返す。
 要約すれば、パーセプトロンにいくつか数値を与えれば、入力に対する重みと閾値に依存した正または負の値が出力される。

学習

 たいていは期待する答えを得るにはパーセプトロンを学習させる必要がある。これは所与の入力に対し望む出力を含む例の集合をパーセプトロンに渡すことで行われる。

-1 => -1, -1
-1 =>  1, -1
-1 => -1,  1
 1 =>  1,  1

 ブール代数について学んだことがあるなら、AND ゲートに対する真理表だと認識してもらえばいいだろう(普通なら 0 と書くところを -1 と記しているが)。パーセプトロンに繰り返し例を与えることで、出力が期待したものになるまで重みと閾値を調整していくことで学習を行う。

while some examples are incorrectly classified
    update weights for each example that fails

 重みは以下のような計算で調整される。

delta[i] = learning_rate * (expected_output - output) * input[i]

 これは負のフィードバック(negative feedback loop)として知られる。現在の出力を次の出力の決定に用いるものである。またこれは無限ループに陥る危険もあることに注意すること。これを防ぐために繰り返し回数の上限を定めておくことも悪いアイデアではない。

コンストラクタ

new( [%args] )

 以下のデフォルトの属性を持った新しいパーセプトロンを生成する。

num_inputs    = 1
learning_rate = 0.01
threshold     = 0.0
weights       = empty list

 理想的に属性を設定するアクセス機構を利用すべきであるが、互換性のために以下のような引数を渡して設定することもできる。

Inputs => $number_of_inputs  (positive int)
N      => $learning_rate     (float)
W      => [ @weights ]       (floats)

 W におけるようその数は入力の数+1と一致しなければならない。
 これは AI::Perceptron の以前のバージョンでは閾値と重みが1つのリストとして、W[0] が閾値、W[1] が重みの最初の値というふうに連結されていたためである。いいアイデアだって? :) でも推奨しない理由でもある。

アクセス機構

num_inputs( [ $int ] )

 パーセプトロンの入力数を設定/取得する。

learning_rate( [ $float ] )

 パーセプトロンの学習率を設定/取得する。

weights( [ \@weights ] )

 パーセプトロンの重みを設定/取得する。
 互換性のために、閾値を最初の要素としてリストコンテキストで返す。

($threshold, @weights) = $p->weights;

 この用法は推奨されない。

threshold( [ $float ] )

 パーセプトロンの閾値を設定/取得する。

training_examples( [ \@examples ] )

 パーセプトロンの学習用例を設定/取得する。これは以下の形式の配列参照のリストでなければならない。

[ $expected_result => @inputs ]

max_iterations( [ $int ] )

 パーセプトロンの学習のための繰り返し回数の最大値を設定/取得する。負の値が設定された場合には上限なしと見なす。


メソッド

compute_output( @inputs )

 所与の入力に対しパーセプトロンの出力(1 または -1)を計算して返す。詳しくは前述のモデルを見よ。

add_examples( @training_examples )

 現在の学習用例に @training_examples を追加する。詳しくは training_examples() を見よ。

train( [ @training_examples ] )

 全ての学習例が正しくクラスわけされるまでパーセプトロンの重みを調整するため確率的降下モデルを用いる。
 利便性のため @training_examples を引数に渡すことができる。これらは add_examples() に渡される。パーセプトロンを再学習させたい場合には完全に新しい例の集合を指定して training_examples() を再設定するとよい。


著者

 Steve Purkis, <spurkis@epn.nu>


著作権

 Copyright (c) 1999-2003 Steve Purkis. All rights reserved.

 本ライブラリはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布してもよい。


参照


謝辞

 バグ報告とフィードバックをくれた Himanshu Garg <himanshu@gdit.iiit.net> 及びその他の多くの方々。


参考資料

 Statistics::LTU, AI::jNeural, AI::NeuralNet::BackProp, AI::NeuralNet::Kohonen

Toolbox Logo
Updated : 2007/04/25