ブログのとさか

技術的な話をしたりしなかったり

k-meansとニューラルネットと機械学習と...

もともとk-meansにDeep Forestのカスケード構造を導入したDeep k-meansみたいなものをやろうとしていましたが、あまりうまく行かなかったうえ、そこから得られる考察もあまり面白くなかったので、関連した違う話を書こうと思います。

おことわり

この記事に書いてあることはしっかりと裏を取って書いたことではありません。
解説記事というわけでもなく、考えたことのメモみたいなものです。間違い等ありましたらご指摘お願いします。

2018年2月追記

今見るとかなり雑なことが書いてありますが、ニューラルネットを勉強し始めた頃に考えていたことのメモとして残しておきます。

k-means

k-meansはk個のクラスタに対応するk個の代表点を定めます。データを分類する際は、そのデータと最も距離が近い代表点が属するクラスタに分類します。

ここでk=2のときを考えます。2つの代表点からの距離が等しくなる軌跡を図示すると、一つの超平面になります。この平面に対して点がどちら側にあるかどうかで属するクラスタが決定されるので、これはn次元空間において分離超平面であるといえます。

これを拡張すると、k>2のときは分離超平面が\displaystyle_ kC_2=k(k-1)/2個配置されると考えることができます。それぞれの超平面による分類結果は、代表点に対応するクラスタ、つまりクラスタiクラスタjの代表点p_ip_jによって配置される超平面の分類結果はiまたはjになるとします。すると、ある点が分類されるクラスタは、全ての超平面によってその点を分類した後、その結果の多数決を取ることによって決定できます。(選ばれるクラスタに分類される回数は常にk回になります。)

このように、k-meansはk個の代表点を用いることで_kC_2個の分離超平面を配置し、それらの分類結果をもとに最終的に属するクラスタを決定する手法であると解釈することもできます。(当然ですがこれはk-meansに限った話ではなく、幾つかの代表点を定めてそれらとの距離で分類する手法一般に言えることです。)

ニューラルネット

全結合ニューラルネットを構成する基本的な人口ニューロンについて考えます。人口ニューロンの結合をベクトルをw,バイアスをb,入力をx,活性化関数をfとすると、出力はf(wx+b)で表されます。するとwx+bは「『wを法線ベクトル,bを定数項とする分離超平面』と『x』の符号付き距離」に,|| w ||を掛けたものだと解釈することができます。詳しくは以下のPDFを見てください。

https://github.com/madoibito80/poem/blob/master/01.pdf

ニューラルネットの層はこの人口ニューロンを複数もっているので、ニューラルネットの1つの層は、複数の分離超平面による分類結果を返している事になります。さらにニューラルネットの層の出力を次の層の人口ニューロンの入力として多値分類を行うと、これはk-meansの時と同様に、複数の超平面による分類結果をもとに最終的な分類結果を決定する手法であると解釈できます。

転移学習的な(ここからポエム感が増します。)

k-meansとニューラルネットは複数の超平面を用いて分類した結果をもとに分類する手法であることがわかりましたが、この話はk-meansやニューラルネットに限らず、多値分類を行う機械学習モデル一般に言えることだと思います。(当たり前の話といえば当たり前の話です。) そう考えると、ニューラルネットの層の初期値を決定するのに、他の機械学習のモデルで得た超平面を用いる手法などがあっても良いような気がしますが、今流行ってないことを考えるとあまりうまく行かないのでしょうか? ラベル付きデータが少ないときなどに教師なしクラスタリングで得た超平面を用いたり、ニューラルネットよりも学習が速い機械学習器で得た超平面を用いたりするのはある程度有効そうな気はしなくもないですが、IMSATのような優れた教師なし学習方法が発展している今の時代には無用の長物なのかもしれません。
ただ、これに関しては後で実験するかもしれません。(Done is better than perfect.に則って実験する前にブログを書きました...)

[追記] 僕もまだちゃんと中身見ていませんが、k-meansでCNNの初期値を定めるのはうまくいくらしいです。

ニューラルネットと同等な表現

ところで、ニューラルネットでもk-meansのように点を決定する手法で分離超平面を配置することができます。(それは同時に法線ベクトルですが...)
学習するベクトルをvとして「座標vを通りvを法線ベクトルとする分離超平面」を配置すると、n次元空間においてはn個のパラメータのみによって全ての分離超平面が表現できます。このvを使ってニューラルネットを構築することも出来ます。
順伝播時には、vによって決定される分離超平面を表す法線ベクトルw=v、バイアス項b=-|| v ||^2とし、通常のニューラルネットと同様に計算します。
これで一つ学習するパラメータを減らしてニューラルネットが構築できたように見えますが、超平面が通る点、つまりバイアス項によってノルムが変化してしまうので、ニューラルネットと同等な表現力をもたせたい場合、実数kも同時に学習させて、出力をkwx+bとすれば良いです。

この表現を得ることで何か嬉しいことがあるのかと言われたら特には思いつきませんが、パラメータを1つでも減らしたい場面がもしあったら使える可能性がゼロでは無いかもしれません。その場合は活性化関数に渡す値を(wx+b)/|| w ||、つまり通常の超平面からの符号付き距離にすることが有効だと思います。(バイアス項によるノルムの変動の影響がなくすことができるため。この場合通常のニューラルネットで言うとノルムを1に常に正規化している状態と同じになり、「各超平面の重み」を表すことができなくなります。)(これに関しては実験を行おうと思います)
ただ、実数kを用いる表現では「法線ベクトルのノルムの意味」と「ベクトルと独立した実数の意味」が通常の人工ニューロンと逆になるという点は少し面白いかなとは思います。

また少し違う話ですが、人口ニューロンでは分離超平面からの符号付き距離を求めているところを、点からの距離にしても学習できるんじゃないかなと思っています。(もちろん式としては違うものが出てきます。また活性化関数も通常のものは使えなくなります。)
結局実験してみないとわからないので、後日試してみたいと思います。

所感

勢いで書いて数式書くのもサボったら非常に読みにくくなってしまいまいました。(追記: とりあえず数式は直しました)
k-meansもニューラルネットも50年以上前に発表されたものなので、今回書いたことはとうの昔に指摘されていることだろうなあとは思っています。