强化学习TD3算法笔记2——代码解读并基于colab平台复现

相关github地址

代码解读的代码链接:sfujim_TD3
colab运行代码:TD3-PyTorch-BipedalWalker-v2
可视化代码:colabgymrender

代码解读

Action、Critic网络定义

# Action网络定义
self.actor = Actor(state, action_dim, max_action).to(device)
# 将action的参数拷贝给target action
self.actor_target = copy.deepcopy(self.action)
self.actor_optimizer = torch.optim.Adam(self.actor.parameters(), lr=3e-4)

# Critic网络定义
self.critic = Critic(state, action).to(device)
self.critic_target = copy.deepcopy(self.critic)
self.critic_optimizer = torch.optim.Adam(self.critic.parameters(), lr=3e-4)

实现smooth_regularization

noise = (torch.randn_like(action)*self.policy_noise) # policy_noise = 0.2
noise = noise.clamp(-self.noise_clap, self.noise_clip) # noise_clip = 0.5

进行相关值计算,min操作

# 从回放经验池采样
state, action, next_action, reward, not_done = replay_buffer.sample(batch_size)

# 不进行梯度传播
with torch.no_grad():
	next_action = (self.actor_target(next_state) + noise)
	next_acion = next_action.clamp(-self.max_action, self.max_action)
	target_Q1, target_Q2 = self.critic_target(next_state, next_action)
	target_Q = torch.min(target_Q1, target_Q2)
	target_Q = reward + not_done * self.discount * target_Q

# 进行梯度传播
current_Q1, current_Q2 = self.critic_target(state, action)
critic_loss = F.mse_loss(current_Q1, target_Q) + F.mse_loss(current_Q1, target_Q)
# 更新critic的参数
self.critic_optimizer.zero_grad()
critic_loss.backward()
self.critic_optimizer.step()

延迟更新

if self.total_it % self.policy_freq == 0:
	actor_loss = -self.critic.Q1(state, self.actor(state)).mean()
	self.actor_optimizer.zero_grad()
	actor_loss.backward()
	self.actor_optimizer.step()

	for param, target_param in zip(self.critic.parameters(), self.critic_target.parameters()):
		target_parameter.data.copy_(self.tau * paramdata + (1-self.tau) * target_param.data)

	for param, target_param in zip(self.actor.parameters(), self.actor_target.parameters()):
		target_param.data.copy_(self.tau * param.data + (1-self.tau) * target_param.data)

代码总结

  1. 从上面的代码可以看出,actor_target和critic_target(target_Q1和target_Q2)是不需要进行梯度计算的。actor_target通过输入下一状态(经验回放取样)得到下一状态的行为取值;critic_target通过输入下一状态(经验回放取样)和actor_target求得的下一状态的行为取值得到两个Q值函数(Q1和Q2两个target网络),然后对求得的两个Q值进行min操作得到可以较好抑制overestimation和variance的Q值,并通过这个Q值求得target值。
  2. critic和actor需要进行梯度计算,因为他们需要通过梯度计算来更新自身网络的参数。critic网络通过输入当前状态和当前行为得到两个Q值,然后通过两个Q值以及critic求得的target值得到损失函数,通过损失函数的梯度计算,从而达到更新参数的目的;等待critic网络较稳定时(代码体现为等待训练episode的个数),actor通过输入当前状态得到当前状态的行为取值,并代入critic输出的Q值函数,得到actor的损失函数,最后通过梯度计算更新actor参数。
  3. 利用更新好的两个网络参数,更新相对应的target网络的参数
  4. 123形成闭环,从而可以完成规定batch_size的训练

Colab运行TD3步骤及效果演示

基于Colab平台复现

由于本人电脑运行算力有限,因此习惯在Google Colab跑深度学习和强化学习的代码。对于Google Colab不熟悉的可以查看我另外一篇博客:PyTorch版YOLOv4训练自己的数据集—基于Google Colab,里面有一些使用的细节,它其实就是一个notebook。

  1. 首先连接谷歌云盘,进入相关的文件路径,并将TD3项目clone下来。
# 连接谷歌云盘
from google.colab import drive
drive.mount('/content/drive')

