David Silver Lecture 7: Policy Gradient

news2024/11/27 4:41:32

1 Introduction

1.1 Policy-Based Reinforcement Learning

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 Value-based and policy based RL

在这里插入图片描述

基于值的强化学习
在基于值的 RL 中,目标是找到一个最优的值函数,通常是 Q 函数或 V 函数。这些函数为给定的状态或状态-动作对分配一个值,表示从该状态开始或在该状态下执行特定动作的预期回报。通过这种方式,智能体可以选择那些具有最高值的动作。

Q-Learning 和 Deep Q Network (DQN) 就是基于值的 RL 的例子。这些方法都试图优化 Q 函数,从而间接地优化策略。

基于策略的强化学习
在基于策略的 RL 中,目标是直接找到最优策略,无需通过值函数。这通常通过参数化策略并使用优化算法(如梯度上升)来最大化预期回报来实现。
基于策略的方法可以处理连续的、高维的动作空间,这在基于值的方法中往往很难处理。Policy Gradient 和 Actor-Critic 是基于策略的 RL 的例子。

区别和联系
基于值的 RL 和基于策略的 RL 的主要区别在于,前者通过优化值函数间接优化策略,而后者直接优化策略。
然而,这两种类型的 RL 也可以结合在一起,形成所谓的 Actor-Critic 方法。在这种方法中,策略(Actor)和值函数(Critic)都是显式表示的,而且都在学习过程中更新。Critic 评估 Actor 的策略性能,而 Actor 根据 Critic 的反馈来更新策略。这种方法结合了基于值和基于策略的 RL 的优点。

我们之前接触到的mento carlo和sarsa( λ \lambda λ)都属于value based RL.
在这里插入图片描述

  • Policy based RL
    在这里插入图片描述

1.3 examples

  • rock-paper-scissors game
    在这里插入图片描述
  • alias gridworld game
    在这里插入图片描述
    对于没有全局定位的机器人来说,两种灰色的状态是类似的,alias state
    在这里插入图片描述

value based RL 的值函数为每个状态-动作对分配一个值。然而,在这两个别名化的状态中,智能体应该采取不同的行动,但由于状态看起来是相同的,智能体会将同一个值分配给这两个状态,这导致智能体无法正确行动。

在这里插入图片描述
举例来说,对于右侧grey state,应该向左移动,但是对于左侧的grey state如果还往左移动就出错了。这就是value based RL的最大局限性。
在这里插入图片描述
采用policy based RL
在这里插入图片描述
在灰色状态的时候,采用随机概率,就可能能达到最终目标。
在这里插入图片描述

1.4 Policy Search

看一个cartpole的问题,试图控制一个小车,使其上方的倒立杆保持直立。如果杆开始倾斜,我们需要移动小车以防止杆倒下。问题的目标是使杆尽可能长时间地保持直立。
这个问题的状态是一个四维向量,包含小车的位置、小车的速度、杆的角度和杆的角速度。每一步,我们可以选择两个动作之一:向左或向右推小车。
在策略梯度中,我们直接优化参数化的策略以获取更多的奖励。这是通过在每个时间步中对策略的参数应用梯度上升来完成的,其中梯度是奖励信号的函数。

代码的整体思路:通过收集到的经验(奖励和行为)来改进策略。

