FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

GPU Proを読んでみる(自己組織化マップについて勉強)

GPGPUのプログラムの書き方とか、高速化のテクニックの基礎を学んだところで、いろいろ挑戦するために、まずは何をすればいいだろう。 そういえば昔こんな本を買ってみたんだったなということで、GPU Proの最初の章で登場している、自己組織化マップについて挑戦してみた。

GPU Pro: Advanced Rendering Techniques

GPU Pro: Advanced Rendering Techniques

最初の章で、SOM(Self Organization Map: 自己組織化マップ)について、簡単に説明してある。人工知能とかニューラルネットワークははっきり言ってど素人なので、これを読みながら勉強してみたが、よく分からない。とりあえずアルゴリズムが載っているので、それを眺めてみよう。

[定義1.1] コードベクタciは、2つのベクトルviとvi'から構成されるならば、そのグラフはマージされる

[定義1.2] ciとci'の距離は、グラフg内の最小パスによって表現される。

[定義1.3] 2つのコードベクタの距離がuよりも小さいときに、コードベクタciの隣接ci'で、u-サイズの隣接であると定義する。

[定義1.4] コードベクタciにおいて、I_i(u)とは、隣接するベクタにおいて、サイズがuであるベクタのインデックスの集合である。

SOMのアルゴリズムは以下のように記述されていた。

  1. T回以下のループを繰替えす。隣接ベクタとのサイズは0からT/8までの間は2,T/8からT/2までの間は1、それ以降は0とする。
  2. M個の空集合Mを作成する。
  3. 各トレーニングベクタx_jに対して、近傍のコードベクタc_i(t)を探索する。 I_i(t)となるインデックスi'の集合に対して、x_jを挿入する。これにより、該当するコードベクタにおいて、距離がu_tよりも小さいコードベクタを挿入していることになる。
  4. コードベクタの平均を取って、コードベクタを更新する。
  5. ステップ2にもどって繰替えす

うーん、こうすると、例に載っている2次元のメッシュ構造を使って学習すると、最初の平均を算出することで、コードベクタが平均化しない? そうすると、それ以降全然学習してくれないような。。。とりあえず、今の自分で作ってしまった実装はそのようになっている。

もうちょっと勉強が必要だな。また分かったことがあったら更新しよう。ってか、第1章を読むのにこんなに時間がかかるなんて...