シンギュラリティ実験ノート

購入した1000ドルPCで何がどこまでできるのか実験した記録です。

金子勇氏のNekoFightを求めていたらED法サンプルページの完全保存版を見つけた

金子勇氏のED法サンプルプログラムページの入口として以下のURLが知られている。

https://web.archive.org/web/19990830154526/http://village.infoweb.ne.jp/~fwhz9346/

 

上記URLはおそらく1999年頃のWEBアーカイブで、ここに金子氏のホームページとED法サンプルページへのリンクがある。ED法サンプルページではED法の理論が数式と図で説明されている。しかしアーカイブが不完全で所々の数式画像が消失しているためED法を理論的に解読しようとする人にはストレスとなっていた。

 

今回ひょんなことからED法サンプルページの完全保存版を見つけた。もったいぶるのもアレなので先にURLを示す。

https://web.archive.org/web/20070128235739/http://homepage1.nifty.com/kaneko/ed.htm

 

これまで消失して見えなかった数式がきれいに残っている。そればかりか金子氏の論文「誤差拡散に基づく階層型神経回路網の教師あり学習法」の査読版PDFと査読修正版PDFのリンクも残っている。日本語論文なのもありがたい。

 

いつ消えるか分からない貴重な資料なので全体をPDF化して保存した。興味のある方はPDF化するなどしてダウンロードしておくのがいいと思う。

 

 

私がこのURLを見つけたきっかけはやねうらお氏の下記のページであった。

ちなみに金子氏のED法が発見・再現された経緯もここから辿ることができる。

yaneuraou.yaneu.com

 

以前から探していた金子氏の遺作「NekoFight」のリンクがここに書かれていた。

https://web.archive.org/web/20160915154005/http://homepage1.nifty.com/kaneko/nfight24.zip

 

先日の記事「ED法でMNISTを試す」にも余談としてこのことは書いた。上記リンクは生きていてNekoFightのZIPファイルをダウンロードでき、Windows環境で動くことも確認した。

 

ということはひょっとして。。と思ってURLのnfight24.zipを消してURLを叩くと金子氏のホームページが表示された。

web.archive.org

 

2000年頃から2015年頃までの金子氏のホームページがアーカイブされている。金子氏が2002年~2003年頃に作成したWindowsプログラムNekoFlightやAnimeBodyなどのリンクも残っていた。私は狂喜して次々にダウンロードしプログラムを試しているところだ。

当時のWindowsはXPだったと思うがWindows11でもなんとか動くものだ。

 

上記ページにED法サンプルページのリンクは消されている。金子氏はなんらかの事情でリンクを消したのだろう。しかしファイルは残っているかもしれない。試しにURLの最後をed.htmとして叩いた。するとED法サンプルページがきれいに表示された!

NekoFightのURLを教えてくれたやねうらおさん、ファイルを残してくれた金子さん、WEBアーカイブしてくれたサービス会社さん、ありがとうございました!!

 

うれしかったのとアーカイブサービス会社が寄付を募集していたので寄付金5ドル(814円)を勢いで寄付してしまった(笑)。

 

この資料の発見がED法の理解とさらなる発展につながればうれしい。

 

査読論文を読むと私ができなかった複数出力への対応方法がちょっとだけ書かれていた。

ED法での複数出力の扱いは、出力層と中間層をまとめて大きな1つのユニットとみなし、これを複数用意することとなる。 中間ユニットの共有を行うことができない。 本論文における手書き文字認識は、このようにして実現されている。

この時点でED法で複数出力の手書き文字認識を成功させていた。さすがである。

 

NekoFightもすばらしい。今はやりのロボットの強化学習をED法で10年〜20年前に実装していたのだ。私なんか今でもロボットを直立させることさえできないのに。。

2体のロボットが自律的に格闘する。どうやって実現しているんですかね??

 

 

ED法でMNISTを試す

金子勇氏が考案したED法でMNISTを試してみた。ED法(誤差拡散法)について理論的なことは全く分かっていないが、動かすことで分かることもある。幸いにして私にはClaude Codeという優秀な助手(兼家庭教師)がいる。難しいことは全て彼にお願いしながら進めることにした。

 

サンプルプログラムの改造を依頼

金子氏が公開したサンプルプログラムの中にC言語によるED法のサンプルプログラムがある。サンプルプログラムは金子氏HPのアーカイブからダウンロードできる。

Kaneko's Software Page

2026-03-01 追記
上記ページからリンクされたページは一部画像データが消失している。完全に保存されたED法のページはこちら

 

PyTorchベースでMNIST学習を試すスクリプトmnist.pyは私の手元にあった。山岡忠夫氏の「強い将棋ソフトの創り方」4.4章 PyTorchの基本にあるスクリプトでこちらのGitHubに公開されている。2層の畳み込みニューラルネットとバックプロパゲーション(誤差逆伝播法)で学習する仕様になっている。

 

以下のようにClaude Codeに頼んでみた。

mnist.pyではPyTorchでバックプロパゲーション(誤差逆伝播法)を使用しています。
金子勇氏が開発した誤差拡散法(ED法)をPyTorchに実装し、MNISTを実行できる環境をPythonで作成してください。
ED法のC言語によるサンプルプログラムはフォルダedの下にあります。
畳み込み層はとりあえず2層でいいです。

 

