Pythonを使って強化学習をする方法を徹底解説

Pythonを使って強化学習をする方法について徹底解説します!
強化学習を始めてみたい!と言う方は是非参考にしてください。

無料で強化学習を試そう

強化学習とは

強化学習とは、機械学習と言われるAI(人工知能)の手法の一つです。
強化学習によって、AIは行動を手に入れると言われているように、いろいろな行動を試してみて、一番いい行動を探し出す(探索)するという学習をします。

強化学習は、最先端で難しそうに感じる強化学習ですが、実際に強化学習を無料で簡単に試すことができるようになっています。
いくつかのステップは必要ですが、是非強化学習を体感してみてください。
強化学習を試すための準備として、以下の作業が必要です。

  • Pythonのインストール
  • Pycharmのインストール
  • ChainerとChainerRLのインストール
  • OpenAI Gymのインストール

Pythonは、AIや機械学習の分野で一般的に使われているプログラミング言語です。
プログラミング言語だけでも開発は可能ですが、それを簡単で便利な環境で実行するのが統合開発環境です。
統合開発環境にはいくつか種類があり、今回ご紹介するPycharmを始め、Anacondaなども有名です。

さらに、強化学習をするためのフレームワーク(ライブラリ)としてChainerとChainerRLを使用します。これらは、深層学習(ディープラーニング)や強化学習のアルゴリズムが実装されているため、数行のコードで深層強化学習を行うこともできます。

最後に、強化学習を行うためのシミュレーション環境がOpenAI Gymです。
強化学習は、どのような行動が最適なのかを見つけ出す学習方法ですので、実際に行動をしてみる実行環境が必要です。OpenAI Gymでは、ブロック崩しのゲームなどを行うためのシミュレーション環境がすでに用意されています。

ここからは、これらのインストール方法を順に見ていきましょう。

Pythonとは?

Python
Pythonは、オープンソースで開発されているフリーのプログラミング言語の一つで、プログラミング言語の中でも「スクリプト言語」と呼ばれています。
Pythonは可読性の高いプログラミング言語で覚えやすいことが特徴です。

Pythonは多くの企業で使われており、アプリやソフトウェアの開発、データサイエンス、IoTの分野、さらには近年注目されているディープラーニングといったAIを支える技術分野でも積極的に活用されています。

Pythonのバージョンについて

Pythonには以下の2つのバージョンが存在します。

  • バージョン2系
  • バージョン3系

現在のPythonの利用状況は、最新のバージョン3系だけはなく古株のバージョン2系も利用されています。

しかし、現在のPythonの開発状況はバージョン3系の開発が積極的に行われており、バージョン2系は2020年にはサポートが打ち切られたため、今後はバージョン3系が広く使われることが予想されます。

Pythonのインストール方法

Pythonの公式サイトへアクセスし、インストーラーをダウンロードします。

「Downloads」で、「Python 3.x.x」を選択します。
Windowsでも今回ご紹介する範囲は対応可能ですので、Pythonのバージョンは3.5に置き換えてインストールをしてみてください。

Pythonのインストール方法

「Files」から、使用しているOS、希望するインストーラーを選択し、インストーラーをダウンロードします。

Files

ダウンロードしたインストーラーを実行します。
「Add Python 3.x to PATH」にチェックを入れ、「Install Now」を押してインストールします。
macOSの場合は、「Add Python 3.x to PATH」にチェックを入れる作業は不要です。

ダウンロードしたインストーラーを実行

ダウンロードしたインストーラーを実行2

インストールが終了したら、「Close」で閉じます。

インストールが終了

Pycharmのインストール方法

今回は、Python向けの統合開発環境「PyCharm」を使用してみます。
PyCharmは、Pythonの統合開発環境(IDE)の一つで、Windows・macOS・Linuxで動作します。
有償の Professional Edition と無償の Community Edition があります。

PyCharmの公式サイトへアクセスし、インストーラーをダウンロードします。

Pycharmのインストール方法

Communityの[Download]を選択します。

Communityの[Download]を選択

ダウンロードしたファイルを実行し、[Next]を選択し、インストールを進めます。
macOSの場合はアイコンをアプリケーションに追加するだけでインストールが完了するため、これ以降の作業は不要です。

