【深度强化学习】蒙特卡洛策略梯度法求解倒立摆问题实战(附源码)

简介: 【深度强化学习】蒙特卡洛策略梯度法求解倒立摆问题实战(附源码)

需要源码请点赞关注收藏后评论区留言~~~

参数化策略

策略梯度法也是直接优化策略的方法,它先参数化策略,并把累积回报作为目标函数,然后用梯度上升法去优化参数使目标函数取得最大值,从而得到最优策略。

将策略确定为一个包含待定参数向量θ的函数π_θ:π_θ(a│s)=P(A_t=a│S_t=s,θ)

常用的策略参数化方法有Softmax策略和高斯策略,前者用于动作空间较小的离散型强化学习中,后者可应用于连续型强化学习中。

Softmax策略

Softmax策略先定义一个偏好函数ℎ(s,a,θ),该函数可看作用一组参数θ去拟合在状态s执行动作a的概率。为了符合概率取值的要求,用Softmax函数来归一化每一(s,a)对的偏好值,得到拟合的策略π_θ(a│s):

高斯策略

高斯策略认为在状态s执行动作a的概率服从高斯分布。该高斯分布的均值由θ根据状态s来拟合,记为偏好函数u(s,θ)。它的方差σ^2也可根据状态s来拟合,也可以设为固定值。

在状态s执行动作a的概率服从该高斯分布:a~N(u(s,θ),σ^2)

此时,策略函数π_θ(a│s)可表示为:

目标函数

1)将目标函数看作是指定初始状态s_0(如冰湖问题)在策略π_θ下累计回报的期望,即s_0的状态值函数:J(θ)=E_π_θ[G|s_0┤]=V_π_θ(s_0)

2)在没有明确初始状态时(如倒立摆控制问题),将目标函数看作是每个状态的累积回报的期望:J(θ)=∑_s▒d_π_θ(s)G_s

3)在没有终止状态的问题中,将目标函数看作是任一时间步的平均立即回报:

梯度

策略梯度法,实际上就是用梯度上升法去求得使目标函数最大时的策略参数θ。梯度上升法的迭代关系式为:

其中,∇_θJ(θ)是目标函数关于系数θ的梯度:

三种目标函数对θ的梯度∇_θJ(θ)都可表示为:

 

当采用Softmax策略、偏好函数ℎ(s,a,θ)采用线性函数时,可以证明分值函数∇_θlogπ_θ(a│s)为:

当采用高斯策略、偏好函数ℎ(s,a,θ)采用线性函数时,可以证明分值函数∇_θlogπ_θ(a│s)为:

动作值函数Q_π_θ(s,a)可采用蒙特卡罗法或时序差分法来求得。

蒙特卡罗策略梯度法

当采用蒙特卡罗法时,通过尝试得到的轨迹τ,从轨迹τ中得到一系列采样。用单个采样(s_t,a_t,G_t)来近似计算策略梯度均值:

算法流程图如下

标记为(6)的操作中,要计算的累积折扣回报G_t可由轨迹的立即回报反向递推求得。

构建一个结构为(4,10,2)的全连接层神经网络,输出层的激活函数为softmax。

通过尝试得到的轨迹τ,从轨迹τ中得到一系列采样(s_t,a_t,G_t)

在求d_π_θ(s)分布下的G_s的期望时,可用按d_π_θ(s)分布进行采样得到的G_s的样本的均值来近似。 网络的训练样本的标签设为[G_t,0]或[0,G_t]

训练结果如下

部分代码如下

