Advertisement

Understanding Actor Critic Methods and How to Use them

阅读量:

作者:禅与计算机程序设计艺术

1.简介

Actor-Critic方法是深度强化学习中的重要模型之一,在处理离散型与连续型动作空间方面有着广泛的应用。该方法构建了策略网络与价值网络,并利用两者间的关系来处理RL问题。其核心在于通过策略网络与价值网络间的反馈机制来实现对价值函数估计与策略优化的同时处理。因此而言,这是一种兼具创新性与有效性的重要方法。本文将深入探讨这一关键算法的工作原理及其应用前景

2. 基本概念术语说明

(1)策略网络(Policy Network)

从本质上讲, Strategy Networks是一种用于建模行为的概率模型, 其中每个状态都与一个动作相关联的结构。对于确定性Strategy Networks而言, 该模型将采取明确且固定的行动;而当采用随机Strategy时, 则会生成一系列可能的动作及其发生的概率。通常采用交叉熵损失函数来优化神经元参数, 并非唯一的选择还包括其他类型的损失函数。基于当前状态下的输入数据, Strategy Networks可以根据需求输出相应的决策向量或选择其发生概率最高的动作作为最优解。

(2)值网络(Value Network)

在强化学习中,通常使用V(s)来表示某一状态s所对应的实数形式的函数。它的主要功能是在给定状态s时预测相应的期望回报或折扣奖励。因为它们的目标就是让模型尽可能准确地预测回报值,并因此被称作"奖励网络"(reward network)。在训练过程中通常采用平方差损失函数来优化模型参数。其输出结果可以被解读为对每个状态未来可能获得的折扣奖励水平的一个估计,在某种程度上进一步评估了执行某个动作后所能带来的价值与长远收益预估情况。其学习过程通过监督学习方法完成。

(3)Actor-Critic框架

该方法通过整合策略网络与价值网络构建了一个完整的体系结构。该体系主要由策略网络和价值网络两个核心模块构成。其中,策略网络的作用是根据当前状态生成一系列可能的动作及其概率分布情况,并且其本质上是一种参数化的确定性决策机制。而价值函数则用于评估不同状态下可能采取的行为及其效果,在此基础上辅助选择最优行动。此外, 还采用了基于贪心算法的探索机制来优化决策过程,在现有策略指导下进行行为选择的同时, 尝试通过不断迭代更新现有模型参数, 试图增加价值函数的有效可靠性水平。最后, 该体系还特别引入了一种贪婪式的目标优化流程, 在每一步决策中尽可能选取当前最优的行为方案, 从而实现了强化学习问题的有效统一解决方案,并且在一定程度上改善了传统政策梯度方法存在的梯度消失和计算效率低下的问题

(4)Advantage Function

在策略梯度的方法中,动作价值评估机制是基于由状态-动作对构成的样本集合进行建模的。该方法的一个局限性在于其动作价值评估机制易受高方差影响。为了降低评估误差并提升精确度,GAE通过逐步加权平均的方法优化了动作价值评估过程。特别地,在此方法中引入了一个基准线(baseline),用于预估后续状态下可能获得的实际回报。具体而言,在每个时间步长t上计算TD误差时,则会将该误差分解为γδ_t与前一时间步计算出的加权因子相乘后再与当前状态的价值函数增量相叠加的结果

A_t=r_t+γv(S_{t+1})-v(S_t)

来计算advantage函数值。其中γ是折扣因子,即步长系数。

Advantage函数发挥着关键作用,在Actor-Critic方法中通过有效的方式部分缓解了状态-动作对样本估计值的不确定性。

3.核心算法原理和具体操作步骤以及数学公式讲解

该方法即为将策略网络与价值网络融合而形成的一个完整体系。其基本思路在于通过价值函数来评估策略网络的效果,并据此改进策略网络的更新机制。本节我们将介绍Actor-Critic方法中的两个关键组件——策略网络和价值网的具体运作原理及其数学推导。

(1)策略网络

在本场景中设定一个双轮车互动游戏环境,在该环境中当前阶段的状态由观测变量o=(x,y,\theta)表征;而动作空间仅包含一个选择a(即\mu_{\theta}(o)=p(a|o;\theta))。其中的策略网络根据当前状态计算对应动作的概率分布;那么如何训练该策略网络?我们采用REINFORCE算法进行优化。

REINFORCE算法是一种简洁直观的策略梯度方法,在理论基础层面依据策略梯度定理确定策略网络参数更新的方向以最大化期望回报值。具体而言,在每一轮训练中我们模拟一个完整的任务流程即从初始状态开始按照当前策略连续执行一系列动作直至任务结束。随后我们根据这一完整轨迹计算累积折扣奖励即对于当前状态s执行动作a后到达新状态s′时仅考虑长期获得的利益而不计入即时负向反馈项。