Claude Codeはコードを作成してくれたが、動かしてみると全く学習してくれなかった。何度もClaude Codeとやり取りしたが改善することはできなかった。

 

作戦変更

サンプルプログラムはそれぞれ動いた実績のあるプログラムでも、ED法を移植するという作業は難しいことが分かった。そこでED法として動いた実績のあるコードを入手して動かすことにした。

幸いにしてすでにPythonでED法を実装してMNISTをちぃがぅさんが試している。

金子勇さんのED法を実装してMNISTを学習させてみた #Python - Qiita

 

コードはTensorFlowベースで書かれている。私のPython3.10環境でTensorFlowが動くが不安であったがClaude Codeに聞いたところ問題ないとのことなのでPython3.10環境で進めた。

コードはほぼそのままで動いたが1箇所だけ修正が必要だった。main_tf()のmodel定義で(28 * 28)が括弧付き整数784として評価されエラーとなった。shape引数にはタプルが必要なため末尾にカンマを追加した。この修正もClaude Codeに教えてもらった。

- tf.keras.layers.Input(shape=(28 * 28)),
+ tf.keras.layers.Input(shape=(28 * 28,)),

 

サンプルコードでは数字0と1を学習させていたが、数字4と5に変更。TensorFlowモデルは3層5エポックに変更。ED法モデルは10層で変更なし。TensorFlowモデルの学習精度は97%、ED法モデルの学習精度は83.7%であった。

テストデータ先頭10データの評価結果を表示させた。このデータではED法は全問正解でTensorFlowは9問正解となった。

 

私はMNISTの学習をさせるには畳み込みニューラルネットが必要と思い込んでいたのだが、ちいがぅさんのコードsample.pyにそれらしき記述が見当たらないためClaude Codeに質問した。

tensorflowに詳しくないのでsample.pyで畳み込みニューラルネットがどのように実装されているか説明してください。フィルタの次元、ゼロパディング、ストライド、バイアスはどこでどのように設定されていますか。畳み込み層の層は何層ですか、プーリング層はどこで指定していますか。

 

Claude Codeの回答


`sample.py` には畳み込みニューラルネット(CNN)は実装されていません。

`sample.py` の `main_tf()` で使われているのは 全結合層(Dense層)のみ で構成されたネットワーク(MLP: 多層パーセプトロン)です。


 

そんな方法もあることを初めて知った。勉強になるな〜。

Claude Codeはコーディングしてくれる助手であるだけでなく、私にとっての家庭教師でもある。難関大学の学生か院生を家庭教師で雇うとすれば今どき時給3千円はするだろう。週1回2時間で一ヶ月に5回来てもらうと手当は3万円になる。それを月3千円で契約して好きな時間に対応してもらえるのであれば安いものだ。

 

MNISTの全データ(数字0から9まで)の学習

サンプルプログラムでは数字0と1の学習(2クラス分類)となっている。これを数字0から9の学習(多クラス分類)に対応させたいと思った。Claude Codeに修正してもらったところ、TessorFlowでは問題なく学習できたが、ED法では学習できなくなった。

 

Claude Codeに質問した。

2クラス分類のsample.pyでは正しく学習できていますが多クラス分類のsample_all.pyでは学習できていません。tensorflowの学習は正しくできています。両方のソースの処理の違いを説明してください。

 

Claude Codeの回答


sample.py(2クラス、`MultiLayerModel`)

def train(self, inputs, target):
    x = self.forward(inputs)
    diff = target - x
    if diff > 0:
        direct = "upper"
    else:
        direct = "lower"
        diff = -diff
    # 隠れ層を1回だけ更新
    for neurons in self.hidden_neurons_list:
        for n in neurons:
            n.update_weight(diff, direct)
    self.out_neuron.update_weight(diff, direct)
  •  出力ニューロンは 1個
  •  `diff` と `direct` は 1回だけ決まる
  •  隠れ層への更新は 1回のみ、方向も 1方向のみ

sample_all.py(多クラス、`MultiLayerModelMultiClass`)

def train(self, inputs, target_class: int):
    out = self.forward(inputs)
    targets = [1.0 if i == target_class else 0.0 for i in range(self.num_classes)]
    for neuron, t, o in zip(self.out_neurons, targets, out):
        diff = t - o
        direct = "upper" if diff > 0 else "lower"
        # 隠れ層をクラスの数だけ繰り返し更新
        for neurons in self.hidden_neurons_list:
            for n in neurons:
                n.update_weight(diff, direct)
        neuron.update_weight(diff, direct)
  •  出力ニューロンは 10個
  •  隠れ層のニューロンが 10クラス分ループで10回更新される
  •  各クラスで `direct` が異なる場合がある

問題の本質:隠れ層への矛盾した更新

1サンプルを処理するとき、10個の出力ニューロンに対して次の状況が起きます:

出力ニューロン target output(学習前) diff direct
正解クラス 1.0 ~0.1 +0.9(大) upper
不正解クラス×9個 0.0 ~0.1 −0.1(小) lower

 

隠れ層は全出力ニューロンで共有されていますが、ループで10回更新される際に:

  •  正解クラス → `"upper"` 方向に更新(出力を上げる)
  •  不正解クラス×9 → `"lower"` 方向に更新(出力を下げる)

この矛盾した信号が隠れ層に繰り返し加わるため、更新が打ち消し合い、隠れ層の重みがほぼ動かない状態になります。

バックプロパゲーションとの根本的な違い

