強化學習策略梯度梳理1 - AC

主要參考文獻 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裏的GtG_t 替換爲critic:Q(St,At,w)Q(S_t, A_t, \boldsymbol{w})
J(θ)Eπ[Q(St,At,w)ln(π(AtSt,θ))] \nabla J(\boldsymbol{\theta}) \propto \mathbb{E}_{\pi}\left[Q(S_t, A_t, \boldsymbol{w})\nabla \operatorname{ln}(\pi(A_t \mid S_t, \boldsymbol{\theta}))\right]
這個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中已經在用
J(θ)Eπ[(G(St,At)v(St))ln(π(AtSt,θ))] \nabla J(\boldsymbol{\theta}) \propto \mathbb{E}_{\pi}\left[\left(G(S_{t},A_t) -v(S_t)\right)\nabla \operatorname{ln}(\pi(A_t \mid S_t, \boldsymbol{\theta}))\right]
很自然的就可以
J(θ)Eπ[(R(St,At)+γv(St+1)v(St))ln(π(AtSt,θ))] \nabla J(\boldsymbol{\theta}) \propto \mathbb{E}_{\pi}\left[\left(R(S_{t},A_t) + \gamma v(S_{t+1}) -v(S_t)\right)\nabla \operatorname{ln}(\pi(A_t \mid S_t, \boldsymbol{\theta}))\right]
這樣我們就有了one step AC算法
在這裏插入圖片描述

如果把一步自舉推廣到多步
在這裏插入圖片描述

Sutton 書裏是這樣的,但我在對參數更新上還有點疑慮, 爲啥δ\delta 算子同時出現在了對actor網絡和critic網絡的更新中,等我搞懂再繼續吧coding。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章