Advertisement

Introduction to deep reinforcement learning。

阅读量:

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

1.背景介绍

Deep Reinforcement Learning (DRL) 被视为机器学习领域的一个新兴研究方向。它不仅能够让智能体(Agent)自动解决复杂的问题,并且还能探索未知环境并掌握适应性策略。近年来,该技术已在游戏开发、物流优化以及自动驾驶等多个领域展现出显著的应用价值。然而由于其高复杂度以及高度依赖强化学习机制的特点,在一定程度上限制了传统机器学习方法的有效应用。为了深入探讨这一新兴领域的潜力与挑战,在研究生阶段本人便对Deep Reinforcement Learning展开了系统研究,并据此撰写了面向工程技术人员的导论性质的文章。

通常情况下,DRL由两个主要部分构成:智能体(agent)和环境(environment)。这些智能体通过与环境互动来积累经验数据,并利用这些数据来训练模型以改进自身的决策行为。在每次互动过程中,智能体会根据所处状态选择动作,并从环境中获得反馈信息作为参考依据。同时,在处理奖励机制时,系统会面临即时奖励和延迟奖励的挑战。

除了上述提到的功能外,DRL系统还集成了多项独特功能。例如,多智能体协作系统可使各智能体会彼此协作共同完成任务,这将显著提高整体系统性能;采用增量式更新算法可有效增强系统的实时响应能力和运行效率;针对复杂环境设计的人工智能系统可在多维度测试中展现出卓越表现;而基于强化学习理论构建的知识驱动型系统则可突破传统框架限制,拓展应用领域

2.核心概念与联系

(1)Agent

agent被称为智能体,在系统科学中被定义为能够设定明确的目标并通过与环境互动来实现自身的目标。这些目标通常包括最大化收益或最小化损失。 agent通常分为两类:一类是基于规则的行为型agent;另一类是基于模型的学习型agent。

  1. 智能体(玩家型):作为人工智能领域的重要组成部分,在实际应用中主要通过接收指令并执行特定动作来完成任务;例如自动驾驶汽车、电子游戏中的人类角色以及计算机内部的学习过程等。
  2. 基于规则或计算模型构建的智能体:其核心特征在于能够通过与环境交互并根据经验进行决策;从而选择下一步的操作以优化其目标达成过程。

(2)Environment

Environment通常被称为真实存在的世界,它是一个动态变化,完全可感知的系统,在其中智能体能够感知外部环境的变化状态并与其互动.该系统由三个主要要素构成.

  • 状态:环境所处的状态信息。
    • 行动:智能体可执行的行为动作。
    • 奖励:环境对智能体行为提供的行为反馈。

(3)Policy

该政策指导智能体在决策过程中的行为准则,在最基本的情形下,则表现为一种固定的行为模式。例如,在标准比赛中常见的直线行驶策略和避障转向策略等特定行为模式。然而,在实际情况中这些简单的模式往往难以适应复杂的环境需求因此不能仅仅依赖于固定的行为轨迹来描述政策的本质特征。从本质上说,政策是一种状态到行为的映射关系即通过接收当前环境的状态信息并将其转化为具体的可执行动作这一机制来实现对复杂任务的应对能力

(4)Value Function

Value Function又被称作价值函数,在每一个状态下它被定义为智能体应赋予的价值量。其核心作用在于帮助智能体识别具有最高价值的行为模式而非单纯追求效用最大化的过程。作为基于状态变量的一个量化指标价值函数能够系统地评估不同状态下可能的行为及其预期收益水平。其数学表达式可表示为:其中s_t代表当前状态π表示所采用的具体策略E_π则体现了在策略π指引下产生的行为序列的概率分布γ是一个介于0和1之间的衰减因子用于权衡短期奖励与长期收益之间的关系当γ趋近于0时系统更倾向于立即获得奖励而忽略未来的潜在收益当γ接近1时则会更加注重各时间点奖励的均衡分配若γ等于0则表明智能体仅关注当前时刻获得的最大即时奖励而完全忽视未来可能带来的收益

(5)Model

Model可被视为一种概率分布表征了智能体对环境的理解其基本假设是智能体根据所处的状态选择相应的行动并预估这些行动将带来的影响。在构建过程中Model通常基于智能体与环境之间的互动而Model更新则通常基于训练数据的支持截至目前已知的主要模型包括基于强化学习的方法基于规划理论的方法模糊系统模型马尔可夫决策过程框架以及动态规划方法等多种类型。