ダウンロードしたファイルを実行

デスクトップにショートカットが必要な場合、OSに合わせて32bitか64bitを選択します。
また、「.py」のチェックをONにすると、Pythonファイル(.py)をPyCharmに紐付けられます。
これらのチェックは、不要な方は無しで進んでも問題ありません。

[Next]で進み、インストールします。

インストール

「Run PyCharm Community Edition」のチェックを入れ、[Finish]で完了します。

「Run PyCharm Community Edition」

「Do not import settings」を選択し、[OK]を選択します。

「Do not import setting」

[OK]で確定します。

[ok]で確定

ChainerとChainerRLのインストール方法

「PyCharm」を使用すると、簡単にChainerとChainerRLのライブラリをインストールできます。
[Create New Project]で新しいプロジェクトを作成します。

ChainerとChainerRLのインストール方法

Locationに任意の名前を入力し、[Create]をクリックします。

Locationに任意の名前を入力し、[Create]をクリック

[File] – [Settings]で設定画面を開きます。

[File] – [Settings]で設定画面を開く

「Project :xxx」-「Project Interpreter」で、「+」マークを選択します。

「Project :xxx」 - 「Project Interpreter」で、「+」マークを選択

検索ウィンドウで以下のライブラリを検索し、表示されたライブラリを選択し[Install Package]を選択します。

  • Chainer
  • ChainerRL

[Install Package]を選択

「Package ‘xxxxx’ installed successfully」が表示されたらインストールが完了です。
右上の「×」ボタンでダイアログを閉じます。

「Package ‘xxxxx’ installed successfully」が表示されたらインストールが完了

[OK]でダイアログを閉じます。

[ok]でダイアログを閉じる

OpenAI gymのインストール方法

OpenAI Gymは、単独でインストールすることもできますが、強化学習ライブラリChainerRLにも一部が含まれています。そのため、まず強化学習を簡単に試したい場合には、既にインストールしているChainerRLがあれば試すことができます。

OpenAI Gymについては以下の記事でも詳しくご紹介しておりますので御覧ください。
参考記事:強化学習用シミュレーションライブラリ「OpenAI Gym」の使い方

強化学習を試してみよう:CartPole問題とは?

それでは実際にOpenAI Gymを使って、強化学習のプログラムを試してみましょう。
今回使用するのは、CartPole問題という強化学習を行う上で一番始めによく試される問題です。

OpenAI gymのサイトより、CartPole問題の詳細を確認します。

OpenAI gymのインストール方法

摩擦のないトラックに沿って動くカートにポールが取り付けられており、カートは横向きに+1または-1の力が加えられるようになっていて制御できます。
振り子が倒れないように左右の力を与え、維持できるようにすることが目的です。
ポールが直立したままで維持できたタイムステップごとに+1の報酬が与えられます。
エピソードは、ポールが垂直から15度を超えるときに終了するか、またはカートが中心から2.4ユニット以上移動すると終了します。

動くカートとポール

状態

番号状態最小値最大値
0カートの位置-4.84.8
1カートの速度-InfInf
2ポールの角度-24°24°
3ポールの速度-InfInf

行動

番号行動
0左にカートを押す
1右にカートを押す

報酬

ポールが倒れなければ、1タイムステップごとに1の報酬が得られます。

エピソードの終了条件

  • ポール角が±12°以上になること
  • カートの位置が±2.4を超える(カートの中央がディスプレイの端に達する)
  • エピソードの長さが200以上になった場合

強化学習を試してみよう:CartPole問題を実装してみる

ここでは、CartPole問題を実際にPythonのプログラムを書くことで実装してみます。
まずは強化学習は全くせず、常にカートを右に移動(行動)させるというプログラムを書いてみます。

[File]-[New]で新しくファイルを作成します。

CartPole問題を実装

ダイアログボックスから「Python File」を選びます。

「Python File」

「Name」に「cartpole_practice.py」と入力し[OK]をクリックします。

「cartpole_practice.py」と入力し[OK]

ライブラリをインポートします。

import gym

CartPoleのインスタンスを作成し、状態を初期化します。