其中,在时间t点上定义了奖励信号R_t。随后,在策略网络的参数更新过程中:我们通过计算当前状态下的动作概率分布,并结合奖励信号R_t来调整模型参数θ;以最大化长期累积奖励为目标函数。

该方法中,更新方向由当前即时奖励\frac{\partial}{\partial\theta}R_t和未来折扣后的累计奖励偏差\gamma^T\frac{\partial}{\partial\theta}r_T进行综合考量。

接着,我们可以使用梯度上升法或者其他梯度下降法来更新参数:

其中,\alpha表示学习速率。

最后我们致力于确定最佳的战略网络参数值。然而在实际应用中一组特定的参数组合可能会映射到多个价值函数这些不同价值函数之间可能存在差异尤其当它们涉及不同的折扣因子γ时这就要求我们在分析过程中全面评估所有潜在的价值函数并从中筛选出最适合当前情境的一个作为基准战略选择为此我们需要对所有的候选模型进行系统性评估以确保最终结果具有最佳泛化性能为了避免过度拟合我们在设计模型时会限制其复杂度从而迫使它仅输出合理的概率分布结果基于此在构建战略网络时需要综合考虑抗噪声干扰的能力以及基于最大似然估计的方法等关键因素

(2)值网络

将值网络视为奖励网络是一种常用的方法。它不仅能够量化各状态下可能获得的期望回报,并且能够帮助评估各状态下系统的潜在性能表现。具体而言,在这种框架下:

  • 其输入为某个特定的状态s
  • 输出则是该状态下对应的期望累计奖励。
    这种分类方法主要分为两类:一种是基于单一的状态信息构建其对应的...

对于状态值网络而言,在给定状态下所有未来奖励之期望值被其所估计。具体而言,在状态s下所能获得的所有奖励的总和可表示为E[G_t|s,\phi]=E[\sum_{k=0}^{\infty}\gamma^kr_{t+k}|s,\phi]。遵循Bellman方程的方法包括MC方法与TD方法等技术手段以计算相应的估计值。而对于评价值网络而言,则旨在根据给定的状态s与动作a,在执行该动作后估算相应奖励r_t的期望值Q_{\psi}(s,a|\phi)=E[r_t|s,a,\psi]。同样地该期望值也可通过采用MC方法或TD方法等方式进行估算

在值网络训练中, 主要目标在于寻求最大化状态的价值评估或者试图减少动作价值估计的误差. 具体而言, 该目标函数的形式由所采用的不同方法决定.

对于状态值网络,可以直接使用Bellman方程的折现形式:

其中,G_t=r_t+\gamma v_{\phi}(S_{t+1}), S_{t+1}=s'

对于评价值网络,目标函数可以如下定义:

其中,\gamma是折扣因子,r是收益。

在训练价值网络的过程中,在线强化学习算法被广泛应用于优化模型参数的过程中。具体而言,在处理状态价值型网络时,则需遵循贝尔曼方程所规定的更新规则;按照以下方法执行参数更新过程:首先,在每一个时间步中计算当前状态下最优动作的价值估计;其次,在后续的状态中依据实际获得的价值信息不断修正当前估计;最后通过迭代优化使模型能够更好地映射状态到相应的价值评估结果中。

其中,\delta_t是TD误差。而对于评价值网络,可以用下面的算法进行更新:

其中,\delta_t是TD误差。

在训练过程中应用价值网络时会遇到多种优化技巧如采用层次化设计或引入特定的数据处理方法以提升算法效果

4.具体代码实例和解释说明

接下来,我们采用代码示例来演示如何应用Actor-Critic方法解决实际问题。代码基于OpenAI Gym的CartPole和MountainCar环境构建。

(1)CartPole环境示例

环境设置

为了更好地完成项目开发目标,在Python 3.6及其以上版本下运行环境的基础上,请您先完成必要的第三方库安装。

复制代码
    pip install gym numpy tensorflow keras
    
    
    代码解读

智能体(Agent)设计

基于Actor-Critic架构的体系中,智能体主要由策略网络与价值网络两部分构成。在此基础上,我们构建了一个相对简单的策略模型。该模型将环境状态作为输入,并输出对应的动作概率分布。为了简化问题处理,在模型设计上采用了仅包含一层全连接层的神经架构,并引入了探索概率的二元变量来辅助决策过程。

