2018.01.09
作りながら学ぶ強化学習 -初歩からPyTorchによる深層強化学習まで
第3回 try Jupyter!で迷路課題を実装
SEやプログラマ、エンジニア、一般の方を対象に、少しずつ実際にプログラムを作りながら、強化学習および深層強化学習について解説していきます。
本連載をまとめ、さらに多くの記事を追加した書籍『つくりながら学ぶ!深層強化学習』を2018年7月に発売しました!
はじめに
前回は、近年強化学習が注目されている理由として、脳の学習理論との関係、そして深層強化学習の発展と応用事例について紹介しました。
今回からプログラムを実装しながら、強化学習の初歩を学習します。初歩を学習する間は try Jupyter! (トライ・ジュパイターもしくはトライ・ジュピター)と呼ばれるWebブラウザ上でPythonをコーディングできる無料サービスを使用します。強化学習する対象としては、簡単な迷路課題を実装します。
今回は前半でtry Jupyter!の使い方を説明し、後半で迷路を実装します。
Pythonとtry Jupyter!
Python
本連載ではPythonと呼ばれるプログラミング言語を使用します。Pythonを使用する理由は主に2つあります。
1つの理由は、強化学習や機械学習に必要なライブラリ(他人が作ってくれたクラスやメソッド)が、他の言語よりも充実しているからです。2つ目の理由は、多くの方がPythonを利用して強化学習や機械学習を実装しているため、参考になるコードや解説をWeb上で見つけやすいからです。
本連載の実装を理解するために、読者に事前に必要とする知識・技術は次の3点となります。
- if文、for文、while文が理解できる
- メソッド(関数)を自分で定義できる
- ベクトルや行列の掛け算ができる
つまり、なんらかの初歩的なプログラミング経験と、初歩的な線形代数の知識があれば理解できるように解説します。紙面の都合上、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!のサイトへアクセスしてください。
以下のページが開かれます。
それでは早速プログラムを作成します。画面右上の[New▼]ボタンをクリックし、ドロップダウンメニューから、[Python 3]をクリックします。
図3.2 try Jupyter! 新たなプログラムの作成手順
すると以下のコーディングページへと遷移します。コーディングページの緑で囲われた1つの四角領域はセル(Cell)と呼ばれ、プログラムを実行する単位となります。
図3.3 try Jupyter! 新たなプログラムの作成画面
では一番上のセルの中に、以下のコードを記入してみてください。
x = 2 + 3 y = x * 4
記入できましたら、Altキーを押しながら、Enterキーを押してみてください(Altキー+Enterキー)。すると以下の図のように、今いるセルが実行され、新たなセルが下側に生成されます。
ちなみにセルの実行のみで、下側にセルを生成させたくない場合は、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の値が出力されます。
続いて、ここまで作成したコードを保存して、再度読み込む操作を説明します。
保存する前に、以下の図を参考に上部メニューの[Untitled]をクリックし、ファイル名を設定します。[Untitled]をクリックすると、ファイル名を変更する画面(モーダル)が表示されるので、ここでは「tryJupyter_saveloadtest」という名前にしてみます。その後、右下の青い[Rename]ボタンをクリックして、ファイル名の設定は完了です。
続いて左上メニュー[File]の[Download as]を選び、[Notebook(.ipynb)]をクリックします。するとtryJupyter_saveloadtest.ipynbというファイルがダウンロード保存されます。ダウンロードされたファイルを、自分の使いやすいフォルダー等に移動させておきます。
次に保存したファイルを読み込む方法を説明します。(※ここでは今保存したtryJupyter_saveloadtest.ipynbをアップロードしてみますが、作業を連続して行っている場合は[Files]のリストに「tryJupyter_saveloadtest.ipynb」が既に存在しています。気になる場合はブラウザを立ち上げなおすなどしてみてください。)
try Jupyter!のトップ画面に移動してください(コーディング画面にいる場合、画面左上のjupyterロゴマークをクリックします)。トップ画面の右上にある[Upload]をクリックするとファイルを選択するウィンドウが表示されるので、読み込みたいファイルを選択します。すると選択したファイルが画面一番上に表示され、その横に青い[Upload]ボタンが表示されます。このボタンをクリックすると選択ファイルがUploadされます。
Uploadが完了すると以下の図のようにファイルが選択可能な状態になります。ファイル名をクリックすればファイルのコーディング画面に遷移し、再度編集・実行が可能になります。
「クラウドサービスにファイルをアップロードすると他人にも見られるのかな?」と心配になりますが、他人からは見えません。このファイルのアップロード操作は自分のブラウザ内で閉じています。そのため、例えば別のブラウザでtry Jupyter!のトップページを開いてみると、先ほどアップロードしたファイルは存在しません。try Jupyter!は、いちいちアップロードしないと再度編集できないので、数日に渡って作成するような規模のプログラムを実装するのには適していませんが、簡単にPythonを試してみる用途にはとてもおすすめです。
以上、try Jupyter!の使用方法を紹介しました。続いて、強化学習の初歩事項を説明する際に使用する「迷路課題」を実装します。
迷路課題の実装
実装する迷路課題は以下の図となります。3×3のマス目になっており、赤い壁は通り抜けることができません。S0の地点がスタートであり、右下のS8がゴールとなります。この迷路を緑のプレイヤー(Actor)がゴールを目指して進みます。
この迷路の初期状態を今回は作成します。まず、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)
上記内容のセルを実行すると迷路の初期状態が描画されます。
以上、今回はインストール作業なしにすぐにPythonを実装できるtry Jupyter!の使い方を説明し、今後 強化学習の説明で使用する迷路課題の初期状態描画を実装しました。次回は迷路内をランダムに探索してゴールを目指すプログラムの実装と、迷路を移動する様子を動画にするプログラムを実装します。
引用
- [1]実践力を身につける Pythonの教科書 (著)クジラ飛行机 マイナビ出版