文章目录
(一)“Pendulum-v0”
- 倒立摆问题是控制文献中的经典问题。这里钟摆以随机位置开始,目标是将其向上摆动,使其保持直立。
- 类型:连续控制
Observation & State
n | Observation | Min | Max |
---|---|---|---|
0 | cos ( t h e t a ) \cos(theta) cos(theta) | -1.0 | 1.0 |
1 | sin ( t h e t a ) \sin(theta) sin(theta) | -1.0 | 1.0 |
2 | theta dot | -8.0 | 8.0 |
- State是Pendulum的角度和角速度(theta和thetadot)
- State是最原始的环境内部的表示,Observation则是State的函数。
Action
n | Action | Min | Max |
---|---|---|---|
0 | Joint effort | -2.0 | 2.0 |
self.action_space = spaces.Box(
low=-self.max_torque,
high=self.max_torque, shape=(1,),
dtype=np.float32
)
- 这是Action的定义,对于Pendulum问题来说,动作空间只有一个维度,就是电机的控制力矩,且有最大值和最小值的限制。
Reward
costs = angle_normalize(th) ** 2 + .1 * thdot ** 2 + .001 * (u ** 2)
- 这是代价,而
R
e
w
a
r
d
=
−
c
o
s
t
Reward=-cost
Reward=−cost,即:
− ( θ 2 + 0.1 × θ d t 2 + 0.001 × a c t i o n 2 ) -\left( \theta^2+0.1\times\theta^2_{dt}+0.001\times action^2\right) −(θ2+0.1×θdt2+0.001×action2)- θ \theta θ在 − π -\pi −π和 π \pi π之间归一化
- 因此,The lowest reward是 − ( π 2 + 0.1 × 8 2 + 0.001 × 2 2 ) = − 16.2736044 -\left( \pi^2 + 0.1 \times8^2 + 0.001\times 2^2\right)=-16.2736044 −(π2+0.1×82+0.001×22)=−16.2736044
- The highest reward是 0 0 0
- 实质上,目标是保持零角度(垂直),旋转速度最小,力度最小
参考文档:https://github.com/openai/gym/wiki/Pendulum-v0
(二)A3C & DDPG
- 两种算法使用的架构都是actor-critic架构,不同的在于A3C的提出引入了并发的思想,通过多个线程独立地与环境交互,同时异步也打破了数据的相关性;而DDPG则是将DQN从离散动作空间扩展至连续动作空间,并借鉴了DQN的两个技巧:经验回放、目标网络。(See DDPG 、A3C for more details.)
A3C
Hyper Parameters:
GAME = 'Pendulum-v0'
N_WORKERS = multiprocessing.cpu_count() # number of threads
MAX_EP_STEP = 200 # steps for one episode
MAX_GLOBAL_EP = 2000 # total episodes
GAMMA = 0.9 # reward discount
UPDATE_GLOBAL_ITER = 10 # update global network per 10 steps
ENTROPY_BETA = 0.01 # for exploration
LR_A = 0.0001 # learning rate for actor
LR_C = 0.001 # learning rate for critic
Test 1
-
2000 Episodes时(其他参数未变,如上),Total Moving Reward曲线:
-
4000 Episodes时(其他参数未变,如上),Total Moving Reward曲线:
可以看到总奖励2000-4000episodes收敛趋于稳定
Test 2
- 尝试改变
ENTROPY_BETA = 0.01
,将其设置为比0.01小的0.001。(其他参数未变) - Larger entropy means more stochastic actions
- 可以发现奖励曲线的变化,该算法在这里的表现没有之前理想,进行4000episode也没有稳定:
Test 3
- 这里尝试修改学习率参数为:
LR_A = 0.001
、LR_C = 0.001
,结果如下:
- 尝试修改为:
LR_A = 0.001
、LR_C = 0.002
,结果如下(表现可能优于上图,不过这两种尝试的表现都未优于LR_A = 0.0001
、LR_C = 0.001
):
Test 4
- 最后尝试对比不同更新主网络参数的频率
- 修改参数:
UPDATE_GLOBAL_ITER = 100
(其他参数不变)
各位可以尝试一些10到100之间的值。
DDPG
Test 1
Hyper Parameters:
ENV_NAME = 'Pendulum-v0'
MAX_EPISODES = 2000
MAX_EP_STEPS = 200
LR_A = 0.001 # learning rate for actor
LR_C = 0.002 # learning rate for critic
GAMMA = 0.9 # reward discount
TAU = 0.01 # soft replacement
MEMORY_CAPACITY = 10000
BATCH_SIZE = 32
- 训练时长近800秒,结果如下:
可以看出500-1000episode左右总奖励就趋于稳定。
总结:DDPG vs A3C
- 可以看出,在Pendulum问题上,DDPG的收敛性优于A3C;
- 不过,需要注意的是,训练2000episode,DDPG用时在800秒左右,而A3C仅用时140秒(A3C在4000episode也仅用时270秒)。
- 总的来说,通过这次对比,A3C和DDPG各有优势。不同的问题上2个算法的表现互有优劣(后面将在不同的问题进行对比学习),不能因为一个问题上的表现下结论哪个更好。当问题的规模中等或者偏小的时候,DDPG效果更佳。但是当问题的规模很大,DDPG训练较慢的时候,A3C会更有优势,因为A3C天生就是可以并行的
My Code:
https://github.com/catchy666/Reinforcement-Learning-Demo
相关参考:
https://www.cnblogs.com/pinard/p/10345762.html
https://github.com/MorvanZhou/Reinforcement-learning-with-tensorflow