iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
AI & Data

從根本學習Reinforcement Learning系列 第 4

[Day04]動態規劃

  • 分享至 

  • xImage
  •  

前言

今天會透過Dynamic Programming來解Bellman Function,理解Policy Iteration的原理,並簡單介紹明天會用到的taxi環境。

GridWorld

用簡單的grid world當作例子
https://ithelp.ithome.com.tw/upload/images/20200904/201299223ryOk9aPrn.png

沒有Final State,所以是一種Continuing Task。
每個State皆有Left, Right, Top, Down四個行為,每個行為的轉移機率都是deterministic(確定性)的,
也就是https://chart.googleapis.com/chart?cht=tx&chl=p(s%5E%7B'%7D%5C%20%2C%5C%20r%5C%20%5Cmid%5C%20%5C%20s%5C%20%2C%5C%20a)皆為1。並會移動到下個格子。
只要該行為下個State為https://chart.googleapis.com/chart?cht=tx&chl=S_%7B3%7Dhttps://chart.googleapis.com/chart?cht=tx&chl=S_%7B4%7D的話,Reward為-1;下個State為https://chart.googleapis.com/chart?cht=tx&chl=S_%7B9%7B的話,Reward為1;其餘Reward皆為0。

聯立方程式

一個很直覺的求Value Function方法就是解聯立方程式。可以把每個State的Bellman Function都列出來
(https://chart.googleapis.com/chart?cht=tx&chl=%5Cgamma%20%3D%200.7)
https://ithelp.ithome.com.tw/upload/images/20200904/20129922lEi90VVjMd.png

  • https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(S_%7B1%7D)%3D%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B1%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%20%2B0.7V_%7B%5Cpi%7D(S_%7B1%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B2%7D))%2B%5Cfrac%7B1%7D%7B4%7D(-1%2B0.7V_%7B%5Cpi%7D(S_%7B4%7D))
  • https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(S_%7B2%7D)%3D%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B1%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B2%7D))%2B%5Cfrac%7B1%7D%7B4%7D(-1%2B0.7V_%7B%5Cpi%7D(S_%7B3%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B5%7D))
  • https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(S_%7B3%7D)%3D%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B2%7D))%2B%5Cfrac%7B1%7D%7B4%7D(-1%2B0.7V_%7B%5Cpi%7D(S_%7B3%7D))%2B%5Cfrac%7B1%7D%7B4%7D(-1%2B0.7V_%7B%5Cpi%7D(S_%7B3%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B6%7D))
  • https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(S_%7B4%7D)%3D%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B1%7D))%2B%5Cfrac%7B1%7D%7B4%7D(-1%2B0.7V_%7B%5Cpi%7D(S_%7B4%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B5%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B7%7D))
  • https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(S_%7B5%7D)%3D%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B2%7D))%2B%5Cfrac%7B1%7D%7B4%7D(-1%2B0.7V_%7B%5Cpi%7D(S_%7B4%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B6%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B8%7D))
  • https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(S_%7B6%7D)%3D%5Cfrac%7B1%7D%7B4%7D(-1%2B0.7V_%7B%5Cpi%7D(S_%7B3%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B5%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B6%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B1%2B0.7V_%7B%5Cpi%7D(S_%7B9%7D))
  • https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(S_%7B7%7D)%3D%5Cfrac%7B1%7D%7B4%7D(-1%2B0.7V_%7B%5Cpi%7D(S_%7B4%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B7%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B7%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B8%7D))
  • https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(S_%7B8%7D)%3D%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B5%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B7%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B8%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B1%2B0.7V_%7B%5Cpi%7D(S_%7B9%7D))
  • https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(S_%7B9%7D)%3D%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B6%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B0%2B0.7V_%7B%5Cpi%7D(S_%7B8%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B1%2B0.7V_%7B%5Cpi%7D(S_%7B9%7D))%2B%5Cfrac%7B1%7D%7B4%7D(%2B1%2B0.7V_%7B%5Cpi%7D(S_%7B9%7D))

9個未知數,9個方程式,可以解聯立方程式來求https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D(s)

如果把https://chart.googleapis.com/chart?cht=tx&chl=%5Cgamma設為1會發生甚麼事?該方程式無解!

Optimal Policy

