實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

AI前線發表於2019-02-25
實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?
作者 | 武維
編輯 | Natalie
前言

毀滅戰士(Doom)是由 ID Software 開發的第一人稱射擊遊戲,是第一人稱射擊遊戲的開拓者。ViZDoom 是基於 Doom 遊戲的人工智慧研究平臺,主要針對的是深度強化學習的研究。ViZDoom 平臺允許人工智慧 Bot 使用遊戲影像資訊進行對戰,與傳統遊戲內建 Bot 的區別在於,傳統遊戲內建 Bot 對整個遊戲的資訊都是知道的。而基於人工智慧的 Agent 獲得的遊戲資訊和人是相同的,需要不斷地探索地圖及執行相應的行動。

本節主要介紹 ViZDoom 中的兩個場景:射擊場景,使用了 Deep Q-learning 演算法;收集醫藥箱場景,使用了 Policy Gradients 演算法。兩個場景如下圖所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

在射擊場景中,怪物隨機地出現在介面的一端,智慧體有左、右移動和射擊三個動作,怪物只要被擊中一次,就會被殺死。當怪物被殺死或執行 100 次行動後怪物還沒被殺死,則遊戲結束。當怪物被殺死,智慧體得到 101 獎勵分數;當執行射擊後,怪物沒有被擊中,智慧體得到 -5 分的獎勵;當執行向左或向右行動後,怪物還在存活,智慧體得到 -1 分的獎勵。

在收集醫藥箱的場景中,整個地圖是矩形的,地面上是酸性的腐蝕液體,液體會週期性地腐蝕智慧體的生命值。地圖上隨機分佈著一些醫藥箱,並且會時不時地出現一些新的醫藥箱。智慧體為了在地圖上生存下去,需要撿起醫療包,恢復生命值。當智慧體死亡或時間到了,遊戲結束。智慧體有三個行動,向左、向右及前進。每個行動後,如果智慧體生存下來,獲得 1 獎勵分數,如果死亡獲取 100 懲罰分數。

本文主要基於 ViZDoom 中的兩個場景,講解強化學習的基本思想,Q-Learning 演算法,Deep Q-Learning 演算法如何應用於射擊場景及 Policy Gradient 演算法如何應用於收集醫藥箱場景。

更多優質內容請關注微信公眾號“AI 前線”(ID:ai-front)

強化學習

強化學習是機器學習的一個重要分支,目前已經廣泛應用於遊戲博弈、機器人控制、自動駕駛、人機對話、優化排程等領域。目前,常使用的深度強化學習演算法主要有 Deep Q-learning、Policy Gradients、Actor Critic 和 PPO(Proximal Policy Optimization)。強化學習的基本思想為在一個環境中,智慧體(agent)不斷地和環境互動,執行不同的行動,然後獲取到相應的獎勵。這樣,智慧體在不斷的嘗試過程中,學習到完成目標的最優策略,從而獲取到最高的累積獎勵。

強化學習的架構中主要包含的元素為:智慧體(agent),環境(env),狀態(state)行動(action)及獎勵(reward)。如下所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

上圖中環境(env)為超級瑪麗昂這個經典遊戲(Super Mario);智慧體(agent)可以認為是一個 AI 機器人,在不斷嘗試玩這個遊戲,實現智慧體的自我進化;狀態(State)為智慧體(Super Mario Bros)在特定時間點的遊戲介面中的位置資訊,可以認為是一張遊戲介面的截圖;行動(action)為智慧體根據當前的狀態資訊,所採取的動作,比如上、下、左、右、跳,相當於智慧體和環境在進行互動操作;當智慧體執行完動作後,智慧體會從當前狀態轉移到下個狀態,即遊戲的下一幀;獎勵(reward)為智慧體執行完動作後獲得的分數,比如執行完向前動作後,如果智慧體不死,則得分加 1。強化學習的基本思想為智慧體能夠最大化期望的累積獎勵,用數學公式可表示為:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

Q-Learning

Q Learning 主要用 Q Table 記錄狀態 s 下采取不同行動後,得到將來的期望獎勵。如下所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

其中,圖中的每個小方格表示智慧體的狀態,共有 5*5=20 種狀態,對應的每個狀態智慧體可採取 4 個行動,為向上、向下、向左、向右移動,如果為 0 表示不可以移動。這樣依據狀態和行動,可生成表格 Q-Table,每個單元格中的分數表示對狀態採取對應行動後產生最大期望獎勵的度量值。表格中的 4 列,分別表示向左、向右、向上、向下移動;表格中的每行表示智慧體的狀態。對應於上節提到的老鼠吃乳酪的遊戲,生成 Q-Table 後,選擇對應狀態的行,得分最高的行動。Q-Learning 演算法的主要目的是能夠學習得到 Q-function,如下所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

Q-function 以狀態和行動作為輸入引數,返回輸入狀態對應的期望累積獎勵。Q-Learning 演算法通過迭代化地優化 Q-Table 得到 Q-function,演算法的學習流程如下所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

