マナティ

作りながら学ぶ強化学習 -初歩からPyTorchによる深層強化学習まで

第3回 try Jupyter!で迷路課題を実装

SEやプログラマ、エンジニア、一般の方を対象に、少しずつ実際にプログラムを作りながら、強化学習および深層強化学習について解説していきます。

本連載をまとめ、さらに多くの記事を追加した書籍『つくりながら学ぶ!深層強化学習』を2018年7月に発売しました!

91985_ext_06_0.jpg
(上の書籍画像をクリックすると購入サイトに移動できます)

はじめに

 前回は、近年強化学習が注目されている理由として、脳の学習理論との関係、そして深層強化学習の発展と応用事例について紹介しました。

 今回からプログラムを実装しながら、強化学習の初歩を学習します。初歩を学習する間は try Jupyter! (トライ・ジュパイターもしくはトライ・ジュピター)と呼ばれるWebブラウザ上でPythonをコーディングできる無料サービスを使用します。強化学習する対象としては、簡単な迷路課題を実装します。

 今回は前半でtry Jupyter!の使い方を説明し、後半で迷路を実装します。

Pythonとtry Jupyter!

Python

 本連載ではPythonと呼ばれるプログラミング言語を使用します。Pythonを使用する理由は主に2つあります。

 1つの理由は、強化学習や機械学習に必要なライブラリ(他人が作ってくれたクラスやメソッド)が、他の言語よりも充実しているからです。2つ目の理由は、多くの方がPythonを利用して強化学習や機械学習を実装しているため、参考になるコードや解説をWeb上で見つけやすいからです。

 本連載の実装を理解するために、読者に事前に必要とする知識・技術は次の3点となります。

  1. if文、for文、while文が理解できる
  2. メソッド(関数)を自分で定義できる
  3. ベクトルや行列の掛け算ができる

つまり、なんらかの初歩的なプログラミング経験と、初歩的な線形代数の知識があれば理解できるように解説します。紙面の都合上、Pythonプログラミングの基礎事項を全て説明することは難しいので、他の書籍 [1]なども参考にしてみてください。

try Jupyter!の紹介

 本連載では強化学習の初歩を学ぶ間、try Jupyter!と呼ばれる無料サービスを利用します。その理由は、インストール作業なしにWebブラウザ上でPythonをコーディングできるからです。

 try Jupyter!はJupyter Notebook(ジュパイター・ノートブックもしくはジュピター・ノートブック)と呼ばれるPythonをコーディングできる無料サービスの公式なお試しクラウドサービスです。Jupyter Notebookも無料のサービスであり、PythonやRといった言語をインタラクティブ(対話的)にコーディングできます。インタラクティブとは、記述したコードをブロックごとに実行して、逐次的にコーディングできるという意味です。元々Jupyter NotebookはIPython(Interactive Python)というサービスでしたが、Python以外のRなどの言語にも対応が広がり、Jupyter Notebookとなりました。

 Pythonや強化学習を学ぶ際には、Python環境を自分のPCにインストールしたり、Anacondaと呼ばれるPythonと機械学習関連ライブラリの一括インストールを使用することが一般的です。しかし、これらをインストールするは手間ですし、最初はすぐに強化学習を体験してもらいたいと考えたのでtry Jupyter!を紹介します。

try Jupyter!の使い方

 try Jupyter!の使い方を説明します。まずはtry Jupyter!のサイトへアクセスしてください。

以下のページが開かれます。

TryJupyter01.JPG
図3.1 try Jupyter! トップ画面

 それでは早速プログラムを作成します。画面右上の[New▼]ボタンをクリックし、ドロップダウンメニューから、[Python 3]をクリックします。

TryJupyter02.JPG
図3.2 try Jupyter! 新たなプログラムの作成手順

 すると以下のコーディングページへと遷移します。コーディングページの緑で囲われた1つの四角領域はセル(Cell)と呼ばれ、プログラムを実行する単位となります。

TryJupyter03.JPG
図3.3 try Jupyter! 新たなプログラムの作成画面

 では一番上のセルの中に、以下のコードを記入してみてください。

