深度強(qiáng)化學(xué)習(xí)實(shí)戰(zhàn):訓(xùn)練DQN模型玩超級(jí)馬里奧兄弟
深度學(xué)習(xí)作為當(dāng)前計(jì)算機(jī)科學(xué)領(lǐng)域最具前沿性的研究方向之一,其應(yīng)用范圍涵蓋了從計(jì)算機(jī)視覺到自然語(yǔ)言處理等多個(gè)領(lǐng)域。本文將探討深度學(xué)習(xí)在游戲領(lǐng)域的一個(gè)具體應(yīng)用:構(gòu)建一個(gè)能夠自主學(xué)習(xí)并完成超級(jí)馬里奧兄弟的游戲的智能系統(tǒng)。
強(qiáng)化學(xué)習(xí)基礎(chǔ)
強(qiáng)化學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個(gè)重要分支,研究智能體如何通過(guò)與環(huán)境的交互學(xué)習(xí)來(lái)優(yōu)化其行為策略。類似于人類的學(xué)習(xí)過(guò)程,智能體在虛擬環(huán)境中通過(guò)不斷嘗試各種行動(dòng)并獲取反饋,逐步建立最優(yōu)決策模型。
在強(qiáng)化學(xué)習(xí)框架中,做出決策的程序被稱為智能體(agent),其所處的交互空間被定義為環(huán)境(environment)。智能體通過(guò)執(zhí)行動(dòng)作(actions)與環(huán)境進(jìn)行交互,每個(gè)動(dòng)作都會(huì)獲得相應(yīng)的獎(jiǎng)勵(lì)信號(hào),用以評(píng)估該動(dòng)作在特定狀態(tài)下的效果——這里的狀態(tài)指的是環(huán)境在特定時(shí)刻的完整配置信息。
以上圖gif為例,作為智能體的人類嘗試與環(huán)境中的灑水裝置進(jìn)行交互,采取了一個(gè)動(dòng)作:將其對(duì)準(zhǔn)自己。執(zhí)行該動(dòng)作后,智能體接收到了明顯的負(fù)向獎(jiǎng)勵(lì)信號(hào)(從干燥到濕潤(rùn)的狀態(tài)轉(zhuǎn)換),從而學(xué)會(huì)了避免重復(fù)該動(dòng)作。
從系統(tǒng)層面來(lái)看,智能體通過(guò)動(dòng)作與環(huán)境交互,獲取獎(jiǎng)勵(lì)信號(hào)和新的狀態(tài)信息,這個(gè)新狀態(tài)又將作為下一個(gè)動(dòng)作決策的依據(jù)。
在超級(jí)馬里奧Bros游戲環(huán)境中,智能體是控制馬里奧行為的程序系統(tǒng),環(huán)境則包含了游戲世界的所有元素:磚塊、管道、敵人等。環(huán)境狀態(tài)即為游戲當(dāng)前幀的完整信息,這些信息構(gòu)成了智能體進(jìn)行決策分析的基礎(chǔ)數(shù)據(jù)。
我們的智能體可以執(zhí)行的動(dòng)作集合對(duì)應(yīng)著馬里奧的控制指令:跳躍、移動(dòng)、靜止等。在游戲的每一幀中,智能體都會(huì)根據(jù)其行為獲得相應(yīng)的獎(jiǎng)勵(lì)信號(hào):失敗時(shí)獲得負(fù)向獎(jiǎng)勵(lì),而向著目標(biāo)推進(jìn)則獲得正向獎(jiǎng)勵(lì)。
通過(guò)上述理論框架的建立,我們可以深入理解智能程序如何在特定環(huán)境中通過(guò)學(xué)習(xí)來(lái)形成最優(yōu)決策策略。
2013年,人工智能領(lǐng)域的領(lǐng)先企業(yè)DeepMind推出了突破性的深度Q網(wǎng)絡(luò)(DQN)技術(shù),該網(wǎng)絡(luò)在多款雅達(dá)利游戲中實(shí)現(xiàn)了超越人類水平的表現(xiàn)。這一創(chuàng)新極大地推進(jìn)了強(qiáng)化學(xué)習(xí)的發(fā)展,使其能夠應(yīng)對(duì)更為復(fù)雜的問(wèn)題,包括對(duì)游戲畫面的實(shí)時(shí)分析與理解。
我們的目標(biāo)是構(gòu)建一個(gè)能夠自主掌握超級(jí)馬里奧Bros第一關(guān)的深度神經(jīng)網(wǎng)絡(luò)系統(tǒng)。
超級(jí)馬里奧Bros環(huán)境構(gòu)建
在開發(fā)針對(duì)超級(jí)馬里奧Bros的智能系統(tǒng)之前,我們需要首先構(gòu)建一個(gè)合適的仿真環(huán)境。Gym-Super-Mario-Bros提供了一個(gè)專門的強(qiáng)化學(xué)習(xí)環(huán)境框架,支持智能體在超級(jí)馬里奧Bros系列前兩代游戲的各個(gè)關(guān)卡中進(jìn)行訓(xùn)練。
在環(huán)境中,系統(tǒng)接收當(dāng)前游戲畫面作為狀態(tài)輸入,并需要基于該狀態(tài)信息選擇相應(yīng)的動(dòng)作,如跳躍、左右移動(dòng)或保持靜止等。
Gym-Super-Mario-Bros框架提供了根據(jù)不同研究目標(biāo)選擇游戲關(guān)卡和視覺特征的靈活性。我們選用SuperMarioBros-1-1-v1作為實(shí)驗(yàn)環(huán)境,這是第一關(guān)卡的簡(jiǎn)化版本,通過(guò)降低背景復(fù)雜度來(lái)優(yōu)化圖像識(shí)別效率。
為了深入理解該環(huán)境的特性,我們首先實(shí)現(xiàn)一個(gè)基于隨機(jī)策略的基準(zhǔn)智能體,用于測(cè)試第一關(guān)卡的基本交互機(jī)制。
DQN架構(gòu)設(shè)計(jì)
從本質(zhì)上講,神經(jīng)網(wǎng)絡(luò)是一類通過(guò)樣本學(xué)習(xí)來(lái)建立輸入輸出映射關(guān)系的函數(shù)系統(tǒng)。在圖像識(shí)別等任務(wù)中,網(wǎng)絡(luò)通過(guò)學(xué)習(xí)樣本建立分類模型。
網(wǎng)絡(luò)的輸入為游戲當(dāng)前狀態(tài)的圖像數(shù)據(jù),輸出為各可能動(dòng)作的價(jià)值評(píng)估(Q值),其中最高價(jià)值對(duì)應(yīng)的動(dòng)作被認(rèn)為是當(dāng)前狀態(tài)下的最優(yōu)決策。
Q值定義為在特定狀態(tài)下執(zhí)行某動(dòng)作所能獲得的預(yù)期累積獎(jiǎng)勵(lì),即在該狀態(tài)采取特定動(dòng)作后所獲得的總體獎(jiǎng)勵(lì)的期望值。
從實(shí)用角度看,它量化了在某個(gè)狀態(tài)下選擇特定動(dòng)作的價(jià)值。
據(jù)此我們?cè)O(shè)計(jì)的神經(jīng)網(wǎng)絡(luò)架構(gòu)如下圖所示:
系統(tǒng)架構(gòu)的具體實(shí)現(xiàn)如下:
- 輸入層接收游戲的最近四幀畫面。這種幀堆疊技術(shù)(Frame Stacking)的引入使網(wǎng)絡(luò)能夠捕獲時(shí)序信息
- 這些圖像數(shù)據(jù)經(jīng)由網(wǎng)絡(luò)的卷積層處理,用于提取和識(shí)別圖像中的關(guān)鍵特征模式
- 卷積層的特征輸出傳遞給全連接層,用于計(jì)算每個(gè)可能動(dòng)作的Q值
- 系統(tǒng)基于計(jì)算得出的Q值選擇最優(yōu)動(dòng)作,即選擇Q值最高的動(dòng)作執(zhí)行
在訓(xùn)練初期,DQN在圖像特征提取和動(dòng)作價(jià)值評(píng)估方面的表現(xiàn)都相對(duì)欠佳。但通過(guò)持續(xù)的訓(xùn)練優(yōu)化,網(wǎng)絡(luò)逐步提升其狀態(tài)理解能力和動(dòng)作評(píng)估準(zhǔn)確度,最終能夠在不同狀態(tài)下做出合理的決策。
雖然網(wǎng)絡(luò)實(shí)現(xiàn)的具體細(xì)節(jié)較為復(fù)雜,感興趣的讀者可以參考源代碼,相關(guān)技術(shù)細(xì)節(jié)也將在文末附錄中詳細(xì)說(shuō)明。
在理解了神經(jīng)網(wǎng)絡(luò)的基本架構(gòu)后,我們現(xiàn)在關(guān)注其與環(huán)境的交互實(shí)現(xiàn)。
智能體-環(huán)境交互機(jī)制
在此前介紹的隨機(jī)策略智能體的基礎(chǔ)上,我們將構(gòu)建一個(gè)具有學(xué)習(xí)能力的智能體系統(tǒng)。
首先實(shí)現(xiàn)state_reshape(state)函數(shù)用于狀態(tài)數(shù)據(jù)的預(yù)處理和標(biāo)準(zhǔn)化,然后構(gòu)建智能體訓(xùn)練函數(shù):
# 狀態(tài)數(shù)據(jù)預(yù)處理和標(biāo)準(zhǔn)化函數(shù)
def state_reshape(state):
state = np.swapaxes(state, -3, -1)
state = np.swapaxes(state, -1, -2)
return state / 255.
# 智能體訓(xùn)練主函數(shù)
def train(agent, env, total_timesteps):
# 環(huán)境初始化
state = env.reset()
# 狀態(tài)預(yù)處理
state = state_reshape(state)
timestep = 0
# 訓(xùn)練循環(huán)
while timestep < total_timesteps:
# 動(dòng)作選擇
actions = agent.act(state)
# 執(zhí)行動(dòng)作并獲取新狀態(tài)信息
next_state, rewards, dones, _ = env.step(actions)
# 新狀態(tài)預(yù)處理
next_state = state_reshape(next_state)
# 經(jīng)驗(yàn)數(shù)據(jù)存儲(chǔ)
agent.remember(state, actions, rewards, next_state, dones)
# 網(wǎng)絡(luò)訓(xùn)練
agent.train()
timestep += 1
# 狀態(tài)更新
state = next_state
# epsilon重置,維持探索性
if timestep % 50000 == 0:
agent.epsilon = 0.1
相比隨機(jī)策略實(shí)現(xiàn),本系統(tǒng)有以下關(guān)鍵改進(jìn):
- 采用智能體的.act(state)方法進(jìn)行動(dòng)作選擇,替代了隨機(jī)選擇機(jī)制
- 引入.remember(state, actions, rewards, next_state, dones)方法實(shí)現(xiàn)經(jīng)驗(yàn)回放機(jī)制,存儲(chǔ)交互數(shù)據(jù)用于后續(xù)訓(xùn)練
- 通過(guò).train()方法實(shí)現(xiàn)持續(xù)的在線學(xué)習(xí),不斷優(yōu)化網(wǎng)絡(luò)性能
- 引入epsilon參數(shù)控制探索-利用平衡,每50,000步重置以維持適度的探索性> 各方法的詳細(xì)技術(shù)說(shuō)明請(qǐng)參見文末附錄
系統(tǒng)實(shí)現(xiàn)完成后,只需執(zhí)行訓(xùn)練程序即可啟動(dòng)學(xué)習(xí)過(guò)程。經(jīng)過(guò)數(shù)小時(shí)的訓(xùn)練,我們使用DQN獲得的最佳表現(xiàn)如文章開頭所示,并且在引入更復(fù)雜的強(qiáng)化學(xué)習(xí)算法后,系統(tǒng)性能得到進(jìn)一步提升:
總結(jié)
本研究展示了強(qiáng)化學(xué)習(xí)在游戲人工智能領(lǐng)域的應(yīng)用潛力。通過(guò)具體項(xiàng)目實(shí)踐,我們期望能夠推動(dòng)該領(lǐng)域的研究發(fā)展,并激發(fā)更多研究者的興趣。
如需深入了解本項(xiàng)目的技術(shù)細(xì)節(jié),請(qǐng)參考下方附錄和完整的源代碼。
以下是對(duì)文中部分技術(shù)細(xì)節(jié)的補(bǔ)充說(shuō)明:
神經(jīng)網(wǎng)絡(luò)架構(gòu)
本項(xiàng)目采用基于PyTorch實(shí)現(xiàn)的神經(jīng)網(wǎng)絡(luò),包含三個(gè)卷積層和兩個(gè)全連接層。
import torch.nn as nn
import torch.nn.functional as F
class Network(nn.Module):
def __init__(self, in_dim: int, out_dim: int):
super(Network, self).__init__()
self.out_dim = out_dim
self.convs = nn.Sequential(nn.Conv2d(4, 32, 8, stride=4, padding=0), nn.ReLU(),
nn.Conv2d(32, 64, 4, stride=2, padding=0), nn.ReLU(),
nn.Conv2d(64, 64, 3, stride=1, padding=0), nn.ReLU())
self.advantage1 = nn.Linear(7 * 7 * 64, 512)
self.advantage2 = nn.Linear(512, out_dim)
self.value1 = nn.Linear(7 * 7 * 64, 512)
self.value2 = nn.Linear(512, 1)
def forward(self, state):
conv = self.convs(state)
flat = conv.reshape(-1, 7 * 7 * 64)
adv_hid = F.relu(self.advantage1(flat))
val_hid = F.relu(self.value1(flat))
advantages = self.advantage2(adv_hid)
values = self.value2(val_hid)
q = values + (advantages - advantages.mean())
這里采用了Dueling Deep Q-Network架構(gòu),將網(wǎng)絡(luò)輸出分為狀態(tài)價(jià)值(V)估計(jì)和動(dòng)作優(yōu)勢(shì)(Advantage)估計(jì)兩個(gè)分支。這種架構(gòu)設(shè)計(jì)通過(guò)將Q值分解為兩個(gè)獨(dú)立的組件,提高了網(wǎng)絡(luò)的學(xué)習(xí)效率和性能。
動(dòng)作選擇策略
為了平衡探索與利用,系統(tǒng)采用ε-貪心策略進(jìn)行動(dòng)作選擇。初始階段較高的探索率確保對(duì)動(dòng)作空間的充分探索,隨訓(xùn)練進(jìn)行逐步降低探索率,但保留最小探索概率以維持適應(yīng)性。
經(jīng)驗(yàn)存儲(chǔ)機(jī)制
每次交互后的經(jīng)驗(yàn)數(shù)據(jù)(當(dāng)前狀態(tài)、動(dòng)作、獎(jiǎng)勵(lì)、下一狀態(tài)、終止標(biāo)志)被存儲(chǔ)到經(jīng)驗(yàn)回放緩沖區(qū),用于后續(xù)批量訓(xùn)練。