25 Jun 2017, 13:47

LEGO Mindstorms で GyroBoy を組み立てた

LEGO MindStorms EV3 を買ったので、まずは GyroBoy を組み立ててみた。

動かしてみる

早速、動かしてみたい!

倒立振子をするロポットの作り方は以下のチュートリアルに乗っている。 - Tutorial: Building BALANC3R - Robotsquare

バランスをとりながら倒立するロポットは 2 種類あるみたい。 - BALANCE3R - GyroBoy

チュートリアルでは BALANC3R の説明をしているけれども、 BALANCE3R をつくれるのは、LEGO MindStorms Home Edition なので、 私は、GyroBoy を作ることにした(わたしのは Education Edition)

組み立て方は以下のリンクから PDF がダウンロードできる。

出来上がったのは以下のロボット。かっこいい!組み立ての要領が悪く 5 時間かかった。

img

Python で倒立振子する

ev3dev-lang-python には、Balancer が提供さている。さすが。

開発の経緯 - Implement BALANC3R · Issue #130 · rhempel/ev3dev-lang-python

参考になったコード - segway/segway.py at master · laurensvalk/segway

ev3dev-lang-python にまーじされたコード - https://github.com/rhempel/ev3dev-lang-python/blob/d0625b5b1e1fdcdd69b7fa390695613a81191736/demo/BALANC3R

#!/usr/bin/env python3

import logging
from ev3dev.GyroBalancer import GyroBalancer


class BALANC3R(GyroBalancer):
    def __init__(self):
        GyroBalancer.__init__(self,
                              gainGyroAngle=1156,
                              gainGyroRate=146,
                              gainMotorAngle=7,
                              gainMotorAngularSpeed=9,
                              gainMotorAngleErrorAccumulated=3)


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(levelname)5s: %(message)s')
    log = logging.getLogger(__name__)

    log.info("Starting BALANC3R")
    robot = BALANC3R()
    robot.main()
log.info("Exiting BALANC3R")

これを実施すると、RemoteControl が定義されていないということで、エラーする

LEGO MindStorms は リモコンで制御するためのセンサーがあるのだけれども、 教育版にはリモコンセンサはついていない。なので、以下のソースをいじって REMOTE CONTROL にかかわる部分を全部削除した!

さあこれでどうだろう・・・立ち上がった!うれしい。

https://www.youtube.com/embed/7Sb4aqrfy3Y?ecver=1

25 Jun 2017, 00:50

ev3dev-lang-python 開発環境(Visual Studio Code)

ev3dev で Python の開発をするには、Visual Studio COde をローカル PC でつかうのがよさそう。

サーバ上でコーディングすると、サーバからのレスポンスが遅くてイライラする。

なので、ローカルで編集したファイルをサーバにアップロードする方式のほうがよさそう。

VS Code なら ftp-sync という拡張機能があり、保存のたびに サーバとローカルのフォルダの同期が走る。

Visual Studio Code の設定メモです。

環境

  • Ubuntu 16.04 LTS
  • Visual Studio Code 1.13.1

Visual Studio Code

VS Code の本体を手に入れる。

deb をダウンロードして、以下でインストール。

$ sudo dpkg -i code_1.13.1-1497464373_amd64.deb

anaconda

anaconda をつかって、専用の環境を用意する。

# ev3 環境を作成
$ conda create -n ev3
$ activate ev3

# python をインストール
$ conda install python

VS Code の ファイル > 基本設定 > 設定を選択。

ユーザ設定ファイル setting.json が作成される。setting.json に python のパスを追記する。

"python.pythonPath": "/home/tsu-nera/anaconda3/envs/ev3/bin/python",

ev3dev-lang-python

ev3dev ライブラリをインストール。

$ git clone https://github.com/rhempel/ev3dev-lang-python.git
$ cd ev3dev-lang-python
$ python setup.py

pylint

pylint をインストールすることで、エラーチェックを有効化。

$ conda install pylint

autocomplete

ev3dev-lang-python の API のコード補完ができない。

PyCharm だとこの辺ができるんだけどな。。。。解決策探し中。

拡張機能

python

Python で開発するための必須機能。

ftp-sync

