俺のブログ

学習メモや日記をつらつらと書きます。

俺の考えた最強のリモートPC開発環境

超簡単まとめ

  • Tailscale + mosh
  • カフェなど出先から簡単に自宅PCにアクセスできる

やりたいこと

  • 家の外から家のリモートPCにssh接続
  • IP固定しない
  • 無料

実現する際に抱えていた問題

  • MacBookPro(Late2016)じゃまともに開発(実行)できない
  • 普段の開発環境をそのまま使いたい
  • マンションのネットワークで簡単に外部ネットワークからsshできない
  • 外部からのsshが遅い
  • ネットワーク何もわからん

Tailscaleで簡単グローバルssh

Tailscaleは無料で使えるVPNサービスです。 会員登録もGoogleアカウントで済むため、お手軽に使えます。 しかも様々なOSに対応しており、MacOSLinuxはもちろんWindowsiOSAndroidにも対応しています。

ローカルマシン、リモートマシンの双方にTailscaleをインストールすると、Tailscale上でネットワークに繋がっているマシンを確認することができます。

Tailscaleブラウザ画面

Tailscaleを使ってリモートマシンにssh接続する場合は、マシンの名前とIPを指定することでリモートPCに接続することが可能です。 $ ssh remotePC@XXX.XXX.XXX.XXX

moshで快適リモート開発

Tailscaleを使って外からリモートPCにssh接続してみると、ネットワーク環境にもよりますが基本的にはもっさりしているなと感じます。 と言うのも、sshではリモートPCからのレスポンスを待って入力が反映されるため、待ち時間が発生してしまい、それがもっさりしているなと感じる要因です。 数分の作業であればもっさりしていても良いのですが、求めているのは快適な環境です。

そこで、moshを使います。 moshは、キータイプした際にもっさり感がないように振る舞ってくれるので、キータイプ時のフラストレーションがかなり軽減されます。 また、カフェやモバイル回線のような不安定ネットワークで使われることを考えて開発されているため、接続が切れても自動で再接続を行ってくれるなどの便利な機能がいくつかあります。 詳細な解説はコチラを参照してください。 なお、moshはもちろんtmuxと併用することができます。

moshもTailscale同様に様々なOSに対応しているため、適宜自分の環境に合わせてインストールしてみてください。

moshとTailscaleを使ってssh接続する場合は次のようになります。

$ mosh remotePC@XXX.XXX.XXX.XXX

また、自分はPythonをJupyter Notebookで使うことがあるため、リモートPC上でJupyter Notebookに使用しているポートをローカルPCに転送したい時がります。 このような場合でもmoshは、sshを代替する事を目標に開発されているため、sshで使えるオプションを使用することができます。

具体的には、

$ mosh --ssh="ssh -L 8888:localhost:8888 remotePC@XXX.XXX.XXX.XXX"

とすることで、リモートPC上の8888ポートで建っているJupyter Notebookをブラウザ上でXXX.XXX.XXX.XXX:8888にアクセスすることで、ローカルPCから操作することが可能になります。

羽田圭介作 スクラップ・アンド・ビルド を読んで

著者である羽田圭介さんが、自分の好きなYouTuberの動画に何度か出演した事で興味を持っていた、「スクラップ・アンド・ビルド」という作品を読んで、思ったことを書きたくなったから書いてみようと思う。無知が故の阿呆な事も書いていると思うが容赦願いたい。

「スクラップ・アンド・ビルド」と言えば芥川賞受賞作品であるが、自分にとっては純文学作品を読むのは初めての経験だった(国語の授業とかで知らない間に読んでるかもしれない)。自分が普段読む物は技術書が主で、物語は以前森見登美彦作品を読み漁っていた程度である。そのような自分の文学に対する姿勢の低さから、純文学は難しくて自分には何が書いてあるのか理解できない、といった先入観があった。 しかし実際に読んでみて、想像していた難しさとは異なる難しさがあるなと思った。 一番自分が読んでいて難しいと感じた事は、場面の転換である。今まで自分が読んできた作品は、場面転換があれば「その晩」や「次の日」など、冒頭部分で明示的に場面が切り替わった事を書いている事がほとんどだった。しかし「スクラップ・アンド・ビルド」では、ある程度読み進んでから場面が切り替わっていた事に気づく事が何度もあった。そのため、何度も同じ部分を読み返す事になり、結果的に脳内で情景がイメージしやすくなったと感じた。ただ、このような書き方が純文学特有の物なのか、羽田圭介さんの書き方なのかは分からない。この点から羽田圭介さんの他の作品を読む必要性がでてきた。また、他の純文学作品、特に芥川賞受賞作品も読む必要性を感じた。どツボにハマったのかもしれない。 また、これも他の作品と比べてみたい点ではあるが、自分が気になったものに、結果をほとんど書いていないという点がある。例えば恋愛を書いた物語では、おそらく恋愛が成就するが、最後のシーンは書かないといった事がよくあるように思う。これは読む人がそれぞれ自由に解釈できるという点でとても良いと思うが、それにしてもこの作品では書かなさすぎである。結局どうなったのか気になる事が多すぎて眠むに眠れないほどである。だが、これは純文学としてよくある事だろうなというイメージがある。なぜかはわからないが、そんなイメージがあるのだから仕方ない。他の純文学を読むのがさらに楽しみになってきた。

ここで、タイトルである「スクラップ・アンド・ビルド」という言葉について思った事を書く。まず「スクラップ」は破壊といった意味を持つ言葉だというイメージがある。次に「ビルド」は作るというようなイメージがある。これらから、作品全体を通して「何かを壊し、作る」というテーマを持った話なのだろうと思った。結果的に、このような先入観を持って作品を読み進めたのは正解だったと思う。というのも主題はおそらく、主人公の健斗が祖父を尊厳死させるべく、今までの生活を変化(破壊)するが、一方で祖父が生活を楽しみ生きようとする(作る)、といった物だと思う。しかし、この「スクラップ・アンド・ビルド」というテーマは、これだけで終わらないのである。作品の中で健斗を中心に色々な所で「スクラップ・アンド・ビルド」が繰り広げられていた。作品内にいくつかの「スクラップ・アンド・ビルド」がある事に気づけたのは、上で書いた先入観を持っていたためであり、より楽しむ事ができたと思っている。

主人公の健斗についても思った事を書きたいと思う。健斗は、フリーターであり就職活動をしている。自分はこの健斗にとても共感できた。というのも自分自身も就職活動中であり、就職活動がうまくいかない主人公に自分の姿を重ねることができてしまったためである。また、性格の面においても少し自分と重なってしまう点があった。作中で、健斗は祖父を尊厳死さすべく、生きたいという気持ちを無くすために、祖父の「自分はもう死んだらいい」と言った言葉に対して慰めを言わない。しかし、誰にもそのような説明はしていないため、主人公の姉が「そんなことはないよ」と慰める。すると健斗は、なぜそんな生きたい気持ちが湧くような言葉を言うのかと、苛立ちを感じてしまう。健斗自身の考えを共有していないのにも関わらず、自分と同様の行動を期待するのは間違っている。他にも、健斗の彼女に対する言動などからも健斗の自己中心的な性格が読み取れ、自分が今までの人生を振り返ると自覚する自己中心的な行動や発言に重なってしまった。このように、主人公に自分を重ねてしまう場面があった事から、物語に没入して読めたのかもしれない。