x = 2 + 3
y = x * 4

 記入できましたら、Altキーを押しながら、Enterキーを押してみてください(Altキー+Enterキー)。すると以下の図のように、今いるセルが実行され、新たなセルが下側に生成されます。

TryJupyter04.JPG
図3.4 try Jupyter! 1つ目のセルを実行

 ちなみにセルの実行のみで、下側にセルを生成させたくない場合は、Shiftキーを押しながら、Enterキーを押します。また途中で、セルとセルの間に新規セルを追加する場合は、上部メニュー左から4番目の[Insert]をクリックし、[Insert Cell Above](今いるセルの上に新規セルを追加)もしくは、[Insert Cell below](今いるセルの下に新規セルを追加)をクリックします。

 図3.4の状態で1つ目のセルが実行完了されているので、xとyには値が格納されています。xとyの値を表示してみましょう。2つ目のセルに以下のコードを記入してください。

print("xの値は{}です".format(x))
print("yの値は{}です".format(y))

このコードは、Pythonで文章と変数を出力する命令となっています。そして、Altキー+Enterキーを押すと以下の図のように、xとyの値が出力されます。

TryJupyter05.JPG
図3.5 try Jupyter! 2つ目のセルを実行

続いて、ここまで作成したコードを保存して、再度読み込む操作を説明します。

 保存する前に、以下の図を参考に上部メニューの[Untitled]をクリックし、ファイル名を設定します。[Untitled]をクリックすると、ファイル名を変更する画面(モーダル)が表示されるので、ここでは「tryJupyter_saveloadtest」という名前にしてみます。その後、右下の青い[Rename]ボタンをクリックして、ファイル名の設定は完了です。

TryJupyter06.JPG
TryJupyter06a.JPG 図3.6 try Jupyter! ファイル名の変更

 続いて左上メニュー[File]の[Download as]を選び、[Notebook(.ipynb)]をクリックします。するとtryJupyter_saveloadtest.ipynbというファイルがダウンロード保存されます。ダウンロードされたファイルを、自分の使いやすいフォルダー等に移動させておきます。

TryJupyter07.JPG
図3.7 try Jupyter! ファイルの保存

 次に保存したファイルを読み込む方法を説明します。(※ここでは今保存したtryJupyter_saveloadtest.ipynbをアップロードしてみますが、作業を連続して行っている場合は[Files]のリストに「tryJupyter_saveloadtest.ipynb」が既に存在しています。気になる場合はブラウザを立ち上げなおすなどしてみてください。)

 try Jupyter!のトップ画面に移動してください(コーディング画面にいる場合、画面左上のjupyterロゴマークをクリックします)。トップ画面の右上にある[Upload]をクリックするとファイルを選択するウィンドウが表示されるので、読み込みたいファイルを選択します。すると選択したファイルが画面一番上に表示され、その横に青い[Upload]ボタンが表示されます。このボタンをクリックすると選択ファイルがUploadされます。

TryJupyter08.JPG
図3.8 try Jupyter! ファイルの読み込み

 Uploadが完了すると以下の図のようにファイルが選択可能な状態になります。ファイル名をクリックすればファイルのコーディング画面に遷移し、再度編集・実行が可能になります。

TryJupyter09.JPG
図3.9 try Jupyter! ファイルの読み込み完了

 「クラウドサービスにファイルをアップロードすると他人にも見られるのかな?」と心配になりますが、他人からは見えません。このファイルのアップロード操作は自分のブラウザ内で閉じています。そのため、例えば別のブラウザでtry Jupyter!のトップページを開いてみると、先ほどアップロードしたファイルは存在しません。try Jupyter!は、いちいちアップロードしないと再度編集できないので、数日に渡って作成するような規模のプログラムを実装するのには適していませんが、簡単にPythonを試してみる用途にはとてもおすすめです。

 以上、try Jupyter!の使用方法を紹介しました。続いて、強化学習の初歩事項を説明する際に使用する「迷路課題」を実装します。