# Softmax网络
model_softmax = keras.models.Sequential([
    layers.Dense(10, input_dim=env.observation_space.shape[0], activation='relu'),
    layers.Dense(env.action_space.n, activation="softmax")
])
model_softmax.compile(loss='mean_squared_error', optimizer=optimizers.Adam(0.001))
n_episodes = 1000  
episode_score_list = []
for i in range(n_episodes):
    s = env.reset()
    score = 0 # 记每次得分
    tau = []
    while True:
        pi_s = model_softmax.predict( np.array([s]) )[0] # 状态s的策略
        a = np.random.choice( len(pi_s), p=pi_s ) # 按概率大小随机确定要执行的动作
        next_s, r, done, _ = env.step( a )
        tau.append( [s, a, r] )
        score += r
        s = next_s
        if done:
            break
    X = [ step[0] for step in tau ]
    y = [ [1 if step[1] == i else 0 for i in range(env.action_space.n)] for step in tau ]
    G = G_seq( [step[2] for step in tau] )
    model_softmax.fit(np.array(X), np.array(y), sample_weight=np.array(G), epochs=10, verbose=0)
    episode_score_list.append(score)
    print('尝试次数:', i+1, ' ,得分:', score)
    # 10次尝试后,输出中间信息
    if (i+1) % 10 == 0:
        print("\n--最近{}次平均得分:{:.1f}\n".format(10, np.mean(episode_score_list[-10:]) ) )
    # 最近10次的平均分大于180时,不再训练
    if np.mean(episode_score_list[-10:]) > 180:
        print("\n\n***最近10次的平均分大于180,完成!!!***")
        break

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
人工智能 算法 数据可视化
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-2
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-2
|
7月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作
|
数据采集 存储 C#
C# 爬虫技术:京东视频内容抓取的实战案例分析
C# 爬虫技术:京东视频内容抓取的实战案例分析
|
10月前
|
机器学习/深度学习 人工智能 物联网
操作系统的心脏——深入理解内核机制
在本文中,我们揭开操作系统内核的神秘面纱,探索其作为计算机系统核心的重要性。通过详细分析内核的基本功能、类型以及它如何管理硬件资源和软件进程,我们将了解内核是如何成为现代计算不可或缺的基础。此外,我们还会探讨内核设计的挑战和未来趋势,为读者提供一个全面的内核知识框架。
|
11月前
|
机器学习/深度学习 人工智能 监控
探索 AI 在软件开发中的新角色:代码审查与质量保证
【10月更文挑战第22天】本文探讨了AI在软件开发中的新角色,特别是在代码审查和质量保证方面。AI通过静态代码分析、代码风格一致性检查和历史数据学习,提高代码审查的效率和准确性。在质量保证中,AI还能够自动生成测试用例、监控应用性能并持续优化。文章还讨论了AI在软件开发中的实践应用、挑战与机遇,以及实施的最佳实践。
|
弹性计算 JavaScript 安全
ROS CDK魔法书:建立你的游戏王国(Python篇)
在虚拟游戏世界中,阿里云ROS CDK让游戏部署变得简单高效。ROS CDK是一个强大的开发框架,通过IaC方式简化云资源管理,帮助游戏开发者轻松创建、配置和部署云资源。本文将指导您使用ROS CDK将2048小游戏快速部署到云端,涵盖环境准备、依赖安装、资源栈创建及部署等步骤,让您体验从本地到云端的无缝迁移。通过简单的代码配置,即可实现游戏的云端部署,享受流畅的游戏体验。
ROS CDK魔法书:建立你的游戏王国(Python篇)
|
存储 自然语言处理 索引
|
机器学习/深度学习 自然语言处理 算法
命名实体消歧
8月更文挑战第23天
|
人工智能 安全 API
【AI大模型应用开发】1.3 Prompt攻防(安全) 和 Prompt逆向工程
【AI大模型应用开发】1.3 Prompt攻防(安全) 和 Prompt逆向工程
751 0
|
机器学习/深度学习 算法 C++
动手强化学习(九):策略梯度算法
 首先定义策略网络PolicyNet,其输入是某个状态,输出则是该状态下的动作概率分布,这里采用在离散动作空间上的softmax()函数来实现一个可学习的多项分布(multinomial distribution)。
589 0