深度强化学习实战:Tensorflow实现DDPG - PaperWeekly 第48期
作者丨李國豪
學校丨中國科學院大學&上海科技大學
研究方向丨無人駕駛,強化學習
指導老師丨林寶軍教授
1. 前言
本文主要講解 DeepMind 發布在 ICLR 2016 的文章 Continuous control with deep reinforcement learning,時間稍微有點久遠,但因為算法經典,還是值得去實現。
2. 環境
這次實驗環境是 Openai Gym 的 Pendulum-v0,state 是 3 維連續的表示桿的位置方向信息,action 是 1 維的連續動作,大小是 -2.0 到 2.0,表示對桿施加的力和方向。目標是讓桿保持直立,所以 reward 在桿保持直立不動的時候最大。筆者所用的環境為:?
Tensorflow (1.2.1)?
gym (0.9.2)?
請先安裝 Tensorflow 和 gym,Tensorflow 和 gym 的安裝就不贅述了,下面是網絡收斂后的結果。
class="video_iframe" data-vidtype="2" allowfullscreen="" frameborder="0" data-ratio="1" data-w="272" data-src="http://v.qq.com/iframe/player.html?vid=y1325jlix3j&width=650&height=487.5&auto=0" style="display: block; width: 650px !important; height: 487.5px !important;" width="650" height="487.5" data-vh="487.5" data-vw="650" src="http://v.qq.com/iframe/player.html?vid=y1325jlix3j&width=650&height=487.5&auto=0"/>
3. 代碼詳解
先貼一張 DeepMind 文章中的偽代碼,分析一下實現它,我們需要實現哪些東西:
4. 網絡結構(model)
首先,我們需要實現一個 critic network 和一個 actor network,然后再實現一個 target critic network 和 target actor network,并且對應初始化為相同的 weights。下面來看看這部分代碼怎么實現:
critic network & target critic network
上面是 critic network 的實現,critic network是一個用神經網絡去近似的一個函數,輸入是 s-state,a-action,輸出是 Q 函數,網絡參數是,在這里我的實現和原文類似,state 經過一個全連接層得到隱藏層特征 h1,action 經過另外一個全連接層得到隱藏層特征 h2,然后特征串聯在一起得到 h_concat,之后 h_concat 再經過一層全連接層得到 h3,最后 h3 經過一個沒有激活函數的全連接層得到 q_output。這就簡單得實現了一個 critic network。
上面是target critic network的實現,target critic network網絡結構和 critic network 一樣,也參數初始化為一樣的權重,思路是先把 critic network 的權重取出來初始化,再調用一遍 self.__create_critic_network() 創建 target network,最后把 critic network 初始化的權重賦值給 target critic network。?
這樣我們就得到了 critic network 和 critic target network。?
actor network & actor target network?
actor network和 actor target network的實現與 critic 幾乎一樣,區別在于網絡結構和激活函數。
這里用了 3 層全連接層,最后激活函數是 tanh,把輸出限定在 -1 到 1 之間。這樣大體的網絡結構就實現完了。
5. Replay Buffer & Random Process(Mechanism)
接下來,偽代碼提到 replay buffer 和 random process,這部分代碼比較簡單也很短,主要參考了 openai 的 rllab 的實現,大家可以直接看看源碼。
6.?網絡更新和損失函數(Model)
用梯度下降更新網絡,先需要定義我們的 loss 函數。?
critic nework 更新
這里 critic 只是很簡單的是一個 L2 loss。不過由于 transition 是 s, a, r, s'。要得到 y 需要一步處理,下面是預處理 transition 的代碼。
訓練模型是,從 Replay buffer 里取出一個 mini-batch,在經過預處理就可以更新我們的網絡了,是不是很簡單。y 經過下面這行代碼處理得到。
actor nework更新
actor network 的更新也很簡單,我們需要求的梯度如上圖,首先我們需要critic network對動作 a 的導數,其中 a 是由 actor network 根據狀態 s 估計出來的。代碼如下:
先根據 actor network 估計出 action,再用 critic network 的輸出 q 對估計出來的 action 求導。?
然后我們把得到的這部分梯度,和 actor network 的輸出對 actor network 的權重求導的梯度,相乘就能得到最后的梯度,代碼如下:
也就是說我們需要求的 policy gradient 主要由下面這一行代碼求得,由于我們需要梯度下降去更新網絡,所以需要加個負號:
之后就是更新我們的 target network,target network 采用 soft update 的方式去穩定網絡的變化,算法如下:
就這樣我們的整體網絡更新需要的東西都實現了,下面是整體網絡更新的代碼:
總體的細節都介紹完了,希望大家有所收獲。另外,完整代碼已放出,大家可以點擊“閱讀原文”訪問我的 Github。
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點擊 |?閱讀原文?| 查看完整代碼
總結
以上是生活随笔為你收集整理的深度强化学习实战:Tensorflow实现DDPG - PaperWeekly 第48期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 来自闪闪宝石的光芒 - “宝石迷阵” x
- 下一篇: 评测任务实战:中文文本分类技术实践与分享