HPCシステムズではエンジニアを募集しています。詳しくはこちらをご覧ください。
HPCシステムズのエンジニア達による技術ブログ

Tech Blog

ロボットアームの強化学習に挑戦

 今回は、OpenAIが公開しているロボットアームの強化学習に挑戦します。ロボットアームの強化学習は、ロボットアームで物体を挟んだり押したりして動かすFetchと、人の手を模したロボットを動作させるShadowHandがあります。その中から、FetchPickAndPlace、HandManipulateBlockRotateXYZ、HandManipulateBlockFullの強化学習に挑戦してみました。

強化学習

 強化学習とは、簡単に説明すると、まず、あるモデルを元にシミュレーションをします。次に、シミュレーションの結果を元にモデルを学習します。その学習したモデルを使って、またシミュレーションを行い、これを繰り返します。モデルをどのように設計するか、どのようにして学習に有効なシミュレーション結果を抽出するかなどが、強化学習の性能を決めることになります。

 ゲームで行われる強化学習では、ゲーム画像を元に、コマンドを入力する形のものが主ですが、roboticsでは、物体やアームの位置、移動速度、ゴールの位置のデータから、アームの動かす方向と加速度を入力していきます。 

 また、報酬が少なく、このまま学習しても失敗データしか出てこないため、HER(Hindsight Experience Replay)という手法を使います。HERは、失敗データに対し、意図的にゴールを動かし成功データにして学習する手法です。これにより報酬が少ない環境でも学習を進めることが可能になります。(参考:https://arxiv.org/abs/1802.09464)

FetchPickAndPlace

 FetchPickAndPlaceとは、ロボットアームで物体を挟み、赤い点に物体を持っていくというものです。OpenAIから出ている論文(https://arxiv.org/abs/1802.09464)の通りに進めていきました。ただ論文よりも、こちらの方が、ハードウェアスペックに余裕があったので、学習率を一桁下げて、長時間学習してみました。

 学習過程での成功率の推移を下記に示します。最高、97%まで成功率は到達しました。

 

学習したモデルで、実行した様子です。

FechPickAndPlace

HandManipulateBlockRotateXYZ

 HandManipulateBlockとは、ShadowHand(ヒトの手を模したアーム)を使って、ブロックの向きと位置を合わせていくものです。HandManipulateBlockRotateXYZは、ブロックの向きだけを合わせるものです。Fetchと異なりShadowHandは動かせる部分がかなり多いです。Fetchは、アームをXYZの3方向とアームの開閉の4次元ですが、ShadowHandは、指は、1方向に動く関節が13個、2方向に動く関節が1個、3方向に動く関節が1個から成り、手首も2方向に動き、計20次元の動作が可能です。

 こちらも、同じく学習率を落とし長時間学習させました。FetchPickAndPlaceの4倍の時間をかけて、成功率は、最高96%まで到達しました。

 

学習したモデルで実行した様子です。

HandManipulateBlockXYZ

HandManipulateBlockFull

 次に、ブロックの向きだけではなく、位置も合わせてみます。これは論文でも成功率が、20%程度までしか到達してないので、少々、工夫が必要になります。実際、XYZと同様に長時間学習しましたが、XYZの3倍長く学習させて、成功率は46%までしか上がりませんでした。

 成功率が上がらないので、単純にモデルの表現力を上げてみることにしました。論文のモデルは3層全結合で、1層あたりのノード数(ニューロン数の方が分かりやすいか)が256個でしたが、これを512個、768個(それぞれのモデルを、単純に、256モデル、512モデル、768モデルと名付けました。)にしてみます。この全結合のノード数を増やすと、計算すべき量がべき乗で増えますが、ソフトウェア側のベクトル化も手伝って、計算時間は768個でも6倍に抑えられています。

 学習における成功率の推移を見ると、明らかに改善しています。成功率は最大89.7%まで達しました。512モデルは、結果が思わしくないため、途中で止めました。

学習したモデルを実行した様子です。

HandManipulateBlockFull

あとがき

 計算力を武器にした力業ですが、それなりの結果が出ることが分かりました。強化学習では、学習自体の計算負荷よりも、シミュレーションのCPU負荷の方が圧倒的に高く、GPUよりもCPUリソースが有利に働きます。今回はマシン1台で頑張りましたが、複数ノードでの分散学習も有効です。