我們可以從現在Value Function來得到比現在的Policy(https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi)更好的Policy(https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi%5E%7B'%7D)

更好的Policy指的是https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%5E%7B'%7D%7D(s)%20%5Cgeq%20V_%7B%5Cpi%7D(s)%20 for all https://chart.googleapis.com/chart?cht=tx&chl=s%20%5Cin%20S

https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi%5E%7B'%7D將每個State上的Action都往Action-Value最大的方向走,將該Action的機率設為100%,其他Action皆為0%:
https://ithelp.ithome.com.tw/upload/images/20200904/20129922GJhREWZibH.png

此Deterministic Action稱為greedy action

https://chart.googleapis.com/chart?cht=tx&chl=S_%7B5%7D上觀察,假如一開始https://chart.googleapis.com/chart?cht=tx&chl=S_%7B5%7D為隨機策略,每個方向的機率都為25%。算完Value Function後,發現https://chart.googleapis.com/chart?cht=tx&chl=q_%7B%5Cpi%7D(s%2C%20%5C%20%5C%20a_%7Bdown%7D)的值最大,如果現在將新的Policyhttps://chart.googleapis.com/chart?cht=tx&chl=%5Cpi%5E%7B'%7D裡的https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi%5E%7B'%7D(a_%7Bdown%7D%5C%20%5Cmid%5C%20%5C%20s_%7B5%7D)%20%3D%20100%25,其他State都不變的話,原本只有25%的Value從https://chart.googleapis.com/chart?cht=tx&chl=S_%7B8%7D得到,現在100%就可以保證新的Policy可以讓https://chart.googleapis.com/chart?cht=tx&chl=S_%7B5%7D的Value更大。

假如現在根據https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi%5E%7B'%7D我們求出新的Action-Value Function ,發現https://chart.googleapis.com/chart?cht=tx&chl=q_%7B%5Cpi%5E%7B'%7D%7D(s%2C%20%5C%20%5C%20a_%7Bright%7D)https://chart.googleapis.com/chart?cht=tx&chl=q_%7B%5Cpi%5E%7B'%7D%7D(s%2C%20%5C%20%5C%20a_%7Bdown%7D)還要大,只要新的Policy(https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi%5E%7B''%7D)在https://chart.googleapis.com/chart?cht=tx&chl=S_%7B5%7D上的行為改成https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi%5E%7B''%7D(a_%7Bright%7D%5C%20%5Cmid%5C%20%5C%20s_%7B5%7D)%20%3D%20100%25的話,根據Bellman Function,Action-Value上的值是依據下一個State的值與Reward來決定的,所以選擇最大的Action-Value的方向可以保證下個Value Function的值比現在還大。

詳細證明可參考這裡

上面這種根據https://chart.googleapis.com/chart?cht=tx&chl=%5Cpihttps://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7D,再用https://chart.googleapis.com/chart?cht=tx&chl=V_%7B%5Cpi%7Dhttps://chart.googleapis.com/chart?cht=tx&chl=%5Cpi%5E%7B''%7D的過程稱為Policy Iteration

可以擴展成
https://ithelp.ithome.com.tw/upload/images/20200904/20129922OzQKPJnK2O.png

  • https://ithelp.ithome.com.tw/upload/images/20200904/20129922H67hwQnQSZ.png稱為policy evaluation
  • https://ithelp.ithome.com.tw/upload/images/20200904/20129922motrlXBP17.png稱為policy improvement

通過這個過程,最後Policy會收斂,這個Policy就稱為Optimal Policy,Policy與Value Function可以寫作https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi_%7B*%7Dhttps://chart.googleapis.com/chart?cht=tx&chl=V_%7B*%7D
這個Policy就是我們強化學習最後的目標,可以最大化Value Function。

現在問題來了,每次policy evaluation都要解一次聯立方程式,當我們State很多的時候非常沒有效率。
這時候Dynamic Programming就非常有用了。

動態規劃(Dynamic Programming)

我們可以用迭代的方式計算Value Function,演算法如下:
https://ithelp.ithome.com.tw/upload/images/20200904/20129922lZ7fXpyKpy.png
每一次迴圈都將每個State的Value往Bellman Function的解移動,迭代一定次數後就能收斂。https://chart.googleapis.com/chart?cht=tx&chl=%5CDelta讓Value不需要完全收斂,因為收斂的速度會隨著離解越近而變慢。

把Policy Evaluation跟Policy Improvement合再一起,稱為Policy Iteration:
https://ithelp.ithome.com.tw/upload/images/20200904/20129922e725UA7TWI.png

policy-stable為收斂條件,只要Policy不再更新,表示已經找到optimal policy。
可以看到Policy Improvement中,https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi的更新就是依據Action-Value Function的最大值來決定。

從下面這張圖可以看出Policy Iteration的精神
https://ithelp.ithome.com.tw/upload/images/20200904/20129922DKwzd2Tb8U.png
Policy Evaluation與Policy Improvement其實是相互競爭的關係,Policy Evaluation會讓之前計算的https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi失效,而Policy Improvement也會將https://chart.googleapis.com/chart?cht=tx&chl=V_%7Bs%7D的值改成錯的。但是這兩個過程卻會一步步地往Optimal Function靠近,最後收斂。

這種精神在強化學習的所有算法裡都通用,稱為Generalized Policy Iteration(GPI)

Gym

先介紹明天會用到的gym環境,明天就可以少寫一點
還沒安裝gym的記得先安裝

pip install gym

Taxi-v2為例
先import近來,並建立環境

import gym
env = gym.make('Taxi-v2')
env = env.unwrapped # 使用更底層的操作(env.P)

再開始gym的環境前,一定要先reset()

env.reset()

可以透過render()看目前狀態

env.render()

會出現
https://ithelp.ithome.com.tw/upload/images/20200904/20129922v0MJEsFOig.png
黃色是車子的位置,英文字代表乘客可能的位置或目標可能的位置,藍色英文字代表目前乘客位置,紫色英文字代表乘客的目標。當街上乘客後,車子會呈綠色。實線的部分是牆壁,虛線則是可以走的部分。
遊戲的目標就是將車子開到藍色的點,接上乘客,前往紫色的點,放下乘客。

總共有6個Action:

  • 0 = 往下
  • 1 = 往上
  • 2 = 往右
  • 3 = 往左
  • 4 = 接上乘客
  • 5 = 放下乘客

500個State,每個State分別表示一種情況。

可以透過指令來看

print(env.action_space.n) # 6
print(env.observation_space.n) # 500

如果要看環境的Dynamic的話,可以輸入

print(len(env.P)) # 500

print(env.P[0]) 
# {
#  0: [(1.0, 100, -1, False)],
#  1: [(1.0, 0, -1, False)],
#  2: [(1.0, 20, -1, False)],
#  3: [(1.0, 0, -1, False)],
#  4: [(1.0, 16, -1, False)],
#  5: [(1.0, 0, -10, False)]
# }

env.P為500個item的dict,每個item對應到一個state
env.P[0]印出第0個state,有0~6的action,
每個action對應到的list裡的值分別為(p(s', r|s, a), s', r, done)

  • p(s', r|s, a)為轉移機率
  • s'為下個state
  • r為reward
  • done表示s'是否為terminal state

透過step(action)與環境互動

env.step(0) # choose action 0

step(action)會回傳一個tuple,
內容為(s', r, done, info),

  • s'就是經過該action後的下個state
  • r為經過該action得到的reward
  • done表示s'是否為terminal state
  • info為其他資訊(p(s', r|s, a)等等)

舉個例子

state為393時的情形
https://ithelp.ithome.com.tw/upload/images/20200904/20129922akmKbBgcec.png
經過env.step(0)後回傳(493, -1, False, {'prob': 1.0})

render()的結果為
https://ithelp.ithome.com.tw/upload/images/20200904/201299229nfbmsbjtI.png
可以看到step(0)讓車子往下移動了一格。

總結

GPI的概念在之後的演算法裡都能看到,之後講到的時候會在連結回來。
明天終於要實際用code來求https://chart.googleapis.com/chart?cht=tx&chl=%5Cpi_%7B*%7Dhttps://chart.googleapis.com/chart?cht=tx&chl=V_%7B*%7D(s),將可以看到不用寫任何rule,車子就能每次都往最正確的地方移動!


上一篇
[Day03]貝爾曼方程
下一篇
[Day05]Policy Iteration and Value Iteration
系列文
從根本學習Reinforcement Learning12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言