版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
機(jī)器學(xué)習(xí):強(qiáng)化學(xué)習(xí):蒙特卡洛方法技術(shù)教程1強(qiáng)化學(xué)習(xí)基礎(chǔ)概念在強(qiáng)化學(xué)習(xí)中,智能體(agent)通過與環(huán)境的交互來學(xué)習(xí)如何做出決策,以最大化某種累積獎(jiǎng)勵(lì)。這一過程涉及三個(gè)核心概念:狀態(tài)(state)、動(dòng)作(action)和獎(jiǎng)勵(lì)(reward)。1.1狀態(tài)(state)狀態(tài)是環(huán)境的當(dāng)前情況的描述,智能體根據(jù)狀態(tài)來決定采取什么動(dòng)作。1.2動(dòng)作(action)動(dòng)作是智能體可以執(zhí)行的操作,執(zhí)行動(dòng)作后,環(huán)境會(huì)進(jìn)入一個(gè)新的狀態(tài),并給出相應(yīng)的獎(jiǎng)勵(lì)。1.3獎(jiǎng)勵(lì)(reward)獎(jiǎng)勵(lì)是智能體執(zhí)行動(dòng)作后從環(huán)境中獲得的反饋,智能體的目標(biāo)是通過學(xué)習(xí)策略來最大化長期的獎(jiǎng)勵(lì)。1.4策略(policy)策略定義了智能體在給定狀態(tài)下采取動(dòng)作的規(guī)則。在強(qiáng)化學(xué)習(xí)中,智能體的目標(biāo)是找到一個(gè)最優(yōu)策略,使得在長期中獲得的獎(jiǎng)勵(lì)最大。1.5價(jià)值函數(shù)(valuefunction)價(jià)值函數(shù)評(píng)估了狀態(tài)或狀態(tài)-動(dòng)作對(duì)的好壞,它反映了從當(dāng)前狀態(tài)或采取當(dāng)前動(dòng)作后,智能體未來可能獲得的獎(jiǎng)勵(lì)的期望值。2蒙特卡洛方法概述蒙特卡洛方法是一種基于樣本的強(qiáng)化學(xué)習(xí)算法,它通過完整的序列(episode)來估計(jì)價(jià)值函數(shù)。蒙特卡洛方法不需要環(huán)境的動(dòng)態(tài)模型,而是直接從與環(huán)境的交互中學(xué)習(xí)。2.1蒙特卡洛預(yù)測(cè)(MonteCarloPrediction)蒙特卡洛預(yù)測(cè)用于估計(jì)狀態(tài)價(jià)值函數(shù)或狀態(tài)-動(dòng)作價(jià)值函數(shù)。它通過收集完整的序列,并使用序列中的回報(bào)來更新價(jià)值估計(jì)。2.1.1示例代碼:蒙特卡洛預(yù)測(cè)狀態(tài)價(jià)值函數(shù)importnumpyasnp
#環(huán)境的回報(bào)函數(shù),這里簡化為一個(gè)隨機(jī)過程
defget_returns(state):
returnnp.random.normal(0,1)
#初始化狀態(tài)價(jià)值函數(shù)
V=np.zeros(100)
returns_sum=np.zeros(100)
returns_count=np.zeros(100)
#蒙特卡洛預(yù)測(cè)過程
defmonte_carlo_prediction(num_episodes):
for_inrange(num_episodes):
#生成一個(gè)完整的序列
episode=[]
state=0
whileTrue:
episode.append(state)
state=(state+1)%100#簡化狀態(tài)轉(zhuǎn)移
ifstate==0:
break
#計(jì)算序列的回報(bào)
G=get_returns(state)
#更新價(jià)值函數(shù)
forstateinepisode:
returns_sum[state]+=G
returns_count[state]+=1
V[state]=returns_sum[state]/returns_count[state]
#運(yùn)行蒙特卡洛預(yù)測(cè)
monte_carlo_prediction(10000)
print(V)2.1.2代碼解釋在上述代碼中,我們定義了一個(gè)簡化的環(huán)境,其中狀態(tài)的回報(bào)是隨機(jī)的。我們使用蒙特卡洛預(yù)測(cè)方法來估計(jì)每個(gè)狀態(tài)的價(jià)值。在每次預(yù)測(cè)中,我們生成一個(gè)完整的序列,然后計(jì)算序列的回報(bào),并使用這個(gè)回報(bào)來更新狀態(tài)價(jià)值函數(shù)。2.2蒙特卡洛控制(MonteCarloControl)蒙特卡洛控制用于學(xué)習(xí)最優(yōu)策略。它通過探索策略,收集完整的序列,并使用序列中的回報(bào)來更新策略。2.2.1示例代碼:蒙特卡洛控制學(xué)習(xí)最優(yōu)策略importnumpyasnp
#環(huán)境的動(dòng)態(tài)模型,這里簡化為一個(gè)隨機(jī)過程
defstep(state,action):
returnnp.random.randint(0,100),np.random.normal(0,1)
#初始化策略和狀態(tài)-動(dòng)作價(jià)值函數(shù)
policy=np.random.randint(0,2,size=100)
Q=np.zeros((100,2))
returns_sum=np.zeros((100,2))
returns_count=np.zeros((100,2))
#蒙特卡洛控制過程
defmonte_carlo_control(num_episodes):
for_inrange(num_episodes):
#生成一個(gè)完整的序列
episode=[]
state=0
whileTrue:
action=policy[state]#根據(jù)當(dāng)前策略選擇動(dòng)作
next_state,reward=step(state,action)#執(zhí)行動(dòng)作,獲得新狀態(tài)和獎(jiǎng)勵(lì)
episode.append((state,action,reward))
state=next_state
ifstate==0:#達(dá)到終止?fàn)顟B(tài)
break
#計(jì)算序列的回報(bào)
G=0
forstate,action,rewardinreversed(episode):
G=G+reward#累加回報(bào)
returns_sum[state,action]+=G
returns_count[state,action]+=1
Q[state,action]=returns_sum[state,action]/returns_count[state,action]
#更新策略
ifQ[state,0]>Q[state,1]:
policy[state]=0
else:
policy[state]=1
#運(yùn)行蒙特卡洛控制
monte_carlo_control(10000)
print(policy)2.2.2代碼解釋在上述代碼中,我們定義了一個(gè)簡化的環(huán)境,其中狀態(tài)的轉(zhuǎn)移和獎(jiǎng)勵(lì)是隨機(jī)的。我們使用蒙特卡洛控制方法來學(xué)習(xí)最優(yōu)策略。在每次控制中,我們根據(jù)當(dāng)前策略生成一個(gè)完整的序列,然后計(jì)算序列的回報(bào),并使用這個(gè)回報(bào)來更新狀態(tài)-動(dòng)作價(jià)值函數(shù)和策略。蒙特卡洛方法是一種強(qiáng)大的工具,它允許智能體在沒有環(huán)境模型的情況下學(xué)習(xí)價(jià)值函數(shù)和策略。然而,它的一個(gè)主要缺點(diǎn)是需要完整的序列才能進(jìn)行更新,這在某些情況下可能效率較低。盡管如此,蒙特卡洛方法仍然是理解和實(shí)現(xiàn)強(qiáng)化學(xué)習(xí)算法的重要起點(diǎn)。3蒙特卡洛方法原理3.1無模型預(yù)測(cè)蒙特卡洛方法在強(qiáng)化學(xué)習(xí)中是一種基于經(jīng)驗(yàn)的方法,它不需要環(huán)境的動(dòng)態(tài)模型,而是通過與環(huán)境的交互來學(xué)習(xí)策略。無模型預(yù)測(cè)是蒙特卡洛方法的核心,它通過完整的序列來估計(jì)狀態(tài)值或動(dòng)作值。3.1.1原理蒙特卡洛方法通過收集完整的序列(即從某個(gè)狀態(tài)開始,直到結(jié)束狀態(tài)的整個(gè)過程)來估計(jì)狀態(tài)值函數(shù)或動(dòng)作值函數(shù)。對(duì)于狀態(tài)值函數(shù),它計(jì)算的是從該狀態(tài)開始,按照策略進(jìn)行,直到結(jié)束狀態(tài)所獲得的回報(bào)的平均值。對(duì)于動(dòng)作值函數(shù),它計(jì)算的是在某個(gè)狀態(tài)下采取某個(gè)動(dòng)作后,按照策略進(jìn)行,直到結(jié)束狀態(tài)所獲得的回報(bào)的平均值。3.1.2示例:使用蒙特卡洛方法進(jìn)行無模型預(yù)測(cè)假設(shè)我們有一個(gè)簡單的環(huán)境,如隨機(jī)行走游戲,其中狀態(tài)為位置,動(dòng)作是向左或向右移動(dòng)。我們將使用蒙特卡洛方法來估計(jì)每個(gè)狀態(tài)的價(jià)值。importnumpyasnp
#環(huán)境的大小
env_size=10
#初始化狀態(tài)值函數(shù)
V=np.zeros(env_size)
#初始化狀態(tài)的訪問次數(shù)
N=np.zeros(env_size)
#回報(bào)的折扣因子
gamma=0.9
#生成一個(gè)完整的序列
defgenerate_episode():
episode=[]
state=5#初始狀態(tài)
whileTrue:
action=np.random.choice([0,1])#隨機(jī)選擇動(dòng)作(0:向左,1:向右)
ifaction==0:
next_state=state-1
else:
next_state=state+1
reward=-1#每移動(dòng)一步,獎(jiǎng)勵(lì)為-1
episode.append((state,action,reward))
ifnext_state==0ornext_state==env_size-1:
break
state=next_state
returnepisode
#蒙特卡洛預(yù)測(cè)
defmc_prediction(episode):
G=0#初始化回報(bào)
states=[x[0]forxinreversed(episode)]#反轉(zhuǎn)序列,從結(jié)束狀態(tài)開始
rewards=[x[2]forxinreversed(episode)]
fori,stateinenumerate(states):
G=gamma*G+rewards[i]#計(jì)算折扣回報(bào)
N[state]+=1#更新狀態(tài)的訪問次數(shù)
V[state]+=(G-V[state])/N[state]#更新狀態(tài)值函數(shù)
#運(yùn)行多次以更新狀態(tài)值函數(shù)
for_inrange(10000):
episode=generate_episode()
mc_prediction(episode)
print(V)在這個(gè)例子中,我們通過與環(huán)境的交互生成了多個(gè)序列,并使用蒙特卡洛方法更新了狀態(tài)值函數(shù)。最終,V數(shù)組將包含每個(gè)狀態(tài)的估計(jì)價(jià)值。3.2策略評(píng)估與改進(jìn)蒙特卡洛方法不僅可以用于預(yù)測(cè),還可以用于策略評(píng)估和策略改進(jìn)。策略評(píng)估是通過蒙特卡洛方法來估計(jì)策略的性能,而策略改進(jìn)則是基于策略評(píng)估的結(jié)果來調(diào)整策略,以期望獲得更高的回報(bào)。3.2.1策略評(píng)估策略評(píng)估的目標(biāo)是估計(jì)給定策略的性能,即在該策略下,每個(gè)狀態(tài)的期望回報(bào)。在蒙特卡洛方法中,這通常通過收集多個(gè)從該狀態(tài)開始的完整序列,并計(jì)算平均回報(bào)來實(shí)現(xiàn)。3.2.2策略改進(jìn)策略改進(jìn)是基于策略評(píng)估的結(jié)果來調(diào)整策略,以期望獲得更高的回報(bào)。在蒙特卡洛方法中,這通常通過貪心策略或ε-貪心策略來實(shí)現(xiàn)。貪心策略會(huì)選擇當(dāng)前估計(jì)回報(bào)最高的動(dòng)作,而ε-貪心策略則會(huì)在探索和利用之間進(jìn)行平衡。3.2.3示例:使用蒙特卡洛方法進(jìn)行策略評(píng)估與改進(jìn)我們繼續(xù)使用隨機(jī)行走游戲的例子,這次我們將使用蒙特卡洛方法來評(píng)估和改進(jìn)策略。#初始化動(dòng)作值函數(shù)
Q=np.zeros((env_size,2))
#初始化動(dòng)作的訪問次數(shù)
N=np.zeros((env_size,2))
#策略評(píng)估
defmc_evaluation(episode):
G=0#初始化回報(bào)
states_actions=[(x[0],x[1])forxinreversed(episode)]#反轉(zhuǎn)序列,從結(jié)束狀態(tài)開始
rewards=[x[2]forxinreversed(episode)]
fori,(state,action)inenumerate(states_actions):
G=gamma*G+rewards[i]#計(jì)算折扣回報(bào)
N[state][action]+=1#更新動(dòng)作的訪問次數(shù)
Q[state][action]+=(G-Q[state][action])/N[state][action]#更新動(dòng)作值函數(shù)
#策略改進(jìn)
defimprove_policy():
policy=np.zeros(env_size)#初始化策略
forstateinrange(env_size):
ifQ[state][0]>Q[state][1]:
policy[state]=0#選擇向左的動(dòng)作
else:
policy[state]=1#選擇向右的動(dòng)作
returnpolicy
#運(yùn)行多次以評(píng)估和改進(jìn)策略
for_inrange(10000):
episode=generate_episode()
mc_evaluation(episode)
policy=improve_policy()
print(policy)在這個(gè)例子中,我們首先通過與環(huán)境的交互生成了多個(gè)序列,并使用蒙特卡洛方法更新了動(dòng)作值函數(shù)。然后,我們基于動(dòng)作值函數(shù)的結(jié)果來改進(jìn)策略。最終,policy數(shù)組將包含每個(gè)狀態(tài)下的最優(yōu)動(dòng)作選擇。通過上述例子,我們可以看到蒙特卡洛方法在強(qiáng)化學(xué)習(xí)中的應(yīng)用,它通過與環(huán)境的交互來學(xué)習(xí)策略,而不需要環(huán)境的動(dòng)態(tài)模型。這使得蒙特卡洛方法在很多實(shí)際問題中非常有用,尤其是在環(huán)境模型未知或難以建模的情況下。4蒙特卡洛控制蒙特卡洛控制是強(qiáng)化學(xué)習(xí)中的一種方法,用于在未知環(huán)境模型的情況下學(xué)習(xí)最優(yōu)策略。它通過嘗試不同的動(dòng)作序列,收集完整的序列數(shù)據(jù),然后根據(jù)這些數(shù)據(jù)來更新策略。蒙特卡洛控制特別適用于那些具有高方差但低偏差的環(huán)境,因?yàn)樗蕾囉谕暾男蛄衼砉烙?jì)狀態(tài)-動(dòng)作對(duì)的價(jià)值。4.1探索與利用在強(qiáng)化學(xué)習(xí)中,智能體需要在探索(exploration)和利用(exploitation)之間找到平衡。探索意味著嘗試新的動(dòng)作,以發(fā)現(xiàn)可能的獎(jiǎng)勵(lì);而利用則是基于當(dāng)前已知信息,選擇最有可能帶來最大獎(jiǎng)勵(lì)的動(dòng)作。蒙特卡洛控制通過ε-貪心策略來實(shí)現(xiàn)這一平衡。4.1.1ε-貪心策略ε-貪心策略是一種簡單而有效的方法,它允許智能體在大部分時(shí)間里選擇當(dāng)前最優(yōu)的動(dòng)作(利用),但在一小部分時(shí)間里隨機(jī)選擇動(dòng)作(探索)。參數(shù)ε(通常是一個(gè)介于0和1之間的值)控制了探索與利用之間的平衡。當(dāng)ε較高時(shí),智能體更傾向于探索;當(dāng)ε較低時(shí),智能體更傾向于利用。4.1.1.1代碼示例下面是一個(gè)使用ε-貪心策略的Python代碼示例,用于在具有四個(gè)動(dòng)作的環(huán)境中選擇動(dòng)作:importnumpyasnp
defepsilon_greedy(Q,state,epsilon):
"""
根據(jù)ε-貪心策略選擇動(dòng)作。
參數(shù):
Q:狀態(tài)-動(dòng)作價(jià)值表,一個(gè)二維數(shù)組。
state:當(dāng)前狀態(tài)。
epsilon:探索與利用的平衡參數(shù)。
返回:
選擇的動(dòng)作。
"""
ifnp.random.uniform(0,1)<epsilon:
#探索:隨機(jī)選擇一個(gè)動(dòng)作
action=np.random.choice([0,1,2,3])
else:
#利用:選擇當(dāng)前狀態(tài)下價(jià)值最高的動(dòng)作
action=np.argmax(Q[state,:])
returnaction在這個(gè)例子中,Q是一個(gè)狀態(tài)-動(dòng)作價(jià)值表,state是智能體當(dāng)前所處的狀態(tài),epsilon是控制探索與利用平衡的參數(shù)。函數(shù)首先生成一個(gè)0到1之間的隨機(jī)數(shù),如果這個(gè)數(shù)小于ε,智能體將隨機(jī)選擇一個(gè)動(dòng)作進(jìn)行探索;否則,智能體將選擇當(dāng)前狀態(tài)下價(jià)值最高的動(dòng)作進(jìn)行利用。4.2蒙特卡洛控制的實(shí)現(xiàn)蒙特卡洛控制通過迭代更新策略和狀態(tài)-動(dòng)作價(jià)值表來學(xué)習(xí)最優(yōu)策略。在每次迭代中,智能體從一個(gè)隨機(jī)狀態(tài)開始,根據(jù)當(dāng)前策略執(zhí)行一系列動(dòng)作,直到達(dá)到終止?fàn)顟B(tài)。然后,智能體使用從該序列中獲得的回報(bào)來更新狀態(tài)-動(dòng)作價(jià)值表,并根據(jù)更新后的價(jià)值表調(diào)整策略。4.2.1代碼示例下面是一個(gè)使用蒙特卡洛控制學(xué)習(xí)最優(yōu)策略的Python代碼示例:importnumpyasnp
defmonte_carlo_control(env,episodes,epsilon,alpha):
"""
使用蒙特卡洛控制學(xué)習(xí)最優(yōu)策略。
參數(shù):
env:環(huán)境模型,需要提供step和reset方法。
episodes:進(jìn)行的迭代次數(shù)。
epsilon:ε-貪心策略的參數(shù)。
alpha:學(xué)習(xí)率。
返回:
學(xué)習(xí)到的最優(yōu)策略。
"""
#初始化狀態(tài)-動(dòng)作價(jià)值表
Q=np.zeros((env.observation_space.n,env.action_space.n))
N=np.zeros((env.observation_space.n,env.action_space.n))
for_inrange(episodes):
#從隨機(jī)狀態(tài)開始
state=env.reset()
#存儲(chǔ)序列數(shù)據(jù)
episode=[]
whileTrue:
#根據(jù)ε-貪心策略選擇動(dòng)作
action=epsilon_greedy(Q,state,epsilon)
#執(zhí)行動(dòng)作,觀察結(jié)果
next_state,reward,done,_=env.step(action)
#存儲(chǔ)序列數(shù)據(jù)
episode.append((state,action,reward))
ifdone:
break
state=next_state
#更新狀態(tài)-動(dòng)作價(jià)值表
G=0
forstate,action,rewardinreversed(episode):
G=G+reward
N[state,action]+=1
Q[state,action]+=alpha*(G-Q[state,action])
#根據(jù)狀態(tài)-動(dòng)作價(jià)值表學(xué)習(xí)最優(yōu)策略
policy=np.argmax(Q,axis=1)
returnpolicy在這個(gè)例子中,env是一個(gè)具有observation_space.n和action_space.n屬性的環(huán)境模型,分別表示狀態(tài)空間和動(dòng)作空間的大小。episodes是迭代次數(shù),epsilon是ε-貪心策略的參數(shù),alpha是學(xué)習(xí)率。函數(shù)首先初始化狀態(tài)-動(dòng)作價(jià)值表Q和計(jì)數(shù)器N,然后進(jìn)行多次迭代。在每次迭代中,智能體從一個(gè)隨機(jī)狀態(tài)開始,根據(jù)當(dāng)前策略執(zhí)行一系列動(dòng)作,直到達(dá)到終止?fàn)顟B(tài)。然后,智能體使用從該序列中獲得的回報(bào)來更新狀態(tài)-動(dòng)作價(jià)值表。最后,根據(jù)更新后的價(jià)值表學(xué)習(xí)最優(yōu)策略。通過上述代碼示例,我們可以看到蒙特卡洛控制如何在探索與利用之間找到平衡,并通過迭代更新策略和狀態(tài)-動(dòng)作價(jià)值表來學(xué)習(xí)最優(yōu)策略。這種方法在處理具有高方差但低偏差的環(huán)境時(shí)特別有效,因?yàn)樗蕾囉谕暾男蛄袛?shù)據(jù)來估計(jì)狀態(tài)-動(dòng)作對(duì)的價(jià)值。5蒙特卡洛方法的變體5.1首次訪問蒙特卡洛方法首次訪問蒙特卡洛方法(First-VisitMonteCarloMethod)是一種評(píng)估策略的方法,它通過執(zhí)行策略并記錄所有首次訪問的狀態(tài)-動(dòng)作對(duì)的回報(bào)來估計(jì)動(dòng)作值。這種方法在探索未知環(huán)境時(shí)特別有效,因?yàn)樗恍枰h(huán)境的模型,而是直接從與環(huán)境的交互中學(xué)習(xí)。5.1.1原理首次訪問蒙特卡洛方法的基本思想是,對(duì)于每個(gè)狀態(tài)-動(dòng)作對(duì),我們只在第一次訪問時(shí)更新其價(jià)值估計(jì)。具體來說,當(dāng)我們從某個(gè)狀態(tài)s采取動(dòng)作a并進(jìn)入一個(gè)新的狀態(tài)序列時(shí),我們記錄從s,a開始的回報(bào)Gt,但只在第一次訪問s,Q其中,α是學(xué)習(xí)率,Gt是從狀態(tài)s采取動(dòng)作a5.1.2示例代碼假設(shè)我們有一個(gè)簡單的網(wǎng)格世界環(huán)境,其中智能體可以向四個(gè)方向移動(dòng)。我們將使用首次訪問蒙特卡洛方法來評(píng)估一個(gè)隨機(jī)策略。importnumpyasnp
#環(huán)境定義
grid_size=5
actions=['up','down','left','right']
rewards=np.zeros((grid_size,grid_size))
rewards[grid_size-1,grid_size-1]=1#目標(biāo)狀態(tài)的獎(jiǎng)勵(lì)
#初始化Q表
Q=np.zeros((grid_size,grid_size,len(actions)))
#存儲(chǔ)每個(gè)狀態(tài)-動(dòng)作對(duì)的訪問次數(shù)
N=np.zeros((grid_size,grid_size,len(actions)))
#學(xué)習(xí)率
alpha=0.1
#生成一個(gè)隨機(jī)策略
policy=np.random.choice(actions,size=(grid_size,grid_size))
#首次訪問蒙特卡洛方法
deffirst_visit_monte_carlo(policy,episodes):
for_inrange(episodes):
#初始化狀態(tài)序列和動(dòng)作序列
states_actions=[]
rewards_sequence=[]
state=(0,0)#從網(wǎng)格的左上角開始
#生成一個(gè)完整的序列
whilestate!=(grid_size-1,grid_size-1):
action=policy[state]
states_actions.append((state,action))
#假設(shè)獎(jiǎng)勵(lì)為0,除了到達(dá)目標(biāo)狀態(tài)
reward=rewards[state]ifstate==(grid_size-1,grid_size-1)else0
rewards_sequence.append(reward)
#更新狀態(tài)
ifaction=='up':
state=(max(state[0]-1,0),state[1])
elifaction=='down':
state=(min(state[0]+1,grid_size-1),state[1])
elifaction=='left':
state=(state[0],max(state[1]-1,0))
elifaction=='right':
state=(state[0],min(state[1]+1,grid_size-1))
#從后向前更新Q表
G=0#返回值
fortinrange(len(states_actions)-1,-1,-1):
state,action=states_actions[t]
if(state,action)notinstates_actions[:t]:#首次訪問
G+=rewards_sequence[t]
N[state][action]+=1
Q[state][action]+=(1/N[state][action])*(G-Q[state][action])
#執(zhí)行算法
first_visit_monte_carlo(policy,1000)5.1.3解釋在上述代碼中,我們首先定義了網(wǎng)格環(huán)境的大小、可能的動(dòng)作、獎(jiǎng)勵(lì)分布以及初始化Q表和策略。然后,我們實(shí)現(xiàn)了一個(gè)函數(shù)first_visit_monte_carlo,它接受策略和要執(zhí)行的回合數(shù)作為參數(shù)。在每個(gè)回合中,我們從網(wǎng)格的左上角開始,根據(jù)策略移動(dòng)智能體,直到它到達(dá)目標(biāo)狀態(tài)。我們記錄了狀態(tài)-動(dòng)作序列和獎(jiǎng)勵(lì)序列。最后,我們從序列的末尾開始,計(jì)算每個(gè)狀態(tài)-動(dòng)作對(duì)的總回報(bào)G,并只在首次訪問時(shí)更新Q表。5.2每訪問一次蒙特卡洛方法每訪問一次蒙特卡洛方法(Every-VisitMonteCarloMethod)與首次訪問蒙特卡洛方法類似,但它在每次訪問狀態(tài)-動(dòng)作對(duì)時(shí)都會(huì)更新其價(jià)值估計(jì),而不僅僅是首次訪問。5.2.1吆理在每訪問一次蒙特卡洛方法中,對(duì)于每個(gè)狀態(tài)-動(dòng)作對(duì),我們記錄并更新其價(jià)值估計(jì),無論是在序列中的第一次還是后續(xù)訪問。這意味著,如果一個(gè)狀態(tài)-動(dòng)作對(duì)在同一個(gè)序列中被多次訪問,那么它的價(jià)值估計(jì)將被多次更新,每次更新都基于從該點(diǎn)開始的總回報(bào)GtQ5.2.2示例代碼使用與首次訪問蒙特卡洛方法相同的網(wǎng)格環(huán)境,我們將實(shí)現(xiàn)每訪問一次蒙特卡洛方法。#每訪問一次蒙特卡洛方法
defevery_visit_monte_carlo(policy,episodes):
for_inrange(episodes):
states_actions=[]
rewards_sequence=[]
state=(0,0)
whilestate!=(grid_size-1,grid_size-1):
action=policy[state]
states_actions.append((state,action))
reward=rewards[state]ifstate==(grid_size-1,grid_size-1)else0
rewards_sequence.append(reward)
ifaction=='up':
state=(max(state[0]-1,0),state[1])
elifaction=='down':
state=(min(state[0]+1,grid_size-1),state[1])
elifaction=='left':
state=(state[0],max(state[1]-1,0))
elifaction=='right':
state=(state[0],min(state[1]+1,grid_size-1))
G=0
fortinrange(len(states_actions)-1,-1,-1):
state,action=states_actions[t]
G+=rewards_sequence[t]
N[state][action]+=1
Q[state][action]+=(1/N[state][action])*(G-Q[state][action])
#執(zhí)行算法
every_visit_monte_carlo(policy,1000)5.2.3解釋在每訪問一次蒙特卡洛方法的實(shí)現(xiàn)中,我們遵循了與首次訪問蒙特卡洛方法相同的步驟,但在更新Q表時(shí),我們不再檢查是否為首次訪問。這意味著,即使?fàn)顟B(tài)-動(dòng)作對(duì)在序列中被多次訪問,我們也會(huì)多次更新其價(jià)值估計(jì),這通常會(huì)導(dǎo)致更準(zhǔn)確的估計(jì),尤其是在狀態(tài)-動(dòng)作對(duì)被頻繁訪問的情況下。通過比較首次訪問和每訪問一次蒙特卡洛方法,我們可以看到,每訪問一次方法在更新價(jià)值估計(jì)時(shí)更全面,因?yàn)樗紤]了所有訪問,而不僅僅是首次訪問。然而,首次訪問方法在處理長序列時(shí)可能更有效,因?yàn)樗苊饬酥貜?fù)計(jì)算。選擇哪種方法取決于具體問題和環(huán)境的特性。6蒙特卡洛方法在強(qiáng)化學(xué)習(xí)中的應(yīng)用6.1賭博問題6.1.1原理賭博問題是一個(gè)經(jīng)典的強(qiáng)化學(xué)習(xí)場(chǎng)景,其中蒙特卡洛方法可以用來估計(jì)策略的好壞。在賭博問題中,一個(gè)玩家開始有一定數(shù)量的籌碼,目標(biāo)是通過一系列的賭博決策,將籌碼增加到某個(gè)目標(biāo)值。每次賭博,玩家可以選擇賭注的大小,贏了則籌碼增加,輸了則籌碼減少。蒙特卡洛方法通過模擬多輪游戲,收集完整的序列(即從初始狀態(tài)到終止?fàn)顟B(tài)的完整路徑),然后根據(jù)這些序列的回報(bào)來更新策略。6.1.2內(nèi)容蒙特卡洛方法在賭博問題中的應(yīng)用主要涉及兩個(gè)步驟:策略評(píng)估和策略改進(jìn)。策略評(píng)估是通過模擬游戲來估計(jì)策略的值函數(shù),而策略改進(jìn)則是基于值函數(shù)來調(diào)整策略,以期望獲得更高的回報(bào)。6.1.2.1策略評(píng)估策略評(píng)估的目標(biāo)是計(jì)算策略π下狀態(tài)s的值函數(shù)V(s)。在賭博問題中,狀態(tài)s可以表示為玩家當(dāng)前擁有的籌碼數(shù)。蒙特卡洛方法通過模擬多輪游戲,收集從狀態(tài)s開始直到游戲結(jié)束的序列,然后計(jì)算這些序列的平均回報(bào),以此來估計(jì)V(s)。6.1.2.2策略改進(jìn)策略改進(jìn)基于策略評(píng)估的結(jié)果,通過比較不同動(dòng)作在相同狀態(tài)下的平均回報(bào),選擇回報(bào)更高的動(dòng)作作為新的策略。在賭博問題中,這意味著比較不同賭注大小在相同籌碼數(shù)下的表現(xiàn),選擇表現(xiàn)最好的賭注大小。6.1.3示例代碼importnumpyasnp
#定義賭博問題的參數(shù)
goal=100#目標(biāo)籌碼數(shù)
num_states=goal+1#狀態(tài)空間大小
num_episodes=10000#模擬的游戲輪數(shù)
win_prob=0.4#贏的概率
#初始化值函數(shù)和策略
V=np.zeros(num_states)
policy=np.zeros(num_states,dtype=int)
returns={state:[]forstateinrange(num_states)}
#蒙特卡洛策略評(píng)估和改進(jìn)
forepisodeinrange(num_episodes):
#初始化一個(gè)游戲序列
episode_states=[]
episode_rewards=[]
current_state=50#玩家開始有50籌碼
episode_states.append(current_state)
#模擬游戲直到結(jié)束
whilecurrent_state!=0andcurrent_state!=goal:
#根據(jù)當(dāng)前策略選擇賭注
stake=min(current_state,goal-current_state)
ifnp.random.rand()<win_prob:
current_state+=stake
else:
current_state-=stake
episode_states.append(current_state)
episode_rewards.append(1ifcurrent_state==goalelse0)
#計(jì)算序列的回報(bào)
G=0
foriinrange(len(episode_rewards)-1,-1,-1):
G+=episode_rewards[i]
ifepisode_states[i]notinepisode_states[:i]:
returns[episode_states[i]].append(G)
V[episode_states[i]]=np.mean(returns[episode_states[i]])
#策略改進(jìn)
forstateinrange(1,num_states-1):
stakes=np.arange(1,min(state,goal-state)+1)
values=[np.mean(returns[state+stake])*win_prob+np.mean(returns[state-stake])*(1-win_prob)forstakeinstakes]
policy[state]=stakes[np.argmax(values)]
print("最終策略:",policy)6.2懸崖行走問題6.2.1原理懸崖行走問題是一個(gè)二維網(wǎng)格環(huán)境,其中玩家的目標(biāo)是從左下角走到右下角的終點(diǎn),同時(shí)避免掉入懸崖(即網(wǎng)格的底部一行除了最右側(cè)的格子)。蒙特卡洛方法可以用來學(xué)習(xí)如何在不掉入懸崖的情況下到達(dá)終點(diǎn)的策略。在這個(gè)問題中,蒙特卡洛方法通過模擬玩家從初始狀態(tài)到終止?fàn)顟B(tài)的完整路徑,收集經(jīng)驗(yàn),然后根據(jù)這些經(jīng)驗(yàn)來更新策略。6.2.2內(nèi)容懸崖行走問題的蒙特卡洛方法應(yīng)用包括狀態(tài)-動(dòng)作值函數(shù)的估計(jì)和基于此值函數(shù)的策略改進(jìn)。狀態(tài)-動(dòng)作值函數(shù)Q(s,a)表示在狀態(tài)s下采取動(dòng)作a后,從當(dāng)前狀態(tài)開始直到游戲結(jié)束的期望回報(bào)。通過模擬多輪游戲,收集從狀態(tài)s開始,采取動(dòng)作a直到游戲結(jié)束的序列,然后計(jì)算這些序列的平均回報(bào),以此來估計(jì)Q(s,a)。6.2.2.1策略改進(jìn)策略改進(jìn)基于狀態(tài)-動(dòng)作值函數(shù)Q(s,a),通過比較在相同狀態(tài)下不同動(dòng)作的Q值,選擇Q值最高的動(dòng)作作為新的策略。6.2.3示例代碼importnumpyasnp
#定義懸崖行走問題的參數(shù)
grid_size=4
num_episodes=1000
gamma=1.0#折扣因子
#初始化狀態(tài)-動(dòng)作值函數(shù)和策略
Q=np.zeros((grid_size,grid_size,4))#4個(gè)動(dòng)作:上、下、左、右
policy=np.zeros((grid_size,grid_size),dtype=int)
returns={(state,action):[]forstateinrange(grid_size*grid_size)foractioninrange(4)}
#定義狀態(tài)轉(zhuǎn)換函數(shù)
defstep(state,action):
x,y=state%grid_size,state//grid_size
ifaction==0:#上
new_state=x+grid_size*(y-1)
elifaction==1:#下
new_state=x+grid_size*(y+1)
elifaction==2:#左
new_state=x-1+y*grid_size
elifaction==3:#右
new_state=x+1+y*grid_size
ifnew_state<0ornew_state>=grid_size*grid_sizeor(new_state%grid_size==0andaction==2)or(new_state%grid_size==grid_size-1andaction==3):
new_state=state
reward=-100if(y==grid_size-1andx!=grid_size-1)else-1
returnnew_state,reward
#蒙特卡洛策略評(píng)估和改進(jìn)
forepisodeinrange(num_episodes):
#初始化一個(gè)游戲序列
episode_states_actions=[]
episode_rewards=[]
current_state=0#玩家開始在左下角
episode_states_actions.append((current_state,policy[current_state//grid_size,current_state%grid_size]))
#模擬游戲直到結(jié)束
whilecurrent_state!=grid_size*grid_size-1:
new_state,reward=step(current_state,episode_states_actions[-1][1])
episode_states_actions.append((new_state,policy[new_state//grid_size,new_state%grid_size]))
episode_rewards.append(reward)
current_state=new_state
#計(jì)算序列的回報(bào)
G=0
foriinrange(len(episode_rewards)-1,-1,-1):
G=gamma*G+episode_rewards[i]
state,action=episode_states_actions[i]
if(state,action)notinepisode_states_actions[:i]:
returns[(state,action)].append(G)
Q[state//grid_size,state%grid_size,action]=np.mean(returns[(state,action)])
#策略改進(jìn)
forstateinrange(grid_size*grid_size):
x,y=state%grid_size,state//grid_size
ify!=grid_size-1orx==grid_size-1:
policy[y,x]=np.argmax(Q[y,x])
print("最終策略:",policy)通過上述代碼示例,我們可以看到蒙特卡洛方法在賭博問題和懸崖行走問題中的具體應(yīng)用,以及如何通過收集和分析經(jīng)驗(yàn)來不斷優(yōu)化策略。7案例分析7.1蒙特卡洛方法在Atari游戲中的應(yīng)用在強(qiáng)化學(xué)習(xí)領(lǐng)域,蒙特卡洛方法因其在處理具有延遲獎(jiǎng)勵(lì)的環(huán)境中的有效性而受到關(guān)注。Atari游戲,作為經(jīng)典的強(qiáng)化學(xué)習(xí)測(cè)試平臺(tái),其復(fù)雜性和不確定性為蒙特卡洛方法提供了理想的實(shí)驗(yàn)場(chǎng)景。下面,我們將通過一個(gè)簡化版的Atari游戲——“Pong”游戲,來探討蒙特卡洛方法的應(yīng)用。7.1.1環(huán)境設(shè)定“Pong”游戲是一個(gè)簡單的乒乓球游戲,其中有兩個(gè)玩家(或AI)通過移動(dòng)他們的球拍來反彈一個(gè)球,目標(biāo)是讓球擊中對(duì)方的墻壁。游戲的獎(jiǎng)勵(lì)是當(dāng)一方得分時(shí),另一方會(huì)收到-1的獎(jiǎng)勵(lì),而得分方則會(huì)收到+1的獎(jiǎng)勵(lì)。7.1.2蒙特卡洛策略蒙特卡洛策略基于游戲的完整回合來更新策略。在“Pong”游戲中,這意味著只有當(dāng)游戲結(jié)束時(shí),我們才能確定每個(gè)動(dòng)作的回報(bào)。蒙特卡洛策略使用了每回合的平均回報(bào)來評(píng)估策略的好壞,從而進(jìn)行策略的更新。7.1.3代碼示例importgym
importnumpyasnp
#初始化環(huán)境
env=gym.make('Pong-v0')
#初始化策略表和回報(bào)表
policy=np.zeros((env.observation_space.n,env.action_space.n))
returns={}
#蒙特卡洛控制算法
defmonte_carlo_control(env,num_episodes,discount_factor=1.0):
#初始化策略和回報(bào)表
policy=np.ones([env.observation_space.n,env.action_space.n])/env.action_space.n
returns={}
#對(duì)于每個(gè)狀態(tài)-動(dòng)作對(duì),初始化空列表來存儲(chǔ)回報(bào)
forstateinrange(env.observation_space.n):
foractioninrange(env.action_space.n):
returns[(state,action)]=[]
#開始迭代
fori_episodeinrange(1,num_episodes+1):
#初始化一個(gè)回合的軌跡
episode=[]
state=env.reset()
#生成一個(gè)回合的軌跡
fortinrange(100):
action=np.random.choice(np.arange(len(policy[state])),p=policy[state])
next_state,reward,done,_=env.step(action)
episode.append((state,action,reward))
ifdone:
break
state=next_state
#計(jì)算每個(gè)狀態(tài)-動(dòng)作對(duì)的回報(bào)
G=0
states_actions_returns=[]
fortinrange(len(episode))[::-1]:
state,action,reward=episode[t]
G=discount_factor*G+reward
states_actions_returns.append((state,action,G))
#更新策略和回報(bào)表
states_actions_returns.reverse()
forstate,action,Ginstates_actions_returns:
returns[(state,action)].append(G)
G=np.mean(returns[(state,action)])
policy[state]=np.argmax(G)
returnpolicy
#訓(xùn)練策略
num_episodes=10000
discount_factor=0.99
policy=monte_carlo_control(env,num_episodes,discount_factor)
#測(cè)試策略
fori_episodeinrange(10):
state=env.reset()
fortinrange(100):
env.render()
action=np.argmax(policy[state])
state,reward,done,_=env.step(action)
ifdone:
break
env.close()7.1.4解釋上述代碼中,我們首先初始化了環(huán)境和策略表。然后,通過蒙特卡洛控制算法,我們迭代地生成游戲的回合,并記錄每個(gè)狀態(tài)、動(dòng)作和獎(jiǎng)勵(lì)。在每個(gè)回合結(jié)束后,我們計(jì)算從每個(gè)狀態(tài)-動(dòng)作對(duì)開始的回報(bào),并更新策略表。最后,我們使用訓(xùn)練好的策略在“Pong”游戲中進(jìn)行測(cè)試。7.2AlphaGo中的蒙特卡洛樹搜索AlphaGo是第一個(gè)在圍棋這一復(fù)雜游戲中擊敗人類職業(yè)選手的AI系統(tǒng),其核心算法之一就是蒙特卡洛樹搜索(MCTS)。MCTS結(jié)合了蒙特卡洛方法的隨機(jī)性和樹搜索的結(jié)構(gòu)化決策過程,能夠在圍棋這樣具有巨大狀態(tài)空間的游戲中找到高質(zhì)量的策略。7.2.1MCTS原理MCTS通過構(gòu)建一棵搜索樹來評(píng)估可能的棋局。樹的每個(gè)節(jié)點(diǎn)代表一個(gè)游戲狀態(tài),而樹的邊則代表從一個(gè)狀態(tài)到另一個(gè)狀態(tài)的動(dòng)作。MCTS算法通過四個(gè)步驟來不斷擴(kuò)展和更新這棵樹:選擇:從根節(jié)點(diǎn)開始,根據(jù)當(dāng)前的策略選擇最有潛力的子節(jié)點(diǎn)。擴(kuò)展:到達(dá)樹的葉節(jié)點(diǎn)后,選擇一個(gè)未探索的狀態(tài)進(jìn)行擴(kuò)展。模擬:從擴(kuò)展的節(jié)點(diǎn)開始,使用隨機(jī)策略進(jìn)行游戲,直到游戲結(jié)束。反向傳播:將模擬的結(jié)果反向傳播到樹中,更新經(jīng)過的節(jié)點(diǎn)的統(tǒng)計(jì)信息。7.2.2代碼示例雖然AlphaGo的完整代碼非常復(fù)雜,下面是一個(gè)簡化版的MCTS算法示例,用于說明其基本流程:importnumpyasnp
classNode:
def__init__(self,state,parent=None):
self.state=state
self.parent=parent
self.children=[]
self.visits=0
self.wins=0
classMCTS:
def__init__(self,root_state):
self.root=Node(root_state)
defsearch(self,num_simulations):
for_inrange(num_simulations):
node=self._select(self.root)
winner=self._simulate(node.state)
self._backpropagate(node,winner)
def_select(self,node):
whilenotnode.state.is_terminal():
ifnotnode.children:
returnnode
else:
node=self._uct_select(node)
returnnode
def_uct_select(self,node):
best_score=float('-inf')
best_nodes=[]
forchildinnode.children:
score=child.wins/child.visits+np.sqrt(2*np.log(node.visits)/child.visits)
ifscore>best_score:
best_score=score
best_nodes=[child]
elifscore==best_score:
best_nodes.append(child)
returnnp.random.choice(best_nodes)
def_simulate(self,state):
#使用隨機(jī)策略進(jìn)行模擬
whilenotstate.is_terminal():
state=state.take_random_action()
returnstate.winner()
def_backpropagate(self,node,winner):
whilenodeisnotNone:
node.visits+=1
ifnode.state.player_to_move()==winner:
node.wins+=1
node=node.parent7.2.3解釋在這個(gè)示例中,我們定義了一個(gè)Node類來表示樹中的每個(gè)節(jié)點(diǎn),以及一個(gè)MCTS類來執(zhí)行搜索過程。MCTS類中的search方法執(zhí)行了指定次數(shù)的模擬,每次模擬包括選擇、擴(kuò)展、模擬和反向傳播四個(gè)步驟。_select方法用于選擇最有潛力的子節(jié)點(diǎn),_uct_select方法實(shí)現(xiàn)了上界置信區(qū)間(UCT)的選擇策略,_simulate
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教A版山西省大同市2023-2024學(xué)年高二上學(xué)期期末質(zhì)量監(jiān)測(cè)數(shù)學(xué)試題
- 林徽因課件教案
- 娜塔莎課件高中
- 2024年吉林省中考生物真題卷及答案解析
- 模板 卡通 課件
- 西京學(xué)院《新媒體數(shù)據(jù)挖掘?qū)嵱?xùn)》2022-2023學(xué)年期末試卷
- 西京學(xué)院《軟件測(cè)試技術(shù)》2021-2022學(xué)年期末試卷
- 測(cè)樹葉的面積
- 西京學(xué)院《機(jī)床電氣與技術(shù)》2022-2023學(xué)年期末試卷
- 西華師范大學(xué)《綜合自然地理》2022-2023學(xué)年第一學(xué)期期末試卷
- 手術(shù)室銳器刺傷
- 中國食物成分表2018年(標(biāo)準(zhǔn)版)第6版
- 2023-2024蘇教版小學(xué)五年級(jí)數(shù)學(xué)上冊(cè)全冊(cè)測(cè)評(píng)試卷(含答案)
- 科普類公園設(shè)計(jì)方案
- 小學(xué)英語就業(yè)能力展示
- 中醫(yī)-艾灸治疼痛
- “安全風(fēng)險(xiǎn)分級(jí)管控”工作制度(2篇)
- 心肌病和心肌炎課件
- 《艾滋病毒》課件
- 平陽港區(qū)西灣作業(yè)區(qū)防浪導(dǎo)流堤工程海域使用論證報(bào)告書
- 管道保溫計(jì)算公式
評(píng)論
0/150
提交評(píng)論