網(wǎng)站建設(shè)步和客戶溝通中國(guó)教師教育培訓(xùn)網(wǎng)
1 Introduction
1.1 Policy-Based Reinforcement Learning
1.2 Value-based and policy based RL
基于值的強(qiáng)化學(xué)習(xí)
在基于值的 RL 中,目標(biāo)是找到一個(gè)最優(yōu)的值函數(shù),通常是 Q 函數(shù)或 V 函數(shù)。這些函數(shù)為給定的狀態(tài)或狀態(tài)-動(dòng)作對(duì)分配一個(gè)值,表示從該狀態(tài)開始或在該狀態(tài)下執(zhí)行特定動(dòng)作的預(yù)期回報(bào)。通過這種方式,智能體可以選擇那些具有最高值的動(dòng)作。Q-Learning 和 Deep Q Network (DQN) 就是基于值的 RL 的例子。這些方法都試圖優(yōu)化 Q 函數(shù),從而間接地優(yōu)化策略。
基于策略的強(qiáng)化學(xué)習(xí)
在基于策略的 RL 中,目標(biāo)是直接找到最優(yōu)策略,無需通過值函數(shù)。這通常通過參數(shù)化策略并使用優(yōu)化算法(如梯度上升)來最大化預(yù)期回報(bào)來實(shí)現(xiàn)。
基于策略的方法可以處理連續(xù)的、高維的動(dòng)作空間,這在基于值的方法中往往很難處理。Policy Gradient 和 Actor-Critic 是基于策略的 RL 的例子。
區(qū)別和聯(lián)系
基于值的 RL 和基于策略的 RL 的主要區(qū)別在于,前者通過優(yōu)化值函數(shù)間接優(yōu)化策略,而后者直接優(yōu)化策略。
然而,這兩種類型的 RL 也可以結(jié)合在一起,形成所謂的 Actor-Critic 方法。在這種方法中,策略(Actor)和值函數(shù)(Critic)都是顯式表示的,而且都在學(xué)習(xí)過程中更新。Critic 評(píng)估 Actor 的策略性能,而 Actor 根據(jù) Critic 的反饋來更新策略。這種方法結(jié)合了基于值和基于策略的 RL 的優(yōu)點(diǎn)。
我們之前接觸到的mento carlo和sarsa( λ \lambda λ)都屬于value based RL.
- Policy based RL
1.3 examples
- rock-paper-scissors game
- alias gridworld game
對(duì)于沒有全局定位的機(jī)器人來說,兩種灰色的狀態(tài)是類似的,alias state
value based RL 的值函數(shù)為每個(gè)狀態(tài)-動(dòng)作對(duì)分配一個(gè)值。然而,在這兩個(gè)別名化的狀態(tài)中,智能體應(yīng)該采取不同的行動(dòng),但由于狀態(tài)看起來是相同的,智能體會(huì)將同一個(gè)值分配給這兩個(gè)狀態(tài),這導(dǎo)致智能體無法正確行動(dòng)。
舉例來說,對(duì)于右側(cè)grey state,應(yīng)該向左移動(dòng),但是對(duì)于左側(cè)的grey state如果還往左移動(dòng)就出錯(cuò)了。這就是value based RL的最大局限性。
采用policy based RL
在灰色狀態(tài)的時(shí)候,采用隨機(jī)概率,就可能能達(dá)到最終目標(biāo)。
1.4 Policy Search
看一個(gè)cartpole的問題,試圖控制一個(gè)小車,使其上方的倒立桿保持直立。如果桿開始傾斜,我們需要移動(dòng)小車以防止桿倒下。問題的目標(biāo)是使桿盡可能長(zhǎng)時(shí)間地保持直立。
這個(gè)問題的狀態(tài)是一個(gè)四維向量,包含小車的位置、小車的速度、桿的角度和桿的角速度。每一步,我們可以選擇兩個(gè)動(dòng)作之一:向左或向右推小車。
在策略梯度中,我們直接優(yōu)化參數(shù)化的策略以獲取更多的獎(jiǎng)勵(lì)。這是通過在每個(gè)時(shí)間步中對(duì)策略的參數(shù)應(yīng)用梯度上升來完成的,其中梯度是獎(jiǎng)勵(lì)信號(hào)的函數(shù)。
代碼的整體思路:通過收集到的經(jīng)驗(yàn)(獎(jiǎng)勵(lì)和行為)來改進(jìn)策略。
這是通過計(jì)算策略梯度并使用優(yōu)化器對(duì)策略進(jìn)行梯度上升來實(shí)現(xiàn)的。這個(gè)過程的背后有一個(gè)關(guān)鍵的概念:我們想要增加我們得到好獎(jiǎng)勵(lì)的動(dòng)作的概率,減少我們得到壞獎(jiǎng)勵(lì)的動(dòng)作的概率。
在函數(shù)中,首先初始化一個(gè)總回報(bào)R為0,并創(chuàng)建一個(gè)空的策略損失列表。然后我們遍歷所有的獎(jiǎng)勵(lì)(從最后一步開始反向遍歷),對(duì)每一步計(jì)算一個(gè)折扣回報(bào)R,并將這個(gè)回報(bào)乘以那一步的動(dòng)作的負(fù)log概率。這個(gè)值被加入到策略損失列表中。這個(gè)過程實(shí)際上就是在計(jì)算策略梯度的公式:
策略梯度方法中,我們使用參數(shù)化的策略 πθ,其中 θ 是神經(jīng)網(wǎng)絡(luò)的參數(shù)。我們希望找到一組參數(shù) θ,使得在這個(gè)策略下,累積回報(bào)的期望值最大。πθ,其中 θ 是神經(jīng)網(wǎng)絡(luò)的參數(shù)。
在訓(xùn)練過程中,我們基于已經(jīng)采取的動(dòng)作和得到的回報(bào)計(jì)算策略梯度,然后使用這個(gè)梯度來更新神經(jīng)網(wǎng)絡(luò)的參數(shù)。具體來說,我們計(jì)算每一步的策略梯度為 ? θ l o g π θ ( a t ∣ s t ) G t ?_θlogπ_θ(a_t|s_t)G_t ?θ?logπθ?(at?∣st?)Gt?,然后將所有步驟的策略梯度加起來作為整個(gè)軌跡的策略梯度。這就相當(dāng)于計(jì)算了一個(gè)誤差信號(hào),這個(gè)誤差信號(hào)表示在當(dāng)前策略下,如何改變參數(shù) θ 才能使得回報(bào)的期望值增大。
在策略梯度中,我們定義的“損失函數(shù)”實(shí)際上是一個(gè)優(yōu)化目標(biāo),這個(gè)目標(biāo)是基于經(jīng)驗(yàn)回報(bào)的。具體來說,我們使用的損失是 ? l o g π θ ( a t ∣ s t ) G t ?logπ_θ(a_t|s_t)G_t ?logπθ?(at?∣st?)Gt?,其中 Gt 是從時(shí)間步 t 到軌跡結(jié)束的累積回報(bào), π θ ( a t ∣ s t ) π_θ(a_t|s_t) πθ?(at?∣st?) 是在狀態(tài) st 下采取動(dòng)作 at 的概率,負(fù)號(hào)表示我們希望最大化這個(gè)量(因?yàn)閮?yōu)化算法通常是最小化損失函數(shù))。 ? l o g π θ ( a t ∣ s t ) G t ?logπ_θ(a_t|s_t)G_t ?logπθ?(at?∣st?)Gt?,其中 Gt 是從時(shí)間步 t 到軌跡結(jié)束的累積回報(bào), π θ ( a t ∣ s t ) π_θ(a_t|s_t) πθ?(at?∣st?) 是在狀態(tài) st 下采取動(dòng)作 ? l o g π θ ( a t ∣ s t ) G t ?logπ_θ(a_t|s_t)G_t ?logπθ?(at?∣st?)Gt?
這樣定義損失函數(shù)的原因是,我們希望在策略產(chǎn)生好的結(jié)果(高回報(bào))時(shí),增加導(dǎo)致這個(gè)結(jié)果的動(dòng)作的概率;反之,如果策略產(chǎn)生的結(jié)果不好(低回報(bào)),我們希望降低導(dǎo)致這個(gè)結(jié)果的動(dòng)作的概率。而 ? l o g π θ ( a t ∣ s t ) G t ?logπ_θ(a_t|s_t)G_t ?logπθ?(at?∣st?)Gt?這個(gè)量的梯度正好滿足這個(gè)需求
import gym
import torch
import torch.nn as nn
import torch.optim as optimclass Policy(nn.Module):def __init__(self):super(Policy, self).__init__()self.affine1 = nn.Linear(4, 128)self.dropout = nn.Dropout(p=0.6)self.affine2 = nn.Linear(128, 2)def forward(self, x):x = self.affine1(x)x = self.dropout(x)x = torch.relu(x)action_scores = self.affine2(x)return torch.softmax(action_scores, dim=1)def select_action(policy, state):state = torch.from_numpy(state).float().unsqueeze(0)probs = policy(state)m = torch.distributions.Categorical(probs)action = m.sample()return action.item(), m.log_prob(action)def train(policy, optimizer, rewards, log_probs):R = 0policy_loss = []for r in rewards[::-1]:R = r + 0.99 * Rpolicy_loss.append(-log_prob * R)optimizer.zero_grad()policy_loss = torch.cat(policy_loss).sum()policy_loss.backward()optimizer.step()def main():env = gym.make('CartPole-v0')policy = Policy()optimizer = optim.Adam(policy.parameters(), lr=1e-2)for i_episode in range(1000):state = env.reset()rewards = []log_probs = []for t in range(10000): # Don't infinite loop while learningaction, log_prob = select_action(policy, state)state, reward, done, _ = env.step(action)rewards.append(reward)log_probs.append(log_prob)if done:breaktrain(policy, optimizer, rewards, log_probs)env.close()if __name__ == '__main__':main()
1.4.1 policy objective functions
policy objective functions:
- 收集數(shù)據(jù)
- 優(yōu)化模型
2 Finite Difference policy Gradient
2.1 Policy Gradient
通過policy gradient 方法進(jìn)行數(shù)值迭代
通過數(shù)值差分的方法,計(jì)算gradient進(jìn)行優(yōu)化
對(duì)于剛才那個(gè)神經(jīng)網(wǎng)絡(luò)的問題,定義loss function,進(jìn)行神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。
2.2 AIBO example
2.3 Likelihood Ratios
- score function
通過似然比技巧,將策略梯度的表達(dá)式轉(zhuǎn)換成更容易處理的形式。由技巧
Δ θ f ( x ) = f ( x ) ? Δ θ l o g ( f ( x ) ) \Delta_{\theta} f(x)=f(x) * \Delta_{\theta} log(f(x)) Δθ?f(x)=f(x)?Δθ?log(f(x))
可以得到轉(zhuǎn)換后的policy gradient
在我們剛才那個(gè)例子中,通過pytorch的log_prob來實(shí)現(xiàn)
def select_action(policy, state):state = torch.from_numpy(state).float().unsqueeze(0)probs = policy(state)m = torch.distributions.Categorical(probs)action = m.sample()return action.item(), m.log_prob(action)
- softmax policy
我們首先定義動(dòng)作的概率分布為softmax函數(shù)的形式。假設(shè)我們有動(dòng)作值函數(shù) Q(s,a;θ),對(duì)于狀態(tài) s 和動(dòng)作 a,動(dòng)作概率被定義為
π ( a ∣ s ; θ ) = e x p ( Q ( s , a ; θ ) ) ∑ a ′ e x p ( Q ( s , a ′ ; θ ) ) \pi(a|s;\theta)=\frac{exp(Q(s,a;\theta))}{\sum_{a'}exp(Q(s,a';\theta))} π(a∣s;θ)=∑a′?exp(Q(s,a′;θ))exp(Q(s,a;θ))?
在這種情況下,策略梯度定理會(huì)稍微變形。在softmax策略下,策略梯度的形式為:
Δ θ J ( θ ) = E π [ Δ θ l o g π ( a ∣ s ; θ ) ? Q π ( s , a ) ] \Delta_{\theta}J(\theta)=E_{\pi}[\Delta_{\theta}log \pi(a|s;\theta) * Q^{\pi}(s,a)] Δθ?J(θ)=Eπ?[Δθ?logπ(a∣s;θ)?Qπ(s,a)]
得到score function是:
根據(jù)GPT給出的推導(dǎo)的過程:
然而,這個(gè)形式在實(shí)踐中并不好計(jì)算,因?yàn)橛?jì)算動(dòng)作值函數(shù) Qπ(s,a) 通常是困難的。因此,我們通常使用一個(gè)稱為優(yōu)勢(shì)函數(shù)的替代項(xiàng):
A π ( s , a ) = Q π ( s , a ) ? V π ( s ) A^{\pi}(s,a)=Q^{\pi}(s,a)-V^{\pi}(s) Aπ(s,a)=Qπ(s,a)?Vπ(s)
這里的 Vπ(s) 是狀態(tài)值函數(shù)。優(yōu)勢(shì)函數(shù)表示選擇動(dòng)作 a 而不是平均情況下的預(yù)期回報(bào)。因此,策略梯度定理在實(shí)踐中常常被寫為:Vπ(s) 是狀態(tài)值函數(shù)。優(yōu)勢(shì)函數(shù)表示選擇動(dòng)作 a 而不是平均情況下的預(yù)期回報(bào)
Δ π J ( θ ) = E π [ Δ θ l o g π ( a ∣ s ; θ ) ? A π ( s , a ) ] \Delta_{\pi}J(\theta)=E_{\pi}[\Delta_{\theta} log\pi(a|s;\theta)*A^{\pi}(s,a)] Δπ?J(θ)=Eπ?[Δθ?logπ(a∣s;θ)?Aπ(s,a)]
對(duì)于線性feature ? ( s , a ) T θ \phi(s,a)^T\theta ?(s,a)Tθ, 根據(jù)score function的公式,可以得到下面的結(jié)論
- Gaussian policy
推導(dǎo)過程如下:
2.4 policy gradient theorem
- one-step MDPs
替換公式中的瞬時(shí)reward到long-term value Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a)
作用
在某些強(qiáng)化學(xué)習(xí)算法中,會(huì)同時(shí)訓(xùn)練兩個(gè)網(wǎng)絡(luò),一個(gè)用來近似價(jià)值函數(shù)(通常是動(dòng)作價(jià)值函數(shù)Q(s,a)),另一個(gè)用來近似策略函數(shù)。這種方法通常被稱為Actor-Critic方法。Q(s,a)),另一個(gè)用來近似策略函數(shù)。這種方法通常被稱為Actor-Critic方法
在Actor-Critic方法中,“Actor”部分是用來近似策略函數(shù)的網(wǎng)絡(luò),它根據(jù)當(dāng)前狀態(tài)s選擇動(dòng)作a;而“Critic”部分是用來近似價(jià)值函數(shù)的網(wǎng)絡(luò),它評(píng)估在給定狀態(tài)s下采取動(dòng)作a的預(yù)期回報(bào)。"Critic"通過計(jì)算TD-error來更新價(jià)值函數(shù),而"Actor"則通過使用策略梯度方法(如您之前提到的 Q π ( s , a ) Q^π(s,a) Qπ(s,a))來更新策略函數(shù)。s選擇動(dòng)作a;而“Critic”部分是用來近似價(jià)值函數(shù)的網(wǎng)絡(luò),它評(píng)估在給定狀態(tài)s下采取動(dòng)作a的預(yù)期回報(bào)。"Critic"通過計(jì)算TD-error來更新價(jià)值函數(shù),而"Actor"則通過使用策略s選擇動(dòng)作a;而“Critic”部分是用來近似價(jià)值函數(shù)的網(wǎng)絡(luò),它評(píng)估在給
Actor-Critic方法確實(shí)可以說是混合了value based和policy based的RL方法,因?yàn)樗瑫r(shí)使用了價(jià)值函數(shù)和策略函數(shù)。這種方法的優(yōu)點(diǎn)在于,它可以利用價(jià)值函數(shù)的穩(wěn)定性和策略函數(shù)的靈活性,從而在強(qiáng)化學(xué)習(xí)任務(wù)中實(shí)現(xiàn)更好的性能。
3 Monte Carlo Policy Gradient
3.1 mente-carlo policy gradient
import gym
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optimclass PolicyNetwork(nn.Module):def __init__(self, n_inputs, n_outputs):super(PolicyNetwork, self).__init__()self.model = nn.Sequential(nn.Linear(n_inputs, 64),nn.ReLU(),nn.Linear(64, n_outputs),nn.Softmax(dim=-1))def forward(self, x):return self.model(x)def train(env, policy, optimizer, gamma=0.99, max_episodes=1000):for episode in range(max_episodes):state = env.reset()log_probs = []rewards = []# Generate an episodedone = Falsewhile not done:state = torch.FloatTensor(state)action_probs = policy(state)action_dist = torch.distributions.Categorical(action_probs)action = action_dist.sample()log_prob = action_dist.log_prob(action)state, reward, done, _ = env.step(action.item())log_probs.append(log_prob)rewards.append(reward)# Compute discounted returnsreturns = []R = 0for r in rewards[::-1]:R = r + gamma * Rreturns.insert(0, R)returns = torch.tensor(returns)returns = (returns - returns.mean()) / (returns.std() + 1e-5)# Compute policy gradientpolicy_loss = []for log_prob, R in zip(log_probs, returns):policy_loss.append(-log_prob * R)policy_loss = torch.cat(policy_loss).sum()# Update policyoptimizer.zero_grad()policy_loss.backward()optimizer.step()if episode % 100 == 0:print('Episode {}\tLoss: {:.2f}'.format(episode, policy_loss.item()))def main():env = gym.make('CartPole-v0')policy = PolicyNetwork(env.observation_space.shape[0], env.action_space.n)optimizer = optim.Adam(policy.parameters(), lr=1e-2)train(env, policy, optimizer)if __name__ == '__main__':main()
4 Actor Critic Policy Gradient
4.1 說明
- Reducing Variance using a Critic
- Estimating the action-value function
- Action-Value Actor-Critic
對(duì)于Actor-Critic方法,我們需要同時(shí)更新Actor和Critic。其中Actor負(fù)責(zé)選擇動(dòng)作,Critic負(fù)責(zé)評(píng)估當(dāng)前狀態(tài)-動(dòng)作對(duì)的值。這個(gè)過程可以看作是一種動(dòng)態(tài)的、交互式的過程,Actor基于Critic的反饋來更新自己的策略,而Critic則基于Actor的動(dòng)作來更新狀態(tài)-動(dòng)作對(duì)的估計(jì)值。
在這個(gè)CartPole問題中,我們采用的Sarsa(λ)算法,它是一種時(shí)序差分學(xué)習(xí)方法,這意味著它在更新狀態(tài)-動(dòng)作對(duì)的值時(shí),同時(shí)考慮了當(dāng)前的獎(jiǎng)勵(lì)和下一個(gè)狀態(tài)-動(dòng)作對(duì)的估計(jì)值。
在代碼中,每一個(gè)episode開始時(shí),我們首先重置環(huán)境和資格跡。在每一步中,我們首先根據(jù)當(dāng)前的狀態(tài)選擇一個(gè)動(dòng)作,然后執(zhí)行這個(gè)動(dòng)作并觀察環(huán)境的反饋。接著,我們計(jì)算TD誤差,這是實(shí)際的獎(jiǎng)勵(lì)和我們的估計(jì)值之間的差距。然后,我們使用這個(gè)TD誤差來更新Critic的參數(shù)。
對(duì)于Actor的更新,我們使用了策略梯度方法。這里的損失函數(shù)是-log(action_prob) * td_error,這實(shí)際上就是對(duì)策略梯度公式的一種實(shí)現(xiàn)。在計(jì)算損失函數(shù)后,我們使用反向傳播來計(jì)算梯度,然后應(yīng)用這個(gè)梯度來更新Actor的參數(shù)。
需要注意的是,在更新Actor的參數(shù)時(shí),我們使用了資格跡。這是因?yàn)樵赟arsa(λ)中,我們不僅考慮了當(dāng)前的狀態(tài)-動(dòng)作對(duì),還考慮了之前的狀態(tài)-動(dòng)作對(duì)。這樣可以更好地將未來的獎(jiǎng)勵(lì)反向傳播到之前的狀態(tài)-動(dòng)作對(duì),從而提高學(xué)習(xí)效率。
在實(shí)際訓(xùn)練的過程中,通過儲(chǔ)存replay buffer,復(fù)用過去的經(jīng)驗(yàn)來更新網(wǎng)絡(luò)。用這種方式sarsa(\lambda)也可以使用batch training的方法來更新q-table的網(wǎng)絡(luò)和policy \theta的網(wǎng)絡(luò)。
兩者分別用value error和 policy gradient來更新網(wǎng)絡(luò)。
import torch
import torch.nn as nn
import torch.optim as optim
import gym
import numpy as np
from collections import deque
import randomclass Actor(nn.Module):def __init__(self, input_dim, output_dim):super(Actor, self).__init__()self.linear1 = nn.Linear(input_dim, 128)self.linear2 = nn.Linear(128, output_dim)def forward(self, state):x = torch.relu(self.linear1(state))x = torch.softmax(self.linear2(x), dim=-1)return xclass Critic(nn.Module):def __init__(self, input_dim, output_dim):super(Critic, self).__init__()self.linear1 = nn.Linear(input_dim, 128)self.linear2 = nn.Linear(128, output_dim)def forward(self, state):x = torch.relu(self.linear1(state))x = self.linear2(x)return xclass ActorCritic:def __init__(self, input_dim, action_dim, gamma=0.99):self.actor = Actor(input_dim, action_dim)self.critic = Critic(input_dim, 1)self.optimizer_actor = optim.Adam(self.actor.parameters())self.optimizer_critic = optim.Adam(self.critic.parameters())self.gamma = gammaself.replay_buffer = deque(maxlen=10000)def get_action(self, state):state = torch.tensor(state, dtype=torch.float).unsqueeze(0)probs = self.actor(state)action = np.random.choice(len(probs[0]), p=probs.detach().numpy()[0])return actiondef update(self, batch_size):if len(self.replay_buffer) < batch_size:returnminibatch = random.sample(self.replay_buffer, batch_size)states, actions, rewards, next_states, dones = zip(*minibatch)states = torch.tensor(states, dtype=torch.float)actions = torch.tensor(actions, dtype=torch.long)rewards = torch.tensor(rewards, dtype=torch.float)next_states = torch.tensor(next_states, dtype=torch.float)dones = torch.tensor(dones, dtype=torch.float)Q_vals = self.critic(states).squeeze()next_Q_vals = self.critic(next_states).squeeze()Q_target = rewards + self.gamma * next_Q_vals * (1 - dones)# update criticloss_critic = nn.MSELoss()(Q_vals, Q_target.detach())self.optimizer_critic.zero_grad()loss_critic.backward()self.optimizer_critic.step()# update actoraction_probs = self.actor(states)chosen_action_probs = action_probs.gather(1, actions.unsqueeze(1)).squeeze()loss_actor = -torch.sum(torch.log(chosen_action_probs) * Q_target.detach())self.optimizer_actor.zero_grad()loss_actor.backward()self.optimizer_actor.step()def store_transition(self, state, action, reward, next_state, done):self.replay_buffer.append((state, action, reward, next_state, done))def main():env = gym.make("CartPole-v0")input_dim = env.observation_space.shape[0]action_dim = env.action_space.nagent = ActorCritic(input_dim, action_dim)num_episodes = 500batch_size = 32for ep in range(num_episodes):state = env.reset()total_reward = 0done = Falsewhile not done:action = agent.get_action(state)next_state, reward, done, _ = env.step(action)agent.store_transition(state, action, reward, next_state, done)agent.update(batch_size)state = next_statetotal_reward += rewardprint(f"Episode {ep}, Reward: {total_reward}")if __name__ == "__main__":main()
4.2 Compatible function Approximation
- bias in actor-critic algorithms
- Compatible Function Approximation
- Proof of Compatible Function Approximation Theorem
"Compatible Function Approximation"是一個(gè)在強(qiáng)化學(xué)習(xí)中用來確保策略梯度有一個(gè)良好性質(zhì)的方法。這個(gè)性質(zhì)就是當(dāng)我們使用一個(gè)特定類型的值函數(shù)近似時(shí)(具體來說,這個(gè)值函數(shù)近似和我們的策略有一定的兼容性),策略梯度就是真實(shí)的策略梯度的一個(gè)無偏估計(jì)。這意味著在平均意義下,我們的策略梯度的估計(jì)是準(zhǔn)確的。
這個(gè)方法的關(guān)鍵思想就是,我們的值函數(shù)近似(Q函數(shù))應(yīng)該和我們的策略有一定的兼容性。具體來說,我們的值函數(shù)近似的梯度應(yīng)該與我們的策略的梯度有關(guān)。為了滿足這個(gè)條件,我們使用以下的值函數(shù)近似:
策略網(wǎng)絡(luò)和值函數(shù)網(wǎng)絡(luò)往往是獨(dú)立的,它們各自有自己的參數(shù),它們的梯度不一定有任何直接的關(guān)系。但這并不妨礙我們使用"Compatible Function Approximation"的理論去指導(dǎo)我們的算法設(shè)計(jì)。
首先,需要明確的是,"Compatible Function Approximation"的理論并不一定需要在實(shí)際應(yīng)用中嚴(yán)格遵守。這個(gè)理論是一個(gè)理想的情況,它給出了一個(gè)理想的值函數(shù)近似應(yīng)該滿足的性質(zhì)。在實(shí)際應(yīng)用中,我們可能無法(或者不需要)嚴(yán)格滿足這些性質(zhì),但我們可以盡量接近它。
其次,盡管在實(shí)際應(yīng)用中,我們的策略網(wǎng)絡(luò)和值函數(shù)網(wǎng)絡(luò)可能是獨(dú)立的,但我們可以通過訓(xùn)練過程去使它們盡量接近"Compatible Function Approximation"的理論。具體來說,我們可以通過以下方式去做:
- 我們可以通過優(yōu)化目標(biāo)函數(shù)去促使策略網(wǎng)絡(luò)和值函數(shù)網(wǎng)絡(luò)的梯度盡可能接近。具體來說,我們可以使用一個(gè)目標(biāo)函數(shù),它包含了策略網(wǎng)絡(luò)和值函數(shù)網(wǎng)絡(luò)的梯度的差的平方。這樣,我們的優(yōu)化過程就會(huì)盡量使得策略網(wǎng)絡(luò)和值函數(shù)網(wǎng)絡(luò)的梯度接近。
- 我們可以在訓(xùn)練過程中共享一部分網(wǎng)絡(luò)結(jié)構(gòu)。具體來說,我們的策略網(wǎng)絡(luò)和值函數(shù)網(wǎng)絡(luò)可以共享一部分底層的網(wǎng)絡(luò)結(jié)構(gòu),這樣,它們的梯度就有可能更接近。
需要注意的是,這些都是盡量接近"Compatible Function Approximation"的理論的方法,它們并不能保證我們的策略網(wǎng)絡(luò)和值函數(shù)網(wǎng)絡(luò)的梯度完全一致。但在實(shí)際應(yīng)用中,這些方法已經(jīng)足夠好了,它們可以使我們的訓(xùn)練過程更穩(wěn)定,更容易收斂。
4.3 Advantage Function Critic
- Reducing Variance Using a Baseline
Advantage Function的直觀理解是,在狀態(tài)s下采取動(dòng)作a相比于在狀態(tài)s下按照策略π采取動(dòng)作的平均優(yōu)勢(shì)。
減少方差:相比于使用原始的回報(bào)(reward-to-go)或者Q值,使用Advantage Function可以減少方差,使得學(xué)習(xí)過程更加穩(wěn)定。因?yàn)锳dvantage Function已經(jīng)減去了值函數(shù)V(s),這相當(dāng)于減去了一個(gè)基線(baseline),可以減少估計(jì)的方差。
更好的指導(dǎo)策略優(yōu)化:Advantage Function可以更好地指導(dǎo)策略優(yōu)化。因?yàn)锳dvantage Function表示的是采取某個(gè)動(dòng)作相對(duì)于平均水平的優(yōu)勢(shì),所以我們?cè)趦?yōu)化策略的時(shí)候,應(yīng)該更傾向于增加那些有正優(yōu)勢(shì)(positive advantage)的動(dòng)作的概率,減少那些有負(fù)優(yōu)勢(shì)(negative advantage)的動(dòng)作的概率。
有助于解決探索與利用的問題:通過使用Advantage Function,我們可以更好地平衡探索與利用的問題。因?yàn)锳dvantage Function可以指示我們哪些動(dòng)作可能比平均水平更好,哪些動(dòng)作可能比平均水平更差,這可以幫助我們?cè)谶x擇動(dòng)作的時(shí)候,既考慮到利用已知的知識(shí),也考慮到探索未知的動(dòng)作。
4.3.1 estimating the advantage function
- 直接法
計(jì)算advantage function,通過直接計(jì)算Q值和V值,然后相減。
- 通過TD間接計(jì)算
在實(shí)際應(yīng)用中,我們確實(shí)需要計(jì)算動(dòng)作值函數(shù)Q和狀態(tài)值函數(shù)V來獲取優(yōu)勢(shì)函數(shù)(Advantage Function)。然而,直接計(jì)算Q值和V值可能需要大量的樣本和計(jì)算資源,因此在實(shí)踐中,我們通常采用一些近似的方法。
一個(gè)常見的方法是使用Temporal Difference (TD) 學(xué)習(xí)的方法估計(jì)Advantage Function。這種方法不需要顯式地計(jì)算Q值和V值,而是通過對(duì)即時(shí)獎(jiǎng)勵(lì)和未來獎(jiǎng)勵(lì)的估計(jì)進(jìn)行比較來計(jì)算Advantage Function。具體來說,TD學(xué)習(xí)的優(yōu)勢(shì)函數(shù)可以通過以下公式進(jìn)行定義:
A(s, a) = r(s, a) + γV(s’) - V(s)
其中,r(s, a)是采取動(dòng)作a在狀態(tài)s下獲得的即時(shí)獎(jiǎng)勵(lì),γ是折扣因子,V(s’)是在下一狀態(tài)s’下的值函數(shù)估計(jì),V(s)是在當(dāng)前狀態(tài)s下的值函數(shù)估計(jì)。
這種方法的好處是,它不需要顯式地計(jì)算Q值,可以直接通過TD誤差來估計(jì)Advantage Function,從而大大減少了計(jì)算和存儲(chǔ)的需求。但是,它也有一個(gè)缺點(diǎn),那就是它需要對(duì)環(huán)境的動(dòng)態(tài)性有一個(gè)較好的估計(jì),以便計(jì)算出準(zhǔn)確的TD誤差。
- 使用TD( λ \lambda λ)計(jì)算advantage function.
其中,α_w和α_θ分別是值函數(shù)和策略的學(xué)習(xí)率,γ是折扣因子,λ是資格跡參數(shù),e是資格跡量。
這種方法的一個(gè)主要優(yōu)點(diǎn)是,它可以利用資格跡量來有效地處理遲延獎(jiǎng)勵(lì)問題,即當(dāng)獎(jiǎng)勵(lì)在時(shí)間步上被延遲時(shí),通過保持一個(gè)資格跡量來“記住”過去的狀態(tài)和動(dòng)作,并利用這些信息來更新值函數(shù)和策略。
4.4 Eligibility Traces
4.4.1 Critic at different time-scale
另一個(gè)常見的方法是使用Actor-Critic方法來估計(jì)Advantage Function。在這種方法中,我們使用一個(gè)稱為Actor的模型來估計(jì)策略,使用另一個(gè)稱為Critic的模型來估計(jì)值函數(shù)。通過這種方式,我們可以在每個(gè)時(shí)間步中同時(shí)更新策略和值函數(shù),從而更準(zhǔn)確地估計(jì)Advantage Function。
4.4.2 actors at Different Time-scales
4.4.3 policy gradient with eligibility traces
4.5 Natural Policy Gradient
4.5.1 Alternative Policy Gradient Directions
Natural Policy Gradient是一種優(yōu)化策略的方法,它是Policy Gradient的一種變體。它的主要思想是在優(yōu)化策略時(shí),不僅要考慮獎(jiǎng)勵(lì)的增加,還要考慮策略改變的大小,也就是說,它試圖在保證策略改變不大的情況下,最大化獎(jiǎng)勵(lì)。為了衡量策略改變的大小,Natural Policy Gradient引入了一種名為Fisher信息度量的概念,它能夠在某種意義上度量?jī)蓚€(gè)策略之間的距離。
具體來說,普通的Policy Gradient方法是基于梯度上升的思想來優(yōu)化策略的,它每一步都沿著梯度的方向改變策略參數(shù)。然而,這種方法可能會(huì)導(dǎo)致策略改變過大,從而影響到學(xué)習(xí)的穩(wěn)定性。相比之下,Natural Policy Gradient則是通過在優(yōu)化過程中引入Fisher信息度量來限制策略改變的大小,從而提高了學(xué)習(xí)的穩(wěn)定性。
Natural Policy Gradient的優(yōu)點(diǎn)主要包括:1.它能夠提高學(xué)習(xí)的穩(wěn)定性。通過限制策略改變的大小,它可以避免策略的過度更新,從而使學(xué)習(xí)過程更加穩(wěn)定。
2.它能夠更好地利用信息。由于它考慮了策略改變的大小,因此它能夠在一定程度上利用更多的信息來優(yōu)化策略。
Natural Policy Gradient主要適用于那些需要保持策略穩(wěn)定性的場(chǎng)景,特別是在復(fù)雜的、連續(xù)的動(dòng)作空間中,Natural Policy Gradient通常可以提供更好的性能。此外,由于它的優(yōu)化過程涉及到Fisher信息度量的計(jì)算,因此它在計(jì)算資源有限的情況下也可能會(huì)表現(xiàn)得更好。
G θ G_{\theta} Gθ? 是 Fisher Information Matrix, G θ G_{\theta} Gθ?^(-1) 是 G θ G_{\theta} Gθ? 的逆矩陣。通過這種方式,NPG 能夠考慮到參數(shù)空間的結(jié)構(gòu),從而使得更新步驟在所有方向上都更加均衡。
直觀地說,標(biāo)準(zhǔn)的 Policy Gradient 方法可能會(huì)在參數(shù)空間的某些方向上更新過快,而忽略了其他方向。而 Natural Policy Gradient 方法則能夠保證在所有方向上都有均勻的更新,從而使得學(xué)習(xí)過程更加穩(wěn)定。