迷路課題の実装

 実装する迷路課題は以下の図となります。3×3のマス目になっており、赤い壁は通り抜けることができません。S0の地点がスタートであり、右下のS8がゴールとなります。この迷路を緑のプレイヤー(Actor)がゴールを目指して進みます。

maze01.png
図3.10 迷路の初期状態

 この迷路の初期状態を今回は作成します。まず、1つ目のセルに以下のコードを入力してください。その後、Altキー+Enterキーでセルを実行してください。このセルの1行目はコメントです。この部分で何をするのかを説明しています。Pythonのコメント文は行の頭に#をつけます。2行目は、Pythonで図を描画する代表的ライブラリであるmatplotlibのpyplotというクラスをpltという名前で使用しますと宣言しています。3行目は、try Jupyter!上で図が表示されるように設定をしています。

# Jupyterでmatplotlibを使用する宣言と、使用するライブラリの定義
import matplotlib.pyplot as plt
%matplotlib inline

 次に2つ目のセルに以下の内容を入力してください。少し長いので、コピー&ペーストしてくださっても構いません。このセルは先ほど図で紹介した迷路を描画する命令となっています。1行ごとの説明は行いませんが、迷路を図として描くために、赤い壁を直線で描いたり、文字をプロットしたり、現在地を緑の円で描いています。各説明は # ではじまるコメント文をご覧ください。

# 初期位置での迷路の様子

# 図を描く大きさと、図の変数名を宣言
fig = plt.figure(figsize=(5, 5))
ax = plt.gca()

# 赤い壁を描く
plt.plot([1, 1], [0, 1], color='red', linewidth=2)
plt.plot([1, 2], [2, 2], color='red', linewidth=2)
plt.plot([2, 2], [2, 1], color='red', linewidth=2)
plt.plot([2, 3], [1, 1], color='red', linewidth=2)

# 状態を示す文字S0~S8を描く
plt.text(0.5, 2.5, 'S0', size=14, ha='center')
plt.text(1.5, 2.5, 'S1', size=14, ha='center')
plt.text(2.5, 2.5, 'S2', size=14, ha='center')
plt.text(0.5, 1.5, 'S3', size=14, ha='center')
plt.text(1.5, 1.5, 'S4', size=14, ha='center')
plt.text(2.5, 1.5, 'S5', size=14, ha='center')
plt.text(0.5, 0.5, 'S6', size=14, ha='center')
plt.text(1.5, 0.5, 'S7', size=14, ha='center')
plt.text(2.5, 0.5, 'S8', size=14, ha='center')
plt.text(0.5, 2.3, 'START', ha='center')
plt.text(2.5, 0.3, 'GOAL', ha='center')

# 描画範囲の設定と目盛りを消す設定
ax.set_xlim(0, 3)
ax.set_ylim(0, 3)
plt.tick_params(axis='both', which='both', bottom='off', top='off',
                labelbottom='off', right='off', left='off', labelleft='off')

# 現在値S0に緑丸を描画する
line, = ax.plot([0.5], [2.5], marker="o", color='g', markersize=60)

 上記内容のセルを実行すると迷路の初期状態が描画されます。

TryJupyter10.JPG
図3.11 迷路の初期状態の描画

 以上、今回はインストール作業なしにすぐにPythonを実装できるtry Jupyter!の使い方を説明し、今後 強化学習の説明で使用する迷路課題の初期状態描画を実装しました。次回は迷路内をランダムに探索してゴールを目指すプログラムの実装と、迷路を移動する様子を動画にするプログラムを実装します。

引用

著者プロフィール

株式会社電通国際情報サービス ⼩川雄太郎(著者)
株式会社電通国際情報サービス(ISID)、技術本部 開発技術部に所属。ディープラーニングをはじめとした機械学習関連技術の研究開発・技術支援、およびHR techに関するデータ解析を業務とする。明石高専、東京大学工学部を経て、東京大学大学院新領域創成科学研究科、神保・小谷研究室にて、脳機能計測および計算論的神経科学の研究に従事し、2016年博士号(科学)を取得。東京大学特任研究員を経て、2017年4月より現職。JDLA DeepLearning for GENERAL 2017。