オブジェクト指向言語を使った ニューラルネットワーク

オブジェクト指向言語を使った
ニューラルネットワーク構造最適化法
村瀬敬和、福原誠、竹田辰興
(電気通信大学電気通信学部情報工学科)
平成 13 年 1 月
概 要
ニューラルネットワークはそのニューロンの数がネットワークの性能を決定する。たとえば、ニューラル
ネットワークを用いて関数を近似する場合、学習前にはどれだけのニューロンを用いて近似するかを決定す
るのは難しい。そこで、学習済みのニューラルネットワークに対して、活用されていないニューロンやコネク
ションを削除することによってニューラルネットワーク自体を最適化することを考える。計算にあまり貢献
していない、あるいはほかのニューロンで置き換えることが可能であると思われるニューロンやコネクショ
ンを削除することによって、ニューラルネットワークの最適化を試みる。本研究では実装されたニューラル
ネットワークの論理構造を気にかけることなく最適化を試みることが出来るという利点を考慮してオブジェ
クト指向プログラミングに基づいて数値実験を行った。
実験するネットワークのサイズを 20 ニューロンからなる 2 層 10 ニューロンのネットワークと 4 層 5 ニュー
ロンのネットワークとし、結合の絶対値が小さなコネクションを切断した場合、全入力信号に対して変化の
少ないニューロンをバイアスに置換した場合、似たような変化を示すニューロンを一つに統合した場合、そ
れらすべてを試みた場合において実験を行った。
コネクション切断、バイアス置換においてはそこそこの成果が得られたが、ニューロンの統合はあまり目
立った成果を上げなかった。しかし、いずれの手法も有効であり、すべてを適用した場合にネットワークの
サイズが元の半分以下になることもあった。また、今回入力が 0 から 1 までの範囲で実験を行ったが、入力
が 1 付近の情報が失われやすいと言う傾向が見られた。
目次
第 1 章 ニューラルネットワーク
1.1
ニューラルネットワーク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.1
1.1.2
1.2
ニューラルネットワーク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
バックプロパゲーション . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オブジェクト指向 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1
1.2.2
1.2.3
オブジェクト指向 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
継承 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
抽象クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
第 2 章 ニューラルネットワークの最適化
2.1
コネクションの削除
2.2
2.3
バイアスへの結合への置き換え . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ニューロンの統合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3
3
4
8
8
8
8
10
10
11
12
第 3 章 実験結果
3.1
13
コネクションの削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.1.1 2 層 10 ニューロン・ネットワークにおけるコネクション削除 . . . . . . . . . . . . . . 13
3.1.2 4 層 5 ニューロン・ネットワークにおけるコネクション削除
バイアス置換 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.1 2 層 10 ニューロン・ネットワークにおけるバイアス置換 . .
3.2.2 4 層 5 ニューロン・ネットワークにおけるバイアス置換 . . .
.
.
.
.
14
17
17
19
3.3
ニューロン統合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4
3.3.1 2 層 10 ニューロン・ネットワークにおけるニューロン統合 . . . . . . . . . . . . . . .
3.3.2 4 層 5 ニューロン・ネットワークにおけるニューロン統合 . . . . . . . . . . . . . . . .
3 種類の最適化の統合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
21
23
25
2 層 10 ニューロン・ネットワークにおける最適化の統合 . . . . . . . . . . . . . . . .
4 層 5 ニューロン・ネットワークにおける最適化の統合 . . . . . . . . . . . . . . . . .
25
27
3.2
3.4.1
3.4.2
第 4 章 考察
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
29
付 録 A プログラムリスト
31
A.1 NeuralUnit, NeuralConnection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
A.1.1 NU.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
A.1.2 NU.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1
A.2 BackPropagationNeuralUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.2.1 BackProp.h . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.2.2 BackProp.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
35
35
A.3 ファイル形式 . . . . . . . . . . . . . . . . . . . .
A.3.1 ネットワーク生成ファイル . . . . . . . . .
A.3.2 ネットワークファイル . . . . . . . . . . .
A.3.3 今回の実験で用いたネットワークファイル
.
.
.
.
36
36
37
37
A.4 create . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.4.1 create.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.5 teach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
39
41
A.5.1 teach.cpp . . . . . . .
A.6 connection cutter . . . . . . .
A.6.1 connection cutter.cpp
A.7 neuron cutter . . . . . . . . .
.
.
.
.
41
44
44
46
A.7.1 neuron cutter.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.8 combine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.8.1 combine.cpp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
50
50
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
第1章
ニューラルネットワーク
ニューラルネットワークは数々の優れた特徴により多くの応用分野があるが、非線形最適化法に基礎をおい
ているために、ネットワーク構造自体の最適化法が、効率よいニューラルネットワーク実現の鍵である。構
造最適化を行うためにはニューラルネットワークを構成するニューロンやそれらを結ぶコネクションを自由
に増減させることが必要である。このためオブジェクト指向言語の活用が有望である。我々はオブジェクト
指向言語 C++ を使ってニューラルネットワーク構造最適化法について研究を行った。
1.1
1.1.1
ニューラルネットワーク
ニューラルネットワーク
ニューラルネットワークを構成するニューロンは図 1.1 のようにモデル化されたものである。図 1.1 におい
て、y1 · · · yn は入力値、w1 · · · wn は重み (結合強度)、x は出力値、また f は活性化関数と呼ばれる非線形関
数である。
y1
w1
y2
w2
f(
w3
y3
...
)
yi wi
i
x
...
wn
yn
図 1.1: ニューロン概念図
各ニューロンはほかのニューロンより信号を受け取る。受け取った信号をそのニューロンとの結合強度に
応じて増幅あるいは減少させ、その総和をとったものを活性化関数 f に渡して自身の出力信号とする。すな
わち、入力パターン p の入力を与えられたニューラルネットワークの、n ニューロンからの入力を持つニュー
ロンの出力 xip は j 番目のニューロンからの出力を yjp 、結合強度を wj とすると次式で与えられる。
xp
=
f(zp )
3
(1.1)
zp
n
X
=
wj yjp
(1.2)
j=1
また、ある一定値以上の出力を示すニューロンについて、「発火している」、「興奮している」、「励起状態
にある」などと表現することもある。
このようなニューロンによって構成されたネットワークのことを、ニューラルネットワークという。ニュー
ラルネットワークは強力な汎化能力を持ち、その応用は実時間制御システムや未来予測、関数近似や連想記
憶など実に多彩である。
1.1.2
バックプロパゲーション
バックプロパゲーション (誤差逆伝播) 法はニューラルネットワークの学習法として現在もっともよく利用
されているものである。バックプロパゲーションは図 1.2 のような階層構造を持つ多層ニューラルネットワー
クの学習アルゴリズムで、ある入力パターン p に対する出力層の i 番目のニューロンの出力を x̄ip とし、教
師信号を tip とした場合の誤差関数、
E
=
X
Ep (w)
(1.3)
p
Ep
=
1X
(x̄ip − tip )2
2
(1.4)
i
を最小化するために E の勾配ベクトルを計算して結合強度のベクトル w を変化させていく (最急降下法)。そ
のため、活性化関数 f は微分可能でなければならない。
.............................
図 1.2: 多層ニューラルネットワーク概念図
4
多層ニューラルネットワーク概念図 (図 1.2) では、◎で示されているのが入力層で、ニューラルネットワー
クへの入力ベクトルはまずこの入力層に設定される。その後、入力層の値を元に単円で示された中間層の
ニューロンを入力層に近い層から順に計算していき、太い線でかかかれた単円で示された出力層のニューロ
ンまで計算が終了すればネットワークの計算は終了である。このとき、出力層のベクトルが出力ベクトルと
なる。入力層と出力層の間の細い円が示しているものは中間層のニューロンである。なお、この概念図では
途中の中間層は省略し、入力層と出力層、中間層の最初と最後の層だけかいてある。中間層は任意の数の層
で構成される。
バックプロパゲーションにおける入力パターン p の入力を与えられたニューラルネットワークの、n 個の
ニューロンからの入力を持つ i 番目のニューロンの出力 xip は手前の層の j 番目のニューロンからの出力を
yjp 、結合強度を wij とする次式で与えられる。
xip
=
zip
=
f(zip )
n
X
wij yjp
(1.5)
(1.6)
j=1
入力パターン p に対する結合強度ベクトル w からなるニューラルネットワークの誤差関数、Ep (w) の勾配
ベクトルの第 ij 成分
∂Ep (w)
∂wij
は、以下のようにして計算できる。式 (1.4)∼(1.6) より
∂Ep (w)
∂wij
は、wij が微小
量変化した場合に Ep (w) がどれだけ変化するかという割合をしめしている。wij が変化すれば当然入力の総
量 zip も式 (1.6) より変化し、これが Ep (w) の変化に影響を及ぼす。したがって次式で与えられる。
∂Ep (w)
∂Ep (w) ∂zip
=
∂wij
∂zip ∂wij
(1.7)
ここで式 (1.6) より
∂zip
= yjp
∂wij
よって式 (1.7) は次式のようになる。
∂Ep (w)
∂Ep (w)
=
yjp
∂wij
∂zip
ここで、
∂Ep (w)
∂zip
(1.8)
について考えてみる。第 s 層 i ニューロンへの入力の総量 zip が変化すれば、それに従って
第 s 層第 i ニューロンからの出力 xip も変化し、それが第 (s + 1) 層以降のニューロンを次々と伝わっていき、
Ep (w) の値を変動させる。従って、
∂Ep (w) ∂xip
∂Ep (w)
=
∂zip
∂xip ∂zip
(1.9)
となる。
式 (1.5) より、xip = f(zip ) だから、式 (1.8) および式 (1.9) より
∂Ep (w) 0
∂Ep (w)
=
f (zip )yjp
∂wij
∂xip
となる。
5
(1.10)
ここで
δip = −
∂Ep (w) 0
f (zip )
∂xip
(1.11)
とおく。すると (1.10) 式は
∂Ep (w)
= −δip yjp
∂wij
(1.12)
となる。
以下で、第 i ニューロンが出力層の場合とそうでない場合にわけて δip を求める。
(1) 第 s 層第 i ニューロンが出力層に属している場合
∂E (w)
出力 xip は、式 (1.4) の x̄ip に相当する。従って、 ∂xp ip は
∂Ep (w)
∂xip
= x̄ip − tip となる。従って、式 (1.11)
より
δip = −(x̄ip − tip )f 0 (zip )
(1.13)
となる。
(2) 第 s 層第 i ニューロンが出力層に属していない場合
第 s 層第 i ニューロンからの出力 xip が変化することによって第 (s + 1) 層の各ニューロンへの入力の総量
zkp が変化し、第 (s + 1) 層の各ニューロンからの出力も変化する。これらの変化が第 (s + 1) 層以降のニュー
ロンを伝わっていき Ep (w) の値を変動させる。したがって、
∂Ep (w) X ∂Ep (w) ∂zkp
=
∂xip
∂zkp ∂xip
(1.14)
k
となる。ただし、式 (1.14) において k は第 (s + 1) 層のニューロンの添え字を意味する。
式 (1.14) の右辺において
∂Ep (w)
∂zkp
を考える。第 (s + 1) 層のニューロンへの入力の総量 zkp が変化すること
により、そのニューロンからの出力 xkp を変化させ、Ep (w) を変化させる。したがって
∂Ep (w) ∂xkp
∂Ep (w) 0
∂Ep (w)
=
=
f (zkp )
∂zkp
∂xkp ∂zkp
∂xkp
(1.15)
式 (1.11) の定義と式 (1.15) から、
∂Ep (w)
= −δkp
∂zkp
式 (1.14) の右辺の
∂zkp
∂xip
(1.16)
は、式 (1.6) において i を k、y を x、j を i と見なすことによって簡略化され、
∂zkp
= wki
∂xip
(1.17)
となる。式 (1.11)、(1.14)、(1.16)、(1.17) より、
δip = f 0 (zip )
X
k
6
δkp wki
(1.18)
となる。式 (1.13) と式 (1.18) によりすべての δip が求まり、式 (1.12) を利用することによって勾配ベクトル
∂Ep (w)
∂w
の各成分
∂Ep (w)
∂wij
が求まる。(参考文献 [1, 2])
今回の実験においては、活性化関数 f に
f(x) =
1
1 + e−x
(1.19)
という関数を用いた。この関数の導関数は
f 0 (x)
=
1 + e−x
−1 0
=
−1 × (1 + e−x )−2 × −e−x
=
e−x (1 + e−x )−2
1
1
1−
1 + e−x 1 + e−x
f(x) (1 − f(x))
=
=
(1.20)
となり、関数 f(x) のみで表すことができる。従って、微分値を算出する場合に、直前の計算の結果を利用し
て簡単に算出することができる。
7
1.2
オブジェクト指向
1.2.1
オブジェクト指向
オブジェクト指向とは、プログラミングパラダイムの一つである。旧来の手続き型プログラミングが、デー
タとデータを操作するアルゴリズムという概念で成り立っているのに対して、オブジェクト指向プログラミ
ングでは、オブジェクトとオブジェクト同士の相互作用という概念の上に成り立っている。
オブジェクトは、生成された瞬間に初期化することができ、オブジェクトに対する操作はオブジェクト自
体にコーディングされる。従って、未初期化オブジェクトがエラーを起こすようなバグや、不正な操作を行
うことによって引き起こされるようなバグは回避することができる。
また、内部の実装を完全にオブジェクト内に隠蔽し、表面的には抽象化されたわかりやすいインタフェース
を用意してやることによりオブジェクトの実装の知識を不要にし、オブジェクトを簡単に扱うことができる。
1.2.2
継承
オブジェクト同士の関係には、「has a」関係と呼ばれるものと「is a」関係と呼ばれるものがある。
「has a」関係は A has a B、つまり「A というオブジェクトは B というオブジェクトを持っている」とい
う内包関係で、これは A オブジェクトの内部変数に B オブジェクトを持つ関係で、C 言語などの構造体を持
つ構造体と同じことである。
これに対し、「is a」関係は B is a A、つまり「B というオブジェクトは A と言うオブジェクトの一種であ
る」という関係である。これは継承と呼ばれ、オブジェクト指向でよく使われるプログラミングテクニック
である。
この関係では、B と言うオブジェクトは A というオブジェクトを派生することによって定義される。この
際、B には A の定義に、追加の定義をしたり、あるいはすでにある定義を上書きして動作を変更すると行っ
た形で定義を行う。この際、変更のない定義はコーディングせずともよいのでコードの行数が押さえられて
バグの入り込む余地も減少する。これが差分プログラミングと呼ばれるコーディングテクニックである。
この定義の仕方からも自明なように、B は、A にできることはすべて行うことができる (振る舞いは違う
かもしれないが)。従って、B を A と同じように扱うことができ、A 用のアルゴリズムを B に適用して実行
するといったことができるようになる。
1.2.3
抽象クラス
オブジェクト指向においては、継承を前提とした不完全なオブジェクトを定義することができる。これは、
C++においては抽象クラスと呼ばれる。抽象クラスとは、クラス定義の中に未定義の関数宣言を含むクラス
で、当然ながら未定義の関数宣言を含んでいるためインスタンス (メモリ上の実体) を生成することができな
い。このクラスを使う場合には、継承を行って継承したクラスで未定義の関数をすべて定義して使うことに
なる。
このようなことをわざわざ行う理由は、たとえば今回プログラムしたニューロンのクラスのように、バック
プロパゲーションニューラルネットワークのニューロンとホップフィールドニューラルネットワークのニュー
ロンではニューロン同士の概念は同一でほぼ同様に扱うことができるのにも関わらず、学習方法が異なるた
8
め学習アルゴリズムをあらかじめ実装できない場合などに使う。そうすることによって、実装的に全く違っ
たものでも同一に扱うことができ、内部実装に依存しない部分のプログラムは変更することなく以前のコー
ドを使い回すことができるようになる。今回のプログラムでいえば、ニューロンとニューロンの接続を表現
するためのクラスには学習アルゴリズムは関係ないのでどちらのネットワークにもコードを変えることなく
同じように利用することができる。(参考文献 [3, 4])
9
第2章
2.1
ニューラルネットワークの最適化
コネクションの削除
絶対値が小さい結合強度を持つコネクションを介した入力は、ニューロンからの入力自体が 1 を超えない
のでニューロンの計算に与える影響は少ない。従って、結合強度の小さいコネクションを削除することによっ
てネットワークの軽量化をはかる。これはちょうど、人の大脳神経系において、パルス信号のやりとりの少
ないシナプス結合が消滅するのと同じようなことであるといえる。
コネクション削除の概念図を図 2.1 に示す。この概念図では、コネクションの結合強度が線の太さとなって
いる。左のネットワークが元の学習済みネットワークで、右のネットワークが左のネットワークから結合強
度の弱いコネクションを取り除いた最適化後のネットワークを表している。
図 2.1: コネクション削除概念図
10
2.2
バイアスへの結合への置き換え
ニューラルネットワークの計算は、ニューラルネットワークを構築する個々のニューロンの値とバイアス
によって最終的な出力が決まる。ここでニューラルネットワークの出力が変化すると言うことは、とりもな
おさずその構成ニューロンの出力が変わると言うことである。
したがって、様々なデータに対してその出力の変化量が低いニューロンは出力の大きなニューロンといえ
ども実はニューラルネットワーク全体の計算にあまり貢献していないと結論することができる。そこでこの
ようなニューロンを除去することが考えられる。この場合、ニューロンを除去した後に、除去したニューロ
ンからの出力に相当する入力を補填しなければならない。そのため、常に出力が 1 である特殊なニューロン
(バイアス) からの入力に置き換えることによって、除去するニューロンの出力を補填する。いわば、ニュー
ラルネットワークの特徴点を抽出することによってネットワークを軽量化しようと言う手法である。
バイアス置換の概念図を図 2.2 に示す。この図において、太い線で示された円は活発に変化するニューロ
ンを示し、一番細い線で示された円は余り変化しないニューロンを示している。この概念図においては、真
ん中の層の一番下のニューロンと、右の層の一番上のニューロンがバイアスに統合されている。そして、右
の層の残った二つのニューロンへのバイアスからの結合は、真ん中の層の統合されたニューロンの出力を補
うように結合強度が増えている。
Bias
Bias
図 2.2: バイアス置換概念図
11
2.3
ニューロンの統合
バイアスへの結合への置き換えというのが、ニューロンの変位が少ない場合という特殊状況でにおける
ニューロンの統合であると考えるならば、当然似たような変化を示すニューロン群を一つにまとめることも
可能と考えることができる。さらに、バックプロパゲーションの個々のニューロンに注目した場合、それぞ
れのニューロンは自分より手前の層の出力から入力を受け取り、自分よりあとの層へ出力を渡していると見
ることが出きる。これをふまえると、前後関係さえ保たれていれば実はニューラルネットワークの構造はき
ちんとした階層構造を持っていなくてもよいと言うことになる。
ここで、それぞれ違う階層に属する似たような変位を示す二つのニューロンを考える。この二つのニュー
ロンを一つにまとめようとする場合、前の層のニューロンにまとめる場合と後ろの層のニューロンにまとめ
る場合とが考えられる。しかし、後ろの層のニューロンにまとめてしまうと、まとめたニューロンの出力を
求めるために消してしまった前の層のニューロンの値が必要となり、循環が生じてしまう。多層ニューラル
ネットワークではアルゴリズム上循環が生じてはまずいので、後ろの層のニューロンにまとめるというアプ
ローチでは問題が出てしまう。前の層にまとめるというアプローチであれば循環は生じないので問題は発生
しない。従って、今回の実験においてはニューロンは必ず前の層のニューロン、あるいは同じ層のニューロ
ンと結合するようにした。
同じ階層に属している場合は、それぞれが完全に独立であるためどちらに統合してもかまわないので考え
る必要はない。
さらに、倍率も考慮に入れることとする。これはつまり、絶対値の変化が似たようなものではなく似たよ
うな変化率を持つニューロンを統合の対象とするということである。すべての反応の中の最大出力の値を用
いて全出力を正規化し、その値をほかのニューロンと比較することによってこれは実現できる。
ニューロン統合の概念図を図 2.3 に示す。この概念図において、同じ太さの円は、似たような反応を示す
ニューロンを示している。ただし、一番細い線で描かれた円は、似たような反応を示すニューロンが存在しな
いニューロンを示す。この概念図においては、左の層の一番下のニューロンと真ん中の層の真ん中のニュー
ロンが左の層の上のニューロンに、真ん中の層の上のニューロンが左の層の真ん中のニューロンに統合され
ている。また、左の層の上のニューロンと真ん中の層の下のニューロンのコネクションの結合強度が、左の
層の一番下のニューロンの出力を補うように増加している。
図 2.3: ニューロン統合概念図
12
第3章
実験結果
1 入力 1 出力の関数近似問題を例として数値実験を行った。関数は
f(x) =
sin(2πx) + 1
2
を用いた。学習データとしては、入力 x が 0 から 0.05 きざみで 20 個 (x = 0, 0.05, . . ., 0.95) を用いた (付録
A.3.1 参照)。
ニューラルネットワークは中間層のニューロン数の合計が 20 であるような、中間層が 2 層 10 ニューロン
のネットワークと 4 層 5 ニューロンのネットワークの 2 種類を用いた。コネクション数は、バイアスからの
コネクションを含めて前者が 20 + 110 + 11 = 141, 後者が 10 + 30 + 30 + 30 + 6 = 106 である。
重みの初期値は乱数で与えた。初期値を変えた 5 つのネットワークに対してそれぞれ 2000 回学習を行い、
その後にネットワーク構造を最適化して、その後 (最適化されたネットワークで)1000 回学習した。
最適化の際に用いる閾値は、値をいくつか変えて実行して、以下ではその中で一番いい結果を載せてある。
3.1
3.1.1
コネクションの削除
2 層 10 ニューロン・ネットワークにおけるコネクション削除
表 3.1 は、2 層 10 ニューロンのネットワークにおいて結合強度の絶対値が 1 以下のコネクション削除前と
後のネットワークを比較したものである。実行時間に関しては、2000 回ループを回し、その 1 回あたりの実
行時間を求めている。
表 3.1: コネクションの削除による 2 層 10 ニューロン・ネットワークの最適化
ネットワーク
コネクション数
最適化率 [%]
実行時間 [µs]
時間最適化率 [%]
最適化前
141
100
82
100
1
92
65
59
72
2
85
60
57
70
3
79
56
57
70
4
82
58
58
71
5
85
60
57
70
平均
85
60
57
70
図 3.1, 図 3.2 は、2 層 10 ニューロンのネットワークの絶対値が 1 以下のコネクションを削除し、その直後
13
に再学習等を行わずに計算したネットワークの出力と 1000 回の学習後の出力のグラフである。
2 層 10 ニューロンネットワークのコネクション削除では、コネクション削除後も比較的元の関数の形がよ
く残っている。コネクション削除の閾値は手で与えており、1000 回の学習後にすぐに元の形を取り戻すよう
な値を選んで用いている。つまり、閾値をこれ以上大きくすると極端に形が崩れ、再学習を行っても用意に
元の形には戻らないようになる。このことから、コネクションごとに計算への影響度の偏りがあるのではな
いかと思われる。
3.1.2
4 層 5 ニューロン・ネットワークにおけるコネクション削除
表 3.2 は、4 層 5 ニューロンのネットワークの結合強度の絶対値が 2 以下のコネクション削除前と後のネッ
トワークを比較したものである。実行時間に関しては、2000 回ループを回し、その 1 回あたりの実行時間を
求めている。最適化率の平均は 60%で、ほぼ 2 層 10 ニューロンネットワークと同様の成績を上げている。
表 3.2: コネクションの削除による 4 層 5 ニューロン・ネットワークの最適化
ネットワーク
コネクション数
最適化率 [%]
実行時間 [µs]
時間最適化率 [%]
最適化前
106
100
68
100
1
65
65
49
72
2
63
60
50
70
3
57
56
47
70
4
62
58
48
71
5
65
60
49
70
平均
62
60
49
71
図 3.3, 図 3.4 は、4 層 5 ニューロンのネットワークの絶対値が 2 以下のコネクションを削除し、その直後
に再学習等を行わずに計算したネットワークの出力と 1000 回の学習後の出力のグラフである。
4 層 5 ニューロンネットワークでは最適化直後のグラフ形状の崩れが著しい。これはおそらく、多くのコ
ネクションがより均等に計算に貢献しているためだと思われる。
14
1
"2x10_1.nnw.1.out"
"2x10_2.nnw.1.out"
"2x10_3.nnw.1.out"
"2x10_4.nnw.1.out"
"2x10_5.nnw.1.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
図 3.1: コネクション削除直後のネットワーク出力
1
"2x10_1.nnw.teach.1.out"
"2x10_2.nnw.teach.1.out"
"2x10_3.nnw.teach.1.out"
"2x10_4.nnw.teach.1.out"
"2x10_5.nnw.teach.1.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
図 3.2: 再学習 (1000 回) 後のネットワーク出力
15
0.8
0.9
1
"4x5_1.nnw.2.out"
"4x5_2.nnw.2.out"
"4x5_3.nnw.2.out"
"4x5_4.nnw.2.out"
"4x5_5.nnw.2.out"
"4x5_6.nnw.2.out"
"4x5_8.nnw.2.out"
"4x5_9.nnw.2.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
図 3.3: コネクション削除直後のネットワーク出力
1
"4x5_1.nnw.teach.2.out"
"4x5_2.nnw.teach.2.out"
"4x5_3.nnw.teach.2.out"
"4x5_4.nnw.teach.2.out"
"4x5_5.nnw.teach.2.out"
"4x5_6.nnw.teach.2.out"
"4x5_8.nnw.teach.2.out"
"4x5_9.nnw.teach.2.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
図 3.4: 再学習 (1000 回) 後のネットワーク出力
16
0.8
0.9
3.2
3.2.1
バイアス置換
2 層 10 ニューロン・ネットワークにおけるバイアス置換
表 3.3 は、2 層 10 ニューロンのネットワークにおいて変化の絶対値が 0.1 以下のニューロンの置換前と後
のネットワークを比較したものである。実行時間に関しては、2000 回ループを回し、その 1 回あたりの実行
時間を求めている。
表 3.3: バイアス置換による 2 層 10 ニューロン・ネットワークの最適化
ネットワーク
ニューロン数
最適化率 [%]
実行時間 [µs]
時間最適化率 [%]
最適化前
20
100
82
100
1
19
95
73
89
2
19
95
74
90
3
16
80
43
54
4
17
85
62
76
5
18
90
67
82
平均
18
89
64
78
ニューロンの最適化率はほぼ 1 割程度になっている。実行時間は、かなりばらつきがあるが、これはニュー
ロン一つあたりの計算時間がかなり重いことを示している。従って、コネクションを削除するよりは多少効
率的には劣るがやはりニューロン自体を切ることが最適化において大きな意味を持つことが確認できたとい
える。
図 3.5, 図 3.6 は、2 層 10 ニューロンのネットワークの変化の絶対値が 0.1 以下のニューロンを削除し、そ
の直後に再学習等を行わずに計算したネットワークの出力と 1000 回の学習後の出力のグラフである。学習直
後にもさほどの崩れは見あたらない。しかし、入力値が 1 の付近ではかなり崩れていると言える。
17
1
"2x10_1.nnw.0.1.out"
"2x10_2.nnw.0.1.out"
"2x10_3.nnw.0.1.out"
"2x10_4.nnw.0.1.out"
"2x10_5.nnw.0.1.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
図 3.5: 置換直後のネットワーク出力
1
"2x10_1.nnw.teach.0.1.out"
"2x10_2.nnw.teach.0.1.out"
"2x10_3.nnw.teach.0.1.out"
"2x10_4.nnw.teach.0.1.out"
"2x10_5.nnw.teach.0.1.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
図 3.6: 再学習 (1000 回) 後のネットワーク出力
18
0.8
0.9
3.2.2
4 層 5 ニューロン・ネットワークにおけるバイアス置換
表 3.4 は、4 層 5 ニューロンのネットワークにおいて変化の絶対値が 0.12 以下のニューロンの置換前と後
のネットワークを比較したものである。実行時間に関しては、2000 回ループを回し、その 1 回あたりの実行
時間を求めている。
表 3.4: バイアス置換による 4 層 5 ニューロン・ネットワークの最適化
ネットワーク
ニューロン数
最適化率 [%]
実行時間 [µs]
時間最適化率 [%]
最適化前
20
100
64
100
1
17
85
50
78
2
18
90
56
88
3
16
80
49
77
4
15
75
44
69
5
17
85
53
83
平均
17
83
50
79
最適化率において 2 層 10 ニューロンよりややよい結果を残しているものの、ほぼ差はない。バイアス置換
においてもネットワーク構成は影響を及ぼしていないように見える。
図 3.7, 図 3.8 は、4 層 5 ニューロンのネットワークの変化の絶対値が 0.12 以下のニューロンを置換し、そ
の直後に再学習等を行わずに計算したネットワークの出力と 1000 回の学習後の出力のグラフである。
19
1
"4x5_1.nnw.0.12.out"
"4x5_2.nnw.0.12.out"
"4x5_3.nnw.0.12.out"
"4x5_4.nnw.0.12.out"
"4x5_5.nnw.0.12.out"
"4x5_6.nnw.0.12.out"
"4x5_8.nnw.0.12.out"
"4x5_9.nnw.0.12.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
図 3.7: 置換直後のネットワーク出力
1
"4x5_1.nnw.teach.0.12.out"
"4x5_2.nnw.teach.0.12.out"
"4x5_3.nnw.teach.0.12.out"
"4x5_4.nnw.teach.0.12.out"
"4x5_5.nnw.teach.0.12.out"
"4x5_6.nnw.teach.0.12.out"
"4x5_8.nnw.teach.0.12.out"
"4x5_9.nnw.teach.0.12.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
図 3.8: 再学習 (1000 回) 後のネットワーク出力
20
0.8
0.9
3.3
3.3.1
ニューロン統合
2 層 10 ニューロン・ネットワークにおけるニューロン統合
表 3.5 は、2 層 10 ニューロンのネットワークにおいて変化率の差が 0.01 以下のニューロンの統合前と後の
ネットワークを比較したものである。実行時間に関しては、2000 回ループを回し、その 1 回あたりの実行時
間を求めている。
表 3.5: ニューロン統合による 2 層 10 ニューロン・ネットワークの最適化
ネットワーク
コネクション数
最適化率 [%]
実行時間 [µs]
時間最適化率 [%]
最適化前
20
100
82
100
1
17
85
63
77
2
19
95
73
89
3
18
90
67
82
4
17
85
61
74
5
17
85
62
76
平均
18
88
65
80
2 層 10 ニューロンネットワークでは 1 割程度のニューロンの削除率を得られた。この中には、ほとんど変
化しないバイアス置換で削除できるものも含まれると考えられる、変化するもの同士の統合はこれより少な
いものと見るべきであろう。
図 3.9, 図 3.10 は、2 層 10 ニューロンのネットワークの変化率の差が 0.01 以下のニューロンを統合し、そ
の直後に再学習等を行わずに計算したネットワークの出力と 1000 回の学習後の出力のグラフである。
21
1
"2x10_1.nnw.0.01.out"
"2x10_2.nnw.0.01.out"
"2x10_3.nnw.0.01.out"
"2x10_4.nnw.0.01.out"
"2x10_5.nnw.0.01.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
図 3.9: ニューロン統合直後のネットワーク出力
1
"2x10_1.nnw.teach.0.01.out"
"2x10_2.nnw.teach.0.01.out"
"2x10_3.nnw.teach.0.01.out"
"2x10_4.nnw.teach.0.01.out"
"2x10_5.nnw.teach.0.01.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
図 3.10: 再学習 (1000 回) 後のネットワーク出力
22
0.8
0.9
3.3.2
4 層 5 ニューロン・ネットワークにおけるニューロン統合
表 3.6 は、4 層 5 ニューロンのネットワークにおいて変化率の差が 0.015 以下のニューロンの統合前と後の
ネットワークを比較したものである。実行時間に関しては、2000 回ループを回し、その 1 回あたりの実行時
間を求めている。
表 3.6: ニューロン統合による 4 層 5 ニューロン・ネットワークの最適化
ネットワーク
ニューロン数
最適化率 [%]
実行時間 [µs]
時間最適化率 [%]
最適化前
20
100
64
100
1
20
100
64
100
2
19
95
61
95
3
19
95
61
95
4
20
100
64
100
5
19
95
61
95
平均
19
97
62
97
4 層 5 ニューロンネットワークは 2 層 10 ニューロンネットワークと違いほとんどニューロンを削ることは
できなかった。バイアス置換において 2 層 10 ニューロンネットワークとほぼ同じ成績をだしているところか
ら考えると、4 層 5 ニューロンネットワークにおいては個々のニューロンの変動は少ないものの、変化率の
推移が一致しないものが多いと言うことが考えられる。
図 3.11, 図 3.12 は、4 層 5 ニューロンのネットワークの変化率の差が 0.015 以下のニューロンを統合し、そ
の直後に再学習等を行わずに計算したネットワークの出力と 1000 回の学習後の出力のグラフである。
23
1
"4x5_1.nnw.0.015.out"
"4x5_2.nnw.0.015.out"
"4x5_3.nnw.0.015.out"
"4x5_4.nnw.0.015.out"
"4x5_5.nnw.0.015.out"
"4x5_6.nnw.0.015.out"
"4x5_8.nnw.0.015.out"
"4x5_9.nnw.0.015.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
図 3.11: ニューロン統合直後のネットワーク出力
1
"4x5_1.nnw.teach.0.015.out"
"4x5_2.nnw.teach.0.015.out"
"4x5_3.nnw.teach.0.015.out"
"4x5_4.nnw.teach.0.015.out"
"4x5_5.nnw.teach.0.015.out"
"4x5_6.nnw.teach.0.015.out"
"4x5_8.nnw.teach.0.015.out"
"4x5_9.nnw.teach.0.015.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
図 3.12: 再学習 (1000 回) 後のネットワーク出力
24
0.8
0.9
3 種類の最適化の統合
3.4
以下は、すでに述べた 3 つのネットワーク最適化をすべて施してみた場合である。
2 層 10 ニューロン・ネットワークにおける最適化の統合
3.4.1
表 3.7 は、ニューロンの変化の絶対値が 0.1 以下のニューロンを削除し、変化率の差が 0.01 のニューロン
を統合したあと結合強度が 1 以下のコネクションを削除した最適化前と後のネットワークを比較したもので
ある。実行時間に関しては、2000 回ループを回し、その 1 回あたりの実行時間を求めている。
表 3.7: 最適化の統合による 2 層 10 ニューロン・ネットワークの最適化
ネットワーク
ニューロン数
最適化率 [%]
結合数
最適化率 [%]
実行時間 [µs]
時間最適化率 [%]
最適化前
20
100
141
100
83
100
1
16
80
73
52
48
58
2
18
90
66
47
48
58
3
13
65
51
36
35
42
4
14
70
52
37
37
45
5
15
75
63
45
42
51
平均
15
76
61
43
42
51
2 層 10 ニューロンネットワークにおいて、すべての最適化を施すとネットワークは元の約半分程度まで最
適化できることがわかった。このとき、実行時間も半分程度になり高速化においても十分期待できると思う。
図 3.13, 図 3.14 は、2 層 10 ニューロンのネットワークの変化の絶対値が 0.1 以下のニューロンを削除し、
変化率の差が 0.01 のニューロンを統合した後結合強度が 1 以下のコネクションを削除して最適化したもので
ある。最適化直後に再学習等を行わずに計算したネットワークの出力と 1000 回の学習後の出力のグラフで
ある。
25
1
"2x10_1.nnw.0.1.0.01.1.out"
"2x10_2.nnw.0.1.0.01.1.out"
"2x10_3.nnw.0.1.0.01.1.out"
"2x10_4.nnw.0.1.0.01.1.out"
"2x10_5.nnw.0.1.0.01.1.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
図 3.13: 最適化の統合直後のネットワーク出力
1
"2x10_1.nnw.teach.0.1.0.01.1.out"
"2x10_2.nnw.teach.0.1.0.01.1.out"
"2x10_3.nnw.teach.0.1.0.01.1.out"
"2x10_4.nnw.teach.0.1.0.01.1.out"
"2x10_5.nnw.teach.0.1.0.01.1.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
図 3.14: 再学習 (1000 回) 後のネットワーク出力
26
0.8
0.9
4 層 5 ニューロン・ネットワークにおける最適化の統合
3.4.2
表 3.8 は、ニューロンの変化の絶対値が 0.12 以下のニューロンを削除し、変化率の差が 0.014 のニューロ
ンを統合したあと結合強度が 1.5 以下のコネクションを削除した最適化前と後のネットワークを比較したも
のである。実行時間に関しては、2000 回ループを回し、その 1 回あたりの実行時間を求めている。
表 3.8: 最適化の統合による 4 層 5 ニューロン・ネットワークの最適化
ネットワーク
ニューロン数
最適化率 [%]
結合数
最適化率 [%]
実行時間 [µs]
時間最適化率 [%]
最適化前
20
100
106
100
67
100
1
17
85
58
55
43
64
2
17
85
54
51
42
63
3
16
80
55
52
41
62
4
15
75
46
43
37
55
5
16
80
64
60
41
61
平均
17
81
55
52
41
61
4 層 5 ニューロンネットワークにおいても、すべての最適化を施すとかなりの最適化ができることがわかっ
た。2 層 10 ニューロンよりは最適化率が悪いが、これは 2 層 10 ニューロンネットワークと 4 層 5 ニューロ
ンネットワークの性能がほぼ同じになっていることから、個々のニューロンやコネクションの計算への貢献
度がほぼ同じになったということを意味していると思われる。
図 3.15, 図 3.16 は、4 層 5 ニューロンのネットワークの変化の絶対値が 0.12 以下のニューロンを削除し、
変化率の差が 0.014 のニューロンを統合した後結合強度が 1.5 以下のコネクションを削除して最適化したも
のである。最適化直後に再学習等を行わずに計算したネットワークの出力と 1000 回の学習後の出力のグラフ
である。
27
1
"4x5_1.nnw.0.12.0.014.1.5.out"
"4x5_2.nnw.0.12.0.014.1.5.out"
"4x5_3.nnw.0.12.0.014.1.5.out"
"4x5_4.nnw.0.12.0.014.1.5.out"
"4x5_5.nnw.0.12.0.014.1.5.out"
"4x5_6.nnw.0.12.0.014.1.5.out"
"4x5_8.nnw.0.12.0.014.1.5.out"
"4x5_9.nnw.0.12.0.014.1.5.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
図 3.15: 最適化の統合直後のネットワーク出力
1
"4x5_1.nnw.teach.0.12.0.014.1.5.out"
"4x5_2.nnw.teach.0.12.0.014.1.5.out"
"4x5_3.nnw.teach.0.12.0.014.1.5.out"
"4x5_4.nnw.teach.0.12.0.014.1.5.out"
"4x5_5.nnw.teach.0.12.0.014.1.5.out"
"4x5_6.nnw.teach.0.12.0.014.1.5.out"
"4x5_8.nnw.teach.0.12.0.014.1.5.out"
"4x5_9.nnw.teach.0.12.0.014.1.5.out"
sin(x*2*pi)/2+0.5
0.8
0.6
0.4
0.2
0
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
図 3.16: 再学習 (1000 回) 後のネットワーク出力
28
0.8
0.9
第4章
考察
ネットワークに最適化を施した場合、入力値が 0.5 付近と 0 付近の情報が比較的よく残ることがわかった。こ
れはおそらくバイアスの影響が大きい領域であるためだと思われる。
ネットワークに最適化を施す場合、現在は削除後の出力を見てあたりをつけて閾値を決めているのだが、
この際、元の関数をなぞるような凹凸が見られるあたりでとめると再学習ですぐに元の形を取り戻すが、凹
凸が見られなくなるとほんの少しの差でも再学習が難しくなることがわかった。
また、コネクションの削除とバイアスへのニューロンの統合においては 4 層 5 ニューロンネットワークの
ほうが最終的な絶対値での結果は良好であり、ニューロンの統合では少し悪かった程度なのであるが、総合
して最適化を行うとほぼ同じ成績を残した。
今回の実験では、当初もっと大規模なネットワークを用いて 3、4 種類程度のネットワークに対して行う予
定であった。しかしながら、そのような大規模なネットワーク (構成ニューロン数が 25 以上のもの) に関し
ては学習に非常に時間がかかりすぎ、結局 20 ニューロンから成る二種類のネットワークでの実験となってし
まった。非常に残念である。今回の実験においてはネットワークが冗長であることが前提となるので、小さ
いネットワークを用いることもできずにこのサイズとなった。
しかしながら、最適化によるネットワークの高速化も確認でき、成果としてはまずまずのものだったとい
える。ただし、今回の実験はあくまで一つのケースにすぎず、実際にどの程度最適化できるかは対象のネッ
トワークの構成とネットワークに学習させている内容によるということも忘れてはいけない。
現在、最適化を行うための閾値を手で決めなければいけないのは明らかな欠陥である。出力値や、ニュー
ロンの反応の分布を元に自動で最適化できるようになるとよいと思われる。また、バイアス置換などは学習
アルゴリズムに取り込むことができるのではないかと思われる。適当なカウンタを用意し、変化がほとんど
なければデクリメント、変化があればリセットするようにすれば大脳神経の自然消滅のような自己最適化が
行えるのではないだろうか。また、必要に応じてニューロンを自動生成できるようになれば、そもそも最適
化など不要になるように思われるし、拡張性という面でも申し分ない。
29
参考文献
[1] 馬場則夫・小島史男・小澤誠一著 『ニューラルネットの基礎と応用』 (共立出版株式会社、1994 年)
[2] 中野馨 編著 知能システム研究会 著 『C でつくる脳の情報システム』(近代科学社、1995 年)
[3] Bajrne Strustrup 著 株式会社 ロングテール/長尾高広 訳 『プログラミング言語 C++』 (アジソン・ウェ
スレイ・パブリッシャーズ・ジャパン、1998 年)
[4] 河村一樹 著 『ソフトウェア工学入門』(近代科学社、1995 年)
30