マイノート

いろいろ勉強したことをまとめていきます

MENU

Q学習

Q学習概要(詳細は後述)

  • 強化学習のアルゴリズムの一種

  • 行動価値を更新する際に、遷移先の状態の最大の行動価値 を用いて更新するのが特徴

Q学習のアルゴリズム

  1. エージェントは現在の状態sの行動価値Q(s)に基づいて行動選択(例ε-greedy 詳細は参考文献参照)

  2. 行動の実行

  3. 環境から現在の状態s'と報酬rを得る

  4. 得られたs'、rを元にQ(s,a)を以下の更新式により学習。ここでは、遷移先(s')の状態の最大の行動価値も用いる

\begin{equation} Q(s,a) = (1 - \alpha)Q(s,a) + \alpha(r + max_{a' \in A}Q(s',a')) \end{equation}

ちなみに式変形するとよく見るQ学習の式になる

\begin{equation} Q(s,a) = Q(s,a) + \alpha(r + max_{a' \in A}Q(s',a')-Q(s,a)) \end{equation}

Q学習についてのその他補足

  • モデルフリーの強化学習

    • 環境のモデルがいらない
  • off-policy

参考文献

www.tcom242242.net

【編集中】EMアルゴリズム

※編集中

概要

  • 2つの変数からなる確率分布p(x,z)が与えられている.

  • しかし、我々が観測可能なのはXのみ観測可能であり、Zは実際には見えない。

  • Xしか観測できないが、p(x,y)の推定を行う

  • 尤度関数 $l(\theta)$ の最大化を行う

\begin{align} l(\theta) &= \sum_{i} \ln p(x^i;\theta) \\ &= \sum_{i} \ln \sum_{z^i} p(x^i,z^i;\theta) \end{align}

  • z が観測できないため、上記の尤度関数を単純に最大化することが難しい

  • そこで、以下のような方法を用いる

  • アルゴリズムの概略

    • $l(\theta)$ の最大化を _一度_ で行わず、$l(\theta)$ の _下限_ を求める.

    • 下限を最大化するようなパラメータを求める.

    • 求めたパラメータでその他のパラメータを更新する.

    • 上記の3つの方法を収束するまで繰り返す.

  • EMアルゴリズムを簡易的なイメージを用いて説明してくれてるスライドがあった

http://yagays.github.io/blog/2013/12/15/mlac-2013-em-algorithm/

もう少し詳しく

\begin{equation} l(\theta) = \sum_{i} \ln \sum_{z^i} p(x^i,z^i;\theta) \end{equation}

確率分布 $Q_i(z^i)$ を考える

\begin{equation} l(\theta) = \sum_{i} \ln \sum_{z^i} Q_i(z^i) \frac{p(x^i,z^i;\theta)}{Q_i(z^i)} \end{equation}

次にイェンゼンの不等式を用いると、尤度の下限を求めることができる。

\begin{equation} l(\theta) \geq \sum_{i}\sum_{z^i} Q_i(z^i) \ln \frac{p(x^i,z^i;\theta)}{Q_i(z^i)} \end{equation}

上記の尤度 _$l(\theta)$_ の下限を最大化する。

EMアルゴリズム

Eステップ

$Q_i(z^i)$ は、

\begin{equation} Q_i(z^i) = \frac{p(x^i,z^i;\theta)}{\sum_z p(x^i,z;\theta)} \end{equation}

Mステップ

尤度関数の下限を最大化するパラメータを求める

\begin{equation} \theta := arg max_{\theta} \sum_{i}\sum_{z^i} Q_i(z^i) \ln \frac{p(x^i,z^i;\theta)}{Q_i(z^i)} \tag{2.1} \end{equation}

EステップとMステップを対数尤度関数の下限、もしくは上記のパラメータが収束するまで、繰り返す.

簡単な証明

尤度が単調増加することを簡単に説明

\begin{equation} l(\theta^{(t+1)}) \geq \sum_{i}\sum_{z^i} Q_i(z^i) \ln \frac{p(x^i,z^i;\theta^{(t+1)})}{Q_i(z^i)} \end{equation}

(2.1) から

\begin{equation} \geq \sum_{i}\sum_{z^i} Q_i(z^i) \ln \frac{p(x^i,z^i;\theta^{t})}{Q_i(z^i)} \\ = l(\theta^{(t)}) \end{equation}

よって、尤度は単調に増加していく

【編集中】LSTMについて

※編集中

LSTMの処理の大まかな流れ

①忘却候補の決定

②新たな情報の判定

③実際にセルの状態の忘却と新しい記憶

④出力する値の決定

メモ

  • どの値を残すか決定するW_f なども逆伝搬により学習する

参考

http://s0sem0y.hatenablog.com/entry/2017/05/06/182757 http://colah.github.io/posts/2015-08-Understanding-LSTMs/

強化学習の枠組み

強化学習は一言で言うと、試行錯誤しながら、最適な行動を学習する学習アルゴリズム です。

何かしらの行動をし、その行動に対する報酬(正解ではない)を受け取り、その行動を 報酬値によって「強化」 していきます。

一番シンプルな強化学習のフレームワークとしては、以下のようになります。

1. 行動の選択(高い報酬を貰えそうな行動を優先的に)

などの多くの手法があります。

2. 実際に行動

3. 行動によって変化した状態と、報酬を受け取る

4. 報酬から学習する

  • Q学習
  • actor-critic

などの多くの手法があります。

5. 上記を繰り返し、報酬値が最大になるような行動を学習する

【keras】keras-rlでcartpole問題

目的

  • keras-rlを試したい

背景

keras-rlとは

kerasを用いて、deep q networkが実装されているossです。

ただ、ここ最近は更新されていないようです。

install方法

pip install h5py
pip install keras-rl
注意点

kerasの2.0に対応していないようです!
なので、kerasのバージョン1.2.0をインストールして使ってみます。

pip install keras==1.2.0

OpenAI Gym

強化学習のベンチマーク問題を集めたOSSです。

keras-rlの強化学習エージェントを解かせる問題は、 OpenAI Gymのインターフェースに準じて作成する必要がある。

OpenAI Gymでのインストール方法

pip install gym

cartpoleとは

名前の通り、cartに上にpoleがあって、
poleが倒れないように、うまくcartをコントロールする問題です。

エージェントはタイムステップ毎に状態(詳しくは参考サイトを参照)と報酬を受け取り、学習します。

以下のサイトがcartpoleについての説明はわかりやすいです。
http://qiita.com/namakemono/items/9b75d1c0c98916b396ba

実験、

ソースコード(DQN)

keras-rlのexmplesに格納されているサンプルプログラムに
多少コメントを加えたものです。

import numpy as np
import gym

from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten
from keras.optimizers import Adam

from rl.agents.dqn import DQNAgent
from rl.policy import BoltzmannQPolicy
from rl.memory import SequentialMemory


ENV_NAME = 'CartPole-v0'

env = gym.make(ENV_NAME)
np.random.seed(123)
env.seed(123)
nb_actions = env.action_space.n # アクション数

# モデルの定義
model = Sequential()
model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(nb_actions))
model.add(Activation('linear'))
print(model.summary())

memory = SequentialMemory(limit=50000, window_length=1) # experience reply で用いるmemory
policy = BoltzmannQPolicy() # 行動選択手法の定義
dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10,
               target_model_update=1e-2, policy=policy)
dqn.compile(Adam(lr=1e-3), metrics=['mae'])

history = dqn.fit(env, nb_steps=50000, visualize=True, verbose=2) # 学習。ここでnb_stepsは全エピソードのステップ数の合計が50000(だと思う)

dqn.save_weights('dqn_{}_weights.h5f'.format(ENV_NAME), overwrite=True)

dqn.test(env, nb_episodes=5, visualize=True)

実験結果

上記のソースコードをただ実行すると、以下のような結果をプロットします。 うまく学習できているようです。

省略

Testing for 5 episodes ...
Episode 1: reward: 200.000, steps: 200
Episode 2: reward: 200.000, steps: 200
Episode 3: reward: 200.000, steps: 200
Episode 4: reward: 200.000, steps: 200
Episode 5: reward: 200.000, steps: 200

エピソード毎の報酬の変化の推移

エピソード毎の報酬の変化の推移をプロットしてみました。(参考程度) f:id:ttt242242:20170905060828p:plain

徐々に累計報酬は上昇しているように見えます。
ただ、もちろん試行錯誤しながら、学習しているので、突然報酬が減少したりもしてます。
これは、探査を行ったためだと考えられます。