复制代码
    import tensorflow as tf
    from keras.models import Sequential
    from keras.layers import Dense
    
    
    class Agent:
    def __init__(self):
        self.model = Sequential()
        self.model.add(Dense(input_dim=4, output_dim=24, activation='relu'))
        self.model.add(Dense(output_dim=2, activation='softmax'))
    
    def choose_action(self, observation, explore_rate=0.1):
        if np.random.rand() < explore_rate:
            return np.random.choice([0, 1])
    
        action_probs = self.predict(observation)[0]
        return np.argmax(np.random.multinomial(1, action_probs)).item()
    
    def predict(self, state):
        state = np.expand_dims(state, axis=0).astype('float32') / 255.0
        return self.model.predict(state)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

在本实现中,在choose_action()函数中实现了基于当前状态的动作选择逻辑。当随机数小于探索率explore_rate时,在此情况下会随机选取一个动作;反之,则会利用predict()函数计算出基于当前状态的动作概率分布,并将这些概率传递至神经网络以完成预测过程。

价值函数设计

在架构上具有相似性的是值网络与策略网络,在处理过程中为了解决问题更加简便,在处理过程中我们采用了单层全连接神经网络模型

复制代码
    class ValueNetwork:
    def __init__(self):
        model = Sequential()
        model.add(Dense(input_dim=4, output_dim=24, activation='relu'))
        model.add(Dense(output_dim=1, activation='linear'))
        model.compile(loss='mse', optimizer='adam')
        self.model = model
    
    def train(self, states, targets, epochs=1, verbose=0):
        inputs = np.array(states)/255.0
        outputs = np.array(targets)[:, None]
        self.model.fit(inputs, outputs, batch_size=len(inputs), epochs=epochs, verbose=verbose)
    
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

在这里,“train()函数负责训练值网络”的表述已经被优化为更专业的表达方式。“我们将环境状态标准化到0~1范围内”的表述已经被调整为更加规范的语言习惯。“然后输入到神经网络中”被修改为“输入至其中”,以增强表达准确性。“得到估计的回报值”被重新表述为更为专业的术语表达方式。“再计算TD误差并更新参数”则被优化为更加规范的技术描述方式。

执行训练流程

最后阶段,在设计主循环时能够有效执行训练任务。具体而言,在核心循环中将最大步数设定为500,并且每隔100步记录一次结果以便输出测试数据。此外,在训练初期将探索率初始化为1,并随着模型逐渐趋向稳定状态而降低探索率以优化策略达到最佳效果

复制代码
    env = gym.make('CartPole-v1')
    agent = Agent()
    value_network = ValueNetwork()
    
    total_steps = 0
    episode_rewards = []
    
    for i_episode in range(1000):
    episode_reward = 0
    observation = env.reset()
    done = False
    while not done:
        total_steps += 1
        action = agent.choose_action(observation)
        next_observation, reward, done, info = env.step(action)
        value_target = (reward + gamma * value_network.predict(next_observation)[0][0]
                        if not done else reward)
        td_error = value_target - value_network.predict(observation)[0][0]
        advantage = td_error
        agent.learn(observation, action, advantage)
        episode_reward += reward
        observation = next_observation
    
        if total_steps % 10 == 0:
            test_observation = env.reset()
            while True:
                test_action = agent.choose_action(test_observation, explore_rate=0.)
                test_observation, test_reward, test_done, _ = env.step(test_action)
                episode_reward += test_reward
                if test_done:
                    break
    
            print("Episode: {}, Total Steps: {}".format(i_episode, total_steps))
            print("Reward per step: {:.2f}".format(episode_reward/10))
            episode_rewards.append((i_episode, total_steps, episode_reward))
    
    print("Average reward for last 100 episodes:",
      sum([r[2] for r in reversed(episode_rewards[-100:])])/100)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

训练结束后,我们打印最后100次的平均奖励。

(2)MountainCar环境示例

环境设置

第一步步骤包括安装相应的依赖库。在Python3.6+的运行时环境中, 可以执行以下命令以完成相关依赖库的安装

复制代码
    pip install gym numpy tensorflow keras
    
    
    代码解读

智能体(Agent)设计

在Actor-Critic框架下设计的主体主要包含两个核心模块:策略网络与价值函数评估器。在此基础上,我们构建了一个基础性的策略网络结构,其输入端接收环境状态信息,并输出一系列可能动作及其对应概率。为了简化模型结构,我们采用了单层全连接神经网络作为核心组件,该组件能够有效映射输入状态到可操作的动作空间中。同时引入了随机探索机制的概率设置,以确保学习过程中的均衡试探与收敛优化之间的平衡关系。

