Main Content

競合ニューラル ネットワークによるクラスター化

競合層のニューロンは、頻繁に与えられる入力ベクトルを認識するように自分自身を分布させます。

アーキテクチャ

競合ネットワークのアーキテクチャは以下のとおりです。

Schematic of a competitive network where input vector p is passed to a competitive layer that calculates output a.

この図の‖ dist ‖ボックスは入力ベクトル p と入力重み行列 IW1,1 を受け入れ、S1 個の要素を持つベクトルを生成します。この要素は、入力ベクトルと、入力重み行列の行から形成されるベクトル iIW1,1 との間の距離を負にした値です。

競合層の正味入力 n1 は、入力ベクトル p と重みベクトルの間の距離を負にした値を求め、バイアス b を加算することで計算されます。すべてのバイアスが 0 の場合、ニューロンが取ることのできる最大正味入力は 0 です。これは、入力ベクトル p がニューロンの重みベクトルと等しいときに起こります。

競合伝達関数は、層に対する正味入力ベクトルを受け入れて、"勝者"、つまり正味入力 n1 の最も大きな正の要素に関連付けられたニューロンを除くすべてのニューロンに対して 0 のニューロン出力を返します。勝者の出力は 1 です。すべてのバイアスが 0 の場合、重みベクトルが入力ベクトルに最も近いニューロンが "最小" の負の正味入力を持つことになり、競合の勝者となって 1 を出力します。

競合層でバイアスを使用する理由については、バイアス学習規則 (learncon)で紹介されています。

競合ニューラル ネットワークの作成

競合ニューラル ネットワークは、関数 competlayer を使用して作成できます。簡単な例を使って、この処理を説明します。

次の 4 個の 2 要素ベクトルを 2 つのクラスに分割するとします。

p = [.1 .8 .1 .9; .2 .9 .1 .8]
p =
    0.1000    0.8000    0.1000    0.9000
    0.2000    0.9000    0.1000    0.8000

原点に近い 2 個のベクトルと、(1,1) に近い 2 個のベクトルがあります。

最初に、2 個のニューロンから成る競合層を作成します。

net = competlayer(2);

これでネットワークができましたが、分類を行うにはネットワークが学習する必要があります。

初めてネットワークの学習が行われるときに、その重みは関数 midpoint を使用して入力範囲の中心に初期化されます。これらの初期値はニューロンの数と入力データを使用して確認できます。

wts = midpoint(2,p)
wts =
    0.5000    0.5000
    0.5000    0.5000

これらの重みは、実際に入力の範囲 (0 ~ 1) の中間点の値になっています。

初期バイアスは initcon によって計算され、次のようになります。

biases = initcon(2)
biases =
    5.4366
    5.4366

入力ベクトル p に応答するように、各ニューロンが競合することを思い出してください。バイアスがすべて 0 であれば、重みベクトルが p に最も近いニューロンが最大の正味入力を得て、競合の勝者となり、1 を出力します。他のすべてのニューロンは 0 を出力します。勝者ニューロンが入力にもっと近づくように調整する必要があります。これを行うための学習規則については、次の節で説明します。

Kohonen 学習規則 (learnk)

勝者ニューロンの重み (入力重み行列の行) は "Kohonen 学習" 規則を使用して調整されます。i 番目のニューロンが勝者である場合、入力重み行列の i 番目の行の要素が以下のように調整されます。

IiW1,1(q)=IiW1,1(q1)+α(p(q)IiW1,1(q1))

Kohonen 規則は、ニューロンの重みに入力ベクトルを学習させるので、認識アプリケーションに役立ちます。

つまり、重みベクトルが入力ベクトルに最も近いニューロンは、さらに近づくように更新されます。その結果、次回類似のベクトルが与えられたときは、今回の勝者ニューロンが競合に勝つ可能性が高くなり、まったく異なる入力ベクトルが与えられたときは、勝つ可能性が低くなります。入力が次々に与えられると、一連の入力ベクトルに最も近い層内の各ニューロンの重みベクトルがすぐに、それらの入力ベクトルの方向に調整されます。最終的に、十分なニューロンがあれば、類似の入力ベクトルの各クラスターにあるニューロンは、クラスター内のベクトルが与えられたときには 1 を出力し、それ以外のときには常に 0 を出力するようになります。したがって、競合ネットワークは、提示される入力ベクトルの分類を学習します。

このツールボックスで Kohonen 学習規則を実行するには、関数 learnk を使用します。

バイアス学習規則 (learncon)

