1. 程式人生 > >用Q-Learning演算法實現無人車智慧代理程式

用Q-Learning演算法實現無人車智慧代理程式

優達學城的第四個專案,通過Q-Learning演算法來實現一個簡單的無人車代駕程式。
先來一張訓練過程的動圖。
訓練過程.gif

需求分析

一個無人車需要滿足的最基本需求就是安全性和可靠性。安全性用來保證使用者安全,可靠性用來保證在限定時間內將使用者送達目的地。安全性可靠性劃分為A+、A、B、C、D、F六個等級
- 安全性
安全性具體表現為遵守交通規則,避免交通事故。
假設有一個簡化的世界,路口的交通燈是老式交通燈,不帶左右轉向指示燈。
簡易世界
紅線代表紅燈的路段。

## 僅考慮紅綠燈就夠了嗎???
## NO!!!
根據一般的交通規則我們可以知道,紅燈時停止直行和左轉,但是可以右轉;綠燈時可以任意方向行駛。


在該規則下,最可能引發安全隱患的情況有以下三種:
- 綠燈時,想左轉,但是交叉方向有直行的車。(見圖1)
- 紅燈時,想右轉,但是左側有直行車輛。(見圖2)
- 綠燈時,想直行,但是右側有右轉車輛。(見圖3)
引發安全隱患的情況

因此確保安全性需要同時考慮紅綠燈、交叉方向車輛、左側車輛、右側車輛的意圖方向。
- 可靠性
可靠性指按時到達目的地。由於路況的不確定,我們不能確定哪條路那種方式是最短時間消耗,比如遇到堵車,即使目的地就在前方,可能繞個道也比等待耗時短,所以這種情況下,我們只要時刻知道目的地的方位就行。

Q-Learning演算法

分數部分(獎勵)

用通俗易懂的語言來講(可能表述不嚴謹)Q-Learning演算法,比如無人駕駛車,初始階段,小車不知道自己會遇到什麼樣的狀態(路況),也不知道該採取什麼樣的策略(前行?左轉?右轉?什麼也不做?),每訓練一次可能遇到一種狀態,就把它記錄下來,比如這一次採取了前行的辦法,則世界根據這個動作給它一個打分,下一次又遇到了相同狀態,採取了左轉策略,則世界根據這個動作再給它一個打分……經過數次訓練,小車可能知道了這種狀態下自己的所有行動對應的分數,在下一次遇到該狀態的時候,則採取分數最高的行動作為本次策略,結束了嗎?沒有,採取了分數最高行動之後,世界根據這個動作又要給小車一個打分,就意味著要重新整理這一次分數,如何重新整理呢?放棄原來的分數重新打分嗎?不,我們希望綜合原來的分數和本次的分數來打分,也就是Q-Learning公式中的學習率alpha
Q-Learning公式


公式中,t代表訓練輪次,s代表狀態,a代表動作,r(a)代表所採取的動作a的獎勵(分數),alpha代表學習率,gamma代表折扣因子,gamma後面的max代表下一個狀態中分數最高的動作的分數,不難發現,與簡明教程中房間不同,在無人車中,並不知道下一個狀態最高的動作是什麼,因為路況是不確定的,所以令gamma=0,則公式便成了
簡化後的公式
從公式可以看出,學習率alpha越大,Q值更新依據過去經驗越少,alpha越小,Q值更新依據過去經驗越大。
至此,分數部分完畢。

動作選擇部分

除了分數部分,還有一個重要部分,動作選擇。每次該如何確定策略?引入一個探索因子epsilon。小車的動作選擇來源於以往經驗和一丟丟“冒險”,就像我們學習新東西需要嘗試一樣,探索因子越大,小車越愛冒險,依據以往經驗越少,探索因子越小,小車越拘束 ,依據以往經驗越多。
不難想到,合適的探索因子是需要變化,比如一開始,小車什麼都不知道,沒有經驗可循,因此探索因子應該大一些,越往後,探索因子可適當減小,偶爾根據以往經驗決定動作,偶爾冒險決定動作。
具體在程式中的使用就是:探索因子為0-1,產生一個0-1的隨機數,如果隨機數小於等於探索因子,則冒險,大於,則根據以往經驗,這樣小車的每個動作就有一定概率是冒險,一定概率是以往經驗。
至此,動作選擇部分完畢。

具體實現

程式碼太多且涉及優達學城的版權,因此不貼了,核心邏輯根據上下文的探討完全可以自己編碼實現,重要的是原理的理解。

狀態空間

根據需求分析,需要考慮的狀態有目的地方向、紅綠燈、交叉方向車輛、左側車輛、右側車輛,分別用waypoint、light、oncoming、left、right表示,waypoint有4種可能:forward、left、right、None,None代表到達目的地,算一種狀態,但不佔狀態空間,因為到了目的地就不用判斷light之類了,所以waypoint有3種狀態,light有紅和綠兩種狀態,oncoming、left、right有forward、left、right、None四種狀態,則共有3x2x4x4x4=384種狀態,所以狀態空間的大小是384。

訓練輪次

根據我的程式碼,每一輪有20次選擇,最極端的情況是20這20次學的同一種狀態的同一個動作,因此384種狀態,每種4個動作,想學完所有狀態,則需要384x4=1536輪訓練。

探索因子的衰減函式

探索因子的可選衰減函式有:
衰減函式
a代表任意一個常數,t代表訓練輪次。
引數可以隨意選擇,但是原則是需要讓探索因子在一定輪次內合理衰減到某個設定值(即epsilon的tolerance),假設使用第一個衰減函式公式,a=0.999,經過1536輪訓練後,epsilon=0.215074991847,所以tolerance設定為0.21,這樣無人車就可以在合理訓練輪次內合理地衰減到tolerance。

alpha的選擇

alpha引數需要自己調參,一般取0.5左右的值。

實現效果

隨機動作選擇

隨機動作選擇

可以看出,安全性和可靠性不管趨勢還是結果都完全隨機,很差。

用Q-Learning進行1500+輪訓練

1500+輪訓練
可以看出,事故越來越少,每個動作的評分也越來越高,可靠性也逐漸提高,且逐漸收斂。最終安全性和可靠性都較高。

用Q-Learning進行1500+輪訓練後的狀態檔案截圖

1536輪訓練後的狀態檔案截圖

經過1500+次訓練後,學習到了382種狀態,還有2種沒學到,可能需要更多輪訓練,也可能不需要,人工智慧演算法都達不到絕對穩定。

折扣因子gamma去哪了

智慧車在行駛過程中只知道目的地的大方向,不知道距離目的地的距離,因此下一個狀態是不知道的,且起點和終點也不固定,因此用gamma是沒有意義的。