翻譯來源:
https://www.youtube.com/watch?v=hBedCdzCoWM
今天要講的是自動(dòng)駕駛車是怎樣工作的褪那,然后在一個(gè)模擬的環(huán)境中應(yīng)用我們自己的自動(dòng)駕駛車杰刽。
自動(dòng)駕駛車再也不是只能在科幻小說里面才能看到的東西了岖常,很多大的公司比如說谷歌,優(yōu)步伦糯,豐田和福特都在研發(fā)甚至上路了颇象。
在不久的將來安疗,我們將會(huì)看到有越來越多的消費(fèi)者可以購買自動(dòng)駕駛車。
自動(dòng)駕駛車是怎樣工作的呢暗赶?
當(dāng)我們?nèi)祟愖谲嚿系臅r(shí)候鄙币,我們需要觀察周圍的環(huán)境,同時(shí)操作我們的車蹂随,作出決定該向哪個(gè)方向轉(zhuǎn)動(dòng)方向盤十嘿。
這個(gè)可以被建模成一個(gè)機(jī)器學(xué)習(xí)問題,SLAM岳锁,simutaneous localization and mapping绩衷,這就是自動(dòng)駕駛車要做的事情。
無人駕駛車激率,會(huì)裝備GPS咳燕,一個(gè)慣性導(dǎo)航系統(tǒng),一些傳感器乒躺。然后用GPS傳過來的地理數(shù)據(jù)來定位自己招盲,用傳感器傳過來的數(shù)據(jù)來構(gòu)造它所在環(huán)境的內(nèi)部地圖,
在自己構(gòu)建的這個(gè)內(nèi)部地圖中找到自己的位置之后嘉冒,就會(huì)尋找一個(gè)從此位置到目標(biāo)地點(diǎn)的優(yōu)化路徑曹货,并且避免任何一個(gè)障礙物咆繁。
當(dāng)它已經(jīng)確定了這個(gè)最優(yōu)路徑之后,就會(huì)把它分解成一系列的電機(jī)命令控乾,這些命令會(huì)被送到汽車的致動(dòng)器么介。
但是在實(shí)際的開車的過程中有很多問題,不僅僅是躲避障礙物蜕衡,還有不同的天氣條件下如何控制速度壤短,不同類型的道路,比如說彎路慨仿,還有遇到不同的道路標(biāo)志時(shí)采取什么樣的行動(dòng)久脯。
最近有一篇論文叫 Long term Planning for Short Term
文中介紹了一個(gè)規(guī)劃的算法。這個(gè)算法可以使無人駕駛車在優(yōu)化一個(gè)長期的目標(biāo)時(shí)镰吆,做出一個(gè)即時(shí)的反應(yīng)
一個(gè)應(yīng)用場景實(shí)例就是在環(huán)島時(shí)帘撰,當(dāng)一個(gè)汽車想要進(jìn)入這個(gè)環(huán)島時(shí),它需要做出一個(gè)是加速還是減速的決定万皿,這個(gè)決定的長期效果就是是否成功進(jìn)入環(huán)島摧找。
通常來講,一個(gè)無人駕駛車的規(guī)劃問題牢硅,是一個(gè)強(qiáng)化學(xué)習(xí)問題蹬耘。一個(gè)汽車是通過很多次的嘗試和犯錯(cuò),不斷的糾正錯(cuò)誤减余,來強(qiáng)化它的駕駛能力的综苔。
一個(gè)汽車觀察到周圍環(huán)境的一個(gè)狀態(tài) s,經(jīng)過判斷某個(gè)行為是好還是壞后采取行動(dòng) a位岔,然后它會(huì)收到一個(gè)反饋如筛,如果這個(gè)行為是對(duì)的就會(huì)獎(jiǎng)勵(lì)它,然后重復(fù)上面這個(gè)過程抒抬。
這個(gè)過程是想要最大化這個(gè)獎(jiǎng)勵(lì)杨刨,它依賴于將狀態(tài)映射到行動(dòng)的規(guī)則,這個(gè)函數(shù)被稱作 Q擦剑,用這個(gè)函數(shù)來找到最優(yōu)的規(guī)則拭嫁。
但是在實(shí)際的道路上,狀況是非常復(fù)雜的抓于,有很多車做粤,而且這個(gè)狀態(tài)是動(dòng)態(tài)的,這就不僅需要要預(yù)測自己的車的行為捉撮,還要能夠預(yù)測其他車輛的行為怕品。
為了能夠?qū)W習(xí)出這個(gè)函數(shù),論文的作者們構(gòu)建了一個(gè)深度神經(jīng)網(wǎng)絡(luò)巾遭。
向這個(gè)神經(jīng)網(wǎng)絡(luò)中投入的數(shù)據(jù)包括肉康,可預(yù)測的部分-車的速度和不可預(yù)測的部分-其他車的速度闯估,這樣就同時(shí)學(xué)習(xí)這兩個(gè)部分。
模型里只有兩個(gè)特征吼和,一個(gè)是 Adaptive Cruise Control涨薪,一個(gè)是 Merging Roundabouts。
有一個(gè)術(shù)語叫 End to End Learning for Self-Driving Cars炫乓,三個(gè)月前Nvidia的一個(gè)團(tuán)隊(duì)發(fā)了一篇新的論文刚夺。他們在擋風(fēng)玻璃上裝了三個(gè)攝像頭來獲取數(shù)據(jù),把這些數(shù)據(jù)投入到一個(gè)卷積神經(jīng)網(wǎng)絡(luò)中末捣,然后自動(dòng)學(xué)習(xí)特征侠姑。
用這個(gè)模型,并不需要把不同的場景明確的分解成不同的子問題箩做。模型里的卷積神經(jīng)網(wǎng)絡(luò)莽红,將把從輸入數(shù)據(jù)看到的東西直接映射成轉(zhuǎn)向命令。
它會(huì)先在一個(gè)提前錄制的虛擬模擬環(huán)境中訓(xùn)練邦邦,然后再由一個(gè)司機(jī)去駕駛它安吁。他們得到一個(gè)非常好的結(jié)果,但是這個(gè)作者覺得很難區(qū)分這個(gè)神經(jīng)網(wǎng)絡(luò)的特征提取部分和控制部分燃辖,也就很難去檢驗(yàn)它們鬼店。
一個(gè)叫 George Hotz 在他的車庫里構(gòu)建了自己的無人駕駛車,只用了一對(duì)手機(jī)相機(jī)郭赐,成本只有1000美元。
接下來讓我們訓(xùn)練一下自己的無人駕駛車
讓它通過 Q Learning 來自動(dòng)駕駛而不會(huì)碰到其它的障礙物确沸。
篇幅有限捌锭,只貼上主要代碼一部分,邏輯請看代碼注釋的漢語部分罗捎,完整repo請看文末資源列表观谦。
from flat_game import carmunk
import numpy as np
import random
import csv
from nn import neural_net, LossHistory
import os.path
import timeit
NUM_INPUT = 3
GAMMA = 0.9 # Forgetting.
TUNING = False # If False, just use arbitrary, pre-selected params.
# 訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò),有一些hyper parameters
def train_net(model, params):
filename = params_to_filename(params)
# 定義變量:觀察數(shù)據(jù)
observe = 1000 # Number of frames to observe before training.
epsilon = 1
train_frames = 1000000 # Number of frames to play.
batchSize = params['batchSize']
buffer = params['buffer']
# 定義變量:位置
# Just stuff used below.
max_car_distance = 0
car_distance = 0
t = 0
data_collect = []
replay = [] # stores tuples of (S, A, R, S').
loss_log = []
# 創(chuàng)建一個(gè)新的游戲?qū)嵗? # Create a new game instance.
game_state = carmunk.GameState()
# 得到這個(gè)實(shí)例的第一個(gè)狀態(tài)
# Get initial state by doing nothing and getting the state.
_, state = game_state.frame_step((2))
# 用一個(gè)timer來追蹤
# Let's time it.
start_time = timeit.default_timer()
# 當(dāng)我們開始建立experience replay時(shí)
# Run the frames.
while t < train_frames:
t += 1
car_distance += 1
# 我們會(huì)更新位置變量桨菜,然后依據(jù)狀態(tài)隨機(jī)選擇行為
# Choose an action.
if random.random() < epsilon or t < observe:
action = np.random.randint(0, 3) # random
else:
# 如果這個(gè)隨機(jī)變量在我們的限制條件之外豁状,我們會(huì)得到每個(gè)行為的Q值,
# 來幫我們找到最優(yōu)的決策
# Get Q values for each action.
qval = model.predict(state, batch_size=1)
action = (np.argmax(qval)) # best
# 如果它是有效的倒得,我們會(huì)得到一個(gè)reward
# Take action, observe new state and get our treat.
reward, new_state = game_state.frame_step(action)
# Experience replay storage.
replay.append((state, action, reward, new_state))
# 當(dāng)它結(jié)束觀察游戲和建立經(jīng)驗(yàn)回放時(shí)泻红,會(huì)開始訓(xùn)練采樣記憶experience replaying,得到訓(xùn)練值
# If we're done observing, start training.
if t > observe:
# If we've stored enough in our buffer, pop the oldest.
if len(replay) > buffer:
replay.pop(0)
# Randomly sample our experience replay memory
minibatch = random.sample(replay, batchSize)
# Get training values.
X_train, y_train = process_minibatch(minibatch, model)
# 然后訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型
# Train the model on this batch.
history = LossHistory()
model.fit(
X_train, y_train, batch_size=batchSize,
nb_epoch=1, verbose=0, callbacks=[history]
)
loss_log.append(history.losses)
# 然后更新狀態(tài)
# Update the starting state with S'.
state = new_state
# Decrement epsilon over time.
if epsilon > 0.1 and t > observe:
epsilon -= (1/train_frames)
# 當(dāng)car dies霞掺,
# We died, so update stuff.
if reward == -500:
# Log the car's distance at this T.
data_collect.append([t, car_distance])
# Update max.
if car_distance > max_car_distance:
max_car_distance = car_distance
# Time it.
tot_time = timeit.default_timer() - start_time
fps = car_distance / tot_time
# Output some stuff so we can watch.
print("Max: %d at %d\tepsilon %f\t(%d)\t%f fps" %
(max_car_distance, t, epsilon, car_distance, fps))
# 記錄距離谊路,重啟
# Reset.
car_distance = 0
start_time = timeit.default_timer()
# 每25000 frames保存一下模型和weights
# Save the model every 25,000 frames.
if t % 25000 == 0:
model.save_weights('saved-models/' + filename + '-' +
str(t) + '.h5',
overwrite=True)
print("Saving model %s - %d" % (filename, t))
# Log results after we're done all frames.
log_results(filename, data_collect, loss_log)
下面是訓(xùn)練的結(jié)果,然后看一下在模擬環(huán)境中是如何work的菩彬,可以看到它可以通過強(qiáng)化學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)缠劝,不斷地躲避障礙物:
來潮梯,把你的小汽車放回宇宙吧
The code in the video is here:
https://github.com/llSourcell/Self-Dr...
More on Reinforcement Learning:
https://www.quora.com/Artificial-Inte...
http://www2.econ.iastate.edu/tesfatsi...