Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

MicroPythonで作る人工生命っぽい何か

1,548 views

Published on

Unagi.py@豊橋 東海ちほー合同大勉強会(2018/10/27)

Published in: Engineering
  • Be the first to comment

MicroPythonで作る人工生命っぽい何か

  1. 1. MicroPythonで作る 人工生命っぽい何か #2018/10/27 東海ちほー合同勉強会
  2. 2. 自己紹介  KOIKE Makoto ○ 湖西市で農家をやってます ○ 元組込みエンジニア ○ 雑誌にAIやIoT記事を寄稿した りしてます 2
  3. 3. メイカームーブメントに感動!ものづくりを始める ● 2013年 MA9 ● 2014年 MA10 ● 2015年 MA11 ● 2016年 MFT2016, GUGEN2016, MA2016 ● 2017年 MFT2017,GUGEN2017,MA2017 ● 2018年 MFT2018 https://protopedia.net/prototyper/makotokoike 3
  4. 4. ディープラーニング使って キュウリ選別システム作ってます キュウリ 仕分け機 ディープラーニング 農家 おじさん 4 Prototype - 3 : Raspberry Pi3 TensorFlow Kivy
  5. 5. 試作4号機 開発中 ● テーブル無しの仕分け装置 5 進捗 seems to be missing!
  6. 6. 今日話すこと ● 人工生命(みたいなの)を作りたいのぉ! ロボスタ(2016/8/4記事):https://robotstart.info/2016/08/04/alter-mirai.html 2016年,日本科学未来館で展示された「機械人 間オルタ」.大阪大学石黒研と東京大学池上研と の共同プロジェクトにより開発された.ロボットの 制御にはCPGとスパイキング・ニューラルネット ワークが使われており,手や顔の動作は 人間に より事前にプログラムされたものではなく,各種セ ンサの値から自発的に作られている . 生きているように振る舞うようプログラ ムされたロボット 自身の置かれた環境から自律的に振 る舞いを獲得している 6
  7. 7. 人工生命とは 人工生命は,人間によって設計,作製された生命.生化学やコンピュータ 上のモデルやロボットを使って,生命をシミュレーションすることで,生命に 関するシステムを研究する分野である.人工生命は生物学的現象を「再 現」しようと試みる点で生物学を補うものである.また,人工生命をALifeを 呼ぶことがある. - wikipediaより オライリー・ジャパン 作って動かすALifeー実装を通した人工生命モデル理論入門 岡 瑞起,池上 高志,ドミニク・チェン,青木 竜太,丸山 典宏 著 生命性をコンピュータ上でシミュレートすることにより,生命の本質に 迫る「ALife(人工生命)」は,「AI(人工知能)」の発展系 として,近年 改めて注目されつつある分野です. ※面白そうだけど,まだ読んでないです.ということで,今日話す内容も初学 者の薄っぺらい知識なので間違ってるかもしれませんがご容赦を・・・. 7
  8. 8. ALifeの興味深い点 ● 人工知能(AI) ○ トップダウン的手法 ○ 頭脳が知的な振る舞いを計算し,手足などの細部を制御する ● 人工生命(ALife) ○ ボトムアップ的手法 ○ 細部1つ1つの単純な振る舞いが相互作用することで,全体として知的な振る 舞いになる 8 ロドニー・ブルックス ロボティクス,人工知能の研究者で, iRobot創業者 &CTO,ルンバの開発者としても知られる. 1986年,“サブサンプション・アーキテクチャ( SA)”を提 唱.SAとは,複雑な知的振る舞いを多数の単純な振る 舞いモジュールに分割し,モジュールの階層構造を構築 する.各層は何らかの目的に沿った実装であり、上位層 に行くに従ってより抽象的になる。 (wikipediaより)
  9. 9. 人工生命といえば・・・ ● ライフゲーム ● ボイド(鳥の群れのモデル) ただ,コンピュータ上でのシミュレーションだけじゃちょっと味気ないですよね. 両方ともALife本のGithub(https://github.com/alifelab/alife_book_src)サンプルコードから 9
  10. 10. 作った! 10 8本の触覚 (タッチセンサー) 動力 (振動モーター) 光る (LED) 脳 (ニューラルネット) 人工昆虫?的なもの
  11. 11. 使ったのはこれ!【ハード編】 ESP32-DevKitC 価格:1,480円(秋月電子通商) Wi-Fi,Bluetoothが使えるモジュール ESP-WROOM-32の評価ボード.USBでPCに繋ぐ だけで直ぐに開発を始められる超お手軽無線 ボード.開発環境は,ArduinoIDEや MicroPythonなどに対応している.そして安い. ● CPU:テンシリカ Xtensa LX6 ● SRAM:520KB ● Flash:4MB ● 周辺リソース ○ I2C,SPI,ADC,DAC,・・・ ○ 静電容量タッチセンサー x10 秋月電子通称 (http://akizukidenshi.com/catalog/g/gM-11819/) 11
  12. 12. 使ったのはこれ!【ソフト編】 MicroPython MicoroPythonは,マイクロコントローラ上での動 作に最適化されたPython3の処理系.2013年か ら開発が始まり,オープンソースとして公開されて いる.標準Pythonと比較し,少ないリソースで動 作させるために標準ライブラリなどがかなり削られ ており,若干慣れが必要(import thisもない).あ と,未対応のリソースや制限などがあることに注意 が必要. pyboard,WiPy,ESP8266, ESP32などに対応. URL:http://micropython.org ※ESP32に関して言えば,MicroPythonの他に公式開発環境の ESP-IDF(C++)やArduino Core for ESP32 (arudinoライク)などがある.どうしても Pythonで書きたいという訳ではない場合は, Arduino IDEがオススメ! 12
  13. 13. MicroPython標準パッケージ一覧 ● パッケージ名の接頭語“u”はMicroバージョンの実装を表す ● マイコンリソースへのアクセスはmachineパッケージで行う ● 対応するSoC用パッケージもある(例:pyb,wipy,esp,esp32,...) ● upipでPyPIからのインストールも可(一般的にはmicropython-*) 13 詳細は:https://docs.micropython.org/en/latest/library/index.html MicroPython v1.9.4-665
  14. 14. 先ずは,こんなのを作る ● 震えたり,光ったりするだけの昆虫っぽいもの ● 8本の触覚を持つ ● 振る舞いはリアルワールドから自律的に学習する ○ 学習の動機となる欲求(恐怖的な?)をパラメータとして設定しておく ○ ※これを人間(創造主)が設定しては人工生命ではない?(ココらへんはよくわかんない) 14 触覚 ニューラルネットワーク 震える 光る 入力 出力 触られるのは怖い
  15. 15. 自律的に学習 ● 今回は強化学習のアルゴリズムである“Q学習”を使用 15 【Q学習とは】  行動価値関数Q(s,a)を,実際に行動して得られた結果で更新していく手法. 状態sの時に,行動aを 行う価値 状態sの時に,行動aを 行った際に得られる報 酬 行動後の状態s’での価値 ※価値が最大となる行動を取る とする(off-policy learning) <更新(学習)方法> TD誤差 ざっくり言うと,ある状態 sでおこなう行動aの価値は,行動したことで直ぐに得られる報酬と その行動で将来得られるであろう報酬を多少割り引いて合計したもの. このQ(s,a)を求める(=試行結果から近似する)ことが Q学習の目標. 試行して得られた結果 行動評価関数学習率 何回も試行を行うことで,実際の結果と見込み Q(s,a)の誤差が0に向かう
  16. 16. ついでにDQN(Deep Q-Network) ● ATARIのゲーム(Pong,Space Invaders,...)をプレイする人工知能 ● Q学習+Deep Learning ○ 行動価値関数Q(s,a)を畳み込みニューラルネットワークを使って学習する ● 何がスゴイのか ○ ゲーム画面から直接学習した(どんなゲームも学習できる!?) 16 【今まで】 【DQN】 畳み込みニューラルネットワークを使って 行動価値Q(s,a)を近似 ゲーム画面 ゲーム画面 CNN Q(s,a) 行動価値 自機座標:x,y ボールの座標:x,y ボールの角度:θ 等 ゲームの状態 ※ゲーム毎に異な る Q学習 Q(s,a) 行動価値 ゲーム毎に何を状態を 表すパラメータとするか 考える必要があった
  17. 17. 今回の手法(ESP32で動かすために) ● Deep Q-Networkはたぶん動かせない ● でも,ニューラル・ネットワークは使いたい ○ ディープじゃないものを使用 ● 計算量を極力減らす ○ 触覚は8本用意したが OR入力とした ○ 振動モーターとLEDも同時出力とした ● ニューラルネットワーク+Q学習 ○ 状態sは,「触覚」と「 LED・振動出力状態」でどちらもブーリアン ○ 行動aは,「a0 :出力停止」と「a1 :出力開始」の2つ ○ それと・・・ 17 NN 中間層:1層 ユニット数:8 触覚(8本のOR)  0:触られていない  1:どれか触られたいる 出力状態  0:停止中  1:出力中 Q(s,a0 ) Q(s,a1 )
  18. 18. 世界1秒前仮説を大胆に採用 ● 「世界は1秒前に始まり,始まりから1秒後には終わっている」とする ● 1ターンで終わる世界 ● つまり,こう 18 将来など考えない目先の報酬が全て ※こうすることで,学習時のNN順伝搬の計算をカット(計算量削減)
  19. 19. 報酬を考える ● Q学習を行うためには報酬Rの設定が必要 ● 今回作る人工生命は昆虫的なものをイメージ ● 昆虫は敵に襲われると恐怖を感じる→敵がいないと安心する→安心感を報酬とし た ● 昆虫は動くと疲れる→なるべく動きたくない→怠惰なことを報酬とした 19 【報酬一覧】 状況 報酬 触覚に触れていた外敵が去った (触覚の入力が1→0になった) 1.0 動かなかった (出力状態が0の時) 0.2 上記以外 なし(0)
  20. 20. 実装 ● ざっくり仕様が決まったので実装するよ ○ 入力はESP32のタッチセンサー8本をOR ○ LEDと振動モーターの出力は同時に行う ○ ニューラルネットワーク(入力層:2ユニット→中間層:8→出力層:2) ○ Q学習は1ターンしか考えない ○ 報酬は2つ(安心感と怠惰) 20
  21. 21. ハードウェア実装 ● 回路図(動けばいいだけのざっくり実装) ○ タッチセンサー8本 ○ LED出力 ○ 振動モーター ○ 電池駆動CR2 21 ESP32 触覚0 触覚1 触覚2 触覚3 触覚4 触覚5 触覚6 触覚7 GPIO4 GPIO12 GPIO13 GPIO14 GPIO15 GPIO27 GPIO32 GPIO33 GPIO26 GPIO25 100R M GND 3V3 振動モーター FM34F 2SK4017 CR2電池 3V 初め3Vボタン電池 を使おうとしたが 動かなかった. 高いけどCR2電池 を使うことにした. 振動モーターは ,GPIOからの出 力では動作が不 安定だったため, リレー駆動にした.
  22. 22. ニューラルネットワークの実装 ● もちろんTensorFlowやChainerなどのライブラリは使えない ● ゼロから実装するしかない? 22 オライリー・ジャパン ゼロから作るDeepLearning 斎藤 康毅 著 ディープラーニングの入門書. 外部のライブラリに頼らずに ,Python3 によってゼロからディープラーニングを作ることで,ディープラーニン グの原理を楽しく学べます. (https://www.oreilly.co.jp/books/9784873117584/)
  23. 23. いきなりつまずく numpyが使えるわけなかった・・・ えっ,numpyなしで実装しないといけないの!? 23
  24. 24. MicroMLP ● MicroMLP(a micro artificial neural network multilayer perceptron) ○ https://github.com/jczic/MicroMLP ○ MicroPythonで実装された多層NNフレームワーク ○ “microMLP.py”1ファイルのみ ○ 基本的な機能のみの実装(Keep it simple, stupid  ) 24 【基本的な使い方:チュートリアル XORの学習】 from microMLP import microMLP mlp = MicroMLP.Create([2,2,1], MicroMLP.ACTFUNC_TANH, MicroMLP.LayersFullConnect) nnFalse = MicroMLP.NNValue.FromBool(False) nnTrue = MicroMLP.NNValue.FromBool(True) mlp.AddExample([nnFalse, nnFalse], [nnFalse]) mlp.AddExample([nnFalse, nnTrue ], [nnTrue ]) mlp.AddExample([nnTrue , nnTrue ], [nnFalse]) mlp.AddExample([nnTrue , nnFalse], [nnTrue ]) learnCount = mlp.LearnExamples(maxSeconds=60*3) print(mlp.Predict([nnFalse, nnFalse])[0].AsBool) ESP32の場合,学習時間を3分ぐ らいにすると上手く行った.
  25. 25. 実装 ● 処理の流れ 25 GPIOの初期化 ニューラルネットワーク構築(学習済みモデルがある場合はレストア) 行動履歴リスト(max=100)の初期化 while do for n = 1 to 10 do /* 取り敢えず10回行動してみる */ 触覚センサの読み取り 試行のためのアクションを決める( ε-greedy法) 行動結果(状態,アクション,報酬) <- 試行を実施 行動結果を行動履歴リストに追加 end for for step = 1 to 100 do /* 100個の行動履歴を使って学習 */ 行動履歴リストからランダムに履歴を選択 履歴を使ってNNを学習 end for 学習済みモデルをファイル (json形式)に保存 end while
  26. 26. 学習テクニック ● ε-greedy法 ○ 行動を選択する時は,最も期待値が高いものを選択する( greedy法) ○ ただこれだと,初期値や部分局所解にハマり学習が進まなくなる場合がある ○ ある定数(0<ε<1,一般的には0.3ぐらい)で,行動をランダムに選択する(つまり探索する)ことでよ り適切な解を探せるようにする ● Experience Replay ○ 行動履歴(状態,アクション,報酬)を保存しておき,学習時は履歴からランダムに選択する ○ 時系列の相関を排除することで学習を安定させる 26
  27. 27. 学習 ● しばらく触って学習させた ○ 触っている時,振動・LEDが光ったらびっくりして手を離すを繰り返す 27 しばらく学習した後の Q(s,a) 分り易くQテーブルで表現す ると Q(s,a0 ) ※出力しない価値 Q(s,a1 ) ※振動・光る価値 S0 =[0,0] ※[触覚,出力] 0.18 0.11 S1 =[1,0] 0.09 0.79 S2 =[0,1] 0.23 0.02 S3 =[1,1] 0.12 0.41
  28. 28. Demo デモします 28
  29. 29. まとめと今後の課題 ● 単純な振る舞いを自動的に学ぶ人工生命っぽいものはできた(のかな?) ● 今後はこんなのを大量生産して「群」にしたらどう振る舞うだろう ○ EPS32は無線通信を使えるため,通信を使って個体ごとの相互作用を作って みる(アリのフェロモンを使ったコミュニケーションのような) ○ 記憶やNNの重みの共有,連結などを試してみたい ● リアルワールドに放置して学習させてみる ○ 最終的には,自律的に害虫を追い払うような人工昆虫(植物)を作りたい 29 群れを作る 人工生命(ALife)おもしろいよ! 池上教授曰く,“ポストAIは必ずあと数年の内 に来るので,その時にはALifeエンジン入の 機械が注目を浴びるようになると思う” (https://www.youtube.com/watch?v=s0NOH0WY8GQ) 今から勉強して,将来自律性をもつシステム を作れるようになろう! ミサカネットワーク

×