iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0
AI & Data

從根本學習Reinforcement Learning系列 第 7

[Day07]On-Policy and Off-Policy

  • 分享至 

  • xImage
  •  

前言

昨天我們用https://chart.googleapis.com/chart?cht=tx&chl=%5Cepsilon-greedy來當作我們的目標policy,並用同樣的policy來與環境互動,這樣跟我們的目標好像有點衝突,一邊要學習optimal policy;一邊又要保持https://chart.googleapis.com/chart?cht=tx&chl=%5Cepsilon-soft來進行exploration。

實際上,我們可以將目標policy與互動用的policy分開,幫助我們同時進行exploration與exploitation,稱為off-policy;而之前用同個policy同時當作目標policy與行為policy的方法就稱為on-policy

Importance Sampling

在進入off-polciy之前,必須先了解importance sampling的概念。我們將policy分成兩個,

  • 與環境互動的policy稱為behavior policy,我們寫作https://chart.googleapis.com/chart?cht=tx&chl=b(a%5C%20%5Cmid%5C%20s)
  • 而我們要學習的optimal policy稱為target policy,我們寫作https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi(a%5C%20%5Cmid%5C%20s)

如果我們用behavior policy來當作與環境互動的行為的話,求出來的https://chart.googleapis.com/chart?cht=tx&chl=G_%7Bt%7D期望值為https://chart.googleapis.com/chart?cht=tx&chl=V_%7Bb%7D(s),但我們想要知道的應該是https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(s)才對。
透過importance sampling,我們可以某個分布中採樣,並用來估測另一個分布中的值。

簡單的推導可以看下圖
https://ithelp.ithome.com.tw/upload/images/20200906/20129922znkT2JNYWq.png
https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi取樣的期望值為從https://chart.googleapis.com/chart?cht=tx&chl=b分布中取樣在乘上兩個分布的比例https://chart.googleapis.com/chart?cht=tx&chl=p(X)https://chart.googleapis.com/chart?cht=tx&chl=p(X)被稱為importance ratio

上述公式可以擴展到https://chart.googleapis.com/chart?cht=tx&chl=G_%7Bt%7D的期望值,因為https://chart.googleapis.com/chart?cht=tx&chl=G_%7Bt%7D為時間https://chart.googleapis.com/chart?cht=tx&chl=thttps://chart.googleapis.com/chart?cht=tx&chl=T的累積reward,而每次reward的回傳也會因policy的不同而不同,所以我們的importance ratio必須考慮到時間https://chart.googleapis.com/chart?cht=tx&chl=thttps://chart.googleapis.com/chart?cht=tx&chl=T的轉移機率,寫作
https://ithelp.ithome.com.tw/upload/images/20200906/201299224Xr1Tf5pOF.png
帶回剛剛推導的期望值公式,得到
https://ithelp.ithome.com.tw/upload/images/20200906/20129922SXqV9kIS4Q.png
就能利用behavior policy來估測target policy的值囉!

Off-Policy Monte Carlo

昨天介紹的monte carlo稱為on-policy monte carlo,on-polciy方法的target policy與behavior policy相同,故稱為on-policy。

現在我們來實現off-policy版本的monte carlo
把target policy和behavior policy分開,一個為我們的目標policy,一個為與環境互動用的policy。

https://ithelp.ithome.com.tw/upload/images/20200906/20129922SXqV9kIS4Q.png
根據上面的公式,期望值可以跟on-policy monte carlo一樣用一般平均來算,但在這裡我們改用加權平均數來計算,表示為
https://ithelp.ithome.com.tw/upload/images/20200906/20129922hhbH2C9EKi.png
其中https://chart.googleapis.com/chart?cht=tx&chl=J(s)指的是在state https://chart.googleapis.com/chart?cht=tx&chl=s下的timestep集合

加權平均數的variance會比直接平均來的小,可以參考Sutton書中p105

另外,加權平均數也可以用incremental的方式來計算,可以參考裡的weighted mean部分,這邊就不做另外的推導。

將上面的內容寫成新的演算法如下:
https://ithelp.ithome.com.tw/upload/images/20200906/20129922yqnEyXvzFR.png

