主要参考文献 Reinforcement Learning: An introduction,Sutton
主要参考课程 Intro to Reinforcement Learning,Bolei Zhou
相关文中代码 https://github.com/ThousandOfWind/RL-basic-alg.git
Actor-Critic
Actor-Critic Policy Gradient (QAC)
从REINFORCE到AC主要就是把MC的估计方式换成自举。
可以把REINFORCE里的 替换为critic:
这个Q可以简单的用TD更新
def get_action(self, observation, *arg):
obs = th.FloatTensor(observation)
pi = self.pi(obs=obs)
m = Categorical(pi)
action_index = m.sample()
self.log_pi_batch.append(m.log_prob(action_index))
self.value_batch.append(self.Q(obs=obs)[action_index])
return int(action_index), pi
def learn(self, memory):
batch = memory.get_last_trajectory()
reward = th.FloatTensor(batch['reward'][0])
log_pi = th.stack(self.log_pi_batch)
value = th.stack(self.value_batch)
mask = th.ones_like(value)
mask[-1] = 0
next_value = th.cat([value[1:], value[0:1]],dim=-1) * mask
td_error = reward + self.gamma * next_value.detach() - value
td_loss = (td_error ** 2).mean()
J = - (value.detach() * log_pi).mean()
loss = J + td_loss
self.writer.add_scalar('Loss/J', J.item(), self._episode)
self.writer.add_scalar('Loss/TD_loss', td_loss.item(), self._episode)
self.writer.add_scalar('Loss/loss', loss.item(), self._episode)
self.optimiser.zero_grad()
loss.backward()
grad_norm = th.nn.utils.clip_grad_norm_(self.params, 10)
self.optimiser.step()
self._episode += 1
感觉结果还是挺悲剧的
QAC with shared network
这个理论其实很简单,只是是共享actor网络和critic网络的特征提取层
但是常常担心会发生耦合而同流合污
至少最左边有几个点黄了。。。
这结果烂着烂着我都习惯了
one-step AC
由于在REINFORCE-baseline中已经在用
很自然的就可以
这样我们就有了one step AC算法
如果把一步自举推广到多步
Sutton 书里是这样的,但我在对参数更新上还有点疑虑, 为啥 算子同时出现在了对actor网络和critic网络的更新中,等我搞懂再继续吧coding。。。