1. 程式人生 > >深度強化學習入門-05DQN實現高速超車(復現 deeptraffic:MIT 6.S094: Deep Learning for Self-Driving Cars)

深度強化學習入門-05DQN實現高速超車(復現 deeptraffic:MIT 6.S094: Deep Learning for Self-Driving Cars)

總的來說問題還有許多,希望感興趣的同學朋友多多交流。

最近對強化學習比較感興趣,發現強化學習工作較多的地方是無人駕駛決策規劃這一塊,我自己對這方面也比較感興趣,就想做一個超車模型,設計互動環境如下,讓圖中的紅車以最快的速度超越其他障礙車。
這裡寫圖片描述
我的思路是用dqp來解決這類超車問題,將連續的4個截圖作為一個狀態空間,並用LeNet網路來逼近值函式,但發現效果不好,我以為是LeNet過於簡單無法識別出車的模型,本想換更復雜的卷積網路,但後來怕計算量變大,等結果的時間變長,於是又用圓形和方形物體來分別表示player_car和obscale_car,其他不變,但是訓練效果還是不好(不知道是不是哪裡引數調錯了,後來發現可能是保留了pooling層,由於pooling層具有平移不變性,使網路對影象中物體的位置資訊不敏感,這對於影象分類是有用的,但在當前問題中車的位置對確定潛在獎勵很重要,所以不使用pooling層)。
後來聽人說可以採用專家軌跡來提升訓練效果,於是我又自己玩遊戲記錄了大約2200個狀態、動作和獎勵,帶進模型中訓練發現效果還是不好,應該是專家軌跡太少了吧,下次多錄些,但真的好費事,也不符合強化學習自己犯錯自己得獎的風格。
恰巧的是,我在網上看到mit的自動駕駛公開課中一個有趣的專案:DeepTraffic,介面如下:跟我目標一樣,然後我參照了deeptraffic的思想,改用柵格的方法來表示模型空間。

這裡寫圖片描述
改用柵格的方法來表示模型空間後問題示意如下:柵格區域大小可以人為設定,其中每輛車佔3*6個柵格,每個車道寬5個柵格。然後最重要的思路來了:每個車可觀測的空間區域是有限的,我這裡設定前向觀測20個柵格,後向觀測10個柵格,側向觀測1個車道(加上自身一共3個車道),可觀測區域越大超車效果應該更好,這樣狀態空間就會下很多,計算速度也快很多。
這裡寫圖片描述
我將障礙車所在的柵格值設為-1,玩家車所在的柵格設為2,其他空白區域設為0。可以獲得如下矩陣:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
0 0 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
0 0 0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
將連續的4個矩陣reshape為向量作為輸入。動作有5個:改左車道、改右車道、加速、減速、保持直線(速度不變)。然後對應的reward如下:(我是個新手,感覺reward的設定可能有些問題,希望大家可以給予意見):
改左車道:reward = 0
改右車道:reward = 0
加速:reward = 0.1*(當前速度-最小速度)
減速:reward = 0.05*(當前速度-最小速度)
【需要注意的是,減速時速度減小量對playerCar的跟車效果是有影響的,然後reward的設定好像也有影響,目前還不知道如何設最好,如果大家感興趣,可以自己設了試試】
保持直線(速度不變):reward = 0.1
撞車:reward = -3
好了,訓練了3w多步後效果還是很不錯的,但是還有幾個問題:
1. 損失一直不收斂:
DQN在訓練過程中由於會遇到許多新的狀態動作,所以在計算TD的引數θ沒有變化的一個週期內loss應該是越來越小的,但總的來說loss卻不是收斂的,理論上將當所有的狀態動作都收集全後再對模型進行訓練的過程中,loss應該是越來越小的,但我沒算到這樣的結果。。。。。。
2. 小車有時會連續變換車道,而且有時會存在抖動,不知道這是什麼問題,是不是隻要重新設定獎勵,比如:
Reward += 0.2*(車道寬度的一半 – playerCar距車道路中心的距離)
然後最主要的DQN的原理就不扯了,網上一堆,如果你入門了,這個肯定會,如果是新手,推薦看郭憲博士的深入淺出強化學習,好書,然後這邊書進去之後你會了解到其它好的中英文學習資料。