TensorFlowが正常に学習できているのは、バックプロパゲーションが「全出力からの誤差を合算してから隠れ層を1回だけ更新する」ためです。

手法 隠れ層の更新方法
バックプロパゲーション 全出力の誤差を加算した勾配で1回更新
ED法(現在の多クラス実装) 各出力ニューロンごとに順番に10回更新(方向が矛盾する)

 

ED法を多クラスへ拡張するには、全出力クラスの `diff` と `direct` を整理してから隠れ層を 1回だけ 更新する仕組みに変更する必要があります。


 

どうやらED法には課題もあるようだ。ED法について説明されたページを見返したところ、ED法は0か1かという2クラス分類には強いが多クラス分類には対応しにくいという弱点があるようだ。

ただし対応できないということではない。解決方法を見つけている方もいた。

ED法で複数出力してみた(XOR 正答率:100%) #ED法 - Qiita

 

Claude Codeに解決方法を考えてもらい何度か試したがうまく学習できない。一筋縄ではいきそうにないのでこの辺であきらめることにした。

 

感想

ED法の2クラス分類でMNISTを動かした。まだED法は理解できていないが少しだけ理解が深まった気はする。

 

余談

ED法についてネットで調べていたらやねうらお氏の以下の記事を見つけた。その中にED法とBP(バックプロパゲーション)について興味深いことが書かれていたので一部引用させていただく。

Winnyの金子さんのED法について | やねうら王 公式サイトやねうら王 公式サイト

いずれにせよ、BP法は、チート性能だ。人間より遥かに少ないニューロンで人間より高い性能が出せる(ことがある)のは、このBP法のお陰だと言っても過言ではないと思う。人間の脳はBP法なんて使っていない。使わせてもらえていない。だから学習がこんなに非効率なのだ。人間が社会人になるまで平均的には20数年かかけるのも、学習が非効率すぎるからだと言えよう。

 

金子氏は「BPは人間の脳では絶対にできない方法だからシミュレーション屋としてはきらいだ」と言って人間の脳の仕組みにより忠実なED法を考え出したわけだが、BPを使うことで多クラス分類(複数出力)も対応できて効率的に学習できているんだからBPでいいじゃんという考え方も確かにあると思った。

「人間が社会人になるまで20数年かかる」という言葉も最近サム・アルトマンが発言していてその点でも興味深かった。

gigazine.net

 

私が一番驚いたのはページ中に金子氏の遺作「NekoFight」のリンクがあったことだ。どうせリンク切れしてるだろうと思いながらクリックしたらZIPファイルをダウンロードできた。解凍してどうせWindows11では動かないだろうと思って起動したら普通に動いた。奇跡である。NekoFightについては別記事で紹介したい。

 

ヒューマノイドのシミュレーション環境を試す(LocoMuJoCo編)

LocoMuJoCo環境でヒューマノイドの歩行強化学習とサンプルプログラムの動作を試してみた。

 

Unitree H1がダンスする様子

経緯

前回はPyBullet環境でヒューマノイドに二足歩行、バク宙、ジャンプ、回し蹴りをさせてみた。

ヒューマノイドの学習済みモデルで二足歩行させてみた - シンギュラリティ実験ノート

この環境でもっとDeepMimic学習済みモデルを使って様々な動きを試したいと思い、GitHubで見つけた学習済みモデルをClaude Codeに動かすように頼んだ。

GitHub - xbpeng/DeepMimic: Motion imitation with deep reinforcement learning.

しかしREADMEに「This codebase is now deprecated. (このコードベースは古いので非推奨)」となっていること、DeepMimicのバージョン違い(関節数の違い)の問題があることをClaude Codeが教えてくれた。なんとか動かしてくれたがまともな動きはしてくれなかった。

DeepMimicのPyBullet版は5年程前に開発されたものでPythonのバージョンも古いバージョンが前提となっている(Python3.6~3.7)。現在はMimicKitに開発が移行しているらしい。

GitHub - xbpeng/MimicKit: A lightweight suite of motion imitation methods for training controllers.

最新のPythonを使うならモダンな代替案を検討しますがどうしますかとClaude Codeから聞かれたので「それで進めてください」と答えた。

 

モダンな代替環境の調査結果

ネットで調査した結果を教えてくれた。代替案の多くが私のよく使うPython3.10には非対応であることがわかった。

プロジェクト シミュレータ フレームワーク Python 特徴
DRLoco MuJoCo
(mujoco-py)
SB3 + PyTorch × 3.7のみ mujoco-py が3.10非対応
google-research/
motion_imitation
PyBullet TF 1.15 × 3.7/3.8のみ TF 1.x が完全なブロッカー
LocoMuJoCo MuJoCo 3.2.7
+ MJX
JAX ○ 3.10以上必須 最も活発・2025年4月更新
MimicKit
(xbpeng公式後継)
Isaac Lab PyTorch ○ 3.10対応 NVIDIA GPU 必須
pytorch_DeepMimic PyBullet PyTorch 1.12 △ おそらく可 小規模コミュニティポート

 

私はNVIDIAのGPUを持っていないのでLocoMuJoCoが最適解と教えてくれた。

インストール方法も教えてくれたのでここにメモしておく。実際には「それで環境を構築してください」と頼んだだけで全てClaude Codeが行ってくれた。

利用方法、CPUでの速度感、注意事項をClaude Codeが教えてくれたのでそれもメモしておく。

 

