看這篇文章之前,建議先了解一下:Q-Learning 算法。
1. 算法介紹
DQN 算法全稱為 Deep Q-Network,即深度Q網絡。它將 Q-Learning 與 Deep Learning 結合在了一起。
1.1 Q-Network
Q-Learning 是使用 Q-table 才存儲決策信息的,那么這就要求 state、action 必須是離散的。但是大部分情況,state 和 action 并不離散,或者不方便例舉出所有的可能性。比如說用來打游戲,這時 Q-Learning 就無法使用。
為了應對 state 和 action 是連續的情況,我們可以使用 Q 函數來替代 Q-table,Q 函數依然可以記為 Q(s,a),這樣對于任意的 state 和 action,只需要通過函數計算我們就可以得到其所對應的 Q-value 了。
但是強化學習可應用的情況可能非常復雜,比如打游戲,我們知道當前的所有敵人的情況 state 和我們下一步想做的操作 action,我們也是沒辦法設想一個合理的函數來作為 Q-value 的。
神經網絡只要構建的足夠大,理論上可以模擬任何函數,那么我們就可以使用神經網絡來充當 Q 函數。w是神經網絡的參數,那么我們的 Q 函數可以記為 Q(s,a;w)。這個網絡也就被成為 Q-Network。
1.2 網絡的輸入與輸出
神經網絡的輸入輸出是什么呢?
輸入肯定就是狀態的每一項。輸出可以有兩種選擇。一種是讓網絡輸出當前 state 對應每一種 action 的 Q-value,另一種是直接讓網絡輸出最優 action。
兩種各有優劣。對第一種來說,由于我們是替代 Q-table 的,那么如果網絡輸出是 Q-value,我們就可以使用 Q-Learning 或 SARSA 所使用的 Q-value 更新策略來更新網絡。但是這樣我們就需要列舉出所有可行的 action,這樣 action 仍需要是離散的,那么之前所說的使用 Q-Network 的初衷就有一部分沒能得到滿足。相比之下,第二種就允許 action 是連續的,但也就不方便使用 TD 策略來更新網絡。
1.3 參數更新
一般我們可以選擇第一種方式,因為方便設計網絡更新算法。如果我們選擇第一種方式的話,如何更新網絡呢?
- 首先需要前向傳播,得到每個可行的 action 對應的 Q-value,獲得一個輸出 a = argmax(Q(s,a;w)),同時我們可以觀察到下一個 s’,并獲得獎勵 r。
- 計算 TD Target:y = r + γ max{Q(s’,a’;w)};
- 計算損失函數:loss = 1/2[y - Q(s,a;w)]^2。
這樣我們就得到了損失函數,然后就可以使用梯度下降來更新網絡中的參數w。
2. 優化
2.1 目標網絡
訓練過程中將網絡復制為兩部分 netA 和 netB。每一次訓練過程,使用 netA 去做決策,只更新 netB 的參數。等到一輪訓練完畢后,將 netB 的參數復制給 netA。
稱 netA 為目標網絡(target network),在每一輪訓練過程中,它的參數是固定死的。
2.2 探索
如果一開始,某個 action 得到了正向的獎勵,那么后面就可能會一直采取這個 action。但其實可能別的 action 會比這個要好很多。為了不會陷入局部優化,算法需要具有一定的探索性。
常用的解決方法有兩種:ε 貪心(epsilon greedy)和玻爾茲曼探索(Boltzmann exploration)。ε 貪心更常用。
-
ε 貪心
其中 ε 為探索率,其值為 0-1 之間。算法會以 ε 的概率選擇隨機 action,以 1-ε 的概率使用 Q-Network 選擇 action。
-
玻爾茲曼探索
玻爾茲曼探索策略是基于玻爾茲曼分布(Boltzmann Distribution)的概念。在每一步中,智能體會根據每個動作的價值函數估計值和一個稱為“溫度”的參數 τ 來計算選擇該動作的概率。
溫度參數 τ 控制了探索和利用之間的平衡:當 τ 較高時,智能體更傾向于探索;當 τ 較低時,智能體更傾向于利用已知信息選擇最優動作。
2.3 經驗回放
經驗回放(Experience Replay)是一種用于存儲和回放過去經驗(即狀態轉換)的策略。
該策略需要創建一個經驗池(Experience Replay Buffer),通常是一個循環隊列或固定大小的列表。每當 agent 選擇一個 action 并與環境進行交互時,就會生成一個新的經驗(或稱為轉換),該經驗包含當前state、所選 action、獲得的 reward 以及下一個state。這個經驗會被存儲到經驗池中。當經驗池中的經驗數量達到一定的閾值時,算法每次訓練會從經驗池中隨機抽取一批經驗作為訓練數據。
好處:
- 打破數據相關性:在強化學習中,相鄰狀態之間通常存在高度相關性。直接使用連續的經驗進行訓練可能會導致模型對最近的經驗產生過度擬合,從而降低其泛化能力。通過經驗回放,算法可以從歷史經驗中隨機抽取數據進行訓練,從而打破數據之間的相關性,提高模型的泛化能力。
- 提高數據利用效率:在強化學習中,數據的收集往往是非常昂貴的。通過經驗回放,算法可以反復利用存儲在經驗池中的歷史經驗進行訓練,從而提高數據的利用效率。
- 提高訓練穩定性:由于經驗回放可以打破數據之間的相關性并提高數據利用效率,因此它可以使DQN的訓練過程更加穩定。此外,通過隨機抽取經驗進行訓練,算法可以更好地應對非平穩分布的問題,因為歷史經驗中可能包含不同分布的數據。