强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现
TD3算法简介
TD3是Twin Delayed Deep Deterministic policy gradient algorithm的简称,双延迟深度确定性策略梯度。从名字看出,TD3算法是DDPG的改进版本。TD3算法来自论文
Addressing Function Approximation Error in Actor-Critic Methods。
TD3相对于DDPG,主要采用了以下重要改进。
- Double network
- Critic学习改进
- Actor学习改进
- target policy smoothing regularization
更详细的介绍请参考
https://zhuanlan.zhihu.com/p/111334500
https://zhuanlan.zhihu.com/p/88446488
详细介绍
解决两个问题,一个是过估计,overestimate,另一个是高方差现象,high variance。
对状态价值的过高估计是Value based方法经常遇到的问题。在Qnetwork不成熟时,对状态的估计有误差,对Q值取最大化操作时,会高于真实的最大Q值。累积下来的过高估计可能会使得算法陷入次优策略中,导致发散等行为。
TD3论文发现Actor-critic算法中也会出现overestimate现象。
解决过高估计问题的办法,文中提到了两个。一个是采取Double DQN的做法,使用target Q network和main Q network分别进行状态价值估计和选取动作,将两者解耦。另一个是Double Q-learning,即采用两个独立的Critic,分别对价值进行估计,取最小值。这个方法带来的高方差问题可以用更新时对梯度进行裁剪来改善。
y = r t + γ m i n i = 1 , 2 Q θ i ′ ( s ′ , π ϕ 1 ( s ′ ) ) y=r_t + \gamma min_{i=1,2} Q_{\theta '_i}(s',\pi_{\phi_1}(s')) y=rt+γmini=1,2Qθi′(s′,πϕ1(s′))
解决高方差问题,文中采用了三个办法。
一个是target network。自从DQN起就在使用,通过降低critic的更新频率来降低方差。
第二个是降低Actor的更新频率,叫做Delaying policy updates。也就是将值函数和策略函数解耦。
第三个是target policy smoothing regularization,即一种正则化方法解决determinstic policy可能overfitting的问题。直观地讲,就是在计算Q值更新目标时,采用如下方式:
a ~ ← π ϕ ′ ( s ′ ) + ϵ , ϵ ∼ c l i p ( N ( 0 , σ ~ ) , − c , c ) \tilde{a} \leftarrow \pi_{\phi'}(s')+\epsilon,\quad \epsilon \sim clip(N(0,\tilde{\sigma}),-c,c) a~←πϕ′(s′)+ϵ,ϵ∼clip(N(0,σ~),−c,c)
算法流程图

算法实现
import argparse
from collections import namedtuple
from itertools import count
import os, sys, random
import numpy as np
import gym
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.distributions import Normal
from tensorboardX import SummaryWriter
device = 'cuda' if torch.cuda.is_available() else 'cpu'
parser = argparse.ArgumentParser()
parser.add_argument('--mode', default='train', type=str) # mode = 'train' or 'test'
parser.add_argument("--env_name", default="LunarLanderContinuous-v2") # OpenAI gym environment name, BipedalWalker-v2 Pendulum-v0
parser.add_argument('--tau', default=0.05, type=float) # target smoothing coefficient
parser.add_argument('--target_update_interval', default=1, type=int)
parser.add_argument('--test_episode', default=50, type=int)
parser.add_argument('--epoch', default=10, type=int) # buffer采样的数据训练几次
parser.add_argument('--learning_rate', default=3e-4, type=float)
parser

本文深入解析了双延迟深度确定性策略梯度(TD3)算法,介绍了其如何解决过估计和高方差问题,并提供了详细的PyTorch实现代码。TD3作为DDPG的改进版,通过双重网络、目标策略平滑正则化等策略提高了策略学习的稳定性和效果。
最低0.47元/天 解锁文章
1222

被折叠的 条评论
为什么被折叠?