インストール手順

# 1. Python 3.10 の conda 環境を作成(既存の python310 環境を流用しても可)
conda create -n locomujoco python=3.10
conda activate locomujoco

# 2. numpy<2.0 を先にピン留め(競合防止)
pip install "numpy<2.0"

# 3. リポジトリをクローン
git clone https://github.com/robfiras/loco-mujoco.git
cd loco-mujoco

# 4. インストール(CPU版JAXが自動的に入る)
pip install -e .

# 5. WandB(学習ログ用)
pip install wandb

# 6. GPU使用時(ない場合は実行不要)
pip install jax["cuda12"]  

 

利用方法

# 環境のアクティベート
conda activate locomujoco

# 動作確認
cd ~/pj/loco-mujoco
python quick_test.py

# PPO 学習(conf.yaml を CPU 向けに編集してから実行)
cd examples/training_examples/jax_rl
WANDB_MODE=offline python experiment.py

# DeepMimic スタイルの模倣学習(conf.yaml を CPU 向けに編集してから実行)
cd ../jax_rl_mimic
WANDB_MODE=offline python experiment.py

 

conf.yaml の CPU 向け調整(デフォルト値 → CPU向け推奨値)

  • num_envs: 2048     →  64        # メモリと速度の兼ね合い
  • total_timesteps: 1.0e8  →  1.0e6   # まずは動作確認用に短縮
  • debug: true                       # ログ収集オーバーヘッドを無効化

 

CPUでの速度感

指標 GPU (RTX 3080 Ti) CPU(参考)
PPO 100M steps 約20分 数時間〜(num_envsによる)
JIT初回コンパイル 1〜2分 同程度

 

注意事項

  • `libtpu.so` の警告は CPU 環境では無害(TPU なしの正常動作)
  • `WANDB_MODE=offline` を付けることで wandb アカウント不要
  • `mujoco==3.2.7` は固定版 — `pip install --upgrade mujoco` は実行しないこと(3.3.0 で API破壊が確認済み)

 

強化学習(PPO)の実行

training_examplesにあるjax_rlの強化学習を実行してみた。num_envsは64、total_timestepsは1.0e6としたところCPUでも約2分で終わった。

 

強化学習中の様子

WANDB_MODE=offline python experiment.py

終了後にLocoMuJoCo_RecordingsフォルダにMP4 データが作成される。

 

学習データの実行

強化学習が終了するとoutputsフォルダに「PPOJax_saved.pkl」が作成されるのでそのパスを指定してコマンドを実行する。

JAX_PLATFORM_NAME=cpu python eval.py --path ./outputs/yyyy-mm-dd/hh-mm-ss/PPOJax_saved.pkl

GUIが立ち上がりロボットに力が加わり反応する様子が表示される。学習時と同様にLocoMuJoCo_RecordingsフォルダにMP4 データが自動作成される

 

四足歩行ではある程度まともに学習しているように見えるが二足歩行でやるとこの程度の学習時間では全然ダメである。もっと学習時間や回数を増やす必要がある。CPUで行うと1回の学習にも数日かかるだろう。ロボットの強化学習を本格的に行うにはやはり高性能なGPUが必要だ。

 

学習済みデータ(サンプルプログラム)

examplesフォルダに学習済みデータでロボットを動かすサンプルプログラムがいくつかあったので実行してみた。

cd replay_datasets
python example.py

Unitree社のロボットUnitree H1が歩行したり踊ったりする様子が表示された。

 

ROCmで動くか

NVIDIAのGPU以外で、例えば我が1000ドルPCのAMDのGPUで動くか聞いてみた。

NVIDIAのgpu以外で実行できますか?例えばamdの780mは使えますか?

 

(Claude Codeの回答)


 LocoMuJoCo は JAX + MuJoCo MJX を使っているため、GPU サポートは JAX のバックエンドに依存します。                                                     
               
JAX がサポートする GPU バックエンド                                                

GPU バックエンド サポート状況
NVIDIA
(CUDA)
CUDA 12 公式サポート・安定
AMD 離散 GPU
(RX 7000 等)
ROCm 実験的・限定サポート
AMD 780M
(統合 GPU)
ROCm ほぼ不可
Apple Silicon
(M1/M2/M3)
Metal jax-metal で一部動作

AMD 780M について

780M は RDNA 3 アーキテクチャの統合 GPU(iGPU) です。

  • ROCmは基本的に離散 AMD GPU(RX/Instinct シリーズ)を対象としており、iGPUは非対応
  • JAXのROCmビルドをインストールしても780MをGPUとして認識しない可能性が高い
  • 実質的にCPU実行と同等になります

現実的な選択肢

  AMD 離散 GPU を使う場合(RX 7800 XT 等)
  pip install jax[rocm]
  ただしJAXのROCmサポートはCUDAより不安定で、MJXでの動作保証はありません。

  Apple Silicon (M1/M2/M3) を使う場合
  pip install jax-metal
  動作報告はありますが、MJX の全機能が対応しているわけではありません。

結論

780MでのGPU実行は現実的ではありません。CPUモードで実行するのが最も確実です。


ですよね〜。ちょっと聞いてみたかっただけです。ごめんなさい!

 

感想

