莫烦python简历_强化学习传说:第一章 模仿学习
Hello,大家好,這里是糖葫蘆喵喵~!
經過了幾個月的奮斗,大家是不是對煉丹已經有所體會了呢?從今天起我們要進入機器學習的一個非常引人注目的領域——強化學習(reinforcement learning)啦!強化學習部分理論較強,不是很好理解。但是不要怕,相信只要讀懂了代碼就能夠理解了!那么,從這里開始為大家帶來伯克利深度強化學習CS294 Fall 2017以及斯坦福強化學習CS234 2017的Assginment解析,還請大家多多指教~!
那么,繼續我們的煉丹旅程吧~!
Part 0 CS294與CS234 Assignment簡介與環境準備
1. CS294
在Fall 2017的課程組織上有了非常重大的改進!(以前喵喵是不會直接推薦這門課程的,現在強烈推薦!)
CS294 Fall 2017 基本可以分為DRL介紹+模仿學習、model free、model based、Exploration+遷移+多任務+Meta-learning等四大部分。課程需要有一點強化學習和機器學習基礎,建議先看完
CS294一共有四個很有趣的assignment,分別是:模仿學習(行為克隆和DAgger)、策略梯度(AC算法)、DQN和基于模型的Model Predictive Control(MPC)。assignment代碼量不大,但是很具有探索性,能夠在幫助你理解相關算法的同時讓你對強化學習環境
2. CS234
CS234: Reinforcement Learning,是斯坦福大學的強化學習課程,該課程從強化學習介紹與基礎知識(MDP、MC、TD)開始,主要講解了model free、Exploration和策略梯度。前半部分和
CS234有三個assignment,分別是:R-max。其中assignment 1恰好是CS294 assignment所沒有體現的部分,可以作為補充。assignment 2 的DQN框架寫的很漂亮(雖然一部分是借鑒CS294的2333),值得詳細閱讀!
3. 環境準備
建議使用ubuntu,windows[all]模式未安裝成功(簡易模式無法進行atari實驗)。
首先安裝以下包:
apt-get install -y python-numpy python-dev cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig
然后安裝Gym:
pip install gym[all]
Joint dynamics with Contact)是一個模擬機器人,生物力學,圖形和動畫等領域的物理引擎。建議使用linux,CS294要求安裝版本為mjpro131 linux。
MuJoCo需要注冊才能免費使用30天,請盡量保證在30天內完成作業。注冊后通過郵箱接收到mjkey.txt,將這個文件放在mjpro131同級目錄下即可。具體位置可參考示例:
/home/username/.mujoco/mjpro131
/home/username/.mujoco/mjkey.txt
其中username是你的用戶名(用過linux應該都能明白吧),.mujoco可以手動建立一個。mjpro131是你下載并解壓的MuJoCo文件夾,mjkey.txt是注冊接收的key。、
至此,復雜的環境配置完畢,可以嘗試運行一些demo看看有沒有問題。
4. 文章組織與學習資料
喵喵這里為了便于理解,打亂了兩門課程的作業順序,分別按照模仿學習(CS294 assignment 1)、值迭代和策略迭代(CS234 assignment 1 部分)、DQN(CS294 assignment 3 \ CS234 assignment 2)、策略梯度(CS294 assignment 2)和基于模型的強化學習(CS294 assignment 4和CS234 assignment 1 部分)的順序進行講解。
推薦學習資料:
喵喵的代碼實現:Observerspy/CS294?github.comObserverspy/CS234?github.com
強化學習原理與技術詳解:強化學習知識大講堂
CS234 2017 課件:某云鏈接:1dFPlzvr 密碼:rsai
開篇講了這么多,現在讓我們愉悅地開始第一個作業模仿學習(CS294 assignment 1)吧!
Part 1 Behavioral Cloning
Behavioral Cloning,行為克隆,其實本質上就是一個標準的監督學習過程,如下圖所示:
顯然我們是要學習一個輸入是觀測o,輸出是動作a的策略網絡。所謂策略就是在給定當前(觀測)狀態下你所做出的動作選擇。于是,明確了我們的數據(觀測o,動作a),整個監督學習任務就很清晰了。
我們的實驗一共有6個任務:
Hopper,Ant,HalfCheetah,Humanoid,Reacher,Walker2d。
如果你環境配置好了運行demo.bash就能看到6個任務的效果了:單足跳的UMA,四條腿的螞蟻,兩條腿的豹子, 跌跌撞撞的人,夠小球的機械臂,兩條腿的神奇生物。
先不吐槽這些神奇生物,我們先來運行專家策略run_expert.py生成訓練數據,對6個任務分別生成20個rollouts的數據用于訓練(每個rollouts默認走1000步,當然有的任務不到1000步就結束了,具體任務具體分析即可)。所以我們擁有20000個訓練數據啦!
專家策略的return均值和標準差如下:
Hopper-v1(input_dim: 11, output_dim: 3)
mean return 3776.51785877 std of return 3.45247967435
Ant-v1 (input_dim: 111, output_dim: 8)
mean return 4832.13478595 std of return 86.6941336401
HalfCheetah-v1 (input_dim: 17, output_dim: 6)
mean return 4132.24798316 std of return 74.760867223
Humanoid-v1 (input_dim: 376, output_dim: 17)
mean return 10401.7386441 std of return 40.9353971034 need more iter
Reacher-v1 (input_dim: 11, output_dim: 2, max_step = 50)
mean return -4.16785312879 std of return 1.74762339869
Walker2d-v1 (input_dim: 17, output_dim: 6)
mean return 5515.55381623 std of return 37.8541602931
然后就是模型,這里喵喵隨便弄了一個三層的網絡,結構如下:
with tf.name_scope('layer1'):
hidden1 = tf.contrib.layers.fully_connected(self.input_placeholder,
num_outputs=128, activation_fn=tf.nn.relu)
with tf.name_scope('layer2'):
hidden2 = tf.contrib.layers.fully_connected(hidden1,
num_outputs=256, activation_fn=tf.nn.relu)
with tf.name_scope('layer3'):
hidden3 = tf.contrib.layers.fully_connected(hidden2,
num_outputs=64, activation_fn=tf.nn.relu)
with tf.name_scope('output'):
pred = tf.contrib.layers.fully_connected(hidden3,
num_outputs=Config.n_classes, activation_fn=None)
參數設置:
epoch=20,itera(迭代次數,為了和DAgger對比)=20,batch_size = 256,lr = 0.0005
每一次itera后我們都以學習到的策略運行20個rollouts,并記錄returns的均值AverageReturn和標準差StdReturn。
(題外話:其實CS294整個作業下來有兩個工具類特別好用,就是logz.py和plot.py,記錄畫圖一氣呵成,已經成為喵喵的常備工具了233
畫圖如下:(其中hopper-big是將網絡第二層節點數提高到512個)
畢竟其實只訓練了itera * epoch = 400(epoch),所以效果也就這樣了(為了和DAgger對比)。對比專家策略,也就Ant和HalfCheetah任務勉強接近,其他任務基本上可以說差得很遠了,當總epoch更大時Ant和HalfCheetah任務效果更好一些。當然,在我們提高網絡節點數量,增強模型表達能力的時候,我們還是可以看到有一個明顯的提升的(Hopper)。
Part 2 DAgger
看來上述簡單的方法不太行,問題出在哪里呢?
我們的訓練數據分布記為
,我們通過模型學習到的策略記為
。當我們執行我們學習到的策略得到的實際數據分布應為
,這個分布通常與
不一致,除非實際數據分布和訓練數據分布完美的一致。因此,我們的Behavioral Cloning在某些任務下很快就偏移了:
那么為了解決這個問題,一個很簡單的想法就是讓
能去貼近
。那么,我們每次在執行完策略
后對獲得的觀測
重新人為給出標記
不就行了?這樣我們把新獲得的數據加入到原來的data中重新訓練,不斷地讓
去貼近
。這就是我們的DAgger算法思想:
很簡單,只是比Behavioral Cloning多了兩步:
1. 從已抽取的data中訓練策略網絡
2. 運行學習策略
后獲得的
3. 對獲得的
執行專家策略得到其label:
;
4. 將獲得的(
,
) 加入data重新訓練策略。
核心部分實現:
for _ in range(10):
_, o = run_env(env, nn, session) #執行學習到的策略,獲得新的觀測o
observations.extend(o)
action = policy_fn(o) #對新觀測的o執行專家策略,獲得a作為label
actions.extend(action)
參數設置:
網絡結構同上,epoch=20,itera=20,batch_size = 256,lr = 0.0005
初始依然是20 rollouts數據,每個itera加入10 rollouts的新數據。
對比結果如下(DA for DAgger, BC for Behavioral Cloning):
可以看到DAgger基本上在同樣的參數下都能接近專家策略的return了。
關于更多DAgger算法的問題,請詳細的學習CS294第二節。
好了,這就是我們本次對模仿學習的講解,我們正式踏入了強化學習的門框233。強化學習里非常重要的算法我們后續也都會接觸到,不要著急哦。
では、おやすみ~!
下期預告:CS234 Assignment1 值迭代和策略迭代作業詳解
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的莫烦python简历_强化学习传说:第一章 模仿学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux mint 无法联网_Linu
- 下一篇: 用python画钢铁侠_用自动铅笔素描画