初めて純文学を読んだ感想は、思っていた程とっつきにくい物ではなかったなというものである。むしろ一冊読んでしまったがために、羽田圭介さんの他の作品や、他の芥川賞受賞作品を読んでしまいたくなった。 「スクラップ・アンド・ビルド」という作品自体に対する感想は、結末がはっきりしないなというものである。これは決してネガティブな感想ではなく、結末がはっきりしないからこそ、自分で色々な結末を想像する事ができてしまうというポジティブな感想である。一方で、作者の思い描く一つの結末が気になるのも確かである。

最後に、感想をこうして書いたことについて書きたい。小中学校と、夏休みの宿題で読書感想文が一番できなかった自分がなぜこんな感想を書こうと思ったのか不思議でならない。昔は1行すら書けなかった自分が2000字以上も感想を書いている現実が受け入れ難い。これが成長なのかもしれない。もしくは、「スクラップ・アンド・ビルド」を読む事で、過去の自分を壊し新たな自分を作るスクラップアンドビルドをしようとしているのかもしれない。

ちなみに「スクラップアンドビルド」という和製英語があるらしい。

PythonでDict(ハッシュテーブル)を実装する

データ構造やアルゴリズムを勉強していて,ハッシュテーブルの仕組みを軽く学んで実装してみたので備忘録に残しておきます.

Dict(ハッシュテーブル)とは

ハッシュテーブルについてはWikipediaを引用しておきます.

ハッシュテーブル (英: hash table) は、キーと値の組(エントリと呼ぶ)を複数個格納し、キーに対応する値をすばやく参照するためのデータ構造。ハッシュ表ともいう。ハッシュテーブルは連想配列や集合の効率的な実装のうち1つである。(Wikipedia/ハッシュテーブル)

ハッシュテーブルは,キーに対応する値を素早く参照するために,キーをハッシュ化します. しかし,キーをハッシュ値にする際,異なるキーでも同じハッシュ値を生成してしまう,衝突(collision)が発生することがあります. この時衝突を回避する方法として以下のの2種類があります.

  • チェイン法
  • オープンアドレス法

今回はチェイン法を使ってこの衝突を回避しています. 具体的には,同じハッシュ値のデータが挿入された場合には,連結リスト(Linked List)を末尾に連結します.

簡単な実装

チェイン法を使って衝突を回避するために,シンプルな連結リストを用意しておきます.

class LinkedList:
    def __init__(self, value):
        self.value = value
        self.next = None

シンプルなハッシュ関数と,データの追加,削除,探索メソッドを実装します.

class MyDict:
    def __init__(self):
        self.table = [None] * 1000

    def hash(self, key):
        # 1000で割った余りをhash値として扱う
        return key % 1000

    def add(self, key, value):
        hashed_key = self.hash(key)
        if self.table[hashed_key]:  # すでにキーにデータが存在したら
            ll = self.table[hashed_key]  # すでに存在しているデータ(連結リストの先頭)
            while ll:  # 連結リストの最後尾までループして,最後にデータを追加する
                if not ll.next:  # 連結リストの最後の場合
                    ll.next = LinkedList(value)  # 新しい値を連結リストに連結
                    break
                else:
                    ll = ll.next
        else:
            self.table[hashed_key] = LinkedList(value)  # データが既に存在していない場合,連結リストとしてデータを挿入

    def get(self, key):
        values = []
        hashed_key = self.hash(key)
        ll = self.table[hashed_key]
        if not ll:  # 指定したキーにデータが存在しない場合は-1を返す
            return -1
        while ll:  # 連結リストが存在する場合
            values.append(ll.value)  # 連結リストの値をリストに追加
            if not ll.next:  # もし連結リストの最後尾だったら
                return values
            else:
                ll = ll.next

    def remove(self, key, value):
        hashed_key = self.hash(key)
        ll = self.table[hashed_key]
        if not ll:  # 指定したキーにデータが存在しなかったら
            print('No Data')
            return
        if ll.value == value:  # 連結リストの先頭を削除する場合
            if ll.next:  # 先頭を削除して,連結リストを一つ前にずらす
                self.table[hashed_key] = ll.next
            else:  # データが一つだけの場合
                self.table[hashed_key] = None
            print(f'Key:{key}, Value:{value} Removed')
            return
        ll_prev = ll
        ll = ll_prev.next
        while ll:  # 指定したキーに複数連結リストが存在する場合
            if ll.value == value:
                ll_prev.next = ll.next
                print(f'Key:{key}, Value:{value} Removed')
                return
            else:
                ll_prev = ll
                ll = ll.next
        print('Data not Found')

実行スクリプトと実行結果を示しておきます

データの追加

dictionary = MyDict()
dictionary.add(1, 'orange')
dictionary.add(2, 'apple')
dictionary.add(3, 'grape')
dictionary.add(1001, 'mikan')
dictionary.add(1003, 'muscat')
dictionary.add(2002, 'green apple')
dictionary.add(3002, 'pineapple')
dictionary.add(2004, 'melon')

# Dict内のデータの表示
for i in range(1, 5):
    print(f'Key: {i}, Value: {dictionary.get(i)}')

出力結果

>>> Key: 1, Value: ['orange', 'mikan']
>>> Key: 2, Value: ['apple', 'green apple', 'pineapple']
>>> Key: 3, Value: ['grape', 'muscat']
>>> Key: 4, Value: ['melon']

データの削除

dictionary.remove(1, 'orange')
dictionary.remove(2002, 'green apple')
dictionary.remove(3, 'muscat')

# データの表示
for i in range(1, 5):
    print(f'Key: {i}, Value: {dictionary.get(i)}')

出力結果

>>> Key:1, Value:orange Removed
>>> Key:2002, Value:green apple Removed
>>> Key:1003, Value:muscat Removed

>>> Key: 1, Value: ['mikan']
>>> Key: 2, Value: ['apple', 'pineapple']
>>> Key: 3, Value: ['grape']
>>> Key: 4, Value: ['melon']

Sim2Real転移のためのDomain Randomization(翻訳)

この記事は,Lilian Weng氏によるDomain Randomization for Sim2Real Transferの記事を日本語訳したものです.

元記事 : Domain Randomization for Sim2Real Transfer: 2019年5月5日 by Lilian Weng

訳 : たける

シミュレーター上で学習したモデルやポリシーを実ロボット上で動作させる場合,確実にsim2realのギャップに直面してしまいます.Domain Randomizationは,学習する環境をランダム化することで,このギャップを埋めるというシンプルながらも協力なアイデアです.

ロボット分野における最も難しい課題の一つに,どのようにして実世界にモデルを転移させるかという問題があります.深層強化学習アルゴリズムのサンプル非効率性と,実ロボットでのデータ収集が高コストな事から,理論的には無限にデータを収集できるシミュレーターでのモデル学習が必要となることがよくあります.ですが,シミュレーターと物理世界のリアリティギャップは,物理ロボットとの作業では失敗につながることが多いです.このギャップは,物理パラメータ(摩擦,kp , 減衰,質量,密度など)の違い,さらには不正確な物理モデリング(柔らかい表面感の衝突など)によって引き起こされます.

sim2realのギャップを近づけるためには,シミュレーターを改善し現実に近づける必要があります.いくつかアプローチがあります:

  • System Identification(システム同定)

    • システム同定とは,物理システムの数学的モデルを構築することです.強化学習のコンテクストでは,数学的モデルとはシミュレーターのことです.シミュレーターをより現実的な物にするためには,注意深いキャリブレーションが必要です.
    • 残念ながら,キャリブレーションには多くの費用がかかります.さらに,同じマシンでも温度や湿度,位置,時間の経過による摩耗で,多くの物理パラメータが大きく異なる可能性があります.
  • Domain Adaption(ドメイン適応)

    • Domain Adaption(DA)とは,タスクモデルによって強制されたマッピング正則化によって,シミュレーションのデータ分布を実際のものと一致するように更新するために開発された転移学習手法の一つです.
    • 多くのドメイン適応モデルは,特に画像分類やEnd-to-Endの画像ベースの強化学習タスク用に,敵対的損失(Adversarial Loss)やGANで構築されています.
  • Domain Randomization(ドメインランダム化)
    • Domain Randomization(DR)を使用すると,ランダム化されたプロパティを使用して様々なシミュレーション環境を作成することができ,それら全てで機能するようにモデルを学習します.
    • このモデルは実世界の環境に適用できる可能性が高いですが,実際のシステムは訓練バリエーションの豊富な分布の中での1つのサンプルになると思われます.