まずClaude Codeの優秀さに感心する。頼んだ仕事をするだけでなくネット情報を自分で調べて提案までしてくれる。1年前にはAIエージェントがネット情報を調べてインストールのトラブルを解決してくれたらいいなと思っていたのだが、今はそのレベルは当たり前のようにできるし、もっと高度な仕事をしてくれる。これが月20ドル(約3千円)なら安い。

ロボットも最近はフィジカルAIと言われてAIの次の主戦場となっている。5年前の物理シミュレーション環境であるPyBulletと現在のオープンな物理シミュレーション環境のMuJoCoを比較しても進化している様子を感じることができる。

LocoMuJoCoの使い方は難しくて全くわからないが雰囲気だけは感じることができた。

今年はフィジカルAIの動きにも注目していきたい。

 

ヒューマノイドの学習済みモデルで二足歩行させてみた

仮想空間でヒューマノイドを二足歩行させることができたので報告したい。今回行ったのはヒューマノイドの学習済みモデルDeepMimicをUbuntu環境で動かすことである。

二足歩行の機械学習は難しい

本来は、Claude Codeに頼んで機械学習プログラムを作成してもらい、ヒューマノイドに学習させて二足歩行ができるようにしたかった。Claude Codeに頼むとそれなりにプログラムを作成してくれた。しかし何度試してもヒューマノイドは全く学習してくれずにすぐに倒れてしまう。

 

 

二足歩行できるモデルをミニPCで機械学習させて作ろうとすることにそもそも無理があるのではないかと思い始めた。大規模言語モデル(LLM)を開発しようとすれば高性能なGPUを積んだマシンが必要である。人間の大脳をシミュレーションするモデルを作るわけだから当然である。二足歩行モデルを開発することは人間の小脳のシミュレーションモデルを作ることである。ミニPCで機械学習させて二足歩行をさせるというのはかなり無謀なチャレンジをしている気がしてきた。

確かに四足歩行シミュレーションは意外と簡単に動いた。人間の赤ちゃんもハイハイから覚える。赤ちゃんはそこからつかまり立ちができるようになり、二本の足で歩くようになるわけだが、それはハイハイ(四足歩行)に比べると格段に難しいことなのだろう。

 

作戦変更

二足歩行の強化学習済みのオープンモデルを探すことにした。

Geminiに聞いてみた。

大規模言語モデルのオープンモデルは存在しますが、ヒューマノイドロボットが二足歩行するための強化学習済みモデルでオープンに使用できるモデルはありますか。PyBulletのようなシミュレーション環境でヒューマノイドを二足歩行させられる学習済みモデルです。

 

Geminiの回答

ヒューマノイドロボットの二足歩行に関しては、LLM(大規模言語モデル)ほど「これ一つでOK」という汎用的な重みファイルはまだ一般的ではありませんが、特定のシミュレーション環境や機体に紐づいたオープンな学習済みモデルはいくつか存在します。

特にご質問の PyBullet 環境で動作するものや、最新の機体に対応したプロジェクトを整理して紹介します。


1.PyBulletで今すぐ試せるモデル

PyBulletの公式レポジトリや関連プロジェクトには、すでに学習済みの歩行モデルが含まれています。

  • DeepMimic (PyBullet版)
    特徴: モーションキャプチャデータを強化学習で再現する手法です。
    内容: bullet3 の公式ディレクトリ内に、ヒューマノイドが歩行・走行・バク宙などを行うための学習済みチェックポイント(.txt や .json 形式のパラメータ)が含まれています。
    実行方法: python -m pybullet_envs.deep_mimic.testrl --arg_file run_humanoid3d_walk_args.txt のようなコマンドで、学習済みの歩行動作をすぐに確認できます。
  • PyBullet Gymnasium Baselines
    特徴: Humanoid-v4(旧Gym環境)のPyBullet版。
    内容: ARS (Augmented Random Search) や PPO で学習されたモデルが、コミュニティやGitHub上のプロジェクト(例:bullet-extensions)で公開されています。

2.最新のオープンソース・ヒューマノイド・プロジェクト

現在、研究界隈で「標準」になりつつあるモデルは、特定のハードウェア(Unitree社製など)をベースにしたものです。

  • Berkeley Humanoid (Lite)
    特徴: UCバークレー校の研究チームが公開している、低コストかつフルスタックなオープンソースプロジェクト。
    内容: ハードウェアの設計図だけでなく、強化学習(RL)のトレーニングコードと学習済みモデルが完全に公開されています。
    環境: 主に Isaac Gym ですが、URDFが公開されているためPyBulletへの移植も盛んです。
  • HumanoidBench
    特徴: ヒューマノイドの全身制御を評価するためのベンチマーク。
    内容: Unitree H1などの機体を用いた、歩行・障害物走などのタスクのベースラインモデルが提供されています。
    ・URL: humanoid-bench.github.io

3.モデルを探すための主要なリポジトリ・ハブ

自分で一から学習させず、既存の「重み」を探すなら以下の場所が最適です。

プロジェクト名 特徴 物理エンジン
Legged Control
(Unitree)
H1やG1の歩行用RLコントローラ。 Isaac Gym / MuJoCo
LeRobot
(Hugging Face)
ロボット版のTransformersを目指すプロジェクト。 MuJoCo / PyBullet
Stable Baselines3 Zoo 多様な環境の学習済みRLエージェント集。 PyBullet
(HumanoidBulletEnv)

 

注意点:Sim-to-Realの壁