Deep Q-Learning

Q-Learning 演算法主要是通過不斷更新 Q-Table 來學習到優化的 Q-function。但是,對於大的智慧體狀態空間,比如說圍棋、射擊遊戲,很難定義和更新 Q-Table,Q-Learning 演算法將不起作用。Deep Q-Learning 演算法,可對智慧體的狀態,通過神經網路演算法,來逼近該狀態下執行 action 後的 Q-Value 值。如下所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

其中,Deep Q 的輸入為狀態資訊,可以是一系列圖片,輸出為執行不同動作後,Q 值的期望。為了更好地利用觀測到的經驗資料,訓練 DQN 的時候常採用經驗回放機制 Experience Replay,經驗回覆機制主要能夠解決兩個方面的問題,一個是避免網路忘掉以前學到的經驗資訊,二是神經網路的訓練資料是獨立分佈的,而強化學習生成的資料一般是序列化的,通過經驗回放機制可以打破這種順序結構。經驗回放機制如下所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

其中,構建一個 ReplyBuffer 資料結構,把智慧體和環境互動的資訊(s,a,r,s’)放入 Buffer 中,然後隨機取樣生成 Batch 的訓練資料,輸入 DQN 網路中。DQN 的優化目標,如下所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

射擊場景中,資料預處理如下所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

其中,首先讀取遊戲介面影像,為了減少訓練資料大小,經過影像預處理,把遊戲影像轉換成 84*84 大小的灰度圖片;然後,為了處理智慧體所處狀態的時序變化,比如移動方向,把四張預處理後的影像堆疊起來,組成 84*84*4 大小的訓練資料。射擊場景使用的 Deep Q-learning 的網路模型結構如下圖所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

其中,使用了 3 個卷積網路,每個卷積特徵層的大小為 20*20*32,9*9*64,3*3*128;然後,經過全連結層,最後輸出執行每個 action 行動後的 Q 值。損失函式的計算方式如下所示,其中 Qtarget 可基於經驗回放的方式和當前 action 的獎勵,由 Q-leaning 中 Q 值的更新方式計算得到。

# Q is our predicted Q value.

self.Q = tf.reduce_sum(tf.multiply(self.output, self.actions_), axis=1)

# The loss is the difference between our predicted Q_values and the Q_target

# Sum(Qtarget – Q)^2

self.loss = tf.reduce_mean(tf.square(self.target_Q – self.Q))

Policy Gradient

Deep Q-Learning 是基於值的強化演算法,而 Policy Gradients 是基於策略的強化演算法,目標是能夠學習到策略方程 policy function,直接實現智慧體狀態到行動的對映,優化的目標為策略方程π。在強化學習中有兩種型別的策略:確定性策略和隨機性策略。確定性策略使用在確定性的環境中,智慧體執行完行動後有確定性的輸出;隨機性策略是輸出智慧體在當前狀態,選擇不同 action 的概率分佈,隨機性策略主要用於非確定性環境。

使用策略梯度演算法主要有三個優點,第一:策略梯度演算法有較好的收斂性,策略梯度演算法會沿著梯度方向更新策略方程裡面的引數,每個迭代下引數更新平穩,演算法收斂性會比較好。第二:策略梯度演算法在高維的 action 空間更有效果,策略梯度會直接根據根據智慧體的狀態輸出要執行的 action,不需要計算 Q 值。第三:策略梯度演算法可以適用於非確定性環境。

策略梯度演算法的主要思想為通過優化θ,改變策略的概率分佈,從而使得智慧體能取得高的期望獎勵,優化方式如下所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

收集醫藥箱的場景的資料預處理方式類似於射擊場景,模型結構如下所示:

實踐 | 如何訓練智慧體Agent玩毀滅戰士ViZDoom?

與射擊場景的模型的差異在於,輸出為該狀態下執行 action 的概率分佈,如下所示:

self.action_distribution = tf.nn.softmax(self.logits)

損失函式計算如下所示,其中,discounted_episode_rewards_ 為該狀態下的累積獎勵,logits 為模型輸出的 logist 值,actions 為對應狀態下選擇執行的行動。

self.neg_log_prob = tf.nn.softmax_cross_entropy_with_logits_v2(logits = self.logits, labels = self.actions)

self.loss = tf.reduce_mean(self.neg_log_prob * self.discounted_episode_rewards_)

總結

本文首先介紹了 Doom 遊戲的人工智慧研究平臺 ViZDoom,包括射擊場景和醫療包收集場景;介紹了強化學習的基本思想,包括智慧體、環境、狀態、行動及獎勵。然後,講解了強化學習中常用的三個演算法 Q-Learning、Deep Q-Learning、Policy Gradient;應用 Deep Q-Learning 於射擊場景;應用 Policy Gradient 於醫藥包收集場景。使用者可把強化學習應用到遊戲博弈、機器人控制、自動駕駛、人機對話、優化排程等工業領域中的相關場景。

參考文獻

[1] https://simoninithomas.github.io/Deep_reinforcement_learning_Course.

相關文章