VS Code のキモの拡張機能。sftp を利用してサーバとフォルダを同期する。

以下のように、ftp-sync.json を設定する。

sftp は port22 に変更することに注意。remotePath は同期したいサーバ上のフォルダ。

{
    "remotePath": "./experimentals",
    "host": "ev3dev.local",
    "username": "robot",
    "password": "maker",
    "port": 22,
    "secure": false,
    "protocol": "sftp",
    "uploadOnSave": true,
    "passive": false,
    "debug": false,
    "privateKeyPath": null,
    "passphrase": null,
    "ignore": [
        "\\.vscode",
        "\\.git",
        "\\.DS_Store"
    ],
    "generatedFiles": {
        "uploadOnSave": false,
        "extensionsToInclude": [],
        "path": ""
    }
}

23 Jun 2017, 23:57

LEGO Mindstorms EV3 を Python から制御するためのメモ

レゴマインドストーム EV3 を Python で制御するためのセットアップ作業メモです。

Environment

  • LEGO MindStorms EV3
  • Ubuntu 16.04(途中 micro SD カードのところは Windows10)
  • ev3dev (2017-06-09)
  • Python 3.4.2

ev3dev

ev3dev の OS 起動

ev3dev とは、Debian ベースの Linux OS.

Python でプログラミングするには、標準で入っている OS ではなく、ev3dev を利用する。 この ev3dev OS を micro SD カードに焼いて、カードから OS を起動してその上で作業する。

いわば これはデュアルブート。 なので、もともとの EV3 の OS を削除することなく、ev3dev OS を動かすことができる。

まずは、OS のイメージをダウンロードする。

ダウンロードしたファイルを解凍する。

micro SD カードに write するために、ツールを使う。自分の PC では Ubuntu で作業しているのだけれども、 カードがどうやっても認識できなかったので、Windows から micro SD カードに OS イメージを焼いた。 Windows では、Win32 Disk Imagerというソフトが利用できる。

SD カードを EV3 本体に差し込んで、起動ボタンを押す。1 分ほどで、立ち上がる。

wifi 接続

wifi 接続には、wifi ドングルが必要。

ssh でリモートログイン

ターミナルを起動して、以下を打ち込む。

ssh robot@ev3dev.local