LLMと異なり、ロボティクスのモデルには「URDF(ロボットの構成定義ファイル)」と「物理パラメータ(摩擦、慣性など)」がセットで必要です。
PyBulletで動かしたい場合は、そのモデルがどのURDF(例えば humanoid.urdf)を対象に学習されたものかを確認してください。パラメータが少しでもずれると、生まれたての小鹿のように転んでしまいます。(Gemini回答ここまで)


 

いますぐ動かせるモデルとしてDeepMimicがあるようなので、これをClaude Codeに頼んで動かしてもらうことにした。Macでも動くだろうがMacのPyBalletのサンプルプログラムを動かそうとすると微妙な環境の違いがあって修正が必要だった。Ubuntuの方が素直に動きそうな気がしたので導入先はUbuntuにした。

 

DeepMimic (PyBullet版)を動かす

導入作業は全てClaude Codeにやってもらった。かなりソースの修正なども必要だったようだが全てClaude Codeがやり遂げてくれた。

ヒューマノイドの二足歩行、バク宙、ジャンプ、回し蹴りの動きができるようになった。初めて見た時は幽体離脱しているのかと思った(笑)。透明なヒューマノイドがおそらくモーションキャプチャした動きで、色のついたヒューマノイドが機械学習した動きのようである。起動コマンドと画面録画を以下に記す。

 

1.二足歩行

python -m pybullet_envs.deep_mimic.testrl --arg_file run_humanoid3d_walk_args.txt

 

2.バク宙

python -m pybullet_envs.deep_mimic.testrl --arg_file run_humanoid3d_backflip_args.txt

 

3.ジャンプ

python -m pybullet_envs.deep_mimic.testrl --arg_file run_humanoid3d_jump_args.txt

 

4.回し蹴り

python -m pybullet_envs.deep_mimic.testrl --arg_file run_humanoid3d_spinkick_args.txt

 

まとめ

LLMでも将棋AIでも学習モデルを自分で作ることは大変だ。まずは公開されているモデルを動かすことから始めるのがよさそうだ。

作業はClaude Codeに全てお任せであったがとりあえずPyBallet環境で二足歩行モデルを動かすことができてうれしい。

他にも学習済みモデルはあるようなので試してみたい。

 

ロボットの機械学習環境をClaude Codeに構築してもらった

金子勇氏のAnimeBodyを動かしたところでこのモデルを二足歩行させてみたいと思った。しかし金子氏のプログラムを解読するのは至難の業である。もっと簡単な方法はないものかと思いAIに聞いてみた。

 

仮想空間でロボットの二足歩行シミュレーションができるソフトが欲しいです。ロボットは自律的に動き回り、障害物にぶつかったり段差で転倒したりしながら機械学習により転倒しない歩き方を学習できる、そんなソフト環境とサンプルプログラムはありますか?

 

主要なシミュレーション環境として以下を教えてくれた。

  1. PyBullet + Gym
    ・無料のオープンソース物理エンジン
    ・強化学習との統合が容易
    ・二足歩行ロボット(Humanoid)のサンプルモデル付属
  2. MuJoCo(Multi-Joint dynamics with Contact)
    ・高精度な物理シミュレーション
    ・DeepMind等の研究機関で広く使用
    ・2021年から無料化
    ・Humanoidモデルが標準で含まれる
  3.  Isaac Gym(NVIDIA)
    ・GPU並列シミュレーション
    ・数千体のロボットを同時学習可能
    ・最速の学習速度

初心者に最適な組み合わせの推奨環境は以下であると教えてくれた。

推奨:PyBullet + Stable-Baselines3

 

PyBulletは「Pythonでロボット工学や物理シミュレーションを簡単に行えるオープンソースのライブラリ」らしい。

Stable-Baselines3は「PyTorchで実装された信頼性の高いオープンソースの強化学習アルゴリズムのセット」らしい。

 

仮想空間で動く四足歩行ロボット

Claude Codeに環境構築を頼む

難しそうなのでClaude Codeに環境構築とサンプルプログラムの作成を丸投げすることにした。使用するマシンは我がMac miniである。

仮想空間でロボットを二足歩行シミュレーションができるソフト環境を作成してください。PyBulletとStable-Baselines3を使います。ロボットは自律的に動き回り障害物にぶつかったり段差で転倒したりしながら機械学習します。ロボットが歩き方を学習する様子を観察できるサンプルプログラムも用意してください。

 

Claude Codeは多少の試行錯誤はあったようだが無事に環境を構築してくれた。二足歩行ロボットのサンプルプログラムも作成してくれた。しかし二足歩行ロボットは二本足で立つことができず、シミュレーションを開始してもすぐに終了してしまう。何度か修正を試みたが二本足で立つことができない。

 

いきなり二足歩行のテーマは難しかったのかと思い、四足歩行ロボットに変更して試すことにした。四足歩行ロボットのサンプルプログラムは無事に動作した。

初めにモデルを学習させるコマンドを実行する。

python -m quadruped.train --timesteps 1000000

 

それが終わったら学習したモデルの動きを確認するコマンドを実行する。

python -m quadruped.enjoy

 

画面にアニメーションが表示された。

 

YouTubeの動画で千葉工大の古田教授が仮想空間で学習させたモデルで四脚ロボットを動かしているのを見たことがある。4096体のロボットを同時に仮想空間で学習させたそうで画面イメージからおそらくIsaac Gymを使っているのだと思う。

 

www.youtube.com

 