其中

  • epsiode是根據https://chart.googleapis.com/chart?cht=tx&chl=b而不是https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi來決定
  • https://chart.googleapis.com/chart?cht=tx&chl=q(s%5C%20%2C%5C%20a)的更新方式就是以incremental與weighted mean來實現
  • https://chart.googleapis.com/chart?cht=tx&chl=W為importance ratio,跟https://chart.googleapis.com/chart?cht=tx&chl=G_%7Bt%7D一樣從epsiode的結尾往回計算比較方便
  • https://chart.googleapis.com/chart?cht=tx&chl=C(S_%7Bt%7D%2C%5C%20A_%7Bt%7D)https://chart.googleapis.com/chart?cht=tx&chl=W_%7Bt%7Dhttps://chart.googleapis.com/chart?cht=tx&chl=W_%7BT%7D的和
  • target policy是將greedy action的機率設為1的方式更新
  • 因為是greedy action,所以當https://chart.googleapis.com/chart?cht=tx&chl=A_%7Bt%7D%20%5C%20%5C%20%5Cneq%5C%20%5C%20%20%5Cpi(S_%7Bt%7D)時,https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi(A_%7Bt%7D%5C%20%5Cmid%5C%20S_%7Bt%7D)%20%3D%200,造成https://chart.googleapis.com/chart?cht=tx&chl=W%20%3D%200,故後面都不需要更新,可以直接break

Blackjack

用新的off-policy monte carlo來看看結果跟昨天是否一樣

import gym
import numpy as np
import sys
from collections import defaultdict

env = gym.make('Blackjack-v0')

num_episodes = 500000
gamma = 1.0
epsilon = 0.2

returns_sum = defaultdict(float)
returns_count = defaultdict(float)
Q = defaultdict(lambda: np.zeros(env.action_space.n))
C = defaultdict(lambda: np.zeros(env.action_space.n))
behavior = defaultdict(lambda: np.ones(env.action_space.n) / env.action_space.n)
target = defaultdict(lambda: np.ones(env.action_space.n) / env.action_space.n)

for i in range(num_episodes):
    state = env.reset()
    episode = []
    while True:
        action = np.random.choice(np.arange(env.action_space.n), p = behavior[state])
        next_state, reward, done, info = env.step(action)
        episode.append((state, action, reward))
        if done:
            break
        state = next_state
    update(episode)
    #first_visit_update(episode)
    #every_visit_update(episode)
    print(f'\repisode: {i + 1}/{num_episodes}', end = '')
    sys.stdout.flush()

上面是與昨天的程式碼很像,把first_visit_updateevery_visit_update改成off policy的update、增加C變數用來實現incremental的部分以及將原本policy改成behavior policy與target policy兩種

這邊實現的是every visit的off policy版本

def update(episode):
    G = 0
    W = 1
    for idx, (state, action, reward) in enumerate(episode[::-1]):
        G = gamma * G + reward
        C[state][action] += W
        Q[state][action] += (W / C[state][action]) * (G - Q[state][action])
        pi_S = np.argmax(Q[state])
        target[state] = np.zeros(env.action_space.n)
        target[state][pi_S] = 1
        if action != pi_S:
            break
        W = W * 1. / behavior[state][action]

update部分直接參考演算法實作

# evaluation
win = 0
for i in range(num_episodes):
    state = env.reset()
    while True:
        action = np.argmax(target[state])
        next_state, reward, done, info = env.step(action)
        if reward == 1:
            win += 1
        if done:
            break
        state = next_state
print(f'\nWin Rate: {win / num_episodes}')

最後用target policy評估勝率,跟on-policy一樣為43%左右。

總結

on-policy和off-policy的概念在之後的q learning與sarsa中也會看到,強化學習演算法的一種分類。
明天將會進到強化學習裡最有名的Temporal-Difference Learning(TD Learning),將會用到之前教的所有概念,來實現簡單又快速的演算法,所以前面有不懂得趕快回去複習或發文喔!


上一篇
[Day06]蒙地卡羅方法
下一篇
[Day08]時序差分學習
系列文
從根本學習Reinforcement Learning12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言