当前位置: 首页 > news >正文

门户网站定制开发工程竣工验收公示网

门户网站定制开发,工程竣工验收公示网,希爱力的作用与功效,2023年度最火关键词策略梯度 强化学习算法进阶 Q-learning、DQN 及 DQN 改进算法都是基于价值#xff08;value-based#xff09;的方法#xff0c;其中 Q-learning 是处理有限状态的算法#xff0c;而 DQN 可以用来解决连续状态的问题。在强化学习中#xff0c;除了基于值函数的方法#…策略梯度 强化学习算法进阶 Q-learning、DQN 及 DQN 改进算法都是基于价值value-based的方法其中 Q-learning 是处理有限状态的算法而 DQN 可以用来解决连续状态的问题。在强化学习中除了基于值函数的方法还有一支非常经典的方法那就是基于策略policy-based的方法。对比两者 基于值函数的方法主要是学习值函数然后根据值函数导出一个策略学习过程中并不存在一个显式的策略而基于策略的方法则是直接显式地学习一个目标策略。策略梯度是基于策略的方法的基础本章从策略梯度算法说起。 基于策略的方法首先需要将策略参数化 假设目标策略 π θ \pi_{\theta} πθ​是一个随机性策略并且处处可微其中θ是对应的参数。我们可以用一个线性模型或者神经网络模型来为这样一个策略函数建模输入某个状态然后输出一个动作的概率分布。我们的目标是要寻找一个最优策略并最大化这个策略在环境中的期望回报。我们将策略学习的目标函数定义为 J ( θ ) E s 0 [ V π θ ( s 0 ) ] J(\theta)\mathbb E_{s_0}[V^{\pi_{\theta}}(s_0)] J(θ)Es0​​[Vπθ​(s0​)]其中 s 0 s_0 s0​表示初始状态。现在有了目标函数我们将目标函数对策略θ求导得到导数后就可以用梯度上升方法来最大化这个目标函数从而得到最优策略。 策略 π \pi π下的状态访问分布在此用 ν π \nu^{\pi} νπ表示。然后我们对目标函数求梯度可以得到如下式子 ∇ θ J ( θ ) ∝ ∑ s ∈ S ν π θ ( s ) ∑ a ∈ A Q π θ ( s , a ) ∇ θ π θ ( a ∣ s ) ∑ s ∈ S ν π θ ( s ) ∑ a ∈ A π θ ( a ∣ s ) Q π θ ( s , a ) ∇ θ π θ ( a ∣ s ) π θ ( a ∣ s ) E π θ [ Q π θ ( s , a ) ∇ θ log ⁡ π θ ( a ∣ s ) ] \begin{aligned} \nabla_\theta J(\theta) \propto\sum_{s\in S}\nu^{\pi_\theta}(s)\sum_{a\in A}Q^{\pi_\theta}(s,a)\nabla_\theta\pi_\theta(a|s) \\ \sum_{s\in S}\nu^{\pi_\theta}(s)\sum_{a\in A}\pi_\theta(a|s)Q^{\pi_\theta}(s,a)\frac{\nabla_\theta\pi_\theta(a|s)}{\pi_\theta(a|s)} \\ \mathbb{E}_{\pi_\theta}[Q^{\pi_\theta}(s,a)\nabla_\theta\log\pi_\theta(a|s)] \end{aligned} ∇θ​J(θ)​∝s∈S∑​νπθ​(s)a∈A∑​Qπθ​(s,a)∇θ​πθ​(a∣s)s∈S∑​νπθ​(s)a∈A∑​πθ​(a∣s)Qπθ​(s,a)πθ​(a∣s)∇θ​πθ​(a∣s)​Eπθ​​[Qπθ​(s,a)∇θ​logπθ​(a∣s)]​ 符号说明 ∇ θ J ( θ ) \nabla_{\theta}J(\theta) ∇θ​J(θ)关于参数 θ \theta θ 的目标函数 J ( θ ) J(\theta) J(θ) 的梯度。目标函数 J ( θ ) J(\theta) J(θ) 通常表示策略 π θ \pi_{\theta} πθ​ 的期望回报策略 π θ ( a ∣ s ) \pi_{\theta}(a|s) πθ​(a∣s) 是在状态 s s s 下采取动作 a a a 的概率由参数 θ \theta θ 决定。 S S S状态空间即所有可能的状态集合。 A A A动作空间即所有可能的动作集合。 ν π θ ( s ) \nu^{\pi_{\theta}}(s) νπθ​(s)在策略 π θ \pi_{\theta} πθ​ 下状态 s s s 的稳态分布也叫占有度量表示长期来看智能体处于状态 s s s 的概率。 Q π θ ( s , a ) Q^{\pi_{\theta}}(s, a) Qπθ​(s,a)在策略 π θ \pi_{\theta} πθ​ 下的状态 - 动作值函数即从状态 s s s 采取动作 a a a 后遵循策略 π θ \pi_{\theta} πθ​ 所能获得的期望累积回报。 π θ ( a ∣ s ) \pi_{\theta}(a|s) πθ​(a∣s)在状态 s s s 下根据策略 π θ \pi_{\theta} πθ​ 采取动作 a a a 的概率。 E π θ [ ⋅ ] \mathbb{E}_{\pi_{\theta}}[\cdot] Eπθ​​[⋅]在策略 π θ \pi_{\theta} πθ​ 下的期望。 公式推导步骤 第一步 ∇ θ J ( θ ) ∝ ∑ s ∈ S ν π θ ( s ) ∑ a ∈ A Q π θ ( s , a ) ∇ θ π θ ( a ∣ s ) \nabla_{\theta}J(\theta) \propto \sum_{s \in S} \nu^{\pi_{\theta}}(s) \sum_{a \in A} Q^{\pi_{\theta}}(s, a) \nabla_{\theta} \pi_{\theta}(a|s) ∇θ​J(θ)∝s∈S∑​νπθ​(s)a∈A∑​Qπθ​(s,a)∇θ​πθ​(a∣s)这一步表达了目标函数的梯度与状态 - 动作值函数和策略梯度的关系。它的含义是目标函数的梯度可以通过对所有状态和动作的加权求和来近似权重是状态的稳态分布和状态 - 动作值函数。 第二步 ∑ s ∈ S ν π θ ( s ) ∑ a ∈ A π θ ( a ∣ s ) Q π θ ( s , a ) ∇ θ π θ ( a ∣ s ) π θ ( a ∣ s ) \sum_{s \in S} \nu^{\pi_{\theta}}(s) \sum_{a \in A} \pi_{\theta}(a|s) Q^{\pi_{\theta}}(s, a) \frac{\nabla_{\theta} \pi_{\theta}(a|s)}{\pi_{\theta}(a|s)} s∈S∑​νπθ​(s)a∈A∑​πθ​(a∣s)Qπθ​(s,a)πθ​(a∣s)∇θ​πθ​(a∣s)​这里通过将 π θ ( a ∣ s ) \pi_{\theta}(a|s) πθ​(a∣s) 乘进去再除出来将式子变形。注意到 ∇ θ π θ ( a ∣ s ) π θ ( a ∣ s ) ∇ θ log ⁡ π θ ( a ∣ s ) \frac{\nabla_{\theta} \pi_{\theta}(a|s)}{\pi_{\theta}(a|s)} \nabla_{\theta} \log \pi_{\theta}(a|s) πθ​(a∣s)∇θ​πθ​(a∣s)​∇θ​logπθ​(a∣s)这是一个常见的对数求导技巧。 第三步 E π θ [ Q π θ ( s , a ) ∇ θ log ⁡ π θ ( a ∣ s ) ] \mathbb{E}_{\pi_{\theta}}[Q^{\pi_{\theta}}(s, a) \nabla_{\theta} \log \pi_{\theta}(a|s)] Eπθ​​[Qπθ​(s,a)∇θ​logπθ​(a∣s)]这一步将双重求和转化为期望形式。根据期望的定义对于一个离散随机变量 X X X这里是状态 - 动作对 ( s , a ) (s, a) (s,a)其期望 E [ X ] ∑ i p i x i \mathbb{E}[X] \sum_{i} p_i x_i E[X]∑i​pi​xi​其中 p i p_i pi​ 是取值 x i x_i xi​ 的概率。在这里 ν π θ ( s ) π θ ( a ∣ s ) \nu^{\pi_{\theta}}(s) \pi_{\theta}(a|s) νπθ​(s)πθ​(a∣s) 是状态 - 动作对 ( s , a ) (s, a) (s,a) 的联合概率分布所以双重求和可以写成期望的形式。 这个梯度可以用来更新策略。需要注意的是因为上式中期望的下标是 π θ \pi_{\theta} πθ​所以策略梯度算法为在线策略on-policy算法即必须使用当前策略采样得到的数据来计算梯度。直观理解一下策略梯度这个公式可以发现在每一个状态下梯度的修改是让策略更多地去采样到带来较高值的动作更少地去采样到带来较低值的动作如图 9-1 所示。 在计算策略梯度的公式中我们需要用到 Q π θ ( s , a ) Q^{\pi_{\theta}}(s,a) Qπθ​(s,a)可以用多种方式对它进行估计。接下来要介绍的 REINFORCE 算法便是采用了蒙特卡洛方法来估计。 REINFORCE 对于一个有限步数的环境来说REINFORCE 算法中的策略梯度为 ∇ θ J ( θ ) E π θ [ ∑ t 0 T ( ∑ t ′ t T γ t ′ − t r t ′ ) ∇ θ log ⁡ π θ ( a t ∣ s t ) ] \nabla_\theta J(\theta)\mathbb{E}_{\pi_\theta}\left[\sum_{t0}^T\left(\sum_{t^{\prime}t}^T\gamma^{t^{\prime}-t}r_{t^{\prime}}\right)\nabla_\theta\log\pi_\theta(a_t|s_t)\right] ∇θ​J(θ)Eπθ​​[t0∑T​(t′t∑T​γt′−trt′​)∇θ​logπθ​(at​∣st​)]其中 T T T是和环境交互的最大步数。 REINFORCE 算法的具体算法流程如下 初始化策略参数 θ \theta θfor 序列 e 1 → E e1\to E e1→E do : 用当前策略 π θ \pi_{\theta} πθ​采样轨迹 { s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , . . . , s T , a T , r T } \{s_1,a_1,r_1,s_2,a_2,r_2,...,s_T,a_T,r_T\} {s1​,a1​,r1​,s2​,a2​,r2​,...,sT​,aT​,rT​}计算当前轨迹每个时刻 t t t往后的回报 ∑ t ′ t T γ t ′ − t r t ′ \sum_{tt}^T\gamma^{t-t_{r_{t}}} ∑t′tT​γt′−trt′​​记为 ψ t \psi_t ψt​对 θ \theta θ进行更新 θ θ α ∑ t T ψ t ∇ θ log ⁡ π θ ( a t ∣ s t ) \theta\theta\alpha\sum_{t}^T\psi_t \nabla_{\theta}\log \pi_{\theta}(a_t|s_t) θθα∑tT​ψt​∇θ​logπθ​(at​∣st​) end for 注意这里是梯度上升写成loss的时候应为 loss − ψ t log ⁡ π θ ( a t ∣ s t ) \text{loss}-\psi_t \log \pi_{\theta}(a_t|s_t) loss−ψt​logπθ​(at​∣st​) REINFORCE 代码实践 import gym import torch import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt from tqdm import tqdm# rl_utils是作者自己写的文件在github上去下载: # https://github.com/boyu-ai/Hands-on-RL/blob/main/rl_utils.py # kaggle上导入库操作 from shutil import copyfile copyfile(src/kaggle/input/rlutils/rl_utils.py, dst ../working/rl_utils.py) import rl_utils# 首先定义策略网络PolicyNet其输入是某个状态输出则是该状态下的动作概率分布 # 这里采用在离散动作空间上的softmax()函数来实现一个可学习的多项分布multinomial distribution。 class PolicyNet(torch.nn.Module):def __init__(self, state_dim, hidden_dim, action_dim):super(PolicyNet, self).__init__()self.fc1 torch.nn.Linear(state_dim, hidden_dim)self.fc2 torch.nn.Linear(hidden_dim, action_dim)def forward(self, x):x F.relu(self.fc1(x))return F.softmax(self.fc2(x), dim1)# 再定义我们的 REINFORCE 算法。 # 在函数take_action()函数中我们通过动作概率分布对离散的动作进行采样。 # 在更新过程中我们按照算法将损失函数写为策略回报的负数对θ求导后就可以通过梯度下降来更新策略。 class REINFORCE:def __init__(self, state_dim, hidden_dim, action_dim, learning_rate, gamma,device):self.policy_net PolicyNet(state_dim, hidden_dim,action_dim).to(device)self.optimizer torch.optim.Adam(self.policy_net.parameters(),lrlearning_rate) # 使用Adam优化器self.gamma gamma # 折扣因子self.device devicedef take_action(self, state): # 根据动作概率分布随机采样state torch.tensor([state], dtypetorch.float).to(self.device)probs self.policy_net(state)action_dist torch.distributions.Categorical(probs)action action_dist.sample()return action.item()def update(self, transition_dict):reward_list transition_dict[rewards]state_list transition_dict[states]action_list transition_dict[actions]G 0self.optimizer.zero_grad()for i in reversed(range(len(reward_list))): # 从最后一步算起reward reward_list[i]state torch.tensor([state_list[i]],dtypetorch.float).to(self.device)action torch.tensor([action_list[i]]).view(-1, 1).to(self.device)log_prob torch.log(self.policy_net(state).gather(1, action)) # gather用于从张量中提取特定索引处的值。G self.gamma * G rewardloss -log_prob * G # 每一步的损失函数loss.backward() # 反向传播计算梯度self.optimizer.step() # 梯度下降# 定义好策略我们就可以开始实验了看看 REINFORCE 算法在车杆环境上表现如何吧 learning_rate 1e-3 num_episodes 1000 hidden_dim 128 gamma 0.98 device torch.device(cuda) if torch.cuda.is_available() else torch.device(cpu)env_name CartPole-v0 env gym.make(env_name) env.seed(0) torch.manual_seed(0) state_dim env.observation_space.shape[0] action_dim env.action_space.n agent REINFORCE(state_dim, hidden_dim, action_dim, learning_rate, gamma,device)return_list [] for i in range(10):with tqdm(totalint(num_episodes / 10), descIteration %d % i) as pbar:for i_episode in range(int(num_episodes / 10)):episode_return 0transition_dict {states: [],actions: [],next_states: [],rewards: [],dones: []}state env.reset()done Falsewhile not done:action agent.take_action(state)next_state, reward, done, _ env.step(action)transition_dict[states].append(state)transition_dict[actions].append(action)transition_dict[next_states].append(next_state)transition_dict[rewards].append(reward)transition_dict[dones].append(done)state next_stateepisode_return rewardreturn_list.append(episode_return)agent.update(transition_dict)if (i_episode 1) % 10 0:pbar.set_postfix({episode:%d % (num_episodes / 10 * i i_episode 1),return:%.3f % np.mean(return_list[-10:])})pbar.update(1)在 CartPole-v0 环境中满分就是 200 分我们发现 REINFORCE 算法效果很好可以达到 200 分。接下来我们绘制训练过程中每一条轨迹的回报变化图。由于回报抖动比较大往往会进行平滑处理。 episodes_list list(range(len(return_list))) plt.plot(episodes_list, return_list) plt.xlabel(Episodes) plt.ylabel(Returns) plt.title(REINFORCE on {}.format(env_name)) plt.show()mv_return rl_utils.moving_average(return_list, 9) plt.plot(episodes_list, mv_return) plt.xlabel(Episodes) plt.ylabel(Returns) plt.title(REINFORCE on {}.format(env_name)) plt.show()可以看到随着收集到的轨迹越来越多REINFORCE 算法有效地学习到了最优策略。 算法缺点 不过相比于前面的 DQN 算法REINFORCE 算法使用了更多的序列这是因为 REINFORCE 算法是一个在线策略算法之前收集到的轨迹数据不会被再次利用。此外REINFORCE 算法的性能也有一定程度的波动这主要是因为每条采样轨迹的回报值波动比较大这也是 REINFORCE 算法主要的不足。 REINFORCE 算法是策略梯度乃至强化学习的典型代表智能体根据当前策略直接和环境交互通过采样得到的轨迹数据直接计算出策略参数的梯度进而更新当前策略使其向最大化策略期望回报的目标靠近。这种学习方式是典型的从交互中学习并且其优化的目标即策略期望回报正是最终所使用策略的性能这比基于价值的强化学习算法的优化目标一般是时序差分误差的最小化要更加直接。 REINFORCE 算法理论上是能保证局部最优的它实际上是借助蒙特卡洛方法采样轨迹来估计动作价值这种做法的一大优点是可以得到无偏的梯度。但是正是因为使用了蒙特卡洛方法REINFORCE 算法的梯度估计的方差很大可能会造成一定程度上的不稳定这也是 Actor-Critic 算法要解决的问题。
http://www.dnsts.com.cn/news/132138.html