動画を見た時はどうすればそんなことができるのかと思っていたのだが、ド素人の私もとりあえずモデルを動かすことができた。Claude Codeがやってくれなければ絶対無理だったと思う。

 

雰囲気は味わえたのでとりあえず満足だが、もう少し発展させてみたい。しかしどういう仕組みで学習してどう動いているのか全く分かっていない。これをどう発展させていいのかも全く分からない状況だ。

さすがにClaude Codeに丸投げするだけではダメで私自身が中身を理解する必要がありそうだ。

 

アーキテクチャ

システムは3層構造になっている。この辺りはシンプルな構造で分かりやすい。

  1. 物理ロボット定義
    ・XMLで記述できる物理モデル(URDFモデル)
  2. 物理シミュレーション + 強化学習インターフェース
    ・Pythonの物理シミュレーションエンジン(PyBullet)
    ・強化学習インタフェース(Gymnasium)
  3. 学習/推論スクリプト
    ・PPO(深層強化学習)エージェント
    ・強化学習アルゴリズムセット(Stable-Baselines3)

 

金子勇氏のサンプルプログラムでは物理モデルがソースコードに埋め込まれているのでちょっとモデルを変更しようとするとソースコードに手を加えないといけない。(金子氏自身がホームページでそう説明していた)

初心者がこれから始めるなら階層がきちんと別れている今のシステムで勉強した方がよさそうだ。

 

ED法(誤差拡散法)による機械学習

金子氏は必要なソフトライブラリがなにもない中で自分で全て構築していた。映画「Winny」にも登場していた「NekoFight」は仮想空間内で2体のロボットを格闘させながら機械学習させて人間らしい動きを学習させるというすごいプログラムだった。

これを2002年という20年以上前に一人で作っていたというから本当にすごい人だったんだなと思う。

しかも機械学習はBP(バックプロパゲーション)ではなくED法(誤差拡散法)という金子氏が独自に考案した方法を使っていたらしい。

 

NekoFightのソースは公開されていないがED法の公開されたソースは発見されている。誰か頑張ってED法をStable-Baselines3のアルゴリズムに追加してくれないかな。

というかClaude Codeに頼めばやってくれそうな気がしなくもない。

 

天才プログラマ金子勇氏のサンプルプログラムAnimeBodyを再現する

Claude Proを契約してClaude Codeが使えるようになった。自分では難しいプログラミングをClaude Codeにやらせてみたい。そう思った時に以前に金子勇氏のNekoFlight for javaを動かしたことを思い出した。

天才プログラマ金子勇氏のサンプルプログラムNekoFlight for javaを再現する - シンギュラリティ実験ノート

 

金子氏が作成したサンプルプログラムはNekoFlight 以外もインターネットアーカイブのページ内に奇跡的にいくつか残っている。それらをAIの力を借りて再現してみたい。

 

金子氏開発のフリーソフトウェア

こちらのページに情報があった。

note.com

 

金子氏の経歴やWinny事件の裁判に関する記事もアドベントカレンダーとしてまとまっている。

金子勇とWinnyの夢を見た - Qiita Advent Calendar 2023 - Qiita

 

金子氏が公開したサンプルプログラムは以下のインターネットアーカイブに残っていた。

Kaneko's Software Page

 

ダウンロードできるサンプルプログラムは以下のプログラムである。

  • NekoFlight for Java (最新版 Ver 0.1)
    ・フライトシミュレータ(Javaアプレット、フリー、プログラムソースあり)
  • AnimeBody for X-Window (最新版 ver 1.0)
    ・Win32用AnimeBody Ver1.51のX-Window版(UNIX汎用、プログラムソースのみ)
  • 簡易剛体計算のサンプルプログラム(車) (最新版 ver 0.1)
    ・AnimeBodyで使っている計算方法を車の挙動に適用してみたサンプルプログラム(Win32、フリー、プログラムソースあり)
  • 簡易剛体計算のサンプルプログラム(ワイヤー) (最新版 ver 0.2)
    ・AnimeBodyで使っている計算方法をワイヤーの挙動に適用してみたサンプルプログラム(Win32、フリー、プログラムソースあり)
  • ED法サンプル
    ・階層型神経回路網の新たな学習アルゴリズムであるED法のサンプルプログラム
    ・ED法は、実際の神経系でも利用可能で、BP法と同等かそれ以上の学習能力を有する学習アルゴリズムです。(UNIX汎用、プログラムソースのみ)

 

AnimeBodyを再現する

昔のUNIX環境ならそのままX-Windowで動いたと思うが今のUbuntu環境でそのままではmakeは通らない。Claude Codeに頼めばどの環境でも動くようにしてくれるはずだ。私はMac環境で動かしたいので「このアプリケーションをMac環境で動く様に改造してください。動かすために適切なソフトウェアを選んでください。」と頼んでみた。

 

SDL2のインストールが必要だった。いくつかのソースが改造された。コンパイルエラーも出ていたようだがエージェントが全て自律的に対応してくれた。Makefileが作成されて作業が完了し、私がmakeとコマンドを打つとabody.outという実行ファイルが無事に作成された。

./abody.out で実行ファイルを起動すると以下の画面が現れた。

AnimeBody for X-Windowの操作方法は以下の通り。

  • マウスドラッグ:制御点の選択と移動
  • スペースキー+マウス:全制御点の選択と移動
  • J/Lキー:縦軸回転
  • I/Kキー:横軸回転
  • W/S/A/Dキー:選択制御点の移動
  • U/Oキー:カメラの前進/後退
  • ESCキー:終了

 

