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