相关文章:

  • 北京建设工程建设交易信息网站网站业务怎么做的
  • 做网站客户最关心的是什么深圳网站建设ppchsj
  • 网站建设与规划案例南昌网站建设哪家好薇
  • 网站标题组合网页设计与网站建设 石油大学
  • 一个人可以建设网站吗网站开发liucheng
  • 有什么做图文长图的网站吗做实体店推广的网站
  • 长垣住房和城乡建设局 网站seo网站推广优化论文
  • 免费 开源 企业网站专业定制网页设计
  • 网站栏目词ip开源网站fpga可以做点什么用
  • 北京电力建设公司培训学校网站自己做视频网站能赚钱吗
  • 网站标题应怎设置在上阿里云做网站
  • 秦皇岛手机网站制作价格做足球推荐网站能赚钱吗
  • 网站开发不足之处广告公司怎么设置网站关键字
  • 网站推广软件哪个最实惠哪个网站能帮助做路书
  • 自己做网站选什么好网站开发可选择的方案有
  • 一手楼房可以做哪个网站做网站推淘宝客
  • wordpress局域网建站百度推广账号登录入口
  • 房产网站内容建设规划网站设计师简介
  • 如何做网站销售网站开发工作室挣钱吗
  • 淘宝开店铺网站怎么做免费的企业查询
  • 做电脑网站用什么软件wordpress 评论ajax分页
  • 苏州新区做网站深圳网站建设找哪
  • asp企业网站模板下载17网站一起做网店app
  • 长沙 公司网站个人做网站用哪个主机好
  • 电子商务网站开发的过程东莞人才服务中心官网
  • 中国建设银行网站的主要功能大连网络推广营销
  • 安徽建站管理系统开发请描述网站开发的一般流程图
  • 平顶山城市住房城乡建筑网站asp网站检查
  • 英文网站建设注意什么网站建设做什么会计分录
  • WordPress P站和目网站