# 进入'Shared drives/whisperTeam'路径
%cd drive/'Shared drives'
%cd whisperTeam

%clone TD3项目,并进入项目文件夹
!git clone https://github.com/nikhilbarhate99/TD3-PyTorch-BipedalWalker-v2.git
%cd TD3-PyTorch-BipedalWalker-v2

步骤一
2. 安装相关的库

# gym环境
!pip install gym
# 可视化组件
!apt-get install python-opengl -y
!apt-get install -y xvfb python-opengl ffmpeg > /dev/null 2>&1 
!pip install -U colabgymrender
!apt install xvfb -y
# 好像也是虚拟游戏环境
!apt install swig cmake
!pip install stable-baselines3[extra] box2d box2d-kengz

步骤二
3. 修改相关代码
由于上面的虚拟环境的安装已经将游戏环境BipedalWalker-v2升级到BipedalWalker-v3,因此需要将train.py文件中的train函数第九行加以修改。

def train():
    ######### Hyperparameters #########
    env_name = "BipedalWalker-v3"
    log_interval = 10           # print avg reward after interval
    random_seed = 0
    gamma = 0.99                # discount for future rewards

还有就是train.py的84和85行说明模型训练到500episode的时候会将模型保存在某个路径,但是下载下来的文件默认是没有这个路径的,因此需要手动创建一个‘preTrained/BipedalWalker-v3’路径的文件夹。
路径文件

还有一个就是可能将游戏环境BipedalWalker-v2升级到BipedalWalker-v3之后,训练默认的1000episode并不会使得平均奖励大于300,因此不会保存有带_solved结尾的模型权重文件,这会为之后的测试造成一定的困扰,因此建议将训练的episode调大。(train.py中line76)
episode调整
待上述细节调整好之后,运行train.py即可利用TD3算法对BipedalWalker-v3游戏环境进行探索。

!python train.py

train.py

效果展示

colab平台是不能直接将BipedalWalker-v3游戏测试画面展示出来的,因此只能将测试画面保存为视频的格式,到时候对其下载播放即可。
可视化代码参考项目链接前面已给出,需要知道细节的同学自行前往,这里给出直接用法(以下代码均在test.py修改)。
1.导入相关的模块并声明调用

# 导入相关模块
from colabgymrender.recorder import Recorder
# 声明调用
render_directory = './video' # 这个为视频存储文件路径
env = Recorder(env, render_directory)

test.py2.运行test.py文件
运行test.py运行完之后便可以在video文件夹下看到测试游戏环境的视频。
视频

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TD3算法的伪代码如下: 1. 初始化神经网络参数和经验缓存 2. for episode in range(total_episodes): 3. 初始化环境状态 4. for t in range(max_steps_per_episode): 5. 选择动作a通过actor网络和添加噪声 6. 执行动作a并观察奖励和下一个状态 7. 将经验存储到经验缓存中 8. 从经验缓存中采样一批经验 9. 使用target actor网络预测下一个状态的动作 10. 计算target Q值 11. 更新critic网络的参数 12. 每隔一定的时间更新target actor和target critic网络的参数 13. 使用actor网络预测当前状态的动作 14. 计算actor的loss 15. 更新actor网络的参数 16. 更新target actor和target critic网络的参数 17. 返回训练好的actor和critic网络参数 在每个时间步骤中,TD3算法使用actor网络选择动作并添加噪声,然后执行动作并观察奖励和下一个状态。经验被存储在经验缓存中,并随机采样一批经验进行训练。然后,使用target actor网络预测下一个状态的动作,并计算target Q值。接下来,更新critic网络的参数以最小化critic loss。然后,更新actor网络的参数以最大化actor的loss。目标网络的参数也会定期更新,以保持稳定性。最后,训练完成后返回训练好的actor和critic网络参数。 请注意,伪代码中的详细实现细节可能因实际情况而异,此处只提供了一个概括性的描述。参考论文和实现代码以获取更详细的信息。 参考文献: 作者. (年份). 标题. 出版物. 作者. (年份). 标题. 出版物. 作者. (年份). 标题. 出版物.<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [深度强化学习-TD3算法原理与代码](https://blog.csdn.net/weixin_46133643/article/details/124509577)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值