通過進化算法教生物力學模型學會走路


通過進化算法教生物力學模型學會走路



讓人形模型采用真實肌肉方式行走
本文中的源代碼可在 這個GitHub 庫 中找到
(https://github.com/normandipalo/learn-to-walk-with-genetic-algs)
2017 NIPS 中有一項挑戰是 《學習跑步》:如題所示, 該任務需設計并開發一個可以控制人體生物力學模型行走的學習算法 。 算法中的執行器(與大多數機器人問題不同)是一組腿部肌肉,每條腿由9塊肌肉組成 。 發布挑戰的作者修改了OpenSIM環境,使其適應增強學習的設定,從而增加一個獎勵信號 。
有些事情變得非常糟糕(或非常正確).
許多參賽者設計了端到端的深度強化學習算法,這些算法在近年來在連續控制任務中表現相當優異 。 但這些模型也通常需要大量算力和計算時間以學習成功的策略,一般在多臺機器上并行效果更好 。
【通過進化算法教生物力學模型學會走路】我決定用我的方法嘗試一下這個挑戰 。 我實現并擴展一個相當輕量級的方法,該方法是我最近為機器人操控開發的,具體來說是進化算法結合神經網絡控制器 。 采用這些算法的好處是不需要求導、可高度并行同時可獲得與深度RL算法相似的結果,參見OpenAI上相關的文章 。 問題在于,運動是完全隨機,因而較難估計學習的內容及方式,但我仍希望嘗試一下這種方法 。
開始幾步,像嬰兒學步 。
…重要的是不要僅保留表現最佳的模型,因為模型會卡在一些局部最小的地方(很難離開這些點) 。
進化算法被用于數值優化問題,算法通過相關的目標函數優化其參數 。 那在本題中,這些參數和目標函數又應該是什么?從經驗出發:腿部以周期方式運動 。 肌肉運動服從周期性、正弦時間規律,但很難手工實現這個規律 。 如何構造一個周期性函數?這里引入傅里葉級數 。 我們知道傅里葉級數(采用正弦余弦的累加)可估算出任意周期函數 。 不過理論上,他們可以有無限項 。 我設計了一個(截?。┎糠猪椀母道锶~級數,用以構造肌肉運動 。 這里只用了前4項余弦序列,于是就產生了8個參數:4個權重值乘以4個不同頻率相位的余弦值 。 這樣就位每塊肌肉構造了周期性函數 。 每條腿有9塊肌肉,我采用了9組周期性函數,這里假定另一條腿也采用同樣的運動方式,可用同樣的函數構造,不過相位差了180o 。 遺傳算法,通過修改調整這些參數(相較神經網絡參數,數量已經非常少了),從而優化目標函數的結果,顯而易見這就是最終激烈函數,比如機器人行走多少距離后摔倒 。
經過一天訓練后的行走模式
參數從白噪音中采樣得到,進行隨機修改 。 但如果某個采樣方向手有了性能提升,參數會沿這個方向進一步移動,知道不再有性能上的提升 。 我并行跑了3個模型,因為對于一臺筆記本來說計算量已經很大了 。 性能最好的權重被保存到一個參數文件中 。 當執行了幾個批次后,訓練又從性能最好的前3個參數組重新開始演算 。 這樣就允許算法去更好的探索不同的行為:重要的是不要僅探索當前最優的模型,因為這個模型可能被卡在一個局部最優很難逃離,而性能較差的模型經過一段時間的訓練卻可以通過微調其他行為超過當前最優的模型 。 確實,經過一系列模擬行走后,從最優的3個模型中重新啟動是成功學到行走模式的關鍵 。 在沒有先驗知識的情況下,模型可以學到像人一樣的運動行為,已經相當不簡單 。
在相對短的訓練時間和較差的硬件條件下(Intel Core 2 Duo CPU),模型可以成功的走出若干步 。 其他深度增強學習模型顯然獲得了更好的效果,但需要很長的訓練時間和強大的硬件 。 我的目標不是真正與這些模型競爭,而是表明如何用遺傳算法及少于100個參數的模型,快速在低配筆記本上獲得行走模式 。

推薦閱讀