ユーザ名は、robot, パスワードは maker.ログインが成功すると、以下の出力を得る。

             _____     _
   _____   _|___ /  __| | _____   __
  / _ \ \ / / |_ \ / _` |/ _ \ \ / /
 |  __/\ V / ___) | (_| |  __/\ V /
  \___| \_/ |____/ \__,_|\___| \_/

Debian jessie on LEGO MINDSTORMS EV3!

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Jun 23 10:55:42 2017 from 192.168.3.4
robot@ev3dev:~$ 

wifi 設定を永続化するために、/etc/wpa_supplicant/wpa_supplicant.conf の編集をする。

cd /etc/wpa_supplicant/
sudo touch wpa_supplicant.conf
sudo chmod a+w wpa_supplicant.conf
sudo wpa_passphrase <SSID> <passward> >> wpa_supplicant.conf

ev3dev のアップデート

sudo apt-get update

Python

Python

デフォルトでは、Python 2.x が入っているようだ。python3 で 3.x 系が使える。

robot@ev3dev:~$ python
Python 2.7.9 (default, Aug 13 2016, 17:33:18) 

robot@ev3dev:~$ python3
Python 3.4.2 (default, Oct  8 2014, 14:47:30

ev3dev-lang-python

Python で ev3dev のデバイス、 つまりセンサやモータなどを制御するためには、ev3dev-lang-python というライブラリを使う。

ライブラリを最新にする。

sudo apt-get install --only-upgrade python3-ev3dev

ライブラリのドキュメントは以下。

インタラクティブ

Hello World

まずは、Hello World から。Python インタープリタを起動する。

robot@ev3dev:~$ python3
Python 3.4.2 (default, Oct  8 2014, 14:47:30) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

ライブラリ を import する。

import ev3dev.ev3 as ev3

Hello, World と音をだす。

ev3.Sound.speak('Hello World!').wait()

モーター制御

ev3.LargeMotor でモーターのインスタンスを作成する。

run_timed で、時間指定でモーターを回す。

# インスタンス取得
m = ev3.LargeMotor('outA')

# 3 秒間動かす
m.run_timed(time_sp=3000, speed_sp=500)

時間指定なしでモーターを回すには、run_forever()を使う。止めるには、stop()を使う。

m.run_forever(duty_cycle_sp=30,speed_sp=500)
m.stop()

スクリプト

python3 を使うために、行頭に #!/usr/bin/env python3 を書く。run_motor.py を作成。

#!/usr/bin/env python3
import ev3dev.ev3 as ev3
import time

m = ev3.LargeMotor('outA')
m.run_forever(duty_cycle_sp=50, speed_sp=500)
time.sleep(3)
m.stop()

ターミナルから実行。

python3 run_motor.py

EV3 の本体から、スクリプトを選択して実行することもできる。スクリプトを実行可能にする。

chmod +x run_motor.py

画面から、File Browser を選択して、作成したファイルを選択すると実行できる。

開発環境

いろいろ試したけれども、PyCharm に落ち着きそう。

Emacs

ローカル PC(Ubuntu)の Emacs からリモートサーバの ev3dev のファイルをいじるには、 Emacs の Tramp を使う。

Emacs を起動して、C-x C-f を押してから以下を入力

/ssh:robot@ev3dev.local:

パスワードを聞かれるので maker と入力して Enter.

Windows での方法は、今回は未検証だけど、以下でいけるはず。

これで、ローカルで編集するのと同じ操作でリモートのファイルいじることができる。

追記

しばらくこれでやっていたのだけれども、tramp を使うと入力レスポンスが遅い。ときどきフリーズする。

じゃあサーバに emacs を入れてしまおうとインストールした。

sudo apt-get install -y emacs-nox

これでも遅い。

やっぱりローカルで編集して、編集したものをアップロードする方式がよさそう。

PyCharm

最近 PyCharm が Emacs よりもずっといいと思いはじめた。

PyCharm での 開発設定は以下にまとめられている。

ここには、git 経由で編集するやり方が書いてある。編集と確認のたびにソースをコミットする必要がありそう。

なにかうまい方法はないかと考え中。ローカルで編集したものを rsync でサーバと同期するか。

追記 source sync

うまい手をみつけた。プラグインで、source syncronizer というものがある。

ローカルからサーバへの一方向のアップロードのみできる。インストールは、ファイル > 設定 > プラグインを選択。 source sync を検索してインストールする。

インストールしたら、ツール > source sync を選択。プロトコルを SCP で作成(SFTP だとうまくいかなかった)

  • ホスト: ev3dev.local
  • ホストパス: アップロード先ディレクトリ
  • ユーザ名: robot
  • パスワード: maker

ファイル単位でのアップロードだと漏れがありそうなので、 やっぱり git で版数管理して同期するか、もしくは併用するのがいいかも。

anaconda 環境の設定方法

# ev3 環境を作成
$ conda create -n ev3
$ activate ev3

# python をインストール
$ conda install python

# ev3dev-lang-python をインストール
$ git clone https://github.com/rhempel/ev3dev-lang-python.git
$ cd ev3dev-lang-python
$ python setup.py

作成した仮想環境を PyCharm で利用するには、 ファイル > 設定 > プロジェクト > プロジェクト・インターセプタから、 作成した環境の Python へのパスを通す。

  • ~/anaconda3/envs/ev3/bin/python

なぜか候補に作成した環境があらわれなかったので、 歯車マークを選択して、ローカル追加を選択することで、パスを追加した。

Jupyter Notebook

頑張れば Jupyter Notebook をインストールして使えるようだ。以下のページを参考にした。

試してみたけれども、セルの実行に時間がかかりすぎたり、謎の kernel エラーが発生したりしたのでやめた。

Visual Studio Code

拡張機能で、ローカル PC とサーバのファイルを sync するものがある。これは便利。

21 Jun 2017, 22:04

Ubuntu での PyCharm 日本語化設定

Python の統合開発環境 PyCharm, デフォルトでは英語ですが日本語化できるようだ。

Eclipse で有名な Pleiades が日本語化のプラグインを配布している。

PyCharm を日本語化する手順は、以下。

ところが、Linux の環境について描かれていなくて少し迷ったので、 Linux での PyCharm 日本語化設定を備忘録としてメモしておきます。

環境

  • Ubuntu 16.04
  • PyCharm Communite Edition 2017.1
  • Pleiades 1.7.26

日本語化する手順

  1. Pleiades の配置 ——————

http://mergedoc.osdn.jp/ から Pleiades プラグインの “最新版ダウンロード”をクリックしてダウンロード。

(図を借ります)

zip を解凍。Linux の、p、plugins/jp.sourceforge.mergedoc.pleiades を

(PyCharm を配置したディレクトリ)/plugins 

の配下にコピーする。

  1. 起動オプションの編集 ———————–

PyCharm を起動して、ツールバーから Help : Edit Custom VM Options… を選択する。

これで、(PyCharm を配置したディレクトリ)/bin、p、pycharm.vmoptions というファイルが生成される。

編集画面が開くので、以下をファイルの末尾に貼り付け。

-Xverify:none
-javaage(P(Pleiades を配置した場所のフルパス)/jp.sourceforge.mergedoc.pleiades/pleiades.jar

以上、これで PyCharm を再起動すれば、日本語化されている。

18 Jun 2017, 16:51

MathJax を使って WordPress に org2blog で数式ありの投稿をする

このブログは、org2blog というライブラリを使って、 Emacs org-mode でかかれた文章を HTML に変換して投稿している。

今回、org-mode から HTML へ変換した文章中で 数式を扱う方法を調べてみた。

MathJax をつかう

MathJax とは、javascript でかかれた 数式を表示するためのライブラリ。 Latex なみの数式表現が扱えるようになる。

すべてのブラウザで動作し、表示するクライアント側での設定はいらない。

さらに、MathJax のファイル群のインストールは必要ない。

MathJax は、コンテンツデリバリネットワーク(Contents Delivery Network、CDN)で公開・配信されているので、 JavaScript ライブラリをダウンロードして、サーバーにアップロードといった作業は必要はないのである。

MathJax を使用するには、<html>…</html> タグの中に以下を書く。

<script type="text/javascript" async
  src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML">
</script>

<body>…</body> の中で、MathJax の記法(MathML、LaTeX、ASCIIMathML)を使って数式を書くと、 数式がレンダリングされる。

org-mode で MathJax をつかう

org-mode は MathJax にデフォルトで対応しているようだ(version. 9.0.5)

なので、org-mode の文章中に 数式を 書いて、org-export で HTML 形式で export すればよい。

これに今まで気づかなかったのは、自分の環境では、#+OPTIONS: TeX:nil を指定していたから。 ここは、Tex t でなければいけない。

Default の設定だと参照する MathJax の version が古いらしく、以下の設定で最新が使える。

(setf org-html-mathjax-options
      '((path "https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML")
        (scale "100") 
        (align "center") 
        (indent "2em")
        (mathml nil))
      )
(setf org-html-mathjax-template
      "<script type=\"text/javascript\" src=\"%PATH\"></script>")

org2blog は、html 形式に org-mode の文章を変換してから、WordPress にアップロードする。 org2blog で WordPress に投稿すれば、WordPress 上でも数式が表示される。

Example

\[〜\] で囲んで数式を表示

\[f(a)= \frac{1}{2\pi i}\oint_{\Gamma} \frac{f(z)}{z-a}dz\]

$$f(a)= \frac{1}{2\pi i}\oint_{\Gamma} \frac{f(z)}{z-a}dz$$

\(〜\) で囲んで本文中に表示

\(〜\) で囲んで、本文中に$a$を表示。

参考

あとは、Latex 記法を覚えるだけだ。(これが一番大変)

18 Jun 2017, 07:51

CEM で CartPole-v0 を試したメモ

はじめに

前回の続き。前回はなんの戦略もなく、ただ試した。

今回は、CrossEntropy Method(CEM)をつかって、OpenAI gym の CartPole-v0 を試した。

CrossEntropy Method(CEM)について

クロスエントロピー法は、2006 年に登場したモンテカルロ法を応用したアルゴリズム。

レアなイベントについてサンプリングすることで(政策改善)、 エリートのみであらたなポリシーをつくる(政策評価)するところに特徴がある。

自分のイメージでは、ランダムにシミュレーションして、 ラッキーな場合のみを選び出して、ポリシーに反映させていくように考えている。

Berkeley の John Schulman さん曰く、このアルゴリズムは、

  • Evolutionary algorithm
  • Works embarrassingly well

と、激ホメしている。

アルゴリズム

Schulman さんの講義スライドより引用。

この gist の資料も参考になった。以下、アルゴリズムの定義を引用。

平均(mean)とガウシアンの共分散(sigma)を初期化し、n_iter 回以下を繰り返す。

  1. batch_size 分の theta を mean と sigma からなるガウス分布から集める
  2. noisy evaluation を実施して、これらの theta からの報酬を得る
  3. top p% のサンプルを選択する(これをエリート集合と呼ぶ)
  4. エリート集合の mean と sigma で 現在の値を更新する。

Lab1

Schulman さんの 2016 年 Deep Reinforcement Learning サマースクールの課題をやる。

クロスエントロピーメソッドで cartpole を攻略するためのスターターコードがある。

Code

スターターコードの穴埋め部分を埋めてみた。nv.monitor.clos のコードを参考にした。

Result

結果は、OpenAI Gym にアップロードした。

132.20 ± 6.42. という結果で、合格ラインの 195 には程遠いが、前回よりはずっと改善した。

embarrassingly だ!

参考リンク

18 Jun 2017, 07:51

Python で勾配降下法を使って線形の単回帰分析をしてみた

Python で勾配降下法を使って線形の単回帰分析をしてみた。

はじめに

Siraj Ravel さんの新しい動画シリーズ, “The Math of Intelligence”が始まった。

機械学習のための数学を毎週カバーしていくようだ。シラバスは以下。

数学に苦手意識があるので、おもしろそうなトピックだけ Coding Challenge に取り組んでいこうと思う。

Coding Challenge

初めのトピックは Gradient Descent(勾配降下法)。

昔、勉強したのだけれども、すっかり忘れていた。以下の本がとても今回役に立った。

Coding Challenge は Kaggle のデータで、勾配降下法を使って線形の単回帰分析をすること。

今回 チャレンジした Jupyter Notebook は以下です。

データセット

Kaggle のデータを使うようにとのことなので、入門用のデータセット, House Prices を使っていこうと思う。

とりあえずいちばん簡単な方法を試したいので、家の面積と価格の相関関係に注目することにした。

  • SalePrice - the property’s sale price in dollars. This is the target variable that you’re trying to predict
  • GrLivArea: Above grade (ground) living area square feet

データをプロットしてみると正の相関関係がありそうなので、直線が引けそう。

勾配降下法

本当は、偏微分の数式とか書きたいけれど、数式の書き方がよくわからなかった orz

というわけで、説明抜きでいきなりコードですみません m(._.)m

参考リンクだけはっておきます。この記事のコードを参考にしました。

def calcurate_mean_squared_error(x, y, b, m):
    total_error = 0
    n = y.size
    for i in range(n):
        prediction = m*x[i] + b
        total_error += (y[i] - prediction)**2
    return (1/n) * total_error

def step_gradient(x, y, b, m, learning_rate):
    m_grad = 0
    b_grad = 0
    n = y.size

    #Computes the gradients
    for i in range(n):
        # Partial derivative for m
        m_grad += -(2/n) * x[i] * (y[i] - ((m*x[i]) + b))
        # Partial derivative for b
        b_grad += -(2/n) * (y[i] - (m*x[i]) + b)

    # update m and b
    m = m - (learning_rate * m_grad)
    b = b - (learning_rate * b_grad)    
    return b, m

def gradient_descent_runner(x, y, initial_b, initial_m, learning_rate, num_iterations):
    b = initial_b
    m = initial_m
    past_errors = []
    for i in range(num_iterations):
        b, m = step_gradient(x, y, b, m, learning_rate)
        if(i % 100) == 0:
            error = calcurate_mean_squared_error(x, y, b, m)
            past_errors.append(error)
            print('Error after', i, 'iterations:', error)
    return b, m, past_errors

実験結果

学習率 0.0001 だと収束しなかった。

おかしい。もっともっと学習率を小さくしても収束しない。はじめはバグっているのかと思ったけど、そうではなさそうだ。

num_iterations = 1000
learning_late = 0.0001
print("Starting gradient descent at b = {0}, m = {1}, error = {2}".format(
    initial_b, initial_m, 
    calcurate_mean_squared_error(x, y, initial_b, initial_m)))
print("Running...")
[b, m, errors] = gradient_descent_runner(x, y, initial_b, 
                                 initial_m, learning_late, num_iterations)
print("After {0} iterations b = {1}, m = {2}, error = {3}".format(
    num_iterations, b, m, calcurate_mean_squared_error(x, y, b, m)))
Starting gradient descent at b = 0, m = 1.0, error = 38434358058.74041
Running...
Error after 0 iterations: 9.29730669048e+15

/home/tsu-nera/anaconda3/envs/dlnd/lib/python3.6/site-packages/ipykernel_launcher.py:6: RuntimeWarning: overflow encountered in double_scalars

/home/tsu-nera/anaconda3/envs/dlnd/lib/python3.6/site-packages/ipykernel_launcher.py:9: RuntimeWarning: overflow encountered in double_scalars
  if __name__ == '__main__':
/home/tsu-nera/anaconda3/envs/dlnd/lib/python3.6/site-packages/ipykernel_launcher.py:14: RuntimeWarning: invalid value encountered in double_scalars

Error after 100 iterations: inf
Error after 200 iterations: nan

いろいろ学習率をいじって試した結果、0.000000385 というよくわからない数が最も適切だった。なんだこりゃ?!

標準化をためす

coursera の Machine Learning で、フィーチャースケーリング を習ったことを思い出した。

講座の動画を見返したら多変数の場合を扱っていた。

説明変数が1つでも、有効なのかな?とりあえず、標準化を試してみた。

norm_x = (x - x.mean()) / x.std()

今回は、学習率 0.0001 という、馴染みの値で収束した。うまくいったようだ。

コスト関数の値も plot した。イテレーションを繰り返すごとに減っている。

14 Jun 2017, 11:36

三目並べ(tic-tac-toe) にモンテカルロ法を試した

三目並べ(tic-tac-toe) をモンテカルロ法をつかって学習させました。

元ネタは、これ。

この本のコードは Octave でかかれているのだけれども、それを Python にポーティングしてくれた人がいた。

自分はなにをしたかというと、このコードを OpenAI Gym の tic-tac-toe に対応させてみた(tic-tac-toe は非公式)

ただ移しただけだと動かなかった。それから 10 時間くらいでばっくをしていた。頭がおかしくなる。

コード

おまけ: プルリク奮戦記

じつは、OpenAI Gym の tic-tac-toe リポジトリにバグっぽいのをみつけた。

ピンチ!いやチャンス?

自分は他人の Github リポジトリにプルリクをしたことがないのだ。

まずは気さくな感じを醸し出して質問をしてみた。Hello!! :-)

1 分も立たずに返信が帰ってきたのでビビる。はえーよ!

feel free to provide a PR!!

もうこの言葉が理解できずにガクガクした。なにかへんな英語表現を使っちゃったかな??

大丈夫、PR は Pull Reqest のことだ。って、ぅえ〜〜〜〜〜。やったことないよ〜〜〜。

プルリクエストの作法を調べる。

  1. branch 経由
  2. fork repository 経由

検索上位に引っかかるのは、初心者は branch を切る方法が勧められている。

  1. 初心者向け Github への PullRequest 方法 - Qiita
  2. Pull Request の仕方 - Qiita

バカだから何を思ったのか、fork ポタンをポチリ。。。。。fork してしまったぁぁ!!!

とりあえず、バグの修正をして、fork した自分のリポジトリに push

そして、GUI 画面から PULL REQUEST !!!!

ふう、まつこと数分・・・ 10 分でレスポンスが帰ってきた。もう心臓に悪りーよ。

  • コメントの単語が適切でない
  • 冗長な for 文の回し方をしている

その通りです、なにもいうことはありません。 こっちも急いで修正して、再コミット!!

祈った。。。そうして待つこと 15 分、ついに Merge されました〜〜〜〜!!!

うらららららららららら〜〜〜〜〜〜〜!

10 Jun 2017, 07:49

実践的な強化学習のオンライン学習教材、Practical RL をはじめた

実践的な強化学習の教材、Practical RL をやりはじめた。

これはなに

HSE と Yandex SDA というロシアの大学?で教えられている強化学習のコースが、 オンライン学習のために英語とロシア語で公開されている。

教材は、オンラインで強化学習をするためのリソースのいいとこどりをしている。

各週のディレクトリに動画や pdf のリンクがかかれた README がある。

また、”実践” とつくだけに、各週の課題が Jupyter Notebook で与えられ、OpenAI Gym を活用する。

fast.ai の講座 が予想以上によかったので、実践的とかかれると期待してしまう。

強化学習のコースなのだが、最近の動向に合わせ Deep Learning(DQN) の内容も盛り込まれている。

Deep Learning のためのライブラリは、Lasagne というライブラリが推奨されている。 しかし、Tensorflow 版の課題ノートも公開されている。

シラバス

github の README から抜粋。詳しくは、元サイトへ。

前半で、強化学習の話題をカバーしている。中盤で、Deep Learning の話題が出てくる。後半はよくわからない。

week0 Welcome to the MDP
week1 Crossentropy method and monte-carlo algorithms
week2 Temporal Difference
week3 Value-based algorithms
week4 Approximate reinforcement learning
week5 Deep reinforcement learning
week6 Policy gradient methods
week6.5 RNN recap
week7 Partially observable MDPs
week 8 Case studies 1
week 9 Advanced exploration methods
week 10 Trust Region Policy Optimization.
week 11 Model-based RL: Planning

他のコースとの比較

他のコースと比較検討して Practical RL を進めようと思ったので、その理由も書いておく。

Practical RL のデメリットは、課題 の解答が公開されていないところ。

fork している人のリポジトリを覗いて自分の解答と照らし合わせようかと思ったけれども、 参考になりそうなリポジトリがあまり見つからなかった。

ということで、自分は途中で挫折する可能性が高いので、 このコースに挫折したら次にやることも考えておく。

Learning Reinforcement Learning - WildML

強化学習の主要な話題が Jupyter Notebook と共に提供されている。うれしいことに、解答付きだ。

ただいま作成中のようなのと、学ぶ方法が Sutton 本を読むことに偏っていたのでやめた。

しかし、Practical RL に行き詰まったらこっちにシフトしようかと考えている。

UCL Course on RL

ユニバーシティ・カレッジ・ロンドンの強化学習の講義資料

この動画は、Practical RL の中で何度も引用されていてみることが進められている。

なので、Practical ML を進めたらこの講義内容はカバーできるのと、 課題が見つからなかったので止めた。

追記: 2016 年のページ見つけた。課題もしたのほうにある。

CS 294: Deep Reinforcement Learning, Spring 2017

UC Barkeley の Deep Learning と強化学習を学ぶ講義資料。

強化学習に Deep Learning を使う。ライブラリは Tensorflow.

講義動画がしっかりそろっている。

課題は 4 つある。掲示板も Reddit を使っていて課題につまったときは検索できそう。

これを選ばなかった理由は、Practical RL よりも難しそうな印象を受けたから。 Deep Learning も 強化学習もわからないのに、それを合わせた内容をバンバン紹介されても消化できなさそうだ。

また 、Practical RL からもこのコースの動画や課題(hw3)が紹介されていたので、 うまくつまみぐいできるかと思ったから。

UC Barkeley CS294 Deep Reinforcement Learning

2015 年の Barkeley の Deep Reinforcement Learning

2017 年版の元になったコースだ。内容は、短くまとまっている(4つ??)

UC Berkeley CS188 Intro to AI

2014 年の Berkeley の AI コース。

レクチャー動画や課題はしっかりしている。Project もおもしろそうだ。

扱っているものは、基本的なもので Deep うんたらはでてこないので少し古さは感じる。

An introduction series to Reinforcement Learning (RL) with comprehensive step-by-step tutorials.

Git-Base のチュートリアリル。提供元団体不明。個人かな?

このチュートリアルも作成中のようだが、前半はほぼ完成している。

README とコードベースのチューとリアルなので、 それほど英語力や数学力を求められない、今までで一番やさしそうな印象を受ける。

扱っている話題は、Q-Learning, OpenAI Gym, DQN, Deep Convolutional Q-Learning, ROS などなど、おもしろそうなものばかりだ。

Udacity Reinforcement Learning

MOOC の大御所 Udacity が提供しているコース。

短い動画がたくさんある。二人の掛け合いによって動画が進んでいき、 とっつきやすい感じはある。

課題はなく、短いので、理解が足りないところを補足する目的で見てもみてもいいかも。

Reinforcement Learning: An Introduction - Richard S. Sutton and Andrew G. Barto

言わずと知れた、強化学習のバイブル。これを腰を据えて読むのがいいのかも。

第2版には、サンプルコードが提供されているようだ。ただし、解答はなし。

Udemy Artificial Intelligence A - Z

Udemy の AI コースも, 最新の話題を扱っている。セールのときに 1200 円で買った。

Module 1: "Self Driving Car"
Module 2: "Deep Convolutional Q-Learning"
Module 3: "A3C"

なんと、フレームワークは Pytouch を使う。

  • Module1 では、シミュレータ上の車のライントレースを DQN で行う。
  • Module2 では、OpenAI Gy 上で Deep Convolutional Q-Learning を学ぶ。
  • Module3 では、A3C という発展的な話題を扱う。

これで、1200 円だ。安いと思う。

Simple Reinforcement Learning with Tensorflow

TensorFlow による 強化学習の実装チュートリアル。

以下は内容。コードはここ https://github.com/awjuliani/DeepRL-Agents

  • Part 0 — Q-Learning Agents
  • Part 1 — Two-Armed Bandit
  • Part 1.5 — Contextual Bandits
  • Part 2 — Policy-Based Agents
  • Part 3 — Model-Based RL
  • Part 4 — Deep Q-Networks and Beyond
  • Part 5 — Visualizing an Agent ’ s Thoughts and Actions
  • Part 6 — Partial Observability and Deep Recurrent Q-Networks
  • Part 7 — Action-Selection Strategies for Exploration

09 Jun 2017, 23:09

OpenAI Gym FrozenLake-v0 に 遺伝的アルゴリズム(deap)を試す

タイトルのとおり、OpenAI Gym FrozenLake-v0 に遺伝的アルゴリズムを試しました。

遺伝的アルゴリズム

遺伝的アルゴリズムとは

遺伝的アルゴリズム(genetic algorithm, 略して GA)とは、 組み合わせ問題の最適解を求めるためのアルゴリズム。

具体的には、以下の 2 〜 4 を繰り返すアルゴリズム。

1. 初期設定
2. 選択
3. 交叉
4. 突然変異

詳しくは、他のサイトに説明は譲る。この記事がわかりやすかった。

Python で遺伝的アルゴリズムやるなら Deap

Python で遺伝的アルゴリズムやるなら Deap というライブラリがある。

遺伝的アルゴリズムにも、選択、交叉、突然変異にいろいろな酒類がある。

この辺の話は, Wikipedia が詳しい。

それらをうまく抽象化して扱えるのがこのライブラリ。

解説記事はネット上にたくさんあるのだが OneMax 問題を扱っているものが多い。

なので、OpenAI の FrozenLake-v0 を題材に Deap を使ってみた。

FrozenLake-v0

GA の前に乱数を発生させて、そのポリシーにしたがって進んでいく例を書く。

結果は、こちら。https://gym.openai.com/evaluations/eval_iinFj8fUSvOOYHWXwjjAw

Score が 0.56 で、基準の 0.78 をオーバーしていない。

deap を使った GA

結果は、こちら。https://gym.openai.com/evaluations/eval_uU3CIG5yTgOhOXVM8EG3wA

Score が 0.81 と、基準値をなんとかクリアした。

deap をつかわない GA

結果は、こちら。https://gym.openai.com/evaluations/eval_YpHI9YmhQoSGcKMI1dFsw

なんと Score は 0.91 だ。

ということは、自分の deap をつかった実装はどこかバグってるなぁ?!