复制代码
    import tensorflow as tf
    from keras.models import Sequential
    from keras.layers import Dense
    
    
    class Agent:
    def __init__(self):
        self.model = Sequential()
        self.model.add(Dense(input_dim=2, output_dim=24, activation='relu'))
        self.model.add(Dense(output_dim=3, activation='softmax'))
    
    def choose_action(self, observation, explore_rate=0.1):
        if np.random.rand() < explore_rate:
            return np.random.choice([-1, 0, 1])
    
        action_probs = self.predict(observation)[0]
        return np.argmax(np.random.multinomial(1, action_probs)).item()-1
    
    def predict(self, state):
        state = np.expand_dims(state, axis=0).astype('float32')
        return self.model.predict(state)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

在下面,在这里描述了一个完整的决策过程:首先,在该系统中有一个关键的功能模块——choose_action(), 它负责根据当前的状态决定执行哪个操作。当生成的随机数低于预先设定的探索率explore_rate时,则会采取一种随机策略来选择操作;反之,则会通过调用另一模块——predict(), 将当前的状态信息传递进去,并使该模型输出的动作概率分布成为操作的选择依据。随后,在这种情况下, 我们从可能的操作集中选取一个具体的操作来执行。值得注意的是, predict()模块的作用就是通过将环境的状态作为输入传递给神经网络模型来进行预测, 进而实现对最优操作的选择。

价值函数设计

Q-值架构在具有相似特征的策略架构之上发展而来。基于上述分析,在保证模型简洁性的前提下,我们采用单层全连接神经网络作为基础模型。

复制代码
    class ValueNetwork:
    def __init__(self):
        model = Sequential()
        model.add(Dense(input_dim=2, output_dim=24, activation='relu'))
        model.add(Dense(output_dim=1, activation='linear'))
        model.compile(loss='mse', optimizer='adam')
        self.model = model
    
    def train(self, states, targets, epochs=1, verbose=0):
        inputs = np.array(states)
        outputs = np.array(targets)[:, None]
        self.model.fit(inputs, outputs, batch_size=len(inputs), epochs=epochs, verbose=verbose)
    
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

这里,train()函数被配置用于训练价值网络。在模型训练过程中,在给定环境状态作为输入的情况下,在神经网络中生成预估回报值;随后计算TD误差并更新模型参数。

执行训练流程

最后阶段的训练可通过主循环自动化完成。此处将最大迭代次数设定为2,000个步骤。每间隔5个周期进行一次性能评估并记录结果。初始化探索率为1,在训练趋于稳定的过程中逐步降低其值。最终算法收敛至最优策略状态。

复制代码
    env = gym.make('MountainCar-v0')
    agent = Agent()
    value_network = ValueNetwork()
    
    total_steps = 0
    episode_rewards = []
    
    for i_episode in range(1000):
    episode_reward = 0
    observation = env.reset()
    done = False
    while not done:
        total_steps += 1
        action = agent.choose_action(observation)
        next_observation, reward, done, info = env.step(action+1) # MountainCar-v0的动作空间为[-1, 0, 1]
        value_target = (reward + gamma * value_network.predict(next_observation)[0][0]
                        if not done else reward)
        td_error = value_target - value_network.predict(observation)[0][0]
        advantage = td_error
        agent.learn(observation, action, advantage)
        episode_reward += reward
        observation = next_observation
    
        if total_steps % 500 == 0:
            test_observation = env.reset()
            while True:
                test_action = agent.choose_action(test_observation, explore_rate=0.)
                test_observation, test_reward, test_done, _ = env.step(test_action+1) # MountainCar-v0的动作空间为[-1, 0, 1]
                episode_reward += test_reward
                if test_done:
                    break
    
            print("Episode: {}, Total Steps: {}".format(i_episode, total_steps))
            print("Reward per step: {:.2f}".format(episode_reward/500))
            episode_rewards.append((i_episode, total_steps, episode_reward))
    
    print("Average reward for last 100 episodes:",
      sum([r[2] for r in reversed(episode_rewards[-100:])])/100)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

训练结束后,我们打印最后100次的平均奖励。

5.未来发展趋势与挑战

Actor-Critic方法在强化学习领域表现卓越,在多个实际领域得到了广泛应用。然而仍存在一些优化空间

(1)稀疏奖励

在现有条件下,在所有环境中所给予的所有奖励都必须是密集型的(即非零测度),这使得该系统难以应对具有复杂性的任务。基于当前研究现状,在A3C算法体系下目前仅适用于离散动作场景的任务处理能力是有局限性的,并且对于连续动作空间中的问题缺乏有效的价值评估机制。

(2)复杂动作空间