マウスとキーで操作している様子の動画。

 

上記の「金子勇Winnyの夢を見た 第6話フリーソフト」にもAnimeBodyの動画がある。動画を見るとWindows版のVer1.53では手足や胴体の制御点が表示されている。今回のX-Windows版では表示されていないので若干操作しにくい。

Ver2.62では自律的な動きもできるようになっていて「歩行」したり「立ち上がる」動作ができている。今回のサンプルプログラムにはそこまでの機能はない。

 

感想

私はまだ完成したプログラムを動かしてみただけで、プログラムの中身は全く理解できていない。この状態で改造したソースを公開するのはちょっとアレなので公開はしないことにする。

それにしても改めて思ったことは金子氏が如何に天才的なプログラマであったかということだ。人間の骨格の動きをシミュレートするという難しいことをシンプルなモデルで実現している。(中身読んでないから推測で言っているけど)

頭の中で思い描いたモデルを自分の手でパパパッとプログラムに変換し、そのモデルが複雑な現実世界をうまくシミュレートできるのかを検証し修正するという、超知的な作業ができた人なのだと思う。

普通の人にはそんなことはできないのだが、自分の頭の中でモデルをある程度でいいから理解し、モデルの内容をAIに伝えることができれば、パパパッとプログラミングする部分はClaude Codeがやってくれるのではないか。

できればこのプログラムを発展させて「二足歩行」ができるようにしたい。金子氏は重力とオートバランサーの演算機能を追加することでボディが勝手に動くようにしたようだ。重心を計算して倒れないようになんらかの自動処理をしているのかな?

 

M4 Mac miniでDL系将棋AIの勝率が極端に悪かった原因

DL系将棋AIとNNUE系将棋AIを連続対局させるとDL系将棋AIの勝率が極端に悪かった原因がなんとなく分かった。

まだ原因を完全には特定できていないし解決策を見つけた状況ではないのだが、おそらくCPU温度が原因かと思われる。ARM系CPUのMacの場合、CPU温度がある程度高くなると熱暴走しないように自動的に処理速度を落とすらしい。そのため将棋AIの性能にも影響しているのかと思われる。

 

私がまず疑問に思ったのは、M4 Mac miniの電源を入れた直後にふかうら王と水匠5を対局させるとそこそこいい勝負をすることだ。勝率的には25%(4回に1回)~30%(3回に1回)くらいの勝率でふかうら王が勝つ。

これは以前にUM790 Proで50回対局させた時にはdlshogiの13勝35敗2引き分けの成績で勝率的には27%の勝率だったのとほぼ同じ勝率だ。

GPU性能と将棋AIの強さの関係 - シンギュラリティ実験ノート

 

しかし連続対局をさせると全く勝てなくなる。50回対局させて1回も勝てない時もあった。こんなことがプログラム的にあり得るだろうか。

最初はShogiHOMEの連続対局機能を疑った。何か起動パラメタに原因があるのではと思い問題を切り分けるため別の将棋AIで連続対局させることにした。

 

将棋所のインストール

将棋AIには他に将棋所とShogiGUIがある。ShogiGUIはMacに対応していないが将棋所はMacに対応している。こちらからダウンロードして解凍してから将棋所のアイコンをアプリフォルダにドラックアンドドロップする。

最近のMacはインターネットからダウンロードしたプログラムのセキュリティチェックが厳しい。アイコンをクリックしても起動することができなかったが、こちらのページにある「ターミナルを使って設定する方法」で起動することができた。

 

将棋所で連続対局を試す

将棋所にふかうら王と水匠5をエンジンとして追加した。パラメタ設定は標準のままとした。ふかうら王で使用するモデルはDlShogiResnet10SwishBatch.mlmodel(28MB)とした。

連続対局で20回対局させたところ成績はふかうら王の5勝15敗。5勝は先手2勝、後手3勝であった。勝率的には25%なのでまずまずである。ちなみに20回連続対局するのに2時間ほどかかった。

 

ふかうら王が先手で水匠5に勝った対局

 

この時点ではShogiHOMEの連続対局機能が犯人ではとまだ思っていた。

続けて将棋所の連続対局で20回対局させた。2時間後に結果が出た。なんとふかうら王の0勝20敗であった。

 

この時点からCPU温度を疑い始めた。連続対局中のMac miniの表面温度は高かった。しかしファンが激しく動く様子もなく静かであるし、NPS値が目立って下がっている様子もなかったのでまだCPU温度犯人説も半信半疑であった。

 

Mac miniをシャットダウンして1時間ほど休ませた。表面温度は若干暖かかったが10回連続対局させてみたところ、ふかうら王の2勝8敗(先手1勝、後手1勝)となった。

 

この時点でCPU温度犯人説を確信した。ShogiHOMEさん、疑ってごめんなさい(ぺこり)。

 

対策

CPU温度を測るコマンドもあるようだが試したところ表示されなかった。このためCPU温度がどの程度上がっているかは確認できていない。

熱対策としては考えられるのはUSB扇風機を使うことくらいである。あまりスマートな方法でないので試してみる気にならない。とりあえずはMacが熱くなったらDL系将棋AIは使うのを止めたほうがよいということでこれ以上は追求しないことにする。