競合ネットワークの制限の 1 つとして、一部のニューロンが "割り当て" られない場合があることが挙げられます。つまり、ニューロンによっては、重みベクトルがどの入力ベクトルからも遠く離れた値で始まるために、どれほど長い時間学習が続けられても、まったく競合に勝てないものがあります。その結果、それらの重みの学習は行われず、決して勝つことはありません。このような不幸なニューロンは "デッド ニューロン" と呼ばれており、役立つ機能を果たしません。

このような事態を避けるために、バイアスを使用して、頻繁に競合に勝っているニューロンよりも、(たとえあったとしても) めったに勝てないニューロンが有利になるようにします。正のバイアスが負の距離に加算されるため、離れたニューロンが勝つ可能性が高くなります。

これを行うために、ニューロン出力のランニング平均が保持されます。これは、各出力が 1 である回数の割合と等価です。この平均は、頻繁に活性化するニューロンのバイアスが小さくなり、あまり活性化しないニューロンのバイアスが大きくなるように、学習関数 learncon でバイアスを更新する際に使用されます。

あまり活性化しないニューロンのバイアスが増加すると、それらのニューロンが応答する入力空間が大きくなります。その入力空間が大きくなると、あまり活性化しないニューロンが応答し、多くの入力ベクトルの方向に移動するようになります。結果として、そのニューロンは、他のニューロンと同数のベクトルに応答します。

これには 2 つの利点があります。まず、重みがどの入力ベクトルよりも離れているために競合に勝てないニューロンでも、最終的にはバイアスが大きくなり、競合に勝てるようになります。そうなると、入力ベクトルの何らかのグループの方向に移動します。そのニューロンの重みが入力ベクトルのグループに移動して、そのニューロンが一貫して勝つようになると、そのバイアスは 0 に減らされます。このようにして、デッド ニューロンの問題は解決されます。

バイアスの 2 つ目の利点は、各ニューロンがほぼ同じ割合の入力ベクトルを分類するにようになることです。つまり、入力空間の 1 つの領域が他の領域よりも多くの入力ベクトルに関連付けられている場合、その密度が高い領域は、多くのニューロンを引きつけて、より小さなサブセクションに分類されます。

通常、learncon の学習率の桁は、ランニング平均が正確になるように learnk の学習率の桁以下に設定されます。

学習

ここでは、ネットワークの学習を 500 エポック行います。train または adapt のいずれかを使用できます。

net.trainParam.epochs = 500;
net = train(net,p);

競合ネットワークに対する train では、学習関数 trainru が使用されます。このことは、ネットワークを作成した後で次のコードを実行して確認できます。

net.trainFcn
ans =
trainru

各エポックでは、すべての学習ベクトル (またはシーケンス) が、エポックごとに異なるランダムな順序で 1 回ずつ与えられ、その提示ごとにネットワークおよび重みとバイアスの値が更新されます。

次に、元のベクトルをネットワークへの入力として提示し、ネットワークのシミュレーションを行い、最後に出力ベクトルをクラスのインデックスに変換します。

a = sim(net,p);
ac = vec2ind(a)
ac =
     1     2     1     2

ネットワークは入力ベクトルを原点に近いクラス 1 と、(1,1) に近いクラス 2 の 2 つのグループに分類するよう学習されたことがわかります。

最終的な重みとバイアスを見てみると、興味深いことがわかる場合もあります

net.IW{1,1}
ans =
    0.1000    0.1500
    0.8500    0.8500
net.b{1}
ans =
    5.4367
    5.4365 

(学習のためにネットワークに与えられるベクトルの順序の選択には乱数シードが使用されるため、この問題を実行した場合に得られる答えが異なる場合があります)。(重み行列の 1 行目から形成される) 最初のベクトルは原点に近い入力ベクトルに近く、重み行列の 2 行目から形成されるベクトルは (1,1) に近い入力ベクトルに近くなることに注意してください。つまり、ネットワークは、入力が提示されるだけで分類が行われるように学習されています。

学習中、入力ベクトルのグループに最も近い層内の各ニューロンの重みベクトルが、それらの入力ベクトルの方向に調整されます。最終的に、十分なニューロンがあれば、類似の入力ベクトルの各クラスターにあるニューロンは、クラスター内のベクトルが与えられたときには 1 を出力し、それ以外のときには常に 0 を出力するようになります。したがって、競合ネットワークは、入力の分類を学習します。

グラフィカルな例

競合層は、重みベクトルと入力ベクトルを図示すると、より理解しやすくなります。下の図では、48 個の 2 要素入力ベクトルがマーカー + によって表されています。

Plot of 48 two-element input vectors.

上記の入力ベクトルは、クラスターに分類されるように表示されます。8 個のニューロンから成る競合ネットワークを使用して、ベクトルをこのようなクラスターに分類できます。

競合学習の動的な例を確認するには、競合学習を試してみてください。