与Actor-Critic方法相比,在某些方面仍存在局限性。当前该方法的状态空间通常是离散的。若要处理连续的动作空间,则需要采用机器学习中的深度强化学习技术而非传统的Actor-Critic方法。

(3)训练效率

该方法在多个领域展现出显著的应用潜力;然而,在每一次参数更新过程中都需要与环境进行交互这一操作,则会导致整个训练过程耗时较长;基于此需求,我们致力于探索提升训练效率的新方法。

6.附录:常见问题与解答

(1)什么是Actor-Critic方法?为什么要使用该方法?

Actor-Critic框架在Deep Reinforcement Learning (DRL)领域被识别为一种关键机制。该框架通过整合分析Policy Gradient(PG)与Q-Learning的优点,并构建了一个基于动作-价值函数的模型。其显著特性体现在能够有效应对多维度的动作空间问题,并对状态与动作进行系统性建模。

Actor-Critic方法可分为若干组成部分包括策略网络(Policy Network)与价值网络(Value Network),两者间存在互动关系并共同完成决策任务

(2)Advantage Function的作用是什么?为什么需要Advantage Function?

Advantage Function的功能旨在通过减少状态-动作对采样估计值不确定性的影响而提升Actor-Critic方法的效果。该函数在构建状态价值网络与行为价值网络的过程中具有广泛应用,在其中扮演着关键角色。具体而言,在状态值网络中,Advantage Function被用作折现实际回报的一个估计量;而在评价值网络中,则被用作当前动作预期回报的一个评估指标。值得注意的是,在采用神经元形式实现该函数时需要特别注意激活函数的选择以及参数调节问题以确保系统的稳定性与收敛性。

(3)在Actor-Critic方法中,状态值网络和评价值网络各自的作用是什么?

用于估计算子价值的状态网络(State Value Network)与用于估计算子价值的动作网络(Action Value Network)均为强化学习中的核心组件。其中, State Value Network接受一个状态变量s, 输出该状态下所有可能动作所对应的期望回报值, 即v_{\phi}(s)=E[\sum_{t=0}^{\infty}\gamma^tr_t|s,\phi]; 而Action Value Network则基于当前的状态变量s及其可能的动作a, 输出在执行动作a后将获得的期望即时回报, 即其输出可表示为: Q_{\psi}(s,a|\phi)=E[r_t|s,a,\psi}

(4)Advantage Function是如何计算的?

Advantage Function 被被称为 TD 误差的加权估计方法。详细而言,它通过以下公式将每个时间步长 t 上的 TD 误差进行加权计算

来计算advantage函数值。其中γ是折扣因子,即步长系数。

(5)可以描述一下策略网络和值网络的具体流程吗?

具体流程如下:

  1. 基于当前状态s的状态下,在策略网络π(a|s; θ)的基础上估计动作分布π(.|s;θ)
  2. 通过计算TD误差δ=r+\gamma\hat{v}(S’,\omega)-\hat{v}(S, \omega)来评估当前状态的折扣回报。
  3. 对策略网络参数进行优化调整至\theta ← argmin_{θ} [\mathcal{L}(θ)+λ⋅H(q_{π}(s,a;θ))]
  4. 通过值网络进行参数更新至w ← argmin_{w} [MSE(\hat{v}(S,w), A_t)]

其中H(q_{\pi}(s,a;\theta))表示策略网络参数θ下的期望策略熵, λ是正则化系数;而MSE代表均方误差.

(6)Actor-Critic方法的优缺点分别是什么?

优点:

  1. 多样的目标函数:Actor-Critic架构允许策略网络与价值网络分别采用不同目标函数,在实现能力对齐时展现出独特优势。例如,在策略网络中可采用Q-Learning,在价值网络中可采用Policy Gradient(PG)方法,并通过这种方式引入额外的噪声以改善稳定性。
  2. 防止动作价值估计过低:通过价值网络评估当前状态下的所有可能动作的价值程度,Actor-Critic架构能有效防止因某些特定行为而导致的动作价值估计过低的问题。
  3. 较高训练效率:由于其更新机制更为高效,在相同的训练时间内可获得更好的模型收敛效果。相较于PG方法而言训练速度更快。
  4. 处理离散化动作空间:该架构特别适合处理离散化后的动作空间问题,在如图像识别任务中用于控制相关问题时展现出良好的适用性。

缺点:

  1. 不稳定现象: Actor-Critic 方法在实际应用中可能会遇到参数无法收敛或更新速度较慢的问题, 这通常是因为涉及的因素较为复杂, 如折扣因子和学习率.
  2. 计算规模较大: Actor-Critic 方法因涉及两个子网络间的交互作用而显著提升了计算效率.

全部评论 (0)

还没有任何评论哟~