編譯:yxy
出品:ATYUN訂閱號
想象一下,你生活在一個沒有交通擁堵,沒有交通事故,也無需花費時間開車的世界,那會多美好。
在我之前做過的一篇關於強化學習的文章中(鏈接在文末)曾說過,自動駕駛汽車是一場革命,主要有兩個原因:
- 每年因交通事故將挽救125萬人的生命
- 省下開車的時間,它會讓你在一生中多活3年
很多公司已經在研究自動駕駛汽車了!比如特斯拉,谷歌,Wayve等等。這些自動駕駛汽車往往使用了強化學習!
再說一遍,如果你還沒有讀上一篇文章(鏈接在文末),可以先讀一下,在這裏我只做上篇文章的簡要概述。
強化學習使機器(或者稱爲智能體)通過實驗學習。就像人類學習走路。起初,你以一定的方式移動你的腿,但是你會跌倒。你跌倒了很多次,但最終,經過多次嘗試,你會慢慢學會如何移動你的腿來走路。強化學習的原則與此相同!
比較正式的說法是,具有特定狀態的環境中的智能體具有可以執行的一組動作。在執行這些動作後,它會收到一個獎勵 ,讓智能體知道這個動作有多好。當然,我們希望得到與我們目標相符的最高的獎勵。貝爾曼方程用於說明未來的獎勵,它通常是一系列導致積極結果的動作。在Q學習函數(Q-Learning)中,我們使用這些獎勵來更新可以告訴我們某個狀態有好壞的Q值。在深度Q學習(Deep Q-Learning)中,我們使用可以近似Q值的深度神經網絡來代替Q值。當下次我們的智能體在環境中移動時,它將使用深度Q網絡(Deep Q-Network)爲每個動作生成Q值,並採用具有最高Q值的動作。
概念說太多也許你不明白,直觀理解就足夠了。強化學習與我們學習的方式進行比較是:
我們採取的行動會產生正面或反面的後果。如果它是正面的,我們會再次採取行動,反之亦然。就這麼簡單!
現在開始構建我們的虛擬自動駕駛汽車,讓我們來看看構建的過程。
1.建立環境
首先,我需要爲我的車創建虛擬環境。我最初想到創建一個Unity環境,但我的筆記本電腦在創建Unity遊戲時感覺已經快死了。再加上機器學習和錄製軟件,我認爲這麼麻煩不值得。
我使用了一個名爲Kivy的python包來創建UI。
我們從一張空地圖開始。“汽車”的目標是在地圖的左上角到右下角之間來回移動。
但是,我可以在地圖上繪製“沙地”。如果汽車碰到了沙地,就會被視爲出了車禍!
我們將使用強化學習(RL),特別是深度Q-Learning來製造我們的自動駕駛汽車。RL算法都有3個關鍵元素,狀態(State),動作(Action)和獎勵(Reward)。以下我的程序中定義這些元素的方式:
狀態
汽車所處的狀態包括5個變量:
- 傳感器紅色
- 傳感器黃色
- 傳感器藍色
- 方向
- 負方向
前三個來自汽車前部的3個傳感器。每個傳感器(紅色,黃色,藍色)都能探測到距離自身10像素半徑內的沙地的像素。從邏輯上講,也就是說,如果汽車左側有一堵沙牆,藍色傳感器會比黃色傳感器探測到的沙地更多。這使汽車可以確定沙地的位置,從而確定行進的方向。最後2個變量代表汽車的方向。以角度衡量,0度將指向上方。我們還添加了負方向方便優化和提升性能。
動作
有三種可能的行動:
- 順時針旋轉20度
- 逆時針轉動20度
- 不轉彎
獎勵
主要獎勵包括:
- -5:如果汽車駛入沙地
- -0.1:如果汽車離目的地越遠
- 0.1:如果汽車更接近目的地
這些只是主要的獎勵。我還根據汽車的性能定義了其他獎勵。例如,我後來意識到汽車離地圖的邊緣太近了,所以每當距離邊緣10個像素內時我就給它一個負獎勵。在實踐中,你可以自行定義獎勵,以獲得自己想要達到的效果。
2.選擇模型
我決定使用強化學習,特別是深度Q學習。這是我的神經網絡的架構:
- 輸入層:5個節點(每個狀態一個輸入節點)
- 隱藏層:30個節點
- 輸出層:3個節點(每個動作一個)
- 激活函數:ReLU
- 優化器:Adam
一個隱藏層通常足以解決這類簡單的問題。再進行訓練需要更長的時間,並且不會帶來顯著的性能提升。
3.訓練
訓練時,汽車開始行駛,並逐漸適應環境。我添加了按鈕來保存,並將以前的模型加載到當前的自動駕駛汽車中。以下是我們實際學習的代碼片段:
4.評估和參數調整
這是智能體每個時間步獲得獎勵的圖。在圖中,智能體每次接近目標時都獲得+1獎勵,遠離則獲得-1獎勵。這由+0.1和-0.1累積而來。訓練在1500個時間步後達到穩定水平。
上面是更早之前生成的圖。這是當智能體視離目標的遠近分別獲得+0.1和-0.1獎勵。如你所見,獎勵在2000步之後穩定了,而不是這次的1500步。這兩個圖平均需要10個不同的訓練週期。結果表明,+1和-1獎勵訓練速度比+0.1和-0.1獎勵更快。
對該模型進行了許多其他更改。比如:
- 天氣調整
- 額外的獎勵(例如,智能體不採取最佳路線。我們增加獎勵,鼓勵智能體降低與上一圈相比達到目標的步數。)
- 不同的神經網絡架構(例如,層數,節點數,優化器,激活函數)
5.預測!
現在,我們的優化模型。我們的汽車可以無碰撞地進行自動駕駛!
我在這裏開發了RL驅動的自動駕駛汽車的基礎架構。現實生活中的汽車將更難進行編碼,但我相信我們最終會成功。並且,我是在筆記本電腦上進行研發,其計算能力比特斯拉公司的小數百萬倍。
GitHub:https://github.com/Jerry2001Qu/Self-Driving-Car