(6)Q-Function

Q-函数是一种函数,在状态与动作之间建立对应关系以获取相应的奖励。其数学形式为:其中S_t代表当前状态而A_t代表相应采取的动作。符号\gamma则表示衰减因子,在下一状态s_{t+1}下通过最大化所有可能动作a的Q值来确定最优策略。这些元素共同构成了完整的Q函数体系,并被广泛应用于强化学习算法中以评估不同动作的表现效果。

(7)Replay Buffer

Replay Buffer是一种用于存储记忆的数据结构;它主要用于记录智能体在与环境交互过程中积累的经验数据;该结构可作为训练模型或调整策略的资源;随着训练过程中的模型更新迭代,在线Replay Buffer会随之调整其内容。

(8)Off-policy vs On-policy

Off-policy亦称异策略,在智能体采用某策略进行探索行为时,并不直接基于环境中收集经验数据。其主要优势体现在降低方差,并不受环境随机因素的影响。该方法有助于缩短训练所需的时间并提升效率,并能增强智能体的探索能力。然而 Off-policy方法可能陷入局部最优解而导致对训练数据产生过拟合现象。

其核心特征是以贪心算法为基础,在每一步中总是选择当前状态下最优化的动作。它具有一些优势包括维持一定范围内的探索能力和最终实现全局最优化。然而,在贪心算法的基础上设计的方法往往容易陷入局部极小值而导致全局优化受阻。

(9)Exploration vs Exploitation

Exploration的概念是指探究新事物的行为模式;Exploitation的概念则是指运用现有知识以最大限度地获得奖励;通常情况下,在探索与利用之间找到平衡是一个挑战;研究表明,在不同策略组合下能够显著提升智能体的探索能力

(10)Training Process

在训练阶段中,智能体通过与环境的互动不断优化其策略,在此过程中不断积累和更新模型参数以适应动态变化。

Step1:初始化环境的状态。

Step2:根据当前的状态,智能体生成动作。

Step3:环境反馈奖励给智能体。

Step4:智能体更新策略,并学习新的策略,并保存策略参数。

Step5:重复第2步~第4步,直到满足终止条件。

3.Core algorithms and operations

(1)DQN

Deep Q Network (DQN),是一种广泛应用在强化学习领域的主流算法。其基本概念在于通过神经网络估计Q值函数,并运用深度学习技术优化网络参数以实现快速收敛。该方法特别强调了两组神经网络的独特作用:一个是用于评估每个状态-动作对的Q值(Q-value),另一个则负责计算对应的目标Q值(target value)。具体而言,在DQN的工作机制中,这两个组件协同作用以完成对策略优化的关键操作。

Step1: 将经验数据放入Replay Buffer。

Step2: 从Replay Buffer中抽取一批经验数据,用作训练集。

Step3: 用训练集计算出样本的Q值。

Step4: 使用样本的Q值作为TD误差的反向传播目标,更新Q网络的参数。

Step5: 更新target network的参数。

Step6: 根据样本的TD误差来调整epsilon值,以探索更多的空间。

DQN擅长克服较简单的策略在复杂环境下的局限性,并且仅需设计合适的网络架构即可迅速收敛于最优策略。特别适用于复杂的状态与动作空间。

(2)PPO

Proximal Policy Optimization (简称PPO)是一种基于actor-critic架构的方法。其核心理念在于将actor神经元与critic神经元分开处理,并统一管理和更新它们各自的参数。actor神经元负责选择动作的执行方案,并通过critic神经元计算动作价值函数。这一策略的主要原因在于actor神经元与critic神经元之间存在相互促进的关系:actor神经元旨在使执行的动作符合预期结果从而降低期望值;而critic神经元则致力于准确计算动作的价值并最大化其数值。

Step1: 在当前状态s_t,根据Actor网络选择行为a_t。

Step2: 执行a_t,观察环境的反馈reward_t以及下一状态s_{t+1}。

Step3: 把(s_t, a_t, reward_t, s_{t+1})存入Replay Buffer。

Step4: 从Replay Buffer中抽取一批经验数据,用作训练集。

