機器學習之 AWS DeepRacer 初體驗 (1)
機器學習這門科學所關注的問題是:計算機程序如何隨著經驗積累自動提高性能。近年來,機器學習被成功地應用于很多領域,從檢測信用卡交易欺詐的數據挖掘程序,到獲取用戶閱讀興趣的信息過濾系統(tǒng),再到能在高速公路上自動行駛的汽車。
—— 美·Tom M. Mitchell 著《機器學習》 CIP 數據核字(2002)第 077094 號
先炫耀一下
看起來,機器學習應用于自動駕駛,至少也有 20 多年歷史了。但是直到上周五,我才有幸第一次零距離參與了一把。


上周五有幸參加了亞馬遜云科技的“機器學習及自動駕駛體驗日”活動,并且所在小組 Alpha Car 在比賽中竟以微弱優(yōu)勢拿了冠軍。


還領到一張很有逼格的獎狀:

感恩
職業(yè)程序員用自己的時間來練習。老板的職責不包括避免你的技術落伍,也不包括為你打造一份好看的履歷。醫(yī)生練習手術不需要病人付錢,球員練習繞樁(通常)不需要球迷付錢,樂手練習音階也不需要樂迷付錢。所以老板沒有義務為程序員的練習來買單。
—— 【美】Robert C. Martin 《代碼整潔之道:程序員的職業(yè)素養(yǎng)》
Bob 大叔在強調程序員的專業(yè)素養(yǎng)時指出,保持自己的學習跟上時代節(jié)奏,是自己的責任,而且應該在業(yè)余時間完成,而不應該占用雇主的時間,也不應該期待雇主支付相關的費用。
雖然如此,仍然有雇主會在工作日給員工提供培訓的機會,甚至花費大量金錢。對這樣的雇主,我心存感激!

AWS DeepRacer 簡介
官網:https://aws.amazon.com/cn/deepracer/?nc2=type_a
使用 AWS DeepRacer,可以在云上進行自動駕駛賽車訓練,隨后既可以參加線上虛擬賽車,也可以將訓練好的賽車模型導出為壓縮文件,上傳至真正的 AWS DeepRacer 賽車上,在真實跑道上進行比賽。
它號稱各種技能水平的開發(fā)人員都可以通過其基于云的 3D 賽車模擬器親身體驗機器學習,我實際體驗下來,發(fā)現 AWS 真的做到了!最大的感受是,DeepRacer 整個系統(tǒng)解耦做得相當漂亮,多數步驟都使用界面引導,唯一需要寫代碼的部分,就是獎勵函數,采用 Python 編碼,相當簡單,的確對于開發(fā)菜鳥,也能使用!
你可以參加免費的在線培訓:https://www.aws.training/Details/eLearning?id=32143,學完也可以拿一個很有逼格的結業(yè)證書,像這樣:

機器學習問題的標準描述
首先看一下機器學習的嚴格定義:對于某類任務 T 和性能度量 P,如果一個計算機程序在 T 上以 P 衡量的性能隨著經驗 E 而自我完善,那么我們成這個計算機程序在從經驗 E 中學習。
比如對于 AWS 的 DeepRacer 中的計時賽,就是這樣一個機器人駕駛學習問題:
?任務 T:通過視覺傳感器在賽車道上行駛
?性能標準 P:無差錯行駛指定圈數所花費的時間(時間越短越好,行駛過程中不能出軌道)
?訓練經驗 E:使用模型中配置好的駕駛指令在 AWS DeepRacer 提供的 3D 賽車賽道上進行駕駛
簡而言之,機器學習就是“通過經驗提高性能的某類程序”。
機器學習的一般套路
通過使用 AWS DeepRacer,你可以毫不費力地親身體驗到機器學習的一般套路,而且生動,令人難忘。
選擇訓練經驗
這是機器學習系統(tǒng)面臨的第一個設計問題,在 AWS DeepRacer 中,預設計了各種賽道,你只需要點擊選擇就好。

具體地說,AWS DeepRacer 采用的強化學習方法,賽道信息在其中被稱為環(huán)境,也就是軌道。軌道中定義了賽車可以走動的地方,以及被允許的狀態(tài)。賽車在軌道中探索并搜集數據,這些被搜集的數據就被用作底層神經網絡的訓練經驗。
選擇目標函數
這是機器學習系統(tǒng)面臨的第二個設計選擇,它需要決定要學習的知識的確切類型以及執(zhí)行程序怎樣使用這些知識。對于賽車問題,由于只要不出軌道,前進方向正確,都是被允許的駕駛方式,最終的程序只要并且必須學會從所有的駕駛方式中選擇最快速跑完指定圈數的駕駛策略。很明顯,要學習的信息類型就是一個程序或者函數,該函數以賽車在軌道中所處的狀態(tài)作為輸入,并且從所有被允許的駕駛策略中產生某個駕駛行為作為輸出。即 V: State -> Result。如前面所介紹的,這個函數被體現為獎勵函數,是唯一需要寫點代碼的部分。
這個函數寫起來雖然簡單,但卻是產生好的結果的關鍵所在。根據我的體驗,這個函數并不是越復雜越好,相信也沒有人能預先寫出最佳的獎勵函數,一定是各種摸索,最終找到一個最好的,而且在未來被更好的獎勵函數打敗也是很正常的。
具體來說,對于任意的賽車狀態(tài),獎勵函數的準確值應該是多少呢?最簡單的做法是不管什么狀態(tài),總是給予獎勵。這顯然不會產生好的結果;也許你會想到,應該獎勵行進在軌道中間,離中線不要太遠的駕駛行為。要寫出自己想要的獎勵函數,需要先了解一下 AWS DeepRacer 都提供了哪些賽車狀態(tài)參數、可以產生哪些具體的駕駛行為以及獎勵函數在 AWS DeepRacer 中的具體體現形式。
如前所述,在 AWS DeepRacer 中,獎勵函數是一段 Python 代碼,它可以讀取描述當前狀態(tài)的參數,并返回一個獎勵數值。參數描述了賽車狀態(tài)的不同方面,比如位置、在軌道中的朝向、速度、轉角等等。
所謂狀態(tài),就是賽車所在的環(huán)境在指定時刻的快照,即賽車的前置攝像頭所捕獲的圖片。AWS DeepRacer 系統(tǒng)可以為獎勵函數提供的參數一共有 13 種:

賽車在軌道上的位置
3.heading賽車在軌道上的朝向
4.waypoints航路點坐標列表
5.closest_waypoints賽道上離賽車最近的 2 個航路點6.progress
跑完的軌道部分百分比7.steps 完成的步數
8.track_width 軌道寬度
9.distance_from_center 偏離軌道中線的距離
10.is_left_of_center 賽車是否在中線左邊?11.all_wheels_on_track
賽車是否完全處于軌道界內?
?
12.speed 賽車車速
13.steering_angle 前輪方向盤轉角

如前所述,你可以根本就不使用這些參數,全部情況下都給予獎勵?;蛘呃萌康膮?,但是并不一定就有好的結果。我在實驗時,選擇了對靠中線,以及不出界的情況給予獎勵,獎勵函數代碼如下:

編輯完獎勵函數,就可以開始訓練了,訓練過程中可以查看過程詳情:

選擇目標函數的表示
前面一步的目標函數是形如 V:State -> Result 的形式,即從當前狀態(tài)可以映射稱一個結果(好或者壞)。這是一個理想的函數,實際上只能得到
,一個 V 的估計。學習的過程就是盡量較少估計值?
?和理想值 V 的誤差的過程。
這個具體的表示不用關心,只需要知道底層是一個 CNN 網絡就行,具體表示可以理解為一個加權平均函數。也就是說,AWS DeepRacer 使用了一個 CNN 網絡,然后通過類似加權平均這樣的計算,努力使得這個結果值,和獎勵函數的返回值接近。
權重就是學習過程所要調整的數值,而參數除了上面介紹的 13 個狀態(tài)參數外(模型之內),還有超參數(模型之外)。超參數是人工調整的,而模型參數則是學習過程自動調整的。所以機器學習,實際上是人機共同學習。機器學習負責模型參數的調整,有各種算法,但是歸根結底是一種試錯改進法。同樣,需要人工調整的超參數,也是人通過試錯調整的方式,慢慢改進得到的較好的值。
選擇函數逼近算法
這個算法的根本目的在于逐步減小目標函數估計值和理想值的誤差,關鍵在于更新權值的策略。大致做法是從任意指定的初始權值開始,使用目標函數的具體表示計算出
,然后計算 V 和 的誤差。注意這個 V 是獎勵函數的返回值,因此實際獎勵和實際模型擬合出的結果的誤差就能指導學習過程去調整權重。

AWS DeepRacer 支持兩種算法,默認選項是 Huber 算法,你也可以改成均方差算法。他們的區(qū)別是均方差算法帶來的權值改動會使得誤差波動更大,因此收斂性會遜于 Huber。

最終設計
任何機器學習系統(tǒng),最終會包含如下幾個核心模塊:

AWS DeepRacer 采用了機器學習中的強化學習方法,這是區(qū)別于有監(jiān)督學習和無監(jiān)督學習之外的,第三種機器學習類型,其設計如下:

其中環(huán)境對應實驗生成器,獎勵環(huán)節(jié)對應鑒定器,代理人對應執(zhí)行系統(tǒng)。代理人在指定環(huán)境中探索通過執(zhí)行能夠帶來獎勵的動作并且避免帶來懲罰的動作來學習需要完成的任務。
總結
機器學習分成三種類型:有監(jiān)督學習、無監(jiān)督學習以及強化學習。AWS DeepRacer 是一個設計得非常棒的系統(tǒng),將非常復雜的機器學習課程,呈現得無比簡單。它構建在已有的 AWS 資源上,比如環(huán)境、模型等靜態(tài)數據存儲在 S3 上,而訓練過程中的動態(tài)數據存儲在 Redis 中,并不斷更新。各個組件解耦做得相當漂亮,用戶只需要在獎勵函數這部分寫一點點代碼,其他都通過友好的界面引導完成,這真的是名副其實的機器學習低代碼平臺!盡管 AWS DeepRacer 采用的強化學習,但是可以完整地體驗到機器學習中的一般套路。
彩蛋
(只要是)我不能創(chuàng)造的,我就(還)沒有理解。
—— 物理學家費曼
AWS DeepRacer 非常棒,但是要使用它,由于會使用到存儲和計算,因此會產生費用。作為程序員,如果想要自己實現它,工程量又實在太大太大了。但是,憑一己之力,實現一個機器學習版的井字棋游戲,還是完全可能的。而且雖然不一定采用強化學習,但只要是機器學習,套路都是一樣的。你可以先去 https://tictactoe.js.org 體驗一下,然后按照本文介紹的套路自己擼一個。如果碰到困難可以參考它的源碼:https://github.com/Jeff-Tian/tic-tac-toe-ai,以及圖文逐步指導:
