增强学习Q-learning分析与演示(入门)
一些說(shuō)明、參閱
https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/blob/master/contents/1_command_line_reinforcement_learning/treasure_on_right.py
https://github.com/simoninithomas/Deep_reinforcement_learning_Course/blob/master/Q%20learning/FrozenLake/Q%20Learning%20with%20FrozenLake.ipynb
https://www.cnblogs.com/hhh5460/p/10134018.html
http://baijiahao.baidu.com/s?id=1597978859962737001&wfr=spider&for=pc
https://www.jianshu.com/p/29db50000e3f
問(wèn)題提出
為了實(shí)現(xiàn)自走的路徑,并盡量避免障礙,設(shè)計(jì)一個(gè)路徑。
如圖所示,當(dāng)機(jī)器人在圖中的任意網(wǎng)格中時(shí),怎樣讓它明白周圍環(huán)境,最終到達(dá)目標(biāo)位置。
?
?
這里給出一個(gè)運(yùn)行結(jié)果:
首先給他們編號(hào)如下:作為位置的標(biāo)識(shí)。
?
然后利用Q-Learning的獎(jiǎng)賞機(jī)制,完成數(shù)據(jù)表單更新,最終更新如下:
?
?
?在機(jī)器人實(shí)際選擇路徑時(shí),按照該表中的最大值選擇,最終走到24號(hào)位置,并避開(kāi)了紅色方塊。
如初始位置在4時(shí)候,首先選擇了最大值向左到3,然后在3處選擇了最大值向下,然后到8處選擇了向下,等等,最終完成路徑的選擇。而這種選擇正是使用Q-Learning實(shí)現(xiàn)的。
Q-learning的想法
獎(jiǎng)賞機(jī)制
在一個(gè)陌生的環(huán)境中,機(jī)器人首先的方向是隨機(jī)選擇的,當(dāng)它從起點(diǎn)開(kāi)始出發(fā)時(shí),選擇了各種各樣的方法,完成路徑。
但是在機(jī)器人碰到紅色方塊后,給予懲罰,則經(jīng)過(guò)多次后,機(jī)器人會(huì)避開(kāi)懲罰位置。
當(dāng)機(jī)器人碰到藍(lán)色方塊時(shí),給予獎(jiǎng)賞,經(jīng)過(guò)多次后,機(jī)器人傾向于跑向藍(lán)色方塊的位置。
具體公式
完成獎(jiǎng)賞和懲罰的過(guò)程表達(dá),就是用值表示吧。
首先建立的表是空表的,就是說(shuō),如下這樣的表是空的,所有值都為0:
?
?
?
?
?在每次行動(dòng)后,根據(jù)獎(jiǎng)懲情況,更新該表,完成學(xué)習(xí)過(guò)程。在實(shí)現(xiàn)過(guò)程中,將獎(jiǎng)懲情況也編制成一張表。表格式如上圖類似。
而獎(jiǎng)懲更新公式為:
貝爾曼方程:
其中的表示當(dāng)前的Q表,就是上圖25行4列的表單。表示學(xué)習(xí)率,表示下一次行為會(huì)得到的獎(jiǎng)懲情況,表示一個(gè)貪婪系數(shù),在這里的公式中,就是說(shuō),如果它的數(shù)值比較大,則更傾向于對(duì)遠(yuǎn)方的未來(lái)獎(jiǎng)賞。
(該式子在很多網(wǎng)頁(yè)文本中并沒(méi)有固定的格式,如貪婪系數(shù),在有些時(shí)候是隨著步數(shù)的增加而遞減的(可能)。
?
?推薦閱讀:
https://www.jianshu.com/p/29db50000e3f
?
?等,其中包括了更新Q表中的一些過(guò)程。
代碼實(shí)現(xiàn)-準(zhǔn)備過(guò)程
?
?
不得不說(shuō)的是該代碼參閱了:https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow/blob/master/contents/1_command_line_reinforcement_learning/treasure_on_right.py
他的代碼講解:https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/2-1-general-rl/
?
他設(shè)計(jì)了一種方案實(shí)現(xiàn)了機(jī)器人在一維空間中如何移動(dòng),但是不涉及障礙物的問(wèn)題,并使用了較高的編程能力,有顯示路徑過(guò)程。
而本文側(cè)重于如何表示出路徑,完成思路示例。
導(dǎo)入對(duì)應(yīng)的庫(kù)函數(shù),并建立問(wèn)題模型:
import numpy as np import pandas as pd import time?
N_STATES = 25 # the length of the 2 dimensional world ACTIONS = ['left', 'right','up','down'] # available actions EPSILON = 0.3 # greedy police ALPHA = 0.8 # learning rate GAMMA = 0.9 # discount factor MAX_EPISODES = 100 # maximum episodes FRESH_TIME = 0.00001 # fresh time for one move?
創(chuàng)建Q表的函數(shù):
def build_q_table(n_states, actions):table = pd.DataFrame(np.zeros((n_states, len(actions))), # q_table initial valuescolumns=actions, # actions's name)return table行為選擇的函數(shù):
行為選擇過(guò)程中,使用這樣長(zhǎng)的表示也就是為了表達(dá):在邊界時(shí)候,機(jī)器人的路徑有些不能選的,要不就超出索引的表格了。。
當(dāng)貪婪系數(shù)更小時(shí),更傾向于使用隨機(jī)方案,或者當(dāng)表初始時(shí)所有數(shù)據(jù)都為0,則使用隨機(jī)方案進(jìn)行行為選擇。
當(dāng)np.random.uniform()< =EPSILON時(shí),則使用已經(jīng)選擇過(guò)的最優(yōu)方案完成Qlearning的行為選擇,也就是說(shuō),機(jī)器人并不會(huì)對(duì)遠(yuǎn)方的未知目標(biāo)表示貪婪。(這里的表達(dá)是和上述公式的貪婪系數(shù)大小的作用是相反過(guò)來(lái)的)
def choose_action(state, q_table):state_actions = q_table.iloc[state, :]if (np.random.uniform() > EPSILON) or ((state_actions == 0).all()): # act non-greedy or state-action have no valueif state==0:action_name=np.random.choice(['right','down'])elif state>0 and state<4:action_name=np.random.choice(['right','down','left'])elif state==4:action_name=np.random.choice(['left','down'])elif state==5 or state==15 or state==10 :action_name=np.random.choice(['right','up','down'])elif state==9 or state==14 or state==19 :action_name=np.random.choice(['left','up','down'])elif state==20:action_name=np.random.choice(['right','up'])elif state>20 and state<24: action_name=np.random.choice(['right','up','left'])elif state==24:action_name=np.random.choice(['left','up'])else:action_name=np.random.choice(ACTIONS)else: # act greedyaction_name = state_actions.idxmax() # replace argmax to idxmax as argmax means a different function in newer version of pandasreturn action_name獎(jiǎng)賞表達(dá):
函數(shù)中參數(shù)S,表示state(狀態(tài)),a表示action(行為),行為0到3分別表示左右上下。該表中,給出了在當(dāng)前狀態(tài)下,下一個(gè)方向會(huì)導(dǎo)致的獎(jiǎng)懲情況。
def get_init_feedback_table(S,a):tab=np.ones((25,4))tab[8][1]=-10;tab[4][3]=-10;tab[14][2]=-10tab[11][1]=-10;tab[13][0]=-10;tab[7][3]=-10;tab[17][2]=-10tab[16][0]=-10;tab[20][2]=-10;tab[10][3]=-10;tab[18][0]=-10;tab[16][1]=-10;tab[22][2]=-10;tab[12][3]=-10tab[23][1]=50;tab[19][3]=50return tab[S,a]獲取獎(jiǎng)懲:
該函數(shù)調(diào)用了上一個(gè)獎(jiǎng)懲表示的函數(shù),獲得獎(jiǎng)懲信息,其中的參數(shù)S,A,同上。
當(dāng)狀態(tài)S,A符合了下一步獲得最終的結(jié)果時(shí),則結(jié)束(終止),表示完成了目標(biāo)任務(wù)。否則更新位置S
def get_env_feedback(S, A):action={'left':0,'right':1,'up':2,'down':3};R=get_init_feedback_table(S,action[A])if (S==19 and action[A]==3) or (S==23 and action[A]==1):S = 'terminal'return S,Rif action[A]==0:S-=1elif action[A]==1:S+=1elif action[A]==2:S-=5else:S+=5 return S, R代碼實(shí)現(xiàn)-開(kāi)始訓(xùn)練
首先初始化Q表,然后設(shè)定初始路徑就是在0位置(也就是說(shuō)每次機(jī)器人,從位置0開(kāi)始出發(fā))
訓(xùn)練迭代次數(shù)MAX_EPISODES已經(jīng)在之前設(shè)置。
在每一代的訓(xùn)練過(guò)程中,選擇行為(隨機(jī)或者使用Q表原有),然后根據(jù)選擇的行為和當(dāng)前的位置,獲得獎(jiǎng)懲情況:S_, R
當(dāng)沒(méi)有即將發(fā)生的行為不會(huì)到達(dá)最終目的地時(shí)候,使用:
q_target = R + GAMMA * q_table.iloc[S_, :].max() q_table.loc[S, A] += ALPHA * (q_target - q_table.loc[S, A])這兩行完成q表的更新。(對(duì)照貝爾曼方程)
當(dāng)完成時(shí)候,即終止,開(kāi)始下一代的訓(xùn)練。
?
def rl():# main part of RL loopq_table = build_q_table(N_STATES, ACTIONS)for episode in range(MAX_EPISODES):S = 0is_terminated = Falsewhile not is_terminated:A = choose_action(S, q_table)S_, R = get_env_feedback(S, A) # take action & get next state and rewardif S_ != 'terminal':q_target = R + GAMMA * q_table.iloc[S_, :].max() # next state is not terminalelse:print(1)q_target = R # next state is terminalis_terminated = True # terminate this episodeq_table.loc[S, A] += ALPHA * (q_target - q_table.loc[S, A]) # updateS = S_ # move to next statereturn q_tableif __name__ == "__main__":q_table = rl()print('\r\nQ-table:\n')print(q_table)效果-總結(jié)
效果其實(shí)和開(kāi)頭一樣,調(diào)整合適的參數(shù),最終輸出的q表自然有對(duì)應(yīng)的影響。
明顯可以得到的是,貪婪系數(shù)會(huì)影響訓(xùn)練時(shí)間等。
所有代碼就是以上。可以使用eclipse的pydev下進(jìn)行運(yùn)行,調(diào)試。并觀察沒(méi)一步對(duì)表格的影響
?
轉(zhuǎn)載于:https://www.cnblogs.com/bai2018/p/11517584.html
總結(jié)
以上是生活随笔為你收集整理的增强学习Q-learning分析与演示(入门)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Django 执行 makemigrat
- 下一篇: 模版引擎总结之综合分析模版引擎