Step5: 用训练集计算出样本的Advantage。

Step6: 基于训练集计算得到Actor网络输出的动作的概率分布和Q值由Critic网络生成。

Step7: 反向传播计算Actor网络的梯度和Critic网络的梯度。

Step8: 更新Actor网络的参数。

Step9: 根据样本的TD误差来调整epsilon值,以探索更多的空间。

PPO的策略更新方式比较独特,而且可以解决稀疏更新问题。

(3)DDPG

Deterministic policy gradient algorithm incorporating a parameter-sharing mechanism (DDPG) falls under the category of Actor-Critic methods. Building upon the foundation of PPO, DDPG introduces an innovative approach by employing two Actor networks and two Critic networks in place of traditional single network configurations. The rationale behind introducing two Actor networks is to minimize excessive reliance on the environment, thereby avoiding stiffness in policies; similarly, dual Critic networks aim to reduce overestimation errors. The key advantages of this method include not only enhanced performance but also robustness against overestimation errors without requiring environmental preprocessing. Below, we outline the specific workflow of DDPG.

Step1: 在当前状态s_t,根据Actor网络选择行为a_t。

Step2: 执行a_t,观察环境的反馈reward_t以及下一状态s_{t+1}。

Step3: 把(s_t, a_t, reward_t, s_{t+1})存入Replay Buffer。

Step4: 从Replay Buffer中抽取一批经验数据,用作训练集。

Step5: 用训练集计算出样本的Target Q值。

Step6: 反向传播计算Actor网络的梯度和Critic网络的梯度。

Step7: 更新Actor网络的参数。

Step8: 更新Critic网络的参数。

Step9: 根据样本的TD误差来调整epsilon值,以探索更多的空间。

DDPG的策略更新方式比较独特,而且可以在没有噪声情况下训练。

4.Code Examples

(1)DQN

复制代码
    import gym # OpenAI Gym environment
    
    from keras.models import Sequential 
    from keras.layers import Dense, Activation, Flatten  
    from keras.optimizers import Adam  
    
    class DQN:
    def __init__(self):
        self.num_actions = env.action_space.n  
    
        model = Sequential() 
        model.add(Flatten(input_shape=(1,) + env.observation_space.shape))
        model.add(Dense(512))
        model.add(Activation('relu'))
        model.add(Dense(256))
        model.add(Activation('relu'))
        model.add(Dense(self.num_actions, activation='linear'))
    
        self.model = model  
    
    def get_q_values(self, state):
        q_values = self.model.predict(np.array([state]))[0]
        return q_values
    
    def train(self, states, targets):
        hist = self.model.fit(states, targets, epochs=1, verbose=0)
        loss = hist.history['loss'][0]
        return loss
    
    def predict(self, state):
        q_values = self.get_q_values(state)
        action = np.argmax(q_values)
        return action
    
    env = gym.make("CartPole-v0")    
    dqn = DQN() 
    
    for episode in range(500):
    done = False
    step = 0
    total_reward = 0 
    state = env.reset()
    while not done:
        action = dqn.predict(state)
        next_state, reward, done, info = env.step(action)
        if done:
            target = reward
        else:
            target = reward + gamma * np.amax(dqn.get_q_values(next_state))
    
        experience = [state, action, reward, next_state, done]
    
        if len(memory) < replay_size: 
            memory.append(experience) 
        else: 
            memory[idx % replay_size] = experience
    
        idx += 1 
    
        batch_size = min(batch_size, len(memory))
    
        for i in range(batch_size):
            mini_batch = random.sample(memory, batch_size)
    
            update_inputs = []
            update_targets = []
    
            for sample in mini_batch:
                state, action, reward, next_state, done = sample
    
                if not done:
                    updated_q = reward + gamma * np.amax(dqn.get_q_values(next_state)) 
                else:
                    updated_q = reward
    
                update_inputs.append(state)
                action_values = dqn.get_q_values(state)
                action_values[action] = updated_q
                update_targets.append(action_values)
    
            history = dqn.train(update_inputs, update_targets)
    
            print(f'Episode {episode}, Step {step}, Loss:{history}')
    
            step += 1
    
        state = next_state
        total_reward += reward
    
    print(f"Total reward for the episode {episode}: {total_reward}")
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

全部评论 (0)

还没有任何评论哟~