Domain AdaptionとDomain Randomizationはどちらも教師なしです.Domain Adaptionは,実際の分布を捉えるために大量の実データサンプルを必要としますが,Domain Randomizationは実データをほとんど必要としない,もしくは全く必要としません.本記事では,このDomain Randomizationに焦点を当てています.

f:id:tkr1205:20201013130646p:plain
図1. sim2real転移における,3つのアプローチを表したコンセプト図

Domain Randomizationとは何か

定義をより一般的にするために,フルにアクセスすることが可能な環境(つまりシミュレーター)をソースドメイン,モデルを転移させる環境(つまり物理的な世界)をターゲットドメインと呼びます.学習はソースドメインで行います.ランダム化空間(\xi \in \Xi \subset \mathbb{R}^N)からサンプリングされた構成(\xi)を使用して,ソースドメイン(e_\xi)N個のランダム化パラメータのセットを制御することが可能です.

方策の学習の過程で,エピソードはランダム化が適応されたソースドメインから収集されます.したがって,方策は様々な環境にさらされ,一般化することを学びます.方策のパラメータ(\theta)は,分布全体で期待報酬(R)の平均を最大化するように学習されます.

f:id:tkr1205:20201010165829p:plain

ここで,(\tau_\xi)は,(\xi)でランダム化されたソースドメインから収集された軌道です.ある意味で,「ソースドメインとターゲットドメイン間の不一致は,ソースドメインの変動性としてモデル化されます」(Peng et al. 2018)

一様Domain Randomization

Domain Randomizationのオリジナルの形式(Tobin et al. 2017;Sadeghi et al. 2016)では,各ランダム化パラメータ(\xi_i)は,\xi_i \in [\xi_i^\text{low}, \xi_i^\text{high}, i=1,...,N]によって制限されます.そして各パラメータは,範囲内で均一にサンプリングされます.

ランダム化パラメータは,例えば以下のようなシーンの外観を制御することが可能です(Fig. 2参照).シミュレーション及びランダム化された画像から学習したモデルは,実際のランダム化されていない画像に転移させることが可能です.

  • 座標や形状,オブジェクトの色
  • 素材の質感
  • 照明の条件
  • 画像にランダムなノイズの付与
  • シミュレーター内のカメラの位置や向き,視野