#CarPoleの読み取りセット
env = gym.make(“CarPole-v0”)
observation = env.reset()

行動を起こし、行動が行われた後の状態を確認します。
今回は、ずっと右に動かし続ける動作をさせてみます。

#実行
for i in range(50):
action = 1 #右に押す
observation, reward, done, info = env.step(action) #情報を取得
print(“observation = ” + str(observation))
print(“reward = ” + str(reward))

ビジュアライズします。

env.render() #ビジュアライズ

ビジュアライズを終了します。

#終了
env.close()

先ほど書いたソースコードを実行します。

[Run]-[Run]で「cartpole_practice.py」を選択

[Run]-[Run]で「cartpole_practice.py」を選択します。
以下のようなアニメーションが表示されます。

アニメーション

以下のような結果が表示されます。

observation = [ 0.02977195 0.15301161-0.04499931-0.2864956 ]reward = 1.0
observation = [ 0.03283218 0.34874546-0.05072922-0.5930245 ]reward = 1.0
observation = [ 0.03980709 0.54453946-0.06258971-0.90124568]reward = 1.0
observation = [ 0.05069788 0.74045105-0.08061463-1.212927 ]reward = 1.0


強化学習を試してみよう:Q学習でCartPole問題を学習させる方法

CartPole問題の環境が実行できたら、実際にQ学習を使用して学習をさせてみましょう。
Q学習はQテーブルを用意し、その行動価値観数Qを更新していくことで学習を進める手法です。

[File]-[New]で新しくファイルを作成します。

[File]-[New]

ダイアログボックスから「Python File」を選びます。

「Python File」

「Name」に「cartpole.py」と入力し[OK]をクリックします。

「Name」に「cartpole.py」

使用するライブラリをインポートします。

import gym
import numpy as np

CartPole問題のシミュレーション環境を用意します。

# CartPole の読み込み
env = gym.make(“CartPole-v0”)

パラメータを設定します。
max_number_of_steps は、1回の試行のstep数(コマ数)の最大数を指定します。
初期値では1秒間に50コマの試行が行われるため、最大4秒の試行時間となります。

#各パラメータの設定
num_digitized = 4 #各状態の離散数
max_number_of_steps = 200 #1試行のstep数(コマ数)
num_episodes = 500 #最大エピソード回数

初期のQテーブルを用意します。

# Qテーブルの用意
q_table = np.random.uniform(low=-1, high=1, size=(num_digitized**num_digitized, 2))

状態の離散化処理を行ないます。
例えば、カート位置,カート速度,棒の角度,棒の角速度)=(1, 2, 3, 4)だった場合には、

1∗4⁰+2∗4¹+3∗4²+4∗4³=1+8+48+256=313

となり、状態313と定義されます。
つまり、カートと棒の位置や速度は様々に変化しますが、今回の場合、それぞれの位置や速度を4分割しておくことで、状態を1つの数字(Qテーブルの番号)として定義することができます。

#状態の離散化処理
def bins(clip_min, clip_max, num):
return np.linspace(clip_min, clip_max, num + 1)[1:1]def digitize_state(observation):
cart_pos, cart_v, pole_angle, pole_v = observation
cart_pos_digi = np.digitize(cart_pos, bins=bins(-2.4, 2.4, num_digitized))
cart_v_digi = np.digitize(cart_v, bins = bins(-3.0, 3.0, num_digitized))
pole_angle_digi = np.digitize(pole_angle, bins=bins(-0.5, 0.5, num_digitized))
pole_v_digi = np.digitize(pole_v, bins=bins(-2.0, 2.0, num_digitized))return cart_pos_digi + cart_v_digi * num_digitized + pole_angle_digi * num_digitized ** 2 + pole_v_digi * num_digitized ** 3 #状態を表す番号を取得

ε-greedy 法の関数を定義します。
ε-greedy法は、最適な行動を取り続けるとはじめに発見した良さそうな行動のみを取り続けてしまうため、εの値に則ったランダムな行動を行うことでより良い行動がないかを探索する手法です。
εが0.5のとき、50%の確率でQ値に従い、50%の確率でランダムな行動を取ります。

