#author("2025-02-28T01:47:24+01:00","","")
#author("2025-02-28T02:14:51+01:00","","")
[[技術資料]]

ターミナルアトラクタを組み込んだ複製・競合メカニズムによる効率的な機械学習.

*目次 [#e890b3d5]

#CONTENTS

*目的 [#x38aa8d3]
構築データ空間からランダムにデータ点が与えられたとき,そのデータ点群から元の信号を推定する.

推定方法として,複製・競合動径基底関数ネットワーク(RC-RBFN)を使用する.

しかし,RC-RBFNには複製における計算量の課題がある.そこで計算量を考慮した複製方法を提案して実装を行う.

また,従来の機械学習手法にRC-RBFNを組み込むことを提案する.

*Ubuntu24.04環境の構築方法 [#u1248302]
自分が使ってたPCアカウントのPC名とパスワード

PC名:pc,パスワード:pc123456789

**事前準備 [#ta19c6d2]
***Ubuntu24.04のisoファイルのダウンロード [#i0e24430]
Ubuntu公式サイト( https://ubuntu.com/ )にアクセスし,「Download Ubuntu」→「Download Ubuntu Desktop」→「Download 24.04.2LTS」

と進めていくと自動的にisoファイルのダウンロードが始まる(始まらない場合は一度前の画面に戻ってもう一回やってみる).保存先はどこでも問題なし(6GB近くあるのでその分の容量が必要).

#ref(Ubuntu公式.png,,Ubuntu1,15%)
~
#ref(Ubuntu.png,,Ubuntu2,15%)
~
#ref(Ubu.png,,Ubuntu3,15%)

***ライブUSBメモリの作成 [#i0e24430]
rufus( https://rufus.ie/ja/ )を使ってライブUSBメモリの作成を行う(USBに入っているデータは削除されるので必要な場合はバックアップを忘れないように).

まず,最新リリースのところから自分のpcに合う実行ファイルをダウンロードする.
#ref(rufus.png,,rufus1,25%)
~
ダウンロードしたファイルを実行すると下のような画面になる.[[参考サイト:https://original-game.com/how-to-use-rufus/#m_heading-1]]

「デバイス」でUSBメモリを選ぶ.次に「ブートの種類」から先ほどダウンロードしたisoファイルを選択し,「スタート」を押す(この後に表示されるウィンドウは「はい」を選んで進める).これには数分かかる.
#ref(rufus2.png,,rufus2,25%)
~
「キャンセル」から「閉じる」になっていれば「閉じる」を押して終了.

**Ubuntuインストール [#ta19c6d2]
ここでは有線のキーボードの方が良いと思われる(後々BIOSに行く必要が出てくる).
[[参考サイト:https://www.kkaneko.jp/tools/ubuntu/ubuntudesktop.html]]
Ubuntuを入れたいPCに先ほどのUSBメモリをさして起動する.

起動時に表示される選択画面で「Try or Install Ubuntu」を選ぶ.
#ref(Ubu1.png,,Ubu1,25%)
~
すると,言語を選択する画面が出てくるので順次自分に必要なものを選び「Next」で進んでいく.

インストール画面では「Ubuntuをインストール」を選択

→インストールの種類は「対話式インストール」を選択

→アプリケーションでは「既定の選択」

→コンピュータを最適化では何も選ばない

→ディスクのセットアップでは「ディスクを削除してUbuntuをインストール」を選択

→アカウントの設定ではユーザーネームやPCの名前,パスワードを入力する(短くわかりやすいのが望ましい)

→タイムゾーンを選択→インストール→再起動
#ref(Ubu2.png,,Ubu2,25%)
~
→「press ENTER」というプロンプトが表示されたらEnterを押す.

→ログイン画面が出てきてログインし,ソフトウェアの更新を行う.

これでUbuntuのインストールは終了.

**使用するソフトウェアのインストール [#ta19c6d2]
主に使用するソフトウェアとして,テキストエディタにVisualStudioCode,仮想環境構築にAnaconda Navigatorがある.

その他入れたいもの(chromeなど)は自分で調べて入れてほしい.

***VSC [#ta19c6d2]
ダウンロードは[[このページ:https://code.visualstudio.com/download]]から行う.

「.deb」と書かれているところをクリックし,インストール

→「Ctrl + Alt + T」でターミナルを開き,ダウンロードしたdebファイルが格納されているディレクトリに移動.

→「sudo apt insall ./ファイル名.deb」と入力し,インストールを実行.

→下のような画面が出てくるので「はい」を選択

#ref(vsc.png,,vsc,25%)
~
デスクトップ画面の左下のマークを押してVSCを左のタスクバーに持ってくると楽.

VSCの設定は各自好きな拡張機能入れてほしい.

***Anaconda Navigator [#ta19c6d2]
[[参考サイト:https://qiita.com/Z0E/items/d574302747df8f0ee4eb]]

Anaconda公式( https://www.anaconda.com/download )からLinux用のインストーラーをダウンロードする.

青枠で囲んである部分からアクセスできる.
#ref(anaconda.png,,anaconda,25%)
~
ダウンロードしたら,ターミナルを開いて「cd Downloads」→「bash Anaconda3-2022.10-Linux-x86_64.sh」と入力する.

この後に表示されるメッセージはすべてEnterもしくはYes.

次に「export PATH=/root/anaconda3/bin:$PATH」でパスを通す.

「conda --version」でパスを通せていることとAnaconda Navigatorがインストール出来ていることを確認.

仮想環境の作成→「conda create -n 環境名 python=バージョン」

仮想環境の起動→「conda activate 環境名」

仮想環境の終了→「conda deactivate 環境名」


***Pycuda [#ta19c6d2]

Pycudaのプログラミングは[[ここ:https://qiita.com/automation2025/items/c1e4465292e607d5d8d3]]を参考にしてほしい.
基底関数の定義部分をPycudaで書き換えたバージョンはここ
#ref(Pycuda.ipynb,,Pycuda)

PycudaとはNVIDIAが提供するcudaをPythonから利用するためのオープンソースライブラリのこと.

CUDAを使用することでGPUの並列計算能力を活用し,CPUよりも高速に処理を実行できる.

1. セキュアブートの無効化

セキュアブートが有効になっているとNVIDIAドライバをロード出来なかったので無効にする.

ここではASUSのマザーボードとBIOS画面を例として出すが,マザーボードのメーカーによってBIOSの項目が異なる可能性があることに注意.[[参考サイト(ASUS):https://www.asus.com/jp/support/faq/1049829/]]

PCを立ち上げる際に「F2」もしくは「Delete」を押したままにしてBIOS画面に入り,「F7」を押してAdvancedModeに切り替える.

#ref(ASUS1.png,,ASUS1,25%)
~
「Boot」タブに移動し,「Secure Boot」を選択する.
#ref(ASUS2.png,,ASUS2,25%)
~
#ref(ASUS3.png,,ASUS3,25%)
~
「OS Type」を「Other OS」にすればセキュアブートの無効化は完了.「F10」を押して保存して再起動する.
#ref(ASUS4.png,,ASUS4,25%)
~

2.cuda toolkitのインストール

Pycudaを使用するにはcudaの開発環境が必要になる.そこで,[[NVIDIA DEVELOPER:https://developer.nvidia.com/cuda-toolkit]]からcuda toolkitをダウンロードする.

このページ内の「Download Now」を押すとプラットフォームを選択する画面に遷移するので,使用しているPCのものを選ぶ.~
画像はUbuntu24.04用のもの
#ref(cuda1.png,,cuda1,25%)
~
すると下の画像のようなコードが出てくるのでターミナルを開き,1行ずつ実行していく.
#ref(cuda2.png,,cuda2,25%)
~
#ref(cuda3.png,,cuda3,25%)
~
一度再起動してターミナルを開き,「nvcc --version」でcudaがインストールできていることを確認する.

「command not found」などと表示される場合はcudaのパスを環境変数に追加する.

「export PATH=/usr/local/cuda/bin:$PATH」

→「export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH」

次にNVIDIAドライバのインストールを行う.

まず,システムがNVIDIAのGPUを認識しているか「nvidia-smi」で確認する.認識していれば以下のような情報が表示される.
#ref(cuda4.png,,cuda4,40%)
~
次にcudaに対応したドライバを「sudo ubuntu-drivers autoinstall」→「sudo reboot」でインストールする.

最後に「python -c "import pycuda.autoinit"」を実行し,エラーが出なければPycudaのインストールは終了.
------------------
*使うモジュールのインストール [#u1248302]
**使用するモジュール [#ta19c6d2]
|モジュール|version|用途|
|pandas||データ収集やデータフレームへの格納などに用いる|
|numpy||数値計算を効率的に行うための拡張モジュール|
|numba||サブセットのソースコードを高速に実行する機械語に変換するJITコンパイラ|
|matplotlib||グラフ描写の為のライブラリ|
|scipy||数値解析ライブラリ|
|pandas|2.2.3|データ収集やデータフレームへの格納などに用いる|
|numpy|2.1.3|数値計算を効率的に行うための拡張モジュール|
|numba|0.61.0|サブセットのソースコードを高速に実行する機械語に変換するJITコンパイラ|
|matplotlib|3.10.0|グラフ描写の為のライブラリ|
|scipy|1.15.2|数値解析ライブラリ|
モジュールのインストールはコマンドプロンプトでpip install モジュール名

バージョンまで指定する場合はコマンドプロンプトでpip install モジュール名==指定するバージョン
でインストールする

Pythonのバージョンは3.10.14(指定しなくてもいいかもしれない)

↓動作環境
#ref(環境.png,,動作環境)
*プログラムの動かし方 [#ob3ca958]

Anacondaで仮想環境を構築し,その仮想環境上でプログラムを動かす.

#ref(カーネル選択.png,,カーネル,35%)
↑右上の「カーネルの選択」→「Python環境」で構築した環境を選べばOK

仮想環境内の変数は下の画像中の「再起動」を押すことでリセットすることができる.
#ref(vsc2.png,,vsc2,35%)

*[理論の解説] [#gb062256]

**[RBFNの解説] [#eb3cce83]
動径基底関数ネットワーク(RBFN)とは任意の非線形関数(η)に対して,基底関数(ξ:一般的にガウス関数が用いられる)に重み(w)を乗算し,足し合わせることによって推定するニューラルネットワークのこと.

↓RBFNの構造
#ref(RBFN.png,,RBFN,15%)

入力ベクトル(X)がN個の変数から成る場合,j(j=1,2,...,M)番目のガウス関数ξ(X)は中心位置パラメータ(m)とξの広がりを表すパラメータ(Σ)を用いて以下のように表される.
#ref(xi.png,,基底関数)

この各パラメータを学習によって更新していくことにより目的関数の推定を行う.

**[競合の解説] [#eb3cce83]
通常のRBFNでは,基底関数の数が多すぎると過学習や学習時間の増加などの問題を引き起こす.そこで適者生存型学習則を適用することによって,学習の過程で競合を発生させて目的関数の推定に不要な基底関数を効率的に削除する.

この適者生存型学習則は[[一般Lotka-Volterra競争系:https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%88%E3%82%AB%E3%83%BB%E3%83%B4%E3%82%A9%E3%83%AB%E3%83%86%E3%83%A9%E3%81%AE%E7%AB%B6%E4%BA%89%E6%96%B9%E7%A8%8B%E5%BC%8F]]をもとにしている.

詳しくはリンク先を見るといいが,簡単にまとめると「競争関係にある生物の個体数の変動を表す数理モデル」であり,生物感の弱肉強食の関係を表すようなモデルである.

この競争関係間の競合を数式で表すと次のようになる.
#ref(競合.png,,競合,75%)

ここでαは[[内的自然増加率:https://ja.wikipedia.org/wiki/%E5%86%85%E7%9A%84%E8%87%AA%E7%84%B6%E5%A2%97%E5%8A%A0%E7%8E%87#:~:text=%E5%86%85%E7%9A%84%E8%87%AA%E7%84%B6%E5%A2%97%E5%8A%A0%E7%8E%87%EF%BC%88%E3%81%AA%E3%81%84%E3%81%A6%E3%81%8D%E3%81%97%E3%81%9C%E3%82%93%E3%81%9E,%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%20biotic%20potential%20%E3%81%A8%E3%82%82%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82]],γは基底関数間の競合係数を表しており,それぞれ以下のように与えられる.
#ref(内的自然増加率2.png,,内的自然増加率2,75%)
#ref(競合係数.png,,競合係数,75%)

これらのパラメータを計算し,重みを更新することによって適切な基底関数のみが生存するようになる.

この学習則に従うRBFNを競合動径基底関数ネットワーク(CRBFN)と呼ぶ.

**[複製の解説] [#eb3cce83]

競合の機能によって基底関数の数を減らすことは実現できた.しかし,基底関数の数が足りない場合については考えることができていない.そこで,複製機能を導入することによって基底関数の数を増やす.



**STEP1 ニューラルネットワークのパラメータ更新[#xbcf3848]
1.シナプス結合荷重wの更新
競争を考慮したシナプス可塑性方程式(適者生存型学習則) に従って更新する。
#ref(パラメータw.png)
ここでαj(ϕ)は内的自然増加率、γjk(ϕ) は競争係数を示し以下のような式で成り立つ
#ref(内的自然増加率.png)
#ref(競争係数.png)

2.動径基底関数の中心𝑚𝑗の更新
従来のRBFNにおける更新式は以下の通りである
#ref(RBFNのmパラメータ.png)
RC-RBFNでは自由エネルギーを考慮します。更新式は条件付確率密度関数𝑝𝛽′(𝑥𝑖∣𝑚𝑗[𝑖])
を用いて最急降下方向に従って更新されます。
#ref(RCRBFNにおけるパラメータm.png)

3.共分散行列Σ𝑗の更新
#ref(共分散行列.png)
従来のRBFNと同様に最急降下法を適用。
**STEP2 収束判定 [#xbcf3848]

#ref(累積二乗誤差関数.png)
累積二乗誤差関数がある閾値以下になった場合、学習を終了。もし、ある閾値 𝜖>0より大きな値で収束 した場合は、次のステップへ。
Lyapunov関数により学習が進むにつれて誤差関数E(w,ϕ) は単調に減少する ことが保証されている。
#ref(誤差の単調減少を保証するLyapunov関数.png)

**STEP3 新たなニューロンの複製位置の決定 [#xbcf3848]
新しい動径基底関数をどこに追加するべきかを確率密度関数を用いて決定する。

1.確率密度関数 𝑝𝛽′(𝑥𝑖∣𝑚𝑗[𝑖])を計算
既存の動径基底関数を用いて、教師信号 𝜂(𝑥)を近似できていない領域を特定し、条件付き確率密度関数 を利用し、動径基底関数の新しい中心𝑚𝑗を追加する位置を決定。
#ref(条件付き確率密度関数.png)

2.温度パラメータ𝛽′の調整
β ′を増やすことで、誤差の大きい部分に動径基底関数を配置するための影響を強くするため0 から徐々に増加させる。

温度パラメータの役割:
・低いとき:データ全体を均等に考慮
・高いとき:誤差が大きい部分を優先的に修正

3.新たな安定点を見つける
温度パラメータ𝛽′の変化に伴い、新たな安定な収束点が現れるかどうかを確認する。安定な収束点𝑚𝑗が増えた場合、新たな動径基底関数を追加する。この点が新しい動径基底関数の複製位置となる。

**STEP4 動径基底関数の複製 [#xbcf3848]
RCRBFN(複製・競合動径基底関数ネットワーク)を環境の変化に適応できるようにSTEP3で決定した新たな安定点に基づいて、動径基底関数(ニューロン)を複製し、ネットワークに追加 します。

1.既存の動径基底関数のパラメータを引き継ぐ
新しい動径基底関数をスムーズにネットワークへ組み込むため新たに追加する動径基底関数𝑚𝑝のシナプス結合荷重𝑤𝑝と共分散行列Σ𝑝は、既存の動径基底関数の値を引き継ぐ。

2.ネットワークへ新しい動径基底関数を追加
新しい動径基底関数をネットワークに組み込む。

3.学習を継続(STEP1に戻る)
新しい動径基底関数を追加した後、再び STEP1(学習の更新)に戻り、ネットワーク全体の再学習を行う。このプロセスを繰り返すことで、環境の変化に適応しながら、最適な動径基底関数の配置を行う。
 
*機械学習への組み込み [#na6257b3]

**強化学習 [#lf55d4e2]
あらかじめ設けられた報酬関数をもとに最適な行動を選択する。報酬関数を用いて報酬を最大化するような行動を得る。

**逆強化学習 [#y8cc6c93]
報酬関数が未知の場合、エージェントの行動履歴からその報酬関数を推定する。「エキスパートがどのように行動しているか」を観察し、その行動を再現するためにどのような報酬関数があれば良いかを学習する。

**最大エントロピー逆強化学習 [#fc3968fa]
逆強化学習にエントロピーの要素を加えたもの

エントロピー最大化: 確率分布の不確かさを最大化することで、可能な限り多様な行動を考慮に入れます。

最大エントロピー逆強化学習: エージェントの行動の確率分布がエントロピー最大化の原理に基づいて推定されます。これにより、現実の人間の行動のように多様で確率的な行動を学習します。

逆強化学習に比べ環境の変化に柔軟に対応できるように多様な選択肢が設けられその中で報酬関数推定を行う。
またこの最大エントロピー逆強化学習とRC-RBFNを組み合わせることにより適応的な学習、効率的な近似、高精度の報酬推定のような効果が見込める。
*プログラムコード内の式説明 [#u1248302]

**基底関数 [#t783d7fe]

ガウス関数を用いた基底関数の初期化と可視化を行う以下がガウス基底関数である。
#ref(ガウス基底関数.png,,Ubuntu1,70%)
~
1.初期設定
#ref(初期設定.png,,Ubuntu1,70%)
M=1:基底関数の数の設定(今回の場合1)

w0:各基底関数の重み(初期値はすべて0)。その後、すべての重みを 1.0 に変更。
~

2.calc_xi 関数の定義
#ref(calc_xi 関数(基底関数の計算).png,,Ubuntu1,70%)
xixi[j][p]:点 point[p] における j 番目の基底関数の値。

xixi_total[p]:すべての基底関数の重み付き合計。

3.基底関数の計算に必要な変数の初期化
#ref(基底関数の計算に必要な変数の初期k.png)
xi:各基底関数の値を格納する行列。

xi_total:基底関数の合計値。

mu_xi:基底関数の中心(平均値)。

sigma_xi:基底関数の分散・共分散

4.calc_xi を使って基底関数を計算
#ref(calc_xi を使って基底関数を計算.png,,Ubuntu1,70%)
2で定義した関数の実行
~
5.1次元の場合の可視化
#ref(可視化(1次元の場合).png,,Ubuntu1,70%)
~
6.2次元の場合の可視化
#ref(可視化(2次元の場合).png,,Ubuntu1,70%)
~
7.出力結果
#ref(基底関数出力結果.png,,Ubuntu1,70%)

**xin-she yang関数 [#z5d76a15]
ベンチマーク関数の一種である。
(ベンチマーク関数とは正解がわかっている問題を解かせどれだけ正確に・速く正解に近づけるかをそれぞれのアルゴリズムで比較する関数。
Xin-She Yang関数は多峰性関数の特性を持つ。)
以下はXin-She Yang関数の公式である。
#ref(xin-she yang関数.png)
プログラムコード
#ref(xin-she yang関数コード.png,,Ubuntu1,40%)
~
#ref(xin-she yang関数コード2.png,,Ubuntu1,40%)

出力結果
#ref(Xin-She Yang 関数.png,,Ubuntu1,40%)
**model_w 関数 [#t783d7fe]
#ref(パラメータw.png,,Ubuntu1,70%)
以上が重みのパラメータ更新式であり下記のコードがその部分である。
#ref(重みwの定義式.png,,Ubuntu1,40%)

コードと式の対応する変数

・alpha_w0[j] と𝛼𝑗(ϕ)

・gamma_w0[j][h] と 𝛾𝑗𝑘(ϕ)

・sum1[j] の計算と ∑𝛾𝑗𝑘(𝜙)𝜇𝑘𝑤𝑘

・dwdt[j] の計算と Δ𝑤𝑗
​

**model_m 関数 [#d40a6931]
#ref(RBFNのmパラメータ.png)
~
#ref(内的自然増加率.png)
~
#ref(𝛾𝑗𝑘(ϕ).png)
以上が中心位置のパラメータ更新式であり下記のコードがその部分である。
#ref(中心位置mの定義式.png,,Ubuntu1,40%)
~
#ref(中心位置mの定義式2.png,,Ubuntu1,40%)

コードと式の対応する変数

alpha_m0[j] と 𝛼𝑗(ϕ):

gamma_m0[j][h] と 𝛾𝑗𝑘(ϕ):

sum1[j] の計算と ∑𝛾𝑗𝑘(𝜙)𝜇𝑘𝑤𝑘:

alpha_m0[j] - sum1[j]を用いることで∂E/∂mjを近似


alpha_m0[j] - sum1[j]を用いることで
**model_s 関数 [#i0bc71aa]
#ref(共分散行列.png)
~
#ref(内的自然増加率.png)
~
#ref(𝛾𝑗𝑘(ϕ).png)
以上が分散のパラメータ更新式であり下記のコードがその部分である。
#ref(分散sの定義式.png,,Ubuntu1,40%)
~
#ref(分散sの定義式2.png,,Ubuntu1,40%)

コードと式の対応する変数

alpha_s0[j] と 𝛼𝑗(ϕ):

gamma_s0[j][h] と 𝛾𝑗𝑘(ϕ):

sum[j] の計算と ∑𝛾𝑗𝑘(𝜙)𝜇𝑘𝑤𝑘:

alpha_s0[j] - sum[j]を用いることで∂E/∂sjを近似

またγjhの総和により競争の考慮を行っている。

**ピーク検出関数 [#sfd3dabc]

#ref(ピーク検出関数.png,,Ubuntu1,40%)

mについてのピークを検出する

**culc_new_gaussian [#wb4f7ed7]

#ref(culc_new_gaussian.png,,Ubuntu1,40%)
検出されたピーク位置に新しくRBFを配置する.

新しく配置することによりモデルの精度向上が見込める。
それ以降のコードは定義した関数をもとに実際に使用される

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS