Solving Rubik's Cube with a Robot Hand を読んだ
はじめに
この記事は強化学習Advent Calendar20198日目の記事です.
たくさん空いているのでどなたでも気軽に参加して貰えると嬉しいです.
自己紹介
北海道の雄大な自然の中にある大学に通う学部4年のたけるです. 卒業研究では,深層強化学習を使ったロボットの制御をしています. 来年からは同大学の大学院修士課程に進学します.
Advent Calendar を企画した理由は,深層強化学習を使った研究をしている人が周りに少ないため,議論できる相手がおらず論文を正しく読めているのか不安に感じたのでoutputすることでツッコミを頂こうと考えたからです.(質問などもいただけると頑張って答えます)
また,英弱につき自信のない部分がいくつかあるので,読み間違い等ありましたらツッコんでいただけると嬉しいです.加えて,こういった説明記事を書くのが初めてなので優しく指摘していただけるとありがたいです.
概要
論文のURL : [1910.07113] Solving Rubik's Cube with a Robot Hand
OpenAIのブログ記事 : Solving Rubik’s Cube with a Robot Hand
この論文はOpenAIによる,ロボットハンドを用いてルービックキューブを解く(回転させる)ことを学習した論文です.分野としてはsim2realと呼ばれる,シミュレーション上で学習し,実世界に学習したものを転移させるものです.この論文ではADRというアルゴリズムをシミュレーション上での学習時に適用します.これにより,ゼロショット(実世界での学習無し)での実世界への転移を先行研究よりも高速に,高い精度で達成した.また,あくまでルービックキューブを回転させる事を学習し,解き方はソルバー(アルゴリズム)を用いている.
学習した結果の動画もYouTubeに上がっているので,合わせて確認するとイメージがしやすいです.
あると幸せになる知識
基本的に以前の研究の進化系なので,この論文に軽く目を透しておくと幸せになります.
扱う分野として,sim2realと呼ばれる,シミュレーション上で学習したモデルを実環境に転移させるものに取り組みます.ここで,大きな問題となるのがシミュレーションは実世界のダイナミクスを完全に再現できているわけでない点です.実世界の物理現象に何が関与しているのかはとても難しい問題なため,シミュレーション上で得られるものと実世界で得られるものでは誤差があります.そこで,シミュレーション上でサンプリングを行う際にノイズを与えることで実世界に転移させた際にも上手く動作するだけの汎化性能を得るDomain Randomizationという手法があります.このとき,与えるノイズが大きければ大きいほど高い汎化性能が得られるが,状態空間が膨大になり学習が困難になるという問題が起きます.一方でノイズを小さくすると学習は簡単でにはなるが,十分な汎化性能が得られないという問題があります.
アブストラクト
全訳を載せておきます.
私達はシミュレーションのみで学習を行ったモデルで,実ロボットにおいて今までにない程複雑なマニピュレーションタスクを解いたことを示す.この手法は2つのキーとなる要素からなります.1つ目:Automatic Domain Randomization(ADR),2つ目:機械学習のためのロボットプラットフォームです.ADRはだんだん難しくなるランダムな環境の分布を自動的に生成する.ADRを用いて学習を行った制御ポリシーやカメラによる状態推定がsim2real転移を大きく改善したことを示す.制御ポリシーにおいて,ADRによって生成された環境の分布で学習を行ったmemory-augmetedなモデルはテストで明確に創発的メタ学習の兆候を示した.カスタムしたロボットプラットフォームとADRの組み合わせによってルービックキューブをハンドマニピュレータを使って解くことができるようになった.結果をまとめたビデオが見れます: http://openai.com/blog/solving-rubiks-cube/
背景
ロボットなどの学習には大量のデータが必要であり,実世界で収集するのは難しい.そこで,シミュレーション上でデータを集める事ができれば魅力的である.しかし,シミュレーションはロボットや環境の全てを詳細には再現できていないため,sim2realの転移に取り組む必要がある.
以前の研究でDomain Randomizationにはシミュレーション環境のみで学習をしたモデルを実ロボットに転移させられるポテンシャルがあることがわかっている.また,以前OpenAIではマニピュレータを用いてブロックを回転させる研究を行っている.
シミュレーションのデータだけで,ルービックキューブを解くのに必要なマニピュレータの制御と状態推定を行う.ルービックキューブをマニピュレータで解くのは器用さと正確さを必要とするため,とても難しい問題である.また,ルービックキューブの状態推定も正確さを必要とする.
これらを達成するために,ポリシーと状態推定の学習にランダム化された環境の分布を自動的に生成するADR(Automatic Domain Randomization)を提案する.
扱うタスク
Block Reorientation
以前の研究で扱った,手の上でブロックを回転させるタスクである,詳細は,こちらを参照してほしい.
Rubik's Cube
言うまでもなくルービックキューブを解くというタスクである.
このタスクは,ルービックキューブ自体の解法についてはCociembaライブラリーを使って手順を作成するため,タスクの焦点はマニピュレータの制御と状態推定である.
つまり,このタスクに取り組むにはルービックキューブの姿勢と6つの面の角度を推定し,そこからマニピュレータを制御する必要がある,
また,ルービックキューブの面を90°回転させる事をrotation, キューブ自体を90°回転(別の面を上に持ってくる)させる事をflipと呼ぶ.
実際の学習では,上面を回転させる事が他の面を回転させるより遥かに簡単であることがわかったため,任意の面を回転させるのではなく,flipとrotationを組み合わせてルービックキューブを解く.(回転させたい面が下にある場合,2回flipする.また,真ん中の列を回転させたい場合,上の面をrotationし,2回flipした後rotationすることで真ん中の列を回転させたことになる)
実環境の設定
ロボットの設定
ハンドマニピュレータにはShadow Dexterous Handを使用し,ケージには3つのRGBカメラとPhase Spaceというモーションキャプチャー用カメラがついている.また,ハンドマニピュレータの先端にはPhase Spaceのモーションキャプチャー用LEDがついている.
ルービックキューブの設定
カメラの入力からルービックキューブの状態を予測させるのは難易度が高い.そこで,踏み台として「スマート」(センサとBluetoothモジュールを搭載した)なルービックキューブを使います.このスマートなルービックキューブをGiiker Cubeと呼ぶ.
制御ポリシーを学習する際,状態予測をするモデルが学習できていないため,このGiiker Cubeを使用した.また,一部の実験ではこのGiiker Cubeを使って,状態予測モデルによるエラーを悪化させずに制御ポリシーをテストした.
シミュレーションの設定
ダイナミクスのキャリブレーション
シミュレーションと実世界でのマニピュレータの関節の動きを比較した.これらの値から,関節のパラメータをMSEで誤差を最小化したシミュレーションを使用した.
(左:キャリブレーション前の関節の値,右:キャリブレーション後の関節の値)
ルービックキューブの設定
完全な立方体だと指が引っかかったりするため,角を1.425mm削って角を丸くした.これは,実際のルービックキューブも同様に角が丸くなっている.
Automatic Domain Randomization
今までのsim2realでは,制御ポリシーと状態推定モデルをシミュレーション上でDomain Randomzationを使って学習し,どちらも実ロボットに転移させることが可能であった.だが,問題点として大量のパラメータのチューニングとイテレーションループが必要でだった.
ADRはこれらの課題を環境の分布をランダムに拡張することで解決した.
ADRの概要
Domain Randomizationは分布の範囲を手動で設定し,固定する必要があるが,ADRは自動で範囲が設定され,その範囲を変更することができる.
上の図は,ADRの概要図である.
ADRは環境全体の分布を制御し,この分布から環境をサンプリングし,それを使用しトレーニングデータを生成し,モデルのトレーニングを行う.そして,モデルの評価を行い,その評価から分布の更新を行う.
基本的には,モデルが上手く動作すると環境の分布は徐々に広がる.環境の分布が広がると,環境のとりうる値が広がる,具体的には,摩擦係数の範囲や,オブジェクトの大きさの範囲が広がる.
学習の初期の環境は,ランダムに変更されない.具体的にはポリシーの場合,初期の環境は実ロボットから測定された値に基づいて設定されます.
ADRの良い点
Domain Randomizationと比較して,ADRには良い点が2つある.
- 最初にひとつの環境で学習を行い,最低限のパフォーマンスを達成した時にのみ新たな環境が追加されるため,トレーニングが進むにつれて難易度が徐々に高くなる.
- 手動のパラメータチューニングがなくなる.ランダムにするパラメータが増えるとチューニングするパラメータが増えるため自動でチューニングされるのは重要である.
アルゴリズム
各環境は で表され,である.はランダム化するパラメータの数であり,例を上げると重力や摩擦係数,キューブの大きさなどである.
Domain Randomization では,である.でパラメータ化する.
ADRでは,このを学習の中で動的に直接変化する.
ADRのエントロピーをとする.このエントロピーが多いとは,環境の分布が大きくより多様な環境がサンプリングされるということである.また,正規化することで異なる環境のパラメータを比較することが可能になる.
ADRにおける番目のパラメータはで表される.また,はとなるように一様にサンプリングされる.
全体の分布は以下の式で表され,
アルゴリズムの流れ
- 色々な環境のパラメータから1 つの次元をランダムに選択する().ここでは,摩擦係数が選択されたと仮定する.
- 摩擦係数バッファーにモデルの評価を追加していく.
- ある程度の数の評価が溜まったら,平均値を求める.
- 求めた平均値と閾値High と閾値Lowと比較を行う.
平均値 なら分布を大きくし,
平均値 なら分布を小さくする.
つまり,モデルが上手く動作しているならば分布を大きくすることでよりタスクを難しくし,上手く動作していなければ分布を小さくすることでタスクを簡単にする.
ただ単純に分布を大きくするのではなく,ランダムに選択された次元Aでは上手く動作したため分布を大きくしたが,次に選択された次元Bでは上手く動作しなかったため分布を小さくすると言った形で自動で分布を変化させる.このあたりのパラメータの調節を人の手ではなくautomaticに行っている.
また,Algorithm1を見てみると,バッファーに追加する際にサンプリングしている環境は現在の分布の最小値もしくは最大値である.これは50%でどちらか選択される.
例えば,摩擦係数が選択されている時,にはより小さい摩擦係数が代入されている.一方でには大きい摩擦係数が代入されている.この時,50%の確率でどちらかからサンプリングされた環境でモデルを実行し評価を得る.この時,評価の平均値が閾値Highよりも高ければ,より大きい範囲の摩擦係数が分布に設定される.もし平均値が閾値Lowよりも小さければ,より範囲の狭い摩擦係数が分布に設定される.
また,評価(Algorithm 1)は確率で実行され,生成(Algorithm 2)は確率で実行される.
あくまでADRは分布を動的に変化させ,分布から環境を生成するアルゴリズムであり,ADR自体が何かを学習するわけではない
ADR自体が学習を行うのではなく,学習アルゴリズム自体に生成したデータを渡してあげる必要がある.状態予測モデルモデルには,ADRのパラメータからレンダリングしたデータを渡し,ADRのデータからポリシーを学習する.
ADRのPolicyにおける分布の初期値は実ロボット上で実際に計測された値である.また,状態予測モデルの初期値はであり,見かけ上の変化が無い.
シミュレーション上でのPolicyの学習
Policyの学習にはPPOを用いた.行動空間や報酬の設計は以前に行った研究から変えていない.
1エピソードを終了する条件として, - 50回連続で成功した時 - キューブを手から落とした時 - 次の行動に移ろうとしてタイムアウトした時
Policyのアーキテクチャ
Policyのアーキテクチャは主に以前の研究と同じである.だが,2点拡張した重要なポイントがある.
1点目は,ネットワークではReLUの後にLSTMが続くネットワークを使用しているが,以前の研究と比較してユニットの数を2倍にすることでネットワークの容量を2倍にしている.
ValueネットワークにもPolicyネットワークにも同じアーキテクチャを用いている.2つのネットワークの異なる点は,ValueネットワークはLSTMの出力をスカラーに射影しており,のL2正則化をかけることで長期間の学習でも重みが発散するのを抑えている.
2点目は,以前の研究ではPolicy, Valueネットワークにおいてノイズのあるバージョンとノイズの無いにバージョンの異なる観測値を入力としており,ネットワークごとに全ての観測値をまとめて一つのベクトルにして入力していた.
Policyはノイズのある観測値のみを入力とし,Valueは観測値といくつかのノイズのある観測値を入力とした.(下の表を参照)
Asymmetric Actor-Criticアーキテクチャを用いているが,入力の連結部分を「embed-and -add」と呼ぶものに変更した.具体的には,最初に各観測を重み共有無しで512次元の潜在空間に埋め込む,そしてそれぞれの潜在表現を足し合わせてReLUを適用する.これを行う目的として,既存のポリシーに新しい観測を簡単に追加し,PolicyとValueネットワーク間で入力の埋め込みを共有することができることです.
Rapidを使った分散学習
多様な環境の分布で学習を行うために分散学習を行った.分散学習を行う際,OpenAI Fiveでも学習に使用したRapidという分散学習フレームワークを使用した.
Block Reorientationタスクには4x8=32個の NVIDIA V100を使用し,4x100=400ワーカーを32CPU Coreで使用した.また,Rubik's Cubeタスクには8x8=64個の NVIDIA V100を使用し,8x115=920ワーカーを32CPUコアで使用した.このタスクは数ヶ月継続して学習を行った.学習に使った累積経験は約1万3千年であり,OpenAI Fiveと同じオーダーである,
Policyのクローン
ADRを使用すると常に困難な分布から学習行うため,同じポリシーを長期間学習することが効果的である.したがって,ゼロから学習をすることはほとんどなく,ADRとPolicyの両方の以前のパラメータを使って学習をしなおした.Policyのアーキテクチャで説明した「embed-and-add」により,観測部分は簡単に変更することができる.だが,Policyはこのように簡単には変更できない.また,初期化されていないモデルで学習をリスタートすると数週間から数ヶ月の進捗が失われます.そこで,DAGGERアルゴリズム(ポリシー抽出)の精神で,行動クローニングを実装し,教師ポリシーに非常に近いパフォーマンスレベルで新しいポリシーを効率的に初期化した.
クローンを作成する際の設定は強化学習に似ているが,教師だけでなく生徒ポリシーもメモリ上に乗っている,ロールアウト中,生徒のアクションを使って環境とやり取りをし,生徒と教師のアクション分布の差を最小化(KLの発散を最小化),価値予測(L2Lossを最小化)する.これがとても上手く機能しており,クローンの作成は行動空間を変更しない限り,任意のPolicyアーキテクチャの変更で上手く機能する.
Visionによる状態推定
制御ポリシーは3台のカメラとニューラルネットワークからなる状態推定を受け取る.また,制御ポリシーにはキューブの位置と方向に加えて6面全ての角度の推定値が必要である.
ポリシーには[-π, π]の絶対回転角度が必要である.中央のステッカーは回転対称なので,1つのカメラから絶対角度を推定することができない.そこで,状態を追跡するorキューブを変更する必要がある.
今回は状態推定に2つのオプションを使うことで対応した.
- 非対称な中央のステッカーのみからのVision : これをする目的はキューブの位置と回転,6面の角度を求めるためである.キューブの中央のステッカーの一角を切り取ることで回転対称性を無くす.これにより絶対回転角度がわかるようにした.
- Giiker Cube : これをする目的は,位置と回転を求めるためである.面の角度はGiikerキューブに組み込まれたセンサを使用する.ポリシーからのエラーのみでvisionによる角度推定のエラーをよりひどくしないために,ほとんどの実験でこのGiiker Cubeを使用した.
(上 : 中央のステッカーを切り取ることで非対称にしたブロック,下:様々なセンサーの埋め込まれたGiiker Cube)
長期的な目標は,現実世界で任意のオブジェクトと相互作用できるロボットを構築することである.そのため,理想では普通のルービックキューブを使用して,visionからのみでこのタスクを解きたいと考えている.これは可能だと考えているが,リカレントモデルでより広範囲に学習する(回転の記憶を状態推定モデルが保持する)か,エンドツーエンドな(状態推定モデルとPolicyが共に学習される)学習の仕組みが必要だと考える.
状態推定モデル
状態推定モデルは以前に行った研究と似ている.3つのRGBカメラを上面と左右に設置している.
位置と方向は上手く直接推定することができるが,センターのステッカーを非対称にしたキューブを使用した場合でも,6面全ての角度を直接予測するのは難しい.そのため,面の角度予測をいくつかの異なる予測に分割した.
Active axis : キューブの3つある軸のうち一つだけが「アクティブ」であるという仮説のもとに,現在どの軸がアクティブであるかを予測する.
Active face angle : アクティブな軸に関する面のラジアンの剰余を予測する.範囲は].面が底面にあり,手に隠れている場合,]ラジアンで絶対角度を直接予測するのはとても難しい.このようにしてラジアンの剰余を予測するには,形状とキューブの相対位置を認識するだけで良いため,簡単にできる.
Top face angle : 上面の絶対角度を]ラジアンで予測する.これは,真上にカメラがあるため,非対称なステッカーのキューブを使用している場合,単一のタイムスタンプから予測できる.上面のカメラはめったに遮られることがないため,上面のみを予測する.
これらから,各面の絶対回転角度を求めることができる(これらからどのように絶対角度を求めるかは,付録CのAlgorithm5を参照). また,角度予測において,角度をπラジアンごとに90°に離散化すると,回帰で直接角度を予測するよも優れたパフォーマンスが得られる.
Rapidを使った分散学習
制御ポリシーと同様に状態推定モデルは完全に生成データから学習し,実世界の画像は使用していない.そして,同様に複雑な学習な設定が必要なため,ポリシーと同様に分散学習のRapidフレームワークを使用した.
画像のネットワーク図における点線はネットワークの重みを共有していることを示している.つまり,ネットワークの重みは3つのカメラは共有している.
上の表はシミュレーション上と実世界での実験結果の比較である. Full モデルが提案手法である.また,Orientationがブロックの方向,Positionは位置,Top Faceは面の角度である.表を見ると,Domain Randomizationを使用していない場合,シミュレーション上ではOrientationとTop Faceの2つでエラーが最も少ないが,実世界ではエラーがとても多いことがわかる.一方で,提案手法ではシミュレーション上ではエラーが一番低いわけではないが,実世界ではエラーが一番少ないことがわかる.(ここで使用しているGround TruthはPhase Spaceから,全ての面の角度はGiiker Cubeから取得している)
状態推定モデルの損失関数について
状態推定モデルの損失関数についてだが,位置と方向にはMSE, 各面の角度はクロスエントロピーを求めた.だが,これらはスケールが異なるのでFocal Lossを用いて自動でLossnに重みを割り当てている.
また,重回帰タスクに上手く適応させるため変更した点がある.各予測に対して低いエラー値を設定し,その値以下のエラーをサンプリングする確率をfocal lossの確率pとして使用するようにした.つまり,となり,全ての実験でとした.これにより,学習中にlossの重みを動的に変更できるため,lossの重みを手動でチューニングする必要がなくなり最適化が向上する.
結果
sim2simにおけるポリシーの転移
sim2simは,ポリシーを学習し,学習には使用していない手で調整した環境の分布にポリシーを転移し,パフォーマンスを評価する.
図より,ADRのエントロピーを大きくする(分布を大きく)とsim2simのパフォーマンスが向上していることがわかる.
Sim2Realにおけるポリシーの転移
実ロボットの実行には高いコストがかかるため,7つの異なるポリシーに限定して評価を行った.それぞれ実ロボットで10回試行した結果である.また,シミュレーションは各500回試行した結果である.
上の表は実験の結果である.
Baselineは以前に行った研究である.Manual DRはADRと同じモデルアーキテクチャを使用して通常のDRで学習した結果である.ADRの(Small, Medium, Large)は学習した期間が異なり,XL, XXLは継続的に学習を行った結果である.
Manual DRとADR(Large)を比較した時,同じ学習期間であり,シミュレーション上での成功率はManual DRの方が高いにも関わらず実世界での結果がとても低い.この2つの違いは環境の分布のみであり,環境の分布を変化させることが重要なポイントであることがわかる.
Baselineはハードウェアの調整などを行った結果であるが,長期間学習を行ったADR(XL, XXL)はハードウェアの調整無しで平均パフォーマンスが2倍,中央値は3倍以上に向上している.
これらから,ADRは数ヶ月に渡る手動のパラメータチューニングの結果を少ない手動のパラメータチューニングではるかに上回った.
徐々に難しい環境でポリシーを学習する影響
ADRは学習する分布の複雑さを徐々に拡大するように設計されている.単一の環境から学習を初めて,学習が進むと非常に複雑な(多様な)環境を学習することが可能である.
上の表のsmall, medium, large, XLから分布だけを取り出して,固定したものとADRを使用して0から学習したものを比較する.
上の図を見ると,分布が固定されているDRよりもADRの方がはるかに学習が早いのがわかる.
この結果から,環境の分布のエントロピーを適応的に大きくすることが重要であるとわかった.また,エントロピーを固定っする場合,エントロピーが大きいほど学習するのに時間がかかっている(図左のsmallとXL).具体的には,あまりに複雑な環境では十分な信号が得られないためポリシーが学習しにくいと考えている.
徐々に難しい環境で状態推定モデルを学習する影響
状態推定モデルをADRで学習する際,ADRは光源の距離,マテリアルのメタリックと光沢,そしてTensorFlowの歪操作(ガウスノイズとチャネルノイズ)を制御している.
上の表は以前の研究で得られたBaselineとADRを比較した結果である.実世界におけるエラーを比較した時,ADRの方がBaselineよりも優れた結果を示しているのがわかる.一方で,シミュレーション環境における結果を比較した時,ADRの方がエラーが大きい.しかし,これはADRは常により難しいタスクを生成し続けるためである.
Rubik's Cubeタスクにおける量的評価
公正に評価を行うためにTNoodleからランダムにサンプリングしたもので評価を行う.つまり,チェリーピッキング(自分に都合良いデータを選ぶこと)はない.
今回しようしたものはL2 U2 R2 B D2 B2 D2 L2 F’ D’ R B F L U’ F D’ L2という組み合わせである.ルービックキューブを解かれた状態から,この状態までグチャグチャにすることで評価を行った.これはルービックキューブを解くのと実質同じことである.また,この状態にするのに合計43回(orientation 26回,flip17回)の操作が必要である.
Manual DRとADR(XL)は2週間学習を行い,ADR(XXL)は数ヶ月学習を行った.
Rubik's Cubeタスクにおける質的評価
上の図は実世界における実行中に様々な邪魔をしている様子である(最初の動画を見てみると結構強めに押したりしている). (最初の)動画を見てみると,ロボットが誤って違う面を回転させていることがわかる.その場合,最善の方法は面を回転して元に戻し,サブゴールを変更せずに継続することである.また,ズレによるインターロックを回避するために,rotationを実行する前にflipした後で面の位置を調整して合わせていることが確認できる.それでもrotationが上手くいかないこともある.その時は,ポリシーが握りを調整して,rotationを別の方法で試行し最終的に成功することがよくある.また,rotationをしようとしてflipした場合も,もう一度把持し直して最終的に成功する.
難しい回転の際に引っかかって,しばらくするとキューブを落とす可能性が高い.これは,数秒間静止したキューブしか観測しないため,それまでしていた行動を「忘れた」からだと考える.
まとめ
シミュレーション上でハンドマニピュレータの制御ポリシーとルービックキューブの状態推定モデルを学習する際にADRを適用し,実世界に転ゼロショットで転移させることができた.制御ポリシーと状態推定モデルは別々に学習を行い,ポリシーの学習には数ヶ月かけている.
ルービックキューブをハンドマニピュレータを使って解くという論文であり,解き方自体はアルゴリズムを使っているという点において,物議を醸していた(例えばコレ)のを観測したが,確かに名前が悪いと思う.
また,Giiker Cubeを学習の一部に使用しており,Policyに対して状態を渡す際にGiiker Cubeの値をそのまま渡すと勘違いしている人も中にはいたが,Giiker Cubeは主に状態推定モデルの学習に使用しており,状態推定モデルでも動作するっぽい.(映像はおそらくGiiker Cubeを使用している.)
コメント
強化学習 Advent Calendar2019はたくさん空きがあるので,是非参加してください!!