f:id:tkr1205:20201010172247p:plain
図2. ランダム化された環境でキャプチャされた画像.(引用元: Tobin et al, 2017(https://arxiv.org/abs/1703.06907))

シミュレーターにおける物理ダイナミクスもまたランダム化(Peng et al. 2018)することが可能です.研究によると,再帰な方策は部分観測可能な現実を含む様々な物理ダイナミクスに適応可能であることが示されている.例として,以下のような物が挙げられます

  • オブジェクトの質量と寸法
  • ロボットの質量と寸法
  • 減衰,kp,関節の摩擦
  • PID制御のゲイン
  • 関節の制限
  • 行動における遅延
  • 観測ノイズ

OpenAI Roboticsでは,ビジュアル及びダイナミクスのDomain Randomizationを使用して,実ロボットのDexterouis Robot Handで方策を学習することができています(OpenAI, 2018).この研究では,ロボットハンドに50回連続でランダムなターゲットの向きにオブジェクトを回転させることを目標としています.このタスクにおけるsim2realのギャップは,(a)ロボットとオブジェクト間の多くの同時接触と(b)オブジェクトの衝突やその他の動きの不完全なシミュレーションにより,非常に大きくなっている.最初,方策はオブジェクトを5秒以上落とさずにいられませんでした.しかし,Domain Randomizationのおかげで,方策は最終的に驚くほどうまく機能するように進化しました.


Learning Dexterity: Uncut

なぜDomain Randomizationはうまくいくのか?

次に,なぜDomain Randomizationはそんなにうまくいくのか尋ねるでしょう.アイデア自体は非常に単純に思えます.以下の2つは私が最も説得力があると思った説明です.

最適化としてのDomain Randomization

あるアイデア(Vuong, et al. 2019)では,Domain Randomizationにおけるランダム化パラメータの学習が,双レベルの最適化であるとみなしています.実際の環境[tex:e{real}]にアクセスでき,ランダム化構成が[tex:\phi, \xi \sim P\phi(\xi)]でパラメータ化された分布からランダム化構成がサンプルされると仮定し,方策[tex:\pi\theta]が学習されている[tex:e{real}]で最大のパフォーマンスを達成するように以下の様に学習します.

f:id:tkr1205:20201013131852p:plain

ここで,\mathcal{L}(\pi; e)は環境eで評価される方策\piの損失関数です.

一様なDomain Randomizationでは,人の手でランダム化の範囲を選択しますが,多くの場合ドメインの知識と転移性能に基づいた何度かの試行錯誤を伴う調整が必要とされます.基本的に,これは最適な[tex:\mathcal{L}(\pi{\theta^*(\phi)}; e\text{real})]のために\phiをチューニングする手動の最適化プロセスです.

次セクションでのガイド付きDomaion Randomizationは,主にこの視点に触発されており,双レベルの最適化を行い,最適なパラメータ分布を自動的に学習することを目的としています.

メタ学習としてのDomain Randomization

OpenAIのプロジェクト(OpenAI, 2018)では,様々なダイナミクスで一般化するためにLSTM方策を学習しました.ロボットが最初の回転をできるようになると,次の回転ができるようになる必要な時間が遥かに短くなることがわかりました.またオンポリシーな方策は,物理ロボットに転移できないことがわかりました.どちらも方策が動的に学習し,新しい環境に適応しているという証拠です.

ある意味で.Domain Randomizationは様々な異なるタスクのコレクションを構成します.リカレントネットワークのメモリは,タスク間のメタ学習を実現し,実世界の設定でさらに作業ができるようにします.

ガイド付きDomain Randomization

普通のDomain Randomziationは,現実のデータへのアクセスを想定していないため,ランダム化の設定はシミュレーションの中で可能な限り広く一様にサンプリングされ.実際の環境がこの広い分布でカバーされることを期待しています.一様なサンプリングを,タスクパフォーマンスや実際のデータ,シミュレーターからのガイダンスに置き換えるように,より洗練された戦略を考えるのが妥当です.

ガイド付きDomain Randomization(Guided Domain Randomization)のモチベーションの一つに.非現実的な環境でのモデルの学習を避けることで計算リソースを節約するというものがあります.もう一つは,過度に広いランダム化分布から生じる可能性があり,方策の学習の成功を妨げる可能性がある実行不可能な方法を回避することです.

タスクパフォーマンスのための最適化

様々なランダム化パラメータ[tex:\xi \sim P \phi (\xi)] を使用して,一連の方策を学習するとします,ここで[tex:P\xi]は\phiによってパラメータ化された\xiの分布です.後で,フィードバックを収集するために,ターゲットドメインのダウンストリームタスクでそれら全てを試す事にしました(つまり,実際にロボットを制御するか,バリデーションセットで評価します).このフィードバックは,\xiの設定がどれくらい良いものかを示し,\phiを最適化するための信号を提供します.

NASに触発されたAutoAugument(Cubuk, et al. 2018)は,画像分類のための最良のデータオーグメンテーション(せん断,回転,反転など)の選択を強化学習の問題として学習する仕組みです.AutoAugmentは,sim2real転移には提案されていませんが,タスクのパフォーマンスによって導かれるDomain Randomizationのバケットに含まれることに注意してください.個々のオーグメンテーション設定は,バリデーションセットで評価され,パフォーマンスの向上はPPOを学習するための報酬として使用されます.この方策は,データセットごとに異なるオーグメンテーション戦略を出力します.例えばCIFAR-10の場合,AutoAugumentは主にカラーベースの変換を選択しますが,ImageNetはジオメトリベースを優先して選択します.

Ruiz(2019)は,タスクフィードバックを強化学習の報酬と見なして,\xiを調整するための「learning to simulate(シミュレーションの学習)」という名前の強化学習ベースの手法を提案しました.多変量ガウス分布としてモデル化された方策を,メインタスクのバリデーションデータのパフォーマンス距離を報酬として,\xiを推定するように学習されています.

f:id:tkr1205:20201013131934p:plain
図3. "learning to simulate"のアプローチを示した概要図. (引用元: Ruiz(2019), https://arxiv.org/abs/1810.02513)

進化アルゴリズムは別の方法であり.フィードバックを進化を促すための適応度として扱います(Yu et al, 2019).この研究では,CMA-ES(共分散行列適応進化戦略)を用いましたが,ターゲット環境での\xi条件付き方策の評価を適応度としています.付録で,研究者らはCMA-ESと\xiダイナミクスをモデル化するようなベイズ最適化やニューラルネットワークなどの他の方法と比較しています.これらのメソッドは,CMA-ESほど安定しておらず,サンプル効率が低いという主張がされています.興味深いことに,P(\xi)ニューラルネットワークでモデル化すると,LSTMがフィードフォワードネットワークよりも著しく優れています.

sim2realギャップは,外観のギャップとコンテンツのギャップの組み合わせであると考える人もいます.つまり,GANに影響を受けたほとんどのDomain Adaptionモデルは,外観のギャップに焦点を合わせています.Meta-Sim(Kar, et al. 2019)は,タスク固有の合成データセットを生成することにより,コンテンツのギャップを埋めることを目的としています.Meta-Simは,自動運転車の学習を例としているため非常に複雑な環境となっています.この場合,合成シーンはプロパティ(場所や色)を持つオブジェクトの階層,及びオブジェクト間の関係によってパラメータ化されます.階層とは,Structure Domain Randomization(SDR; Prakash, et al. 2018)に近い確率的シーン文法によって指定され,事前にわかっている前提です.モデルGはシーンプロパティsの分布を拡張するように次の方法で学習します,

  1. まず,事前学習を行います.恒等関数G(s)=sを学習します.
  2. 実際のデータ分布とシミュレーションデータ分布間のMMD損失を最小化します.これには微分不可能なレンダラーを通じたバックプロパゲーションが含まれます.この論文は,G(s)の属性を摂動させることで,数値的に計算しています.
  3. 合成データで学習しましたが,実際のデータで評価した場合,REINFORCEタスクの損失を最小化します.繰り返しになりますが,これはAutoAugumentと非常によく似ています.

不幸にも,このようなメソッドはsim2realには適していません.強化学習や進化アルゴリズムには,多数の実サンプルが必要です.また,物理ロボットのデータ収集をリアルタイムで学習ループに含めるのは非常に高いコストがかかります.計算リソースが少なくなるかどうかは,タスクによって異なります.

実データ分布との一致

実際のデータをガイド付きDomain Randomizationに使用することは,システム同定やDomain Adaptionを行うのとよく似ています.Domain Adaptionの中心となるアイデアは,実際のデータ分布に一致するようにデータ分布を修正することです.実データガイド付きDomain Randomizationの場合,シミュレータの状態分布を実世界の状態分布に近づけるランダム化パラメータ\xiを学習したいというものです.

SimOptモデル(Chebotar et al. 2019)は,まず初期ランダム化分布[tex:P\phi(\xi)]の下で学習を行い,方策[tex:\pi{\theta, P\theta}]を得ます.そして,この方策はシミュレーターと物理ロボットの両方に適用され,それぞれ軌道[tex:\tau\xi]と\tau_\text{real}を収集します.最適化目的関数は,以下のシミュレーションと実際の軌道間の誤差を最小化することです.

f:id:tkr1205:20201013132241p:plain

ここで,D(.)は,軌道ベースの不一致を測るものです.「Learning to simulate」の論文同様に,SimOptも微分不可能シミュレーターを通じて,勾配伝播の問題を解決する必要があります.これには,相対エントロピーポリシー検索(relative entropy policy search)と呼ばれる手法を用いました,詳細は論文を参照してください.

f:id:tkr1205:20201013132352p:plain
図4. SimOptフレームワークの概要図. (引用元: Chebotar et al, 2019(https://arxiv.org/abs/1810.05687))

"Randomized-to-Canonical Adaption Networks"を略であるRCAN(James et al. 2019)は,エンドツーエンドな強化学習タスクに対して有効なDomain AdaptionとDomain Randomizationを組み合わせた物です.Image-conditional GAN(cGAN)は,ドメインランダム化された画像をランダム化されていない画像に変換するようにシミュレーターで学習されます.その後,同じモデルを使用して実際の画像を,対応するシミュレートされた画像に変換し,エージェントが学習したものと同じようにします.基本的な仮説は,ドメインランダム化されたシミュレーション画像の分布が実際のサンプルをカバーするのに十分広いということです.

f:id:tkr1205:20201013132904p:plain
図5. RCANは,ドメインランダム化された画像や実画像を対応するシミュレーション画像に変換できる,条件付き画像生成器です(引用元: James et al., 2019(https://arxiv.org/abs/1812.07252))

モデルは,ビジョンベースのロボットアームで把持を行うために,シミュレーターでエンドツーエンドに学習します,ランダム化は,トレイの仕切りやオブジェクトの掴む位置,ランダムなテクスチャ,照明の位置,方向,色などが各タイムステップで適用されます.生成される正規バージョンの見た目は,シミュレーターのデフォルトの見た目です.RCANは生成器を学習しようとするということです.

G ランダム化された画像 → {正規バージョンの画像,セグメンテーション,深度}

ここで,セグメンテーションマスクと背インド画像は補助タスクとして使用されます.RCANは,一様なDomain Randomzationと比較して,ゼロショット転移に優れていましたが.どちらも実画像のみで学習されたモデルよりも性能が低いことが示されています.コンセプト的には,RCANはGraspGANと逆で,Domain Adaptionによって合成画像を実画像に変換します.

シミュレーターでのガイド付きデータ

DeceptionNetとして知られる,ネットワークドリブンなDomain Randomization(Zakharov et al. 2019)は,画像分類タスクでのドメイン間のギャップを埋めるのに役立つランダム化を学習することで動機づけされています.

ランダム化は,エンコーダ-デコーダアーキテクチャを持つDeceptionモジュールを通じて適用されます.Deceptionモジュールは,画像を変換(背景の変更,歪みの追加,照明の変更など)するように特別な設計がされています.他の認識ネットワーク(Recognition Net)は,変換された画像に対して分類を実行することでメインのタスクを処理します.

学習の工程には2段階あります,

  1. 認識ネットワークを固定した状態で,誤差逆伝播中に逆勾配を適用して,予測とラベルの差を最大化します.これにより,Deceptionモジュールが最も混乱するトリックを学習できます.
  2. Deceptionモジュールを固定した状態で,入力画像を変更して認識ネットワークを学習します.

f:id:tkr1205:20201013135025p:plain
図6. どのようにしてDeceptionNetが働くか.(引用元: Zakharov et al., 2019(https://arxiv.org/abs/1904.02750))

Deceptionモジュールを学習するためのフィードバックは,ダウンストリーム分類器から提供されます.しかし,上記のセクションのようにタスクのパフォーマンスを最大化しようとするのではなく,ランダム化モジュールがより難しいケースを作り出すことを目的としています.大きな欠点の一つに,データセットやタスクごとに異なるDeceptionモジュールを手動で設計する必要があるため,簡単にスケーラブルにできない点です.ゼロショットであるという事を考えると,結果はSOTAのDomain AdaptionメソッドによるMNIST, LineMODよりも悪いです.

同様に,Active Domain Randomization(ADR;Mehta et al., 2019)も.より難しいトレーニングサンプルを作成するためにシミュレーションデータに依存しています.ADRは,指定されたランダム化範囲内で最も情報量の多い環境のバリエーションを探索します.ここで,情報量はランダム化された環境インスタンスと参照(元の,非ランダム化な)環境インスタンスにおけるロールアウトの不一致で測ります.少しSimOptに似てる気がしますか?まぁ,SimOptはシミュレーションと実際のロールアウトの不一致を測るのに対し,ADRはランダム化と非ランダム化シミュレーションの不一致を測り.高コストな実データ収集を避けいることに注意してください.

f:id:tkr1205:20201013135221p:plain
図7. どのようにしてActive Domain Randomization(ADR)が働くか(引用元: Mehta et al., 2019(https://arxiv.org/abs/1904.04762))

学習は,以下の流れで行われます

  1. 与えられた方策を参照環境とランダム化された環境の両方で実行し,それぞれ2セットの軌道を収集します.
  2. ロールアウトした軌道が,参照環境でのものか,ランダム化環境のものかどうかを識別するモデル(discriminator)を学習します.予測された\log p(ランダム化される確率)が報酬として使用されます.ランダム化環境のロールアウトと参照環境のロールアウトが異なるほど.予測が容易になり,報酬が高くなります.
    • 直感的には,環境が簡単なら,同じエージェントが参照環境と同様の軌道を生成できます.そして,モデルは様々な行動を奨めることで,困難な環境でも報酬を与え探索します.
  3. 分類器による報酬は,Stein Variational Policy Gradient(SVPG)に伝えられ,多様なランダム化の設定を出力します.

ADRのアイデアは,2つの小さな懸念点があります.確率的な方策を実行する際に,環境変数の難易度を測定するのに軌道間の類似度を使用するのは,あまり良い方法ではないかもしれません.sim2realの結果は,残念ながらそれほどエキサイティングではないように見えますが,論文ではADRがランダム化パラメータの範囲を狭めていることが勝因であると述べられています.

参考

[1] Josh Tobin, et al. “Domain randomization for transferring deep neural networks from simulation to the real world.” IROS, 2017.

[2] Fereshteh Sadeghi and Sergey Levine. “CAD2RL: Real single-image flight without a single real image.” arXiv:1611.04201 (2016).

[3] Xue Bin Peng, et al. “Sim-to-real transfer of robotic control with dynamics randomization.” ICRA, 2018.

[4] Nataniel Ruiz, et al. “Learning to Simulate.” ICLR 2019

[5] OpenAI. “Learning Dexterous In-Hand Manipulation.” arXiv:1808.00177 (2018).

[6] OpenAI Blog. “Learning dexterity” July 30, 2018.

[7] Quan Vuong, et al. “How to pick the domain randomization parameters for sim-to-real transfer of reinforcement learning policies?.” arXiv:1903.11774 (2019).

[8] Ekin D. Cubuk, et al. “AutoAugment: Learning augmentation policies from data.” arXiv:1805.09501 (2018).

[9] Wenhao Yu et al. “Policy Transfer with Strategy Optimization.” ICLR 2019

[10] Yevgen Chebotar et al. “Closing the Sim-to-Real Loop: Adapting Simulation Randomization with Real World Experience.” Arxiv: 1810.05687 (2019).

[11] Stephen James et al. “Sim-to-real via sim-to-sim: Data-efficient robotic grasping via randomized-to-canonical adaptation networks” CVPR 2019.

[12] Bhairav Mehta et al. “Active Domain Randomization” arXiv:1904.04762

[13] Sergey Zakharov,et al. “DeceptionNet: Network-Driven Domain Randomization.” arXiv:1904.02750 (2019).

[14] Amlan Kar, et al. “Meta-Sim: Learning to Generate Synthetic Datasets.” arXiv:1904.11621 (2019).

[15] Aayush Prakash, et al. “Structured Domain Randomization: Bridging the Reality Gap by Context-Aware Synthetic Data.” arXiv:1810.10093 (2018).

スレートプレートを買った自慢がしたい

スレートプレートを買った

f:id:tkr1205:20200405004033j:plain

最近は外出せずにYouTubeでお料理の動画ばかり見ている. 色々なお料理の動画を見ている中で,私はスレートプレートに出会ってしまった.

なぜ私がそれに惹かれたのかは分からない. ただ,スレートプレートを使った料理はどれもオシャレに見えた.

すぐにスレートプレートを調べた.ダイソーやセリアなどの百円ショップに売っているらしい. 今は不要不急の外出の自粛が求められているが,これは不要不急ではない. 早急になんとしてでも手に入れなければならない.ASAPである. 手に入れた暁には,世間への不満にあふれるTwitterのTLにオシャレな料理で一石を投じようではないか. 食欲が刺激されることで少しは世間に対する不満が和らぐに違いない. マズローの5段階欲求説によるなら生理的欲求を満たそうとする段階に陥るはずであり,世間への不満は和らぎ殺伐としたTLには美味しいご飯で溢れるはずである.

善は急げである,外出自粛を理由に一日中来ている部屋着を脱ぎ捨て私はすぐに家を出た. 目指すはお財布の味方ダイソーである. スレートプレートを買ったらどんな料理を作ろうか期待を胸に食器コーナーへと向かった.

だが現実はそうもいかなかった. 考えることは皆同じなのだろうか,私と同じ様に皆お料理の動画を見ているのだろうか,すでに国民の多くは生理的欲求の段階に陥ってしまっているのだろうか.

だが私は諦めない. 地球温暖化はなんのその,化石燃料を燃やしCO2を排出しながらセリアに向かった.

現実は想像を絶するものだった. セリアにもスレートプレートは置いていなかったのだ.

Google大先生は百円均一にも様々な種類のスレートプレートが売っていると教えてくれた. だが,実際はそうではなかった. 仮にも情報系大学で4年間学んだ者が,インターネットの情報を一切疑わず,信じてしまったのだ. 私は一体何を学んでいたのだろうか,メディア・リテラシーとはなんなのか. その謎を解明すべく南米の奥地へと向かいたいところではあるが,私にはスレートプレートを早急に手に入れるという使命がある.

私は諦めなかった. インターネットをもう一度信頼した. その結果,なんとニトリにスレートプレートがあるとGoogle大先生が言うではないか.

すぐにニトリへとハンドルを切った. 一度インターネットに裏切られた身である. 半信半疑の面持ちのままエスカレーターを上がり食器コーナーへと向かった.

嗚呼,なんということだろうか,そこには黒く平らな板が輝いているではないか. これこそ私の求めていたスレートプレートである.

価格は100円とは行かないが500円程度である.しかもかなりのサイズである. 私は迷うこと無く手に取り颯爽とレジヘと向かった.

この時私の脳内ではオシャレな料理の写真をツイートする妄想を繰り広げていた. 私は同時に肉が食べたいと強く思った.同時にこれだけプレートが大きいならば肉も大きくないと格好がつかないとも思った.

私はニトリを後にし,いつも利用しているスーパーへと向かった. 通いなれた私を遮るものなど何もなく,まっすぐ精肉コーナーにたどり着いた. その時,私はある物を見てしまった. 1ポンドステーキに貼ってある20%オフのステッカーを.

私はすぐにステーキ肉を手に取り,料理の付け合せを考え始めた. すぐに脳内を総動員させ,人参とコーンというベストな答えを導き出した.

ありきたりかもしれないが,彩りを考えたときに人参は映えると考えた. 料理の盛り付けには彩りも重要である事ももちろんYouTubeで履修済みである.

すぐに帰宅し,調理へと取り掛かった. 調理はこちらを参考にしていただきたい.

そして料理は完成した.

YouTubeで見ていた,あのオシャレな料理が目の前にある.

是非これを読んだ人は作ってみてほしい. 味の満足感よりもオシャレな料理を作れたことに満足する.不思議な体験が得られることだろう.

f:id:tkr1205:20200405004023j:plain

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に上がっているので,合わせて確認するとイメージがしやすいです.

www.youtube.com

あると幸せになる知識

基本的に以前の研究の進化系なので,この論文に軽く目を透しておくと幸せになります.

扱う分野として,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)を提案する.

扱うタスク

f:id:tkr1205:20191208220513p:plain

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で誤差を最小化したシミュレーションを使用した.

f:id:tkr1205:20191208222201p:plain

(左:キャリブレーション前の関節の値,右:キャリブレーション後の関節の値)

ルービックキューブの設定

完全な立方体だと指が引っかかったりするため,角を1.425mm削って角を丸くした.これは,実際のルービックキューブも同様に角が丸くなっている.

Automatic Domain Randomization

今までのsim2realでは,制御ポリシーと状態推定モデルをシミュレーション上でDomain Randomzationを使って学習し,どちらも実ロボットに転移させることが可能であった.だが,問題点として大量のパラメータのチューニングとイテレーションループが必要でだった.

ADRはこれらの課題を環境の分布をランダムに拡張することで解決した.

ADRの概要

Domain Randomizationは分布の範囲を手動で設定し,固定する必要があるが,ADRは自動で範囲が設定され,その範囲を変更することができる.

f:id:tkr1205:20191209001708p:plain

上の図は,ADRの概要図である.

ADRは環境全体の分布を制御し,この分布から環境をサンプリングし,それを使用しトレーニングデータを生成し,モデルのトレーニングを行う.そして,モデルの評価を行い,その評価から分布の更新を行う.

基本的には,モデルが上手く動作すると環境の分布は徐々に広がる.環境の分布が広がると,環境のとりうる値が広がる,具体的には,摩擦係数の範囲や,オブジェクトの大きさの範囲が広がる.

学習の初期の環境は,ランダムに変更されない.具体的にはポリシーの場合,初期の環境は実ロボットから測定された値に基づいて設定されます.

ADRの良い点

Domain Randomizationと比較して,ADRには良い点が2つある.

  • 最初にひとつの環境で学習を行い,最低限のパフォーマンスを達成した時にのみ新たな環境が追加されるため,トレーニングが進むにつれて難易度が徐々に高くなる.
  • 手動のパラメータチューニングがなくなる.ランダムにするパラメータが増えるとチューニングするパラメータが増えるため自動でチューニングされるのは重要である.

アルゴリズム

各環境は e_\lambdaで表され,\lambda \in \mathbb{R}^dである.dはランダム化するパラメータの数であり,例を上げると重力や摩擦係数,キューブの大きさなどである.

Domain Randomization では,\lambda \sim P_\phiである.\phi \in \mathbb{R}^{d'}でパラメータ化する.

ADRでは,この\phiを学習の中で動的に直接変化する.

ADRエントロピーH(P_\phi) = \frac{1}{d} \int P_\phi (\lambda) \log P_\phi (\lambda) d \lambda とする.このエントロピーが多いとは,環境の分布が大きくより多様な環境がサンプリングされるということである.また,正規化することで異なる環境のパラメータを比較することが可能になる.

ADRにおけるi番目のパラメータは\lambda_i, i = 1, 2, 3, 4, 5, ... , dで表される.また,({\phi_i}^L, {\phi_i}^H)\lambda \sim U({\phi_i}^L, {\phi_i}^H)となるように一様にサンプリングされる.

全体の分布は以下の式で表され,

P_\phi(\lambda) = \prod_{i=1}^d U({\phi_i}^L, {\phi_i}^H)

ADRエントロピーは以下の式となる.

 H(P_\phi) = \frac{1}{d} \sum_{i=1}^d \log ({\phi_i}^L - {\phi_i}^H)

アルゴリズムの流れ

  1. 色々な環境のパラメータから1 つの次元をランダムに選択する(\lambda_i).ここでは,摩擦係数が選択されたと仮定する.
  2. 摩擦係数バッファーにモデルの評価を追加していく.
  3. ある程度の数の評価が溜まったら,平均値を求める.
  4. 求めた平均値と閾値High  t_H閾値Lowt_Lと比較を行う.

平均値  > t_H なら分布を大きくし,

平均値  く t_L なら分布を小さくする.

つまり,モデルが上手く動作しているならば分布を大きくすることでよりタスクを難しくし,上手く動作していなければ分布を小さくすることでタスクを簡単にする.

ただ単純に分布を大きくするのではなく,ランダムに選択された次元Aでは上手く動作したため分布を大きくしたが,次に選択された次元Bでは上手く動作しなかったため分布を小さくすると言った形で自動で分布を変化させる.このあたりのパラメータの調節を人の手ではなくautomaticに行っている.

f:id:tkr1205:20191209105741p:plain

また,Algorithm1を見てみると,バッファーに追加する際にサンプリングしている環境は現在の分布の最小値もしくは最大値である.これは50%でどちらか選択される.

例えば,摩擦係数が選択されている時, {\phi_i}^Lにはより小さい摩擦係数が代入されている.一方で {\phi_i}^Hには大きい摩擦係数が代入されている.この時,50%の確率でどちらかからサンプリングされた環境でモデルを実行し評価を得る.この時,評価の平均値が閾値Highよりも高ければ,より大きい範囲の摩擦係数が分布に設定される.もし平均値が閾値Lowよりも小さければ,より範囲の狭い摩擦係数が分布に設定される.

また,評価(Algorithm 1)は確率 P_bで実行され,生成(Algorithm 2)は確率 1 - P_bで実行される.

あくまでADRは分布を動的に変化させ,分布から環境を生成するアルゴリズムであり,ADR自体が何かを学習するわけではない

ADR自体が学習を行うのではなく,学習アルゴリズム自体に生成したデータを渡してあげる必要がある.状態予測モデルモデルには,ADRのパラメータからレンダリングしたデータを渡し,ADRのデータからポリシーを学習する.

ADRのPolicyにおける分布の初期値 {\phi_i}^{0,L} = {\phi_i}^{0,H}は実ロボット上で実際に計測された値である.また,状態予測モデルの初期値は {\phi}^0 = 0であり,見かけ上の変化が無い.

シミュレーション上でのPolicyの学習

Policyの学習にはPPOを用いた.行動空間や報酬の設計は以前に行った研究から変えていない.

1エピソードを終了する条件として, - 50回連続で成功した時 - キューブを手から落とした時 - 次の行動に移ろうとしてタイムアウトした時

Policyのアーキテクチャ

Policyのアーキテクチャは主に以前の研究と同じである.だが,2点拡張した重要なポイントがある.

f:id:tkr1205:20191209113309p:plain

1点目は,ネットワークではReLUの後にLSTMが続くネットワークを使用しているが,以前の研究と比較してユニットの数を2倍にすることでネットワークの容量を2倍にしている.

ValueネットワークにもPolicyネットワークにも同じアーキテクチャを用いている.2つのネットワークの異なる点は,ValueネットワークはLSTMの出力をスカラーに射影しており, 10^{-6}のL2正則化をかけることで長期間の学習でも重みが発散するのを抑えている.

2点目は,以前の研究ではPolicy, Valueネットワークにおいてノイズのあるバージョンとノイズの無いにバージョンの異なる観測値を入力としており,ネットワークごとに全ての観測値をまとめて一つのベクトルにして入力していた.

Policyはノイズのある観測値のみを入力とし,Valueは観測値といくつかのノイズのある観測値を入力とした.(下の表を参照)

f:id:tkr1205:20191209114355p:plain

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を使用した.

f:id:tkr1205:20191209122909p:plain f:id:tkr1205:20191209122915p:plain

(上 : 中央のステッカーを切り取ることで非対称にしたブロック,下:様々なセンサーの埋め込まれたGiiker Cube)

長期的な目標は,現実世界で任意のオブジェクトと相互作用できるロボットを構築することである.そのため,理想では普通のルービックキューブを使用して,visionからのみでこのタスクを解きたいと考えている.これは可能だと考えているが,リカレントモデルでより広範囲に学習する(回転の記憶を状態推定モデルが保持する)か,エンドツーエンドな(状態推定モデルとPolicyが共に学習される)学習の仕組みが必要だと考える.

状態推定モデル

状態推定モデルは以前に行った研究と似ている.3つのRGBカメラを上面と左右に設置している.

位置と方向は上手く直接推定することができるが,センターのステッカーを非対称にしたキューブを使用した場合でも,6面全ての角度を直接予測するのは難しい.そのため,面の角度予測をいくつかの異なる予測に分割した.

  1. Active axis : キューブの3つある軸のうち一つだけが「アクティブ」であるという仮説のもとに,現在どの軸がアクティブであるかを予測する.

  2. Active face angle : アクティブな軸に関する面の \frac{\pi}{2}ラジアンの剰余を予測する.範囲は [-\frac{\pi}{4}, \frac{\pi}{4} ].面が底面にあり,手に隠れている場合, [-\pi, \pi]ラジアンで絶対角度を直接予測するのはとても難しい.このようにして \frac{\pi}{2}ラジアンの剰余を予測するには,形状とキューブの相対位置を認識するだけで良いため,簡単にできる.

  3. Top face angle : 上面の絶対角度を [-\pi, \pi]ラジアンで予測する.これは,真上にカメラがあるため,非対称なステッカーのキューブを使用している場合,単一のタイムスタンプから予測できる.上面のカメラはめったに遮られることがないため,上面のみを予測する.

これらから,各面の絶対回転角度を求めることができる(これらからどのように絶対角度を求めるかは,付録CのAlgorithm5を参照). また,角度予測において,角度をπラジアンごとに90°に離散化すると,回帰で直接角度を予測するよも優れたパフォーマンスが得られる.

Rapidを使った分散学習

制御ポリシーと同様に状態推定モデルは完全に生成データから学習し,実世界の画像は使用していない.そして,同様に複雑な学習な設定が必要なため,ポリシーと同様に分散学習のRapidフレームワークを使用した.

f:id:tkr1205:20191209124427p:plain

画像のネットワーク図における点線はネットワークの重みを共有していることを示している.つまり,ネットワークの重みは3つのカメラは共有している.

f:id:tkr1205:20191209124625p:plain

上の表はシミュレーション上と実世界での実験結果の比較である. Full モデルが提案手法である.また,Orientationがブロックの方向,Positionは位置,Top Faceは面の角度である.表を見ると,Domain Randomizationを使用していない場合,シミュレーション上ではOrientationとTop Faceの2つでエラーが最も少ないが,実世界ではエラーがとても多いことがわかる.一方で,提案手法ではシミュレーション上ではエラーが一番低いわけではないが,実世界ではエラーが一番少ないことがわかる.(ここで使用しているGround TruthはPhase Spaceから,全ての面の角度はGiiker Cubeから取得している)

状態推定モデルの損失関数について

状態推定モデルの損失関数についてだが,位置と方向にはMSE, 各面の角度はクロスエントロピーを求めた.だが,これらはスケールが異なるのでFocal Lossを用いて自動でLossnに重みを割り当てている.

また,重回帰タスクに上手く適応させるため変更した点がある.各予測に対して低いエラー値を設定し,その値以下のエラーをサンプリングする確率をfocal lossの確率pとして使用するようにした.つまり, FL(p; \gamma) = -(1-p) \gamma \log(p)となり,全ての実験で \gamma = 1とした.これにより,学習中にlossの重みを動的に変更できるため,lossの重みを手動でチューニングする必要がなくなり最適化が向上する.

結果

sim2simにおけるポリシーの転移

sim2simは,ポリシーを学習し,学習には使用していない手で調整した環境の分布にポリシーを転移し,パフォーマンスを評価する.

f:id:tkr1205:20191209130035p:plain

図より,ADRエントロピーを大きくする(分布を大きく)とsim2simのパフォーマンスが向上していることがわかる.

Sim2Realにおけるポリシーの転移

実ロボットの実行には高いコストがかかるため,7つの異なるポリシーに限定して評価を行った.それぞれ実ロボットで10回試行した結果である.また,シミュレーションは各500回試行した結果である.

f:id:tkr1205:20191209130438p:plain

上の表は実験の結果である.

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から学習したものを比較する.

f:id:tkr1205:20191209131841p:plain

上の図を見ると,分布が固定されているDRよりもADRの方がはるかに学習が早いのがわかる.

この結果から,環境の分布のエントロピーを適応的に大きくすることが重要であるとわかった.また,エントロピーを固定っする場合,エントロピーが大きいほど学習するのに時間がかかっている(図左のsmallとXL).具体的には,あまりに複雑な環境では十分な信号が得られないためポリシーが学習しにくいと考えている.

徐々に難しい環境で状態推定モデルを学習する影響

状態推定モデルをADRで学習する際,ADRは光源の距離,マテリアルのメタリックと光沢,そしてTensorFlowの歪操作(ガウスノイズとチャネルノイズ)を制御している.

f:id:tkr1205:20191209132743p:plain

上の表は以前の研究で得られた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回)の操作が必要である.

f:id:tkr1205:20191209133153p:plain

Manual DRとADR(XL)は2週間学習を行い,ADR(XXL)は数ヶ月学習を行った.

Rubik's Cubeタスクにおける質的評価

f:id:tkr1205:20191209133855p:plain

上の図は実世界における実行中に様々な邪魔をしている様子である(最初の動画を見てみると結構強めに押したりしている). (最初の)動画を見てみると,ロボットが誤って違う面を回転させていることがわかる.その場合,最善の方法は面を回転して元に戻し,サブゴールを変更せずに継続することである.また,ズレによるインターロックを回避するために,rotationを実行する前にflipした後で面の位置を調整して合わせていることが確認できる.それでもrotationが上手くいかないこともある.その時は,ポリシーが握りを調整して,rotationを別の方法で試行し最終的に成功することがよくある.また,rotationをしようとしてflipした場合も,もう一度把持し直して最終的に成功する.

難しい回転の際に引っかかって,しばらくするとキューブを落とす可能性が高い.これは,数秒間静止したキューブしか観測しないため,それまでしていた行動を「忘れた」からだと考える.

まとめ

シミュレーション上でハンドマニピュレータの制御ポリシーとルービックキューブの状態推定モデルを学習する際にADRを適用し,実世界に転ゼロショットで転移させることができた.制御ポリシーと状態推定モデルは別々に学習を行い,ポリシーの学習には数ヶ月かけている.

ルービックキューブをハンドマニピュレータを使って解くという論文であり,解き方自体はアルゴリズムを使っているという点において,物議を醸していた(例えばコレ)のを観測したが,確かに名前が悪いと思う.

また,Giiker Cubeを学習の一部に使用しており,Policyに対して状態を渡す際にGiiker Cubeの値をそのまま渡すと勘違いしている人も中にはいたが,Giiker Cubeは主に状態推定モデルの学習に使用しており,状態推定モデルでも動作するっぽい.(映像はおそらくGiiker Cubeを使用している.)

コメント

強化学習 Advent Calendar2019はたくさん空きがあるので,是非参加してください!!

iPadを買っておけ間違いないから!!!

この記事は,FUN Advent Calendar2019の12月5日の記事です.

昨日はnao(ki)さんの1/32の車のお話。でした.

学部4年の知能コースのたける(Twitter)です. 強化学習とか深層学習とかロボットの制御的な感じの研究してます. 特に最近は自分の無能さに病みがちです. 来年からは未来大の修士課程です.

毎年12月5日にAdvent Calendarに参加しているんですが,実は今日12月5日が誕生日です. 誕生日プレゼントください,誕プレ乞食するために毎年12月5日に記事書いてます.貰えたことほぼ無いけど

Amazon欲しい物リスト(Geforce TITAN RTXが欲しいです)

本題に入る前に

未来大生のような悲しい人達には基本彼氏や彼女がいないと思うので,クリスマスプレゼントにお金が消えるなんて事は無いと思います.そこで,自分にクリスマスプレゼントを買いましょう.今すぐ買いましょう.今スグです!!!

今スグiPadを買いましょう!!!

まず,コチラをクリック!

そして,いいなと思った物をカートに入れる.そしたら,コチラもおすすめですみたいなところにあるApple Pencilもカートに入れましょう.

あとはお金の払える魔法のカードとか使えばクリスマスくらいには届きます.

iPadを使う利点

iPadを使う利点が無限にあります.今回は中でもいくつか紹介したいと思います.

  • 紙のノートを持ち歩く必要がない
  • PDFなどの資料に直接書き込める
  • 論文を印刷せずに書き込み放題
  • 電子書籍にとても向いている
  • Macのサブディスプレイになる
  • YouTubeが見やすい

紙のノートを持ち歩く必要がない

皆さんは講義の日にノート持ってくるの忘れたー!とか,持ってくるノート間違えたー!!という経験はありませんか?ありますよね?僕は何度もあります.

他にもノートを何冊も持ち歩くの面倒だなと感じた事はありませんか?

iPadApple Pencilがあればそんな日々とはおさらばです.

iPadには色々なノートアプリがあります.

有名所では,

  • Notability
  • GoodNotes 5
  • Noteshelf 2

などが挙げられます.全部同じ様な事ができるので好きな物を選ぶといいと思います.

自分はNotabilityを使用しているので以下Notabilityでの説明になります.

下の2つのノートは実際に自分がiPadApple Pencil, Notabilityを使って取ったノートです.(字が汚いのはデフォです)

f:id:tkr1205:20191204201717j:plainf:id:tkr1205:20191204201739j:plain

キレイにノートが取れていますね(震え声)

ノートアプリがあればグラフをキレイに描けたり,撮った板書の写真を貼り付けたりなんでもできてしまいます.

個人的にはノート取りまくってると手が黒くなってしまう事案が発生しないのが良いポイントです.

PDFなどの資料に直接書き込める

講義によっては,パワーポイントなんかの講義資料を配布してくださる先生もいらっしゃいます.

その場合には講義資料をiPadに取り込んでしまいましょう.

多くのノートアプリはPDFファイルなどの形式に対応しているので,講義資料をダウンロードして直接書き込むことができてしまいます.

また,プリント資料を配布してくださる先生もいらっしゃいます.そんな場合にはプリントの写真を取ってノートアプリに取り込みましょう.そうすれば書き込み放題です.

f:id:tkr1205:20191204233319j:plainf:id:tkr1205:20191204233330j:plain

論文を印刷せずに書き込み放題

ノートアプリにPDFを直接読み込めるということは,arxivなどに上がっている論文を読み込む事もできます.

表紙の次に空ページを作って,そこにアブストの全訳を書いてみたり,少しメモを取ったり.

また,自分の様な英弱には,ノートアプリの中で単語を指定してその和訳を調べることもできます.

f:id:tkr1205:20191204204025j:plainf:id:tkr1205:20191204203847j:plain

他にもPDFや書き込んだノートは各種Cloudから共有できるので,Google Driveから論文を読み込んだりすることもできます.

自分はiPhoneTwitterからarxivに飛ぶことが多いので,iPhoneで開いたarxivAirDropiPadに飛ばしてNotabilityで開くということをよくしています.

電子書籍にとても向いている

技術書などを購入する人も多いと思います.

技術書は重いし分厚いし,気になったときにパッと開きたいのに手元にないことがあったり,不便ですよね.

ですが,iPadがあれば分厚い電子書籍も何万冊でも持ち歩き放題.

これは僕のKindleアプリに入っている本です.これらの本をいつも持ち歩くのは大変ですが,iPadがあればいつでも参照することができます.

f:id:tkr1205:20191204224807j:plain

また,色々ゴニョゴニョすればKindleの本をPDFにしてノートアプリに取り込むこともできます.

そうすれば下の写真のようにKindleアプリではできなかった,本に直接手書きでメモすることが可能になります.

また,理工系の書籍がKindleストアでは頻繁にセールしているので,半額とかで買うこともできます.

f:id:tkr1205:20191204225322j:plain

Macのサブディスプレイになる

対象機種は限られていますが,iPadMacのサブディスプレイとして使うことができます.

iPadがサブディスプレイになるのでスタバに行ってドヤる際にも,iPadがあればデュアルディスプレイを使うことができてしまいます.

また,デュアルディスプレイ中にもApple Pencilが使えるので,Adobe IllustratorApple Pencilで使うことができます.

他にもAdobeのいくつかのソフトがiPadアプリとして提供されているのでApple Pencilを使って簡単に使用することができます.

YouTubeが見やすい

YouTubeを見るときに何を使って見ていますか?

スマートフォンは画面が小さいし,PCはいちいち取り出してしまうのが面倒ではないですか?

そこでiPadを使いましょう.スマートフォンより大きく,PCよりも出し入れが楽に行なえます.

また,こういったケースを使えば,自立してくれるのでより見やすくなります.

最後に

iPadApple Pencilを買ってノートを持ち歩く生活とはおさらばしましょう.

iPad買わなかった人は僕に誕生日プレゼントください.iPad買った人も僕に誕生日プレゼントください( Amazon欲しい物リスト).

明日はパンダちゃんさんです

最後にもう一度

今スグiPadを買いましょう!!!

おまけ

兵庫の実家の母親が誕生日を祝ってくれました.(後ろの人形は誕生日会参加者らしい)

お母さん,僕はそこにいません.僕もケーキ食べたかった.

f:id:tkr1205:20191204232213j:plain