強化學習開源項目:自己動手創建虛擬自動駕駛汽車

編譯: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章