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