FANN - eiichiromomma/CVMLAB GitHub Wiki

FANN Fast Artificial Neural Network Library

サンプルソースの解説

インストール(1.2.x, 2.x共通)

難しいことはしていないので簡単にbuildできる。 展開して

./configure
gmake

インストールする前にexamplesに移動して

gmake compiletest

とすると、buildした場所を参照してサンプルをbuildしてくれるので、取り敢えずの動作を確認できる。

サンプルのテスト

exampleの中で

./xor_train

とするとxor.dataを元にした学習が行なわれ、結果がxor_*.netに保存される。

./xor_test

で学習結果を元にしたテストとなる。 Ver.1.2.xと2.xを見比べると2.xの方がより面白い出力になっているのが分かる。

学習データ

xor.dataが参考になる。

4 2 1 //学習データ数 入力層数 出力層数
-1 -1 //入力その1
-1    //出力その1
-1 1  //入力その2
1     //出力その2
1 -1
1
1 1
-1

xorの場合、範囲を0〜1ではなく-1〜1として内部のシグモイド関数もANN_SIGMOID_SYMMETRICを使っていることに注意。

FANN 2.x

1.2.xと非互換。混在も出来ないので注意。 新たに使い始めるなら2.xを使うべき。

FANN 1.2.xからの移植

fann_createをfann_create_standardに置き換えて、第1,2引数のconnection_rateとlearning_rateを削れば取り敢えずは動く。

チュートリアルざっと訳

インストール

省略

Getting Started

省略

Advanced Usage:応用編

Adjusting Parameters:パラメータ調整

以後紹介するパラメータは学習前、学習中に変更が可能だが、学習中に行なうと怪しい結果を生み出すので学習前にやるべき。

学習アルゴリズムはデフォルトではFANN_TRAIN_RPROPが設定されているがfann_set_training_algorithmを使って変更可能。

学習アルゴリズムは多々あるがANN_TRAIN_INCREMENTAL, FANN_TRAIN_BATCH, FANN_TRAIN_QUICKPROPにはlearning rateパラメータが重要となる。デフォルトでこれといった値を定めることは難しいが作者は試行錯誤の末0.7に決定したが、色々な値を試すのも良い考えだ。learning rateはfann_set_learning_rateで設定できる。

重み係数は-0.1から0.1の範囲でランダムに与えられる。fann_randomize_weightsfann_init_weightsで変更できる。

(文献によると0.2に固定しても良いらしいが原典を見てないのでノーコメント。)

ニューロンが使う関数についてはfann_activationfunc_enumを参照。fann_set_activation_functionで単独の、fann_set_activation_function_hiddenfann_set_activation_function_outputで各層の関数を指定できる。 勾配はfann_set_activation_steepnessで設定可能。

中間層(隠れ層)、出力層で関数をフレキシブルに選べる特徴を有するが、これはthreshold関数を使って離散的出力を必要とする場合に役立つ。但し、この関数を使っている場合、学習はできないので注意。

Network Design ネットワークの構成

レイヤー数、ニューロン数をどうするか。巨大過ぎるネットワークはロクな結果を生まない。逆に小さ過ぎるネットワークも問題解決に十分なルールが作れずに良い値に収束しない。

中間層数は重要で、一般には簡単な問題なら1,2層で良いがより複雑な問題に対しては増やす必要がある。

複雑過ぎないネットワークを構築する一手法としてfann_create_sparseで与えるconnection_rateパラメータを弄る手がある。 これが0.5だとすると結合数が半分になる(要するに結合を間引く)。が、これが便利かと言うと難しいが、全部結合して解いた問題に0.5を設定してなお削れるかを試すくらいなら良い。

FANN2.0では新たなANNの作成法を組み込んだ。上手い結果が出るまでニューロンを一つずつ足すことができる。このアプローチはCascade2アルゴリズムを使っており、[[fann_cascadetrain_on_data)Cascade Training の章で説明する。

Understanding the Error Value 誤差を知る

学習では二乗誤差が求まる。この誤差のはfann_get_MSEで求まり、fann_reset_MSEでリセットできる。学習の質を明らかにするのに役立つだろうから以下に二乗誤差の計算の例を示す。

(省略)

fann_train_on_fileで学習した場合、誤差が表示される。これは全学習データの二乗誤差で、各学習ペア(1組の入力と教師データ)における誤差の平均である。

Training and Testing 学習とテスト

学習はfann_train_on_fileで十分だと思うが、より細かくコントロールしたいか、学習ループをカスタマイズしたい場合もあるだろう。特殊な停止条件の設定や学習中でのパラメータ変更が考えられ、前者はデータ特定のデータに目標設定する場合となる。

fann_train_on_fileを単純化した例

struct fann_train_data *data = fann_read_train_from_file(filename);
for(i = 1 ; i <= max_epochs ; i++) {
  error = fann_train_epoch(ann, data);
  if ( error < desired_error ) {
    break;
  }
}
fann_destroy_train(data);

fann_train_epochに注目すると、これは一つのデータに対する誤差を返している。struct fann_train_data構造体は学習の成果を収めるものである。この構造体は学習に利用可能であるだけでなく、未学習データによるテストにも利用可能である。

全データの誤差を計算する場合

struct fann_train_data *data = fann_read_train_from_file(filename);
fann_reset_MSE(ann);
fann_test_data(ann, data);
printf("Mean Square Error: %f\n", fann_get_MSE(ann));
fann_destroy_train(data);

fann_test_dataは非常に便利で、二乗誤差を更新できる。

Avoid Over-Fitting

(過学習は良くないから限度を設定しましょうという話)

Adjusting Parameters During Training 学習中にパラメータを変更する

非常に小さい誤差が求められる場合には、重みをちょっとずつ変える方法として学習中にlearning rateを減らすのは良いアイデアとなる場合もある。が、精度が求められるだけならfanndoubleを使いなさい。

(threshold関数は上にも書いたので省略)

シグモイド関数のsteepnessを学習中に増やすこともできる。その結果徐々にthreshold関数のような状態になるだろう。その後で関数をthreshold関数にしてしまえばANNはちゃんと働く。この手法はあらゆる問題に対して有効ではないが、XORについては良好だった。(らしい)

Training a Fixed Point ANN

省略