强化学习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文件夹下看到测试游戏环境的视频。
视频

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值