#ε-greedydef get_action(next_state, episode):
next_state = digitize_state(observation)
epsilon = 0.5 * (1 / (episode + 1))
if epsilon <= np.random.uniform(0, 1): #もしεの値より一様乱数のほうが大きければ
next_action = np.argmax(q_table[next_state])# Qテーブルの中で、次に取りうる行動の中で最も価値の高いものを選択
else:
next_action = np.random.choice([0, 1])#それ以外はランダムな行動を取る
return next_action

Qテーブルの更新関数を作成します。

# Qテーブルの更新
def
update_Qtable(q_table, state, action, reward, next_state):
alpha = 0.2
gamma = 0.99
max_Q_next = max(q_table[next_state])
q_table[state, action] = q_table[state, action] + alpha * (
reward + gamma * max_Q_next-q_table[state, action])
return q_table

学習の繰り返しのコードを記載します。
OpenAI gymの初期化と、状態の番号の取得、始めの行動の決定を行ないます。

#実行
for episode in range(num_episodes): #試行数分繰り返す
observation = env.reset() #初期化
state = digitize_state(observation) #倒立振子の状態番号を取得
action = np.argmax(q_table[state]) # Qテーブルの最大要素(0 or 1)を返す
episode_reward = 0 #報酬のリセット

1試行分のループと、報酬の追加を記述します。

for step in range(max_number_of_steps): # 1試行のループ
if episode % 10 == 0: # 10で割り切れたら
env.render() #シミュレーション画像の表示
observation, reward, done, info = env.step(action) # Qテーブルの最大で行動。その結果を変数に格納
#報酬を与える
if done an d step < max_number_of_steps-1:
reward-= max_number_of_steps #棒が倒れたら罰則
episode_reward += reward #報酬を追加

t+1の状態を踏まえ、Qテーブルを更新します。

next_state = digitize_state(observation) # t+1での観測状態を、離散値に変換
q_table = update_Qtable(q_table, state, action, reward, next_state)

ε-greedy法で次の行動を決定します。

action = get_action(next_state, episode) #ε-greedy法で次の行動を決定
state = next_state
if done:
break

エピソードの完了のタイミングで、エピソード数と報酬を表示します。

print(‘episode:’, episode, ‘R:’, episode_reward)

Qテーブルをテキストファイルとして書き出します。

np.savetxt(‘Qvalue.txt’, q_table)

Gymを終了します。

#終了
env.close()
[Run]-[Run]で「cartpole.py」を選択し先ほど書いたソースコードを実行します。

[Run]-[Run]で「cartpole.py」

結果を確認

結果を確認します。

episode: 0 R:-174.0
episode: 1 R:-181.0
episode: 2 R:-191.0
episode: 3 R:-153.0



episode: 496 R: 200.0
episode: 497 R: 200.0
episode: 498 R: 200.0
episode: 499 R: 200.0

Pythonで強化学習が学べるおすすめセミナー

Pythonで強化学習をしたいけど、独学では理解できないところがあるという方はセミナーで講師に教えてもらうのがおすすめです。
強化学習プログラミング講習」はeラーニングなので、自分のペースで学習でき、強化学習の知識から実装まで学ぶことができます。

機械学習用ライブラリ「ChainerRL」「OpenAI Gym」もセミナー内で利用するので、ライブラリも使用してみたいという方にもぴったりのセミナーとなっています。
ぜひPythonで強化学習をきちんと学びたい方はセミナーを検討してみてください。

Pythonの基礎が学べるセミナー

まだ強化学習にまでたどり着けていないという人は、Pythonの基礎が学べる「Python講習」もおすすめです。
Pythonの基礎から実際に作業の自動化まで講座でできるので、講座が完了したら自分1人でPythonを使うことができます。

ぜひPythonを基礎から学びたい方はこちらを受けてみてください。

Pythonで強化学習をしよう まとめ

今回はPythonを使って強化学習をするやり方をご紹介しましたがいかがだったでしょうか。
いくつかの準備は必要でしたが、無料で強化学習のほとんどのことができるなんて、素晴らしい世の中になっていますよね。
是非この機会にPythonをインストールして強化学習の世界に飛び込んでみてください!

最新情報をチェックしよう!