主要參考文獻 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。。。