文章目錄
- 前言
- **一、 理論基礎:什么是策略梯度?**
- **1.1 基于價值 vs. 基于策略**
- **1.2 策略梯度(Policy Gradient)**
- **1.3 REINFORCE 算法:蒙特卡洛策略梯度**
- **1.4 REINFORCE 算法流程**
- **二、 PyTorch 代碼實踐**
- **2.1 環境與輔助函數**
- **2.2 核心算法實現**
- **2.3 訓練與結果**
- **總結**
前言
歡迎來到“從代碼學習深度強化學習”系列!在之前的文章中,我們可能已經接觸了許多基于價值(Value-based)的強化學習算法,如 Q-learning 和 DQN。這些算法的核心思想是學習一個價值函數(如 Q-函數),然后根據這個函數間接地推導出一個最優策略。然而,在很多現實場景中,尤其是那些動作空間連續或者非常大的問題中,直接學習一個策略函數可能更為高效和直接。
今天,我們將深入探討**策略梯度(Policy Gradient)**方法,這正是直接學習策略的算法家族的基石。我們將聚焦于該家族中最基礎也最經典的算法之一:REINFORCE。通過本篇博客,您將不僅理解 REINFORCE 的核心理論,還將跟隨我們一步步用 PyTorch 實現一個完整的 REINFORCE 智能體,并在經典的 CartPole 環境中進行訓練和測試。
讓我們一起從理論出發,最終落腳于代碼,徹底掌握 REINFORCE 算法的精髓!
完整代碼:下載鏈接
一、 理論基礎:什么是策略梯度?
在深入代碼之前,我們必須先理解 REINFORCE 算法背后的核心思想——策略梯度。
1.1 基于價值 vs. 基于策略
首先,讓我們明確兩類方法的根本區別:
- 基于價值 (Value-based) 的方法:如 Q-learning、DQN 及其改進算法,它們學習的是價值函數。學習過程并不會顯式地存在一個策略,而是根據學到的價值函數(例如,選擇Q值最高的動作)來推導出一個策略。
- 基于策略 (Policy-based) 的方法:這類方法不通過價值函數,而是直接學習一個目標策略。智能體會學習一個帶參數的策略函數
π(a|s, θ)
,這個函數直接輸出在某個狀態s
下采取各個動作a
的概率。我們的目標就是找到最優的參數θ
,使得策略最優。
策略梯度方法正是基于策略的方法的基礎。
1.2 策略梯度(Policy Gradient)
基于策略的方法首先需要將策略參數化。假設我們的目標策略 πθ
是一個隨機性策略,并且處處可微,其中 θ
是對應的參數。我們可以用一個線性模型或者神經網絡來構建這樣一個策略函數建模,它輸入某個狀態,然后輸出一個動作的概率分布。我們的目標是要尋找一個最優策略并最大化這個策略在環境中的期望回報。
我們將策略學習的目標函數定義為:
J ( θ ) = E s 0 [ V π θ ( s 0 ) ] J(\theta)=\mathbb{E}_{s_0}[V^{\pi_\theta}(s_0)] J(θ)=Es0??[Vπθ?(s0?)]
其中, s 0 s_0 s0? 表示初始狀態,V
是狀態價值函數,J(θ)
代表了在策略 π θ \pi_{\theta} πθ? 下,從初始狀態 s 0 s_0 s0?開始所能獲得的期望總回報。
現在有了目標函數,我們就可以將目標函數對策略參數 θ
求導,得到導數后就可以用梯度上升方法來最大化這個目標函數,從而得到最優策略。這個梯度就是我們常說的策略梯度,其具體形式如下(推導過程略):
? θ J ( θ ) ∝ ∑ s ∈ S ν π θ ( s ) ∑ a ∈ A Q π θ ( s , a ) ? θ π θ ( a ∣ s ) = ∑ s ∈ S ν π θ ( s ) ∑ a ∈ A π θ ( a ∣ s ) Q π θ ( s , a ) ? θ π θ ( a ∣ s ) π θ ( a ∣ s ) = E π θ [ Q π θ ( s , a ) ? θ log ? π θ ( a ∣ s ) ] \begin{aligned}\nabla_\theta J(\theta)&\propto\sum_{s\in S}\nu^{\pi_\theta}(s)\sum_{a\in A}Q^{\pi_\theta}(s,a)\nabla_\theta\pi_\theta(a|s)\\&=\sum_{s\in S}\nu^{\pi_\theta}(s)\sum_{a\in A}\pi_\theta(a|s)Q^{\pi_\theta}(s,a)\frac{\nabla_\theta\pi_\theta(a|s)}{\pi_\theta(a|s)}\\&=\mathbb{E}_{\pi_\theta}[Q^{\pi_\theta}(s,a)\nabla_\theta\log\pi_\theta(a|s)]\end{aligned} ?θ?J(θ)?∝s∈S∑?ν