前言
前段時間無意發現了 AWS 在澳門舉辦 AWS DeepRacer 的 AI 賽車挑戰賽,雖然我對這方面完全沒有經驗,但報名條件沒有什麼額外限制,而且還能免費聽一下線上講解,於是就報名了。
總括而言
訓練 AI 來進行賽車的過程就好比訓練狗隻上廁所一般,需要針對它做得好的行為給予獎勵,對於不好的行為給予懲罰或無視,如此這般反覆進行,直到它的行為乎合設定者的預期。
剛開始訓練時大概是這個樣子,車子會盲目行駛甚至駛出界外。
小試牛刀
聽了線上講座對 AI 賽車有了初步的了解後,便嘗試註冊 AWS 帳號,開始摸索如何使用 AWS 的雲計算服務,一步一步的研究。
選擇比賽的路徑(按大會要求)
選擇比賽的類型(這裡也是按大會要求,選擇計時賽類型)和所使用的訓練演算法
選擇速度和角度
然後到了最後而且是最重要的部分,自訂你的 reward function,這個就是我一開始所說的,透過 reward function 來讓你的 AI 模型慢慢的走向你預期的行為。
當然,AWS 明白大家新手們很難從零開始寫出一個 reward function,所以給了我們 3 個範例。
沿著中線走(默認)
留在兩邊內(不出界)
防 Z 字形(不亂漂)
雖然以上的範例可以直接拿來使用,但用來作計時賽就略遜一籌,於是我便稍微的修改一下,以下是我的 reward function:
def reward_function(params):
# 取得當前車輛狀態
track_width = params['track_width']
distance_from_center = params['distance_from_center']
speed = params['speed']
steering_angle = params['steering_angle']
steps = params['steps']
progress = params['progress']
all_wheels_on_track = params['all_wheels_on_track']
waypoints = params['waypoints']
closest_waypoints = params['closest_waypoints']
# 設定獎勵和懲罰的權重
center_weight = 1.5
speed_weight = 1.0
progress_weight = 2.0
steering_weight = 0.3
# 初始化獎勵值
reward = 1e-3
# 檢查車輛是否在賽道上
if not all_wheels_on_track:
return float(reward)
# 獎勵車輛保持在賽道中心
reward += (1 - (center_weight * distance_from_center / (0.5 * track_width)))
# 獎勵車輛保持高速行駛
reward += (speed_weight * speed / 10)
# 獎勵車輛的進展程度
reward += (progress_weight * progress / 100)
# 盡量減少步數
reward += (1 - (steps / 1000))
return float(reward)
後續
雖然一開始我只需簡單訓練 2、3 小時就拿了一個不錯的成績,但後來發現了一個新問題,就是 DeepRacer 免費訓練的時間只有 10 小時!
以下是 AWS 的定價:
很快的,我的成績被其他人逐漸超越,而我又不敢貿然去花錢訓練。
在我即將放棄的時候,我發現了 deepracer-for-cloud,一個可以搭建在本地上訓練自己 DeepRacer 模型的專案,然後我又踏上另一段旅程。
等待後續…