这是通过计算策略梯度并使用优化器对策略进行梯度上升来实现的。这个过程的背后有一个关键的概念:我们想要增加我们得到好奖励的动作的概率,减少我们得到坏奖励的动作的概率。
在函数中,首先初始化一个总回报R为0,并创建一个空的策略损失列表。然后我们遍历所有的奖励(从最后一步开始反向遍历),对每一步计算一个折扣回报R,并将这个回报乘以那一步的动作的负log概率。这个值被加入到策略损失列表中。这个过程实际上就是在计算策略梯度的公式:
策略梯度方法中,我们使用参数化的策略 πθ,其中 θ 是神经网络的参数。我们希望找到一组参数 θ,使得在这个策略下,累积回报的期望值最大。πθ,其中 θ 是神经网络的参数。
在训练过程中,我们基于已经采取的动作和得到的回报计算策略梯度,然后使用这个梯度来更新神经网络的参数。具体来说,我们计算每一步的策略梯度为 ∇ θ l o g π θ ( a t ∣ s t ) G t ∇_θlogπ_θ(a_t|s_t)G_t θlogπθ(atst)Gt,然后将所有步骤的策略梯度加起来作为整个轨迹的策略梯度。这就相当于计算了一个误差信号,这个误差信号表示在当前策略下,如何改变参数 θ 才能使得回报的期望值增大。
在策略梯度中,我们定义的“损失函数”实际上是一个优化目标,这个目标是基于经验回报的。具体来说,我们使用的损失是 − l o g π θ ( a t ∣ s t ) G t −logπ_θ(a_t|s_t)G_t logπθ(atst)Gt,其中 Gt 是从时间步 t 到轨迹结束的累积回报, π θ ( a t ∣ s t ) π_θ(a_t|s_t) πθ(atst) 是在状态 st 下采取动作 at 的概率,负号表示我们希望最大化这个量(因为优化算法通常是最小化损失函数)。 − l o g π θ ( a t ∣ s t ) G t −logπ_θ(a_t|s_t)G_t logπθ(atst)Gt,其中 Gt 是从时间步 t 到轨迹结束的累积回报, π θ ( a t ∣ s t ) π_θ(a_t|s_t) πθ(atst) 是在状态 st 下采取动作 − l o g π θ ( a t ∣ s t ) G t −logπ_θ(a_t|s_t)G_t logπθ(atst)Gt
这样定义损失函数的原因是,我们希望在策略产生好的结果(高回报)时,增加导致这个结果的动作的概率;反之,如果策略产生的结果不好(低回报),我们希望降低导致这个结果的动作的概率。而 − l o g π θ ( a t ∣ s t ) G t −logπ_θ(a_t|s_t)G_t logπθ(atst)Gt这个量的梯度正好满足这个需求

import gym
import torch
import torch.nn as nn
import torch.optim as optim

class 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 = 0
    policy_loss = []
    for r in rewards[::-1]:
        R = r + 0.99 * R
        policy_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 learning
            action, log_prob = select_action(policy, state)
            state, reward, done, _ = env.step(action)
            rewards.append(reward)
            log_probs.append(log_prob)
            if done:
                break

        train(policy, optimizer, rewards, log_probs)

    env.close()

if __name__ == '__main__':
    main()

1.4.1 policy objective functions

policy objective functions:

  • 收集数据
    在这里插入图片描述
  • 优化模型
    在这里插入图片描述

2 Finite Difference policy Gradient

2.1 Policy Gradient

通过policy gradient 方法进行数值迭代
在这里插入图片描述
通过数值差分的方法,计算gradient进行优化
在这里插入图片描述
对于刚才那个神经网络的问题,定义loss function,进行神经网络的训练。

2.2 AIBO example

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

2.3 Likelihood Ratios

  • score function
    通过似然比技巧,将策略梯度的表达式转换成更容易处理的形式。由技巧
    Δ θ 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))
    可以得到转换后的policy gradient
    在这里插入图片描述
    在我们刚才那个例子中,通过pytorch的log_prob来实现
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
    我们首先定义动作的概率分布为softmax函数的形式。假设我们有动作值函数 Q(s,a;θ),对于状态 s 和动作 a,动作概率被定义为
    π ( 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))} π(as;θ)=aexp(Q(s,a;θ))exp(Q(s,a;θ))
    在这种情况下,策略梯度定理会稍微变形。在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π(as;θ)Qπ(s,a)]
    得到score function是:
    在这里插入图片描述

根据GPT给出的推导的过程:
在这里插入图片描述

然而,这个形式在实践中并不好计算,因为计算动作值函数 Qπ(s,a) 通常是困难的。因此,我们通常使用一个称为优势函数的替代项:
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) 是状态值函数。优势函数表示选择动作 a 而不是平均情况下的预期回报。因此,策略梯度定理在实践中常常被写为:Vπ(s) 是状态值函数。优势函数表示选择动作 a 而不是平均情况下的预期回报
Δ π 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π(as;θ)Aπ(s,a)]

对于线性feature ϕ ( s , a ) T θ \phi(s,a)^T\theta ϕ(s,a)Tθ, 根据score function的公式,可以得到下面的结论
在这里插入图片描述
在这里插入图片描述

  • Gaussian policy
    在这里插入图片描述
    推导过程如下:
    在这里插入图片描述
    在这里插入图片描述

2.4 policy gradient theorem

  • one-step MDPs
    在这里插入图片描述
    在这里插入图片描述
    替换公式中的瞬时reward到long-term value Q π ( s , a ) Q^{\pi}(s,a) Qπ(s,a)
    在这里插入图片描述
    作用
    在这里插入图片描述

在某些强化学习算法中,会同时训练两个网络,一个用来近似价值函数(通常是动作价值函数Q(s,a)),另一个用来近似策略函数。这种方法通常被称为Actor-Critic方法。Q(s,a)),另一个用来近似策略函数。这种方法通常被称为Actor-Critic方法
在Actor-Critic方法中,“Actor”部分是用来近似策略函数的网络,它根据当前状态s选择动作a;而“Critic”部分是用来近似价值函数的网络,它评估在给定状态s下采取动作a的预期回报。"Critic"通过计算TD-error来更新价值函数,而"Actor"则通过使用策略梯度方法(如您之前提到的 Q π ( s , a ) Q^π(s,a) Qπ(s,a))来更新策略函数。s选择动作a;而“Critic”部分是用来近似价值函数的网络,它评估在给定状态s下采取动作a的预期回报。"Critic"通过计算TD-error来更新价值函数,而"Actor"则通过使用策略s选择动作a;而“Critic”部分是用来近似价值函数的网络,它评估在给
Actor-Critic方法确实可以说是混合了value based和policy based的RL方法,因为它同时使用了价值函数和策略函数。这种方法的优点在于,它可以利用价值函数的稳定性和策略函数的灵活性,从而在强化学习任务中实现更好的性能。

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 optim

class 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 episode
        done = False
        while 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 returns
        returns = []
        R = 0
        for r in rewards[::-1]:
            R = r + gamma * R
            returns.insert(0, R)
        returns = torch.tensor(returns)
        returns = (returns - returns.mean()) / (returns.std() + 1e-5)

        # Compute policy gradient
        policy_loss = []
        for log_prob, R in zip(log_probs, returns):
            policy_loss.append(-log_prob * R)
        policy_loss = torch.cat(policy_loss).sum()

        # Update policy
        optimizer.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
    在这里插入图片描述

对于Actor-Critic方法,我们需要同时更新Actor和Critic。其中Actor负责选择动作,Critic负责评估当前状态-动作对的值。这个过程可以看作是一种动态的、交互式的过程,Actor基于Critic的反馈来更新自己的策略,而Critic则基于Actor的动作来更新状态-动作对的估计值。

在这个CartPole问题中,我们采用的Sarsa(λ)算法,它是一种时序差分学习方法,这意味着它在更新状态-动作对的值时,同时考虑了当前的奖励和下一个状态-动作对的估计值。

在代码中,每一个episode开始时,我们首先重置环境和资格迹。在每一步中,我们首先根据当前的状态选择一个动作,然后执行这个动作并观察环境的反馈。接着,我们计算TD误差,这是实际的奖励和我们的估计值之间的差距。然后,我们使用这个TD误差来更新Critic的参数。

对于Actor的更新,我们使用了策略梯度方法。这里的损失函数是-log(action_prob) * td_error,这实际上就是对策略梯度公式的一种实现。在计算损失函数后,我们使用反向传播来计算梯度,然后应用这个梯度来更新Actor的参数。

需要注意的是,在更新Actor的参数时,我们使用了资格迹。这是因为在Sarsa(λ)中,我们不仅考虑了当前的状态-动作对,还考虑了之前的状态-动作对。这样可以更好地将未来的奖励反向传播到之前的状态-动作对,从而提高学习效率。

在实际训练的过程中,通过储存replay buffer,复用过去的经验来更新网络。用这种方式sarsa(\lambda)也可以使用batch training的方法来更新q-table的网络和policy \theta的网络。
两者分别用value error和 policy gradient来更新网络。

import torch
import torch.nn as nn
import torch.optim as optim
import gym
import numpy as np
from collections import deque
import random

class 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 x

class 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 x

class 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 = gamma
        self.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 action

    def update(self, batch_size):
        if len(self.replay_buffer) < batch_size:
            return

        minibatch = 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 critic
        loss_critic = nn.MSELoss()(Q_vals, Q_target.detach())
        self.optimizer_critic.zero_grad()
        loss_critic.backward()
        self.optimizer_critic.step()
		# update actor
        action_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.n

    agent = ActorCritic(input_dim, action_dim)

    num_episodes = 500
    batch_size = 32

    for ep in range(num_episodes):
        state = env.reset()
        total_reward = 0
        done = False
        while 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_state
            total_reward += reward

        print(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"是一个在强化学习中用来确保策略梯度有一个良好性质的方法。这个性质就是当我们使用一个特定类型的值函数近似时(具体来说,这个值函数近似和我们的策略有一定的兼容性),策略梯度就是真实的策略梯度的一个无偏估计。这意味着在平均意义下,我们的策略梯度的估计是准确的。
这个方法的关键思想就是,我们的值函数近似(Q函数)应该和我们的策略有一定的兼容性。具体来说,我们的值函数近似的梯度应该与我们的策略的梯度有关。为了满足这个条件,我们使用以下的值函数近似:
在这里插入图片描述

策略网络和值函数网络往往是独立的,它们各自有自己的参数,它们的梯度不一定有任何直接的关系。但这并不妨碍我们使用"Compatible Function Approximation"的理论去指导我们的算法设计。
首先,需要明确的是,"Compatible Function Approximation"的理论并不一定需要在实际应用中严格遵守。这个理论是一个理想的情况,它给出了一个理想的值函数近似应该满足的性质。在实际应用中,我们可能无法(或者不需要)严格满足这些性质,但我们可以尽量接近它。
其次,尽管在实际应用中,我们的策略网络和值函数网络可能是独立的,但我们可以通过训练过程去使它们尽量接近"Compatible Function Approximation"的理论。具体来说,我们可以通过以下方式去做:

  1. 我们可以通过优化目标函数去促使策略网络和值函数网络的梯度尽可能接近。具体来说,我们可以使用一个目标函数,它包含了策略网络和值函数网络的梯度的差的平方。这样,我们的优化过程就会尽量使得策略网络和值函数网络的梯度接近。
  2. 我们可以在训练过程中共享一部分网络结构。具体来说,我们的策略网络和值函数网络可以共享一部分底层的网络结构,这样,它们的梯度就有可能更接近。

需要注意的是,这些都是尽量接近"Compatible Function Approximation"的理论的方法,它们并不能保证我们的策略网络和值函数网络的梯度完全一致。但在实际应用中,这些方法已经足够好了,它们可以使我们的训练过程更稳定,更容易收敛。

4.3 Advantage Function Critic

  • Reducing Variance Using a Baseline
    在这里插入图片描述
    Advantage Function的直观理解是,在状态s下采取动作a相比于在状态s下按照策略π采取动作的平均优势。
    减少方差:相比于使用原始的回报(reward-to-go)或者Q值,使用Advantage Function可以减少方差,使得学习过程更加稳定。因为Advantage Function已经减去了值函数V(s),这相当于减去了一个基线(baseline),可以减少估计的方差。

更好的指导策略优化:Advantage Function可以更好地指导策略优化。因为Advantage Function表示的是采取某个动作相对于平均水平的优势,所以我们在优化策略的时候,应该更倾向于增加那些有正优势(positive advantage)的动作的概率,减少那些有负优势(negative advantage)的动作的概率。

有助于解决探索与利用的问题:通过使用Advantage Function,我们可以更好地平衡探索与利用的问题。因为Advantage Function可以指示我们哪些动作可能比平均水平更好,哪些动作可能比平均水平更差,这可以帮助我们在选择动作的时候,既考虑到利用已知的知识,也考虑到探索未知的动作。

4.3.1 estimating the advantage function

  • 直接法
    计算advantage function,通过直接计算Q值和V值,然后相减。

在这里插入图片描述

  • 通过TD间接计算

在实际应用中,我们确实需要计算动作值函数Q和状态值函数V来获取优势函数(Advantage Function)。然而,直接计算Q值和V值可能需要大量的样本和计算资源,因此在实践中,我们通常采用一些近似的方法。

一个常见的方法是使用Temporal Difference (TD) 学习的方法估计Advantage Function。这种方法不需要显式地计算Q值和V值,而是通过对即时奖励和未来奖励的估计进行比较来计算Advantage Function。具体来说,TD学习的优势函数可以通过以下公式进行定义:

A(s, a) = r(s, a) + γV(s’) - V(s)

其中,r(s, a)是采取动作a在状态s下获得的即时奖励,γ是折扣因子,V(s’)是在下一状态s’下的值函数估计,V(s)是在当前状态s下的值函数估计。

这种方法的好处是,它不需要显式地计算Q值,可以直接通过TD误差来估计Advantage Function,从而大大减少了计算和存储的需求。但是,它也有一个缺点,那就是它需要对环境的动态性有一个较好的估计,以便计算出准确的TD误差。

在这里插入图片描述

  • 使用TD( λ \lambda λ)计算advantage function.
    在这里插入图片描述
    其中,α_w和α_θ分别是值函数和策略的学习率,γ是折扣因子,λ是资格迹参数,e是资格迹量。

这种方法的一个主要优点是,它可以利用资格迹量来有效地处理迟延奖励问题,即当奖励在时间步上被延迟时,通过保持一个资格迹量来“记住”过去的状态和动作,并利用这些信息来更新值函数和策略。

4.4 Eligibility Traces

4.4.1 Critic at different time-scale

另一个常见的方法是使用Actor-Critic方法来估计Advantage Function。在这种方法中,我们使用一个称为Actor的模型来估计策略,使用另一个称为Critic的模型来估计值函数。通过这种方式,我们可以在每个时间步中同时更新策略和值函数,从而更准确地估计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是一种优化策略的方法,它是Policy Gradient的一种变体。它的主要思想是在优化策略时,不仅要考虑奖励的增加,还要考虑策略改变的大小,也就是说,它试图在保证策略改变不大的情况下,最大化奖励。为了衡量策略改变的大小,Natural Policy Gradient引入了一种名为Fisher信息度量的概念,它能够在某种意义上度量两个策略之间的距离。

具体来说,普通的Policy Gradient方法是基于梯度上升的思想来优化策略的,它每一步都沿着梯度的方向改变策略参数。然而,这种方法可能会导致策略改变过大,从而影响到学习的稳定性。相比之下,Natural Policy Gradient则是通过在优化过程中引入Fisher信息度量来限制策略改变的大小,从而提高了学习的稳定性。
Natural Policy Gradient的优点主要包括:

1.它能够提高学习的稳定性。通过限制策略改变的大小,它可以避免策略的过度更新,从而使学习过程更加稳定。

2.它能够更好地利用信息。由于它考虑了策略改变的大小,因此它能够在一定程度上利用更多的信息来优化策略。

Natural Policy Gradient主要适用于那些需要保持策略稳定性的场景,特别是在复杂的、连续的动作空间中,Natural Policy Gradient通常可以提供更好的性能。此外,由于它的优化过程涉及到Fisher信息度量的计算,因此它在计算资源有限的情况下也可能会表现得更好。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
G θ G_{\theta} Gθ 是 Fisher Information Matrix, G θ G_{\theta} Gθ^(-1) 是 G θ G_{\theta} Gθ 的逆矩阵。通过这种方式,NPG 能够考虑到参数空间的结构,从而使得更新步骤在所有方向上都更加均衡。

直观地说,标准的 Policy Gradient 方法可能会在参数空间的某些方向上更新过快,而忽略了其他方向。而 Natural Policy Gradient 方法则能够保证在所有方向上都有均匀的更新,从而使得学习过程更加稳定。

4.5.2 natural actor-critic

在这里插入图片描述

4.5.3 summary of policy Gradient Algorithms

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVAEE】JUC(java.util.concurrent)的常见类

目录 1.Callable接口 1.1简介 1.2代码演示 1.3Runnable与Callable的区别 2.ReentrantLock 2.1ReentrantLock的常用方法 2.2ReentrantLock的代码演示 2.3ReentrantLock和synchronized的区别 3.Semaphore信号量 3.1概念 3.2代码演示 4.CountDownLatch 4.1概念 4.2代…

【SpringBoot整合RabbitMQ(下)】

八、死信队列 先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或者直接到 queue 里了&#xff0c; consumer 从 queue 取出消…

用Pin自动对二进制文件脱壳

Intel Pin Intel Pin在可执行二进制代码中插入一些探测函数,用于观察、记录、分析宿主代码执行过程中的一些与计算机体系结构相关的特性,如访存指令,寄存器内容,寄存器地址等,通过Pin提供的API可以编写各种分析函数,这样程序运行完以后,统计和分析结果也同时产生,分析…

I3D--视频理解必读论文总结

论文标题&#xff1a;Quo Vadis, Action Recognition? A New Model and the Kinetics会议期刊&#xff1a; CVPR 2017Dataset 论文地址&#xff1a;https://arxiv.org/pdf/1705.07750.pdf 文章目录 前言文章核心摘要引入方法a. 2DConvLSTMb. 3DConvc d. Two-StrwamTwo-Stream …

C语言学习分享(第七次)------操作符

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 操作符详解 1. 前言&#x1f6a9;2…

Ajax,前后端分离开发,前端工程化,Element,Vue路由,打包部署

Ajax介绍 Axios <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

为什么我掌握了大量软测知识,却还是找不到工作?

很多朋友都在疑惑&#xff0c;为什么随着对于软件测试了解的加深&#xff0c;不断掌握更多测试知识与技巧&#xff0c;找工作貌似越来越难了&#xff1f; 不免让人联想到最近偶然间看到一句话&#xff1a;“软件测试是整个 IT 行业中最差的岗位”。 打工人的问题出在哪&#xf…

使用Jmeter应该如何进行http接口性能测试?

在进行网页或应用程序后台接口开发时&#xff0c;一般要及时测试开发的接口能否正确接收和返回数据&#xff0c;对于单次测试&#xff0c;Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求&#xff0c;而对于模拟多用户并发等性能测试&#xff…

11.1网络编程——

多线程 一、基础知识概念相关API二、任务创建一个简单的本地客户端创建一个简单的本地服务器三、总结四、问题一、基础知识 概念 网络编程中客户端和服务器指的是进程,而不是常提到的机器或者主机。注意三个概念:请求、响应、事务。 网络编程中客户端-服务器事务是指客户端和…

刷题day65:分割等和子集

题意描述&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 思路&#xff1a; 使用01背包&#xff0c; 背包的体积为sum / 2背包要放入的商品&#xff08;集合里的元素&#xff09;…

linux数据校验

文件 一般对于文件的校验使用md5&#xff0c;centos7系统有自带的md5校验工具md5sum&#xff0c;可以用来校验两个文件是否一致 可以对比一下md5值是否一致来校验文件是否一致 目录 1 若是在主机上使用网络磁盘挂载备份的可以使用diff工具对比两个目录是否一致 diff -r /op…

Nginx使用教程

目录 一、Nginx介绍二、下载和安装三、Nginx命令1.查看版本2.检查配置文件正确性3.启动和停止4.重新加载配置文件 四、配置文件结构五、Nginx具体应用1.部署静态资源2.反向代理3.负载均衡 一、Nginx介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件( IMAP/POP3)代…

少儿编程 中国电子学会图形化编程等级考试Scratch编程二级真题解析(选择题)2023年3月

2023年3月scratch编程等级考试二级真题 选择题(共25题,每题2分,共50分) 1、小猫的程序如图所示,积木块的颜色与球的颜色一致。点击绿旗执行程序后,下列说法正确的是 A、小猫一直在左右移动,嘴里一直说着“抓到了”。 B、小猫会碰到球,然后停止。 C、小猫一直在左右…

《LKD3粗读笔记》(13)虚拟文件系统

《LKD3粗读笔记》(13)虚拟文件系统 虚拟文件系统&#xff0c;简称VFS&#xff0c;是内核的子系统&#xff0c;为用户空间程序提供了文件系统相关的接口。系统中所有文件系统不但依赖VFS共存&#xff0c;而且也依靠VFS系统协同工作。通过虚拟文件系统&#xff0c;程序可以利用标…

文本三剑客正则表达式2

文章目录 文本三剑客&正则表达式21 sed2 sed命令的常用选项3 sed命令的操作符4 打印4.1 按照行号寻址打印4.1.1 只打印第二行4.1.2 只显示行号4.1.3 显示行号及内容4.1.4 只打印最后一行 4.2 进行行号范围区间的打印4.2.1 打印1-3行4.2.2 打印第二行到最后一行4.2.3 打印2-…

操作符续(整型提升与算术转换)

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c…

MySQL深入浅出: order by if()与order by in()之条件排序

目录 1&#xff1a;原表数据 2&#xff1a;order by if&#xff08;&#xff09; 3&#xff1a;order by in&#xff08;&#xff09; 4&#xff1a;社区地址 1&#xff1a;原表数据 2&#xff1a;order by if&#xff08;&#xff09; SELECT * FROM people ORDER BY IF(…

mysql数据库的表的增删查改

目录 表的增删查改 6.1&#xff1a;增加 6.2&#xff1a;查找 6.3&#xff1a;更新 6.4&#xff1a;删除 6.5&#xff1a; 插入查询结果 6.6&#xff1a;聚合函数 6.7&#xff1a;group by分组 关键字的先后顺序&#xff1a;from > on> join > where > gro…

C语言实现三子棋小游戏

目录 游戏介绍 游戏菜单的创建&#xff08;menu&#xff09; 游戏核心功能实现 棋盘的初始化&#xff08;InitBoard&#xff09; 棋盘的展现&#xff08;printfboard&#xff09; 玩家下棋&#xff08;playerBoard&#xff09; 电脑下棋&#xff08;computerBoard&#…

探究C++构造函数及其优化

目录 一、 类的六个默认成员函数1.1 框架图1.2 具体介绍&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;析构函数&#xff08;3&#xff09;拷贝构造函数&#xff08;4&#xff09;赋值运算符重载函数 归纳我们不写&#xff0c;编译器默认生成了什么&#xff1a; …