歡迎來到機器學習工程師納米學位的第四個項目!在這個notebook文件中,模板代碼已經提供給你,有助於你對智能出租車的分析和實現學習算法。你無須改動已包含的代碼,除非另有要求。 你須要回答notebook文件中給出的與項目或可視化相關的問題。每個你要回答的問題前都會冠以'問題 X'。仔細閱讀每一個問題,並在後面'回答'文本框內給出完整的回答。你提交的項目會根據你對於每一個問題的回答以及提交的agent.py
的實現來進行評分。javascript
提示: Code 和 Markdown 單元格可經過 Shift + Enter 快捷鍵來執行。此外,Markdown能夠經過雙擊進入編輯模式。css
在這個項目中,你將構建一個優化的Q-Learning駕駛代理程序,它會操縱智能出租車 經過它的周邊環境到達目的地。由於人們指望智能出租車要將乘客從一個地方載到另外一個地方,駕駛代理程序會以兩個很是重要的指標來評價:安全性和可靠性。駕駛代理程序在紅燈亮時仍然讓智能出租車行駛往目的地或者勉強避開事故會被認爲是不安全的。相似的,駕駛代理程序頻繁地不能適時地到達目的地會被認爲不可靠。最大化駕駛代理程序的安全性和可靠性保證了智能出租車會在交通行業得到長期的地位。html
安全性和可靠性用字母等級來評估,以下:html5
等級 | 安全性 | 可靠性 |
---|---|---|
A+ | 代理程序沒有任何妨害交通的行爲, 而且老是能選擇正確的行動。 |
代理程序在合理時間內到達目的地的次數 佔行駛次數的100%。 |
A | 代理程序有不多的輕微妨害交通的行爲, 如綠燈時未能移動。 |
代理程序在合理時間內到達目的地的次數 佔行駛次數的90%。 |
B | 代理程序頻繁地有輕微妨害交通行爲, 如綠燈時未能移動。 |
代理程序在合理時間內到達目的地的次數 佔行駛次數的80%。 |
C | 代理程序有至少一次重大的妨害交通行爲, 如闖紅燈。 |
代理程序在合理時間內到達目的地的次數 佔行駛次數的70%。 |
D | 代理程序形成了至少一次輕微事故, 如綠燈時在對面有車輛狀況下左轉。 |
代理程序在合理時間內到達目的地的次數 佔行駛次數的60%。 |
F | 代理程序形成了至少一次重大事故, 若有交叉車流時闖紅燈。 |
代理程序在合理時間內到達目的地的次數 未能達到行駛次數的60%。 |
爲了協助評估這些重要的指標,你會須要加載可視化模塊的代碼,會在以後的項目中用到。運行下面的代碼格來導入這個代碼,你的分析中會須要它。java
# 檢查你的Python版本
from sys import version_info
if version_info.major != 2 and version_info.minor != 7:
raise Exception('請使用Python 2.7來完成此項目')
# Import the visualization code
import visuals as vs
# Pretty display for notebooks
%matplotlib inline
在開始實現你的駕駛代理程序前,首先須要瞭解智能出租車和駕駛代理程序運行的這個世界(環境)。構建自我學習的代理程序重要的組成部分之一就是了解代理程序的特徵,包括代理程序如何運做。原樣直接運行agent.py
代理程序的代碼,不須要作任何額外的修改。讓結果模擬運行一段時間,以觀察各個不一樣的工做模塊。注意在可視化模擬程序(若是啓用了),白色車輛就是智能出租車。python
用幾句話,描述在運行默認的agent.py
代理程序中,你在模擬程序裏觀察到了什麼。一些你能夠考慮的狀況:jquery
提示: 從頂層的/smartcab/
目錄(這個notebook所在的地方),運行命令linux
'python smartcab/agent.py'
回答:android
1.從啓動的pygame window中能夠看出白色車輛沒有移動css3
2.獎勵一會正一會負,Agent properly idled at a red light時,獎勵爲正,Agent idled at a green light with no oncoming traffic時,獎勵爲負。
3.因爲車未動,當交通燈爲紅時,符合交通規則,爲正獎勵,交通燈變爲綠時,而且迎面沒有車駛來,此時中止不動,不符合交通規則,爲負獎勵
除了要了解世界以外,還須要理解掌管世界、模擬程序等等如何運做的代碼自己。若是一點也不去探索一下「隱藏」的器件,就試着去建立一個駕駛代理程序會很難。在頂層的/smartcab/
的目錄下,有兩個文件夾:/logs/
(以後會用到)和/smartcab/
。打開/smartcab/
文件夾,探索每一個下面的Python文件,而後回答下面的問題。
agent.py
Python文件裏,選擇 3 個能夠設定的 flag,並描述他們如何改變模擬程序的。environment.py
Python文件裏,當代理程序執行一個行動時,調用哪一個Environment類的函數?simulator.py
Python 文件裏,'render_text()'
函數和'render()'
函數之間的區別是什麼?planner.py
Python文件裏,'next_waypoint()
函數會先考慮南北方向仍是東西方向?回答:
agent.py
1.learning
設置爲True
,強制驅動代理使用Q-learning。
2.enforce_deadline
設置爲True
,以執行最後期限度量。
3.num_dummies
環境中其餘車子數
environment.py
1.act函數
simulator.py
1.render_text()
使agent運行時在終端中顯示日誌信息 2.render()
則是將agent的狀態顯示與pygame窗口
planner.py
1.東西
建立一個優化Q-Learning的駕駛代理程序的第一步,是讓代理程序確實地執行有效的行動。在這個狀況下,一個有效的行動是None
(不作任何行動)、'Left'
(左轉)、'Right'
(右轉)或者'Forward'
(前進)。做爲你的第一個實現,到'choose_action()'
代理程序函數,使駕駛代理程序隨機選擇其中的一個動做。注意你會訪問到幾個類的成員變量,它們有助於你編寫這個功能,好比'self.learning'
和'self.valid_actions'
。實現後,運行幾回代理程序文件和模擬程序來確認你的駕駛代理程序每步都執行隨機的動做。
要從最初的模擬程序得到結果,你須要調整下面的標誌:
'enforce_deadline'
- 將此標誌設定爲True
來強制駕駛代理程序捕獲它是否在合理時間內到達目的地。'update_delay'
- 將此標誌設定爲較小數值(好比0.01
)來減小每次試驗中每步之間的時間。'log_metrics'
- 將此標誌設定爲True
將模擬結果記錄爲在/logs/
目錄下的.csv
文件。'n_test'
- 將此標誌設定爲'10'
則執行10次測試試驗。可選的,你還能夠經過將'display'
標誌設定爲False
來禁用可視化模擬(可使得試驗跑得更快)。調試時,設定的標誌會返回到他們的默認設定。重要的是要理解每一個標誌以及它們如何影響到模擬。
你成功完成了最初的模擬後(有20個訓練試驗和10個測試試驗),運行下面的代碼單元格來使結果可視化。注意運行一樣的模擬時,日誌文件會被覆寫,因此留意被載入的日誌文件!在 projects/smartcab 下運行 agent.py 文件。
# Load the 'sim_no-learning' log file from the initial simulation results
vs.plot_trials('sim_no-learning.csv')
利用上面的從你初始模擬中獲得的可視化結果,給出關於駕駛代理程序的分析和若干觀察。確保對於可視化結果上的每一個面板你至少給出一條觀察結果。你能夠考慮的一些狀況:
答案:
major violation在0.2左右,minor violation在0.1左右,其餘兩個各0.05左右,Total Bad Actions = Major Voilation + Minor Voilation + Major Accident + Minor Accident=0.4
合理,隨機駕駛安全性和到達目的地機率低
得到了負獎勵,爲-5左右,代表它受到了懲罰
隨着實驗數增長,輸出結果沒有大變化
不安全,由於事故率高,不可靠,由於沒有到達目的地
建立一個優化Q-Learning的駕駛代理程序的第二步,是定義一系列代理程序會在環境中發生的狀態。根據輸入、感知數據和駕駛代理程序可用的變量,能夠爲代理程序定義一系列狀態,使它最終能夠學習在一個狀態下它須要執行哪一個動做。對於每一個狀態的'若是這個處於這個狀態就那個行動'
的情況稱爲策略,就是最終駕駛代理程序要學習的。沒有定義狀態,駕駛代理程序就不會明白哪一個動做是最優的——或者甚至不會明白它要關注哪一個環境變量和條件!
查看'build_state()'
代理程序函數,它顯示駕駛代理函數能夠從環境中得到下列數據:
'waypoint'
,智能出租車去向目的地應該行駛的方向,它是智能出租車車頭方向的相對值。'inputs'
,智能出租車的感知器數據。它包括
'light'
,交通燈顏色。'left'
,智能出租車左側車輛的目的方向。若是沒有車輛,則返回None
。'right'
,智能出租車右側車輛的目的方向。若是沒有車輛,則返回None
。'oncoming'
,智能出租車交叉方向車輛的目的方向。若是沒有車輛,則返回None
。'deadline'
,智能出租車在時間以內到達目的地還所需的剩餘動做數目。代理程序的哪些可用特徵與學習安全性和效率相關性最高?你爲何認爲這些特徵適合在環境中對智能出租車建模?若是你沒有選擇某些特徵,放棄他們的緣由是什麼?
回答:
1.安全性考慮:inputs-智能出租車的感知器數據,包括交通燈顏色和附近是否有車輛行駛,若不考慮,則會發生事故。
2.可靠性考慮:waypoint-行駛方向,若不考慮,智能出租車不能到達目的地。
3.放棄deadline,首先這個時效性地信息是沒有意義的,由於在每次訓練過程當中,起點、終點在隨機變更,因此用它訓練出來的Q表在不一樣的環境下不具有泛化性,使用它反而會模糊小車的行動。(deadline在每次訓練時候,值的分佈都不一樣,那麼必定程度上會干擾訓練成果)。其次,它的值是5倍的小車與終點的曼哈頓距離,大概會將狀態空間增長14倍(由於默認的地圖尺寸是 6*8,1~6+8,共有14個取值),大幅增長狀態空間的大小,致使小車很難訓練。最後,這個deadline
還有某種 「急於求成」 的意思,即使有意義,也會過度追求時間效率——而這一特徵和安全性在某種程度上存在對立關係,也會引入必定的問題。
經過運行代碼對比發現加入deadline隨着試驗次數的增長會增長事故率。以下圖加入deadline後可視化結果。
# Load the 'sim_no-learning-deadline' log file from the initial simulation results
vs.plot_trials('sim_no-learning-deadline.csv')
當定義一系列代理程序會處於的狀態,必需考慮狀態空間的大小。就是說,若是你指望駕駛代理程序針對每一個狀態都學習一個策略,你會須要對於每個代理狀態都有一個最優的動做。若是全部可能狀態的數量很是大,最後會變成這樣的情況,駕駛代理程序對於某些狀態學不到如何行動,會致使未學習過的決策。例如,考慮用下面的特徵定義智能出租車的狀態的狀況:
('is_raining', 'is_foggy', 'is_red_light', 'turn_left', 'no_traffic', 'previous_turn_left', 'time_of_day')
. 發生如(False, True, True, True, False, False, '3AM')
的狀態的頻次如何?沒有近乎無限數量的訓練,很懷疑代理程序會學到一個合適的動做!
若是用你在問題4中選擇的特徵來定義一個狀態,狀態空間的大小是多少?假定你瞭解環境以及它是如何模擬的,你以爲通過合理數量的訓練以後,代理駕駛能學到一個較好的策略嗎?(碰見絕大部分狀態都能做出正確決策。) 提示: 考慮特徵組合來計算狀態的總數!
回答:
waypoint的狀態:farword、left、right(3個),waypoint的狀態來判斷到達目的地的方向,若爲None,則說明已經到達目的地。因此只有三個狀態
inputs:
light的狀態:red、green(2個)
left的狀態:None、forward、left、right(4個)
right的狀態:None、forward、left、right(4個)
oncoming的狀態:None、forward、left、right(4個)
狀態空間大小:3×2×4×4×4 = 384
因爲狀態空間不是很大,agent能在合理數量訓練後學得策略
刻意的選擇列表中第一個最大的,就會致使agent缺乏探索精神。相同最大值action隨機更能訓練出好的模型。由於應當的狀況更多了
要完成你的第二個實現,去到'build_state()'
代理程序函數。根據你在問題4給出的判斷,你如今要將'state'
變量設定爲包含全部Q-Learning所需特徵的元組。確認你的駕駛代理程序經過運行代理程序文件和模擬會更新它的狀態,注意狀態是否顯示了。若是用了可視化模擬,確認更新的狀態和在模擬程序裏看到的一致。
注意: 觀察時記住重置模擬程序的標誌到默認設定!
建立一個優化Q-Learning的駕駛代理程序的第三步,是開始實現Q-Learning自身的功能。Q-Learning的概念至關直接:每一個訪問的狀態,爲全部可用的狀態-行動配對在Q-table裏建立一條記錄。而後,當代理程序遇到一個狀態並執行了一個動做,基於得到的獎勵和設定的相互的更新規則,來更新關聯的狀態-動做配對的Q-value。固然,Q-Learning還帶來其餘的收益,如此咱們可讓代理程序根據每一個可能的狀態-動做配對的Q-values,來爲每一個狀態選擇最佳動做。在這個項目裏,你會實現一個衰減 $\epsilon$ -貪心 的Q-learning算法,不含折扣因子。聽從每一個代理程序函數的TODO下的實現指導。
注意代理程序的屬性self.Q
是一個字典:這就是Q-table的構成。每一個狀態是self.Q
字典的鍵,每一個值是另外一個字典,包含了action和Q-value。這裏是個樣例:
{ 'state-1': { 'action-1' : Qvalue-1, 'action-2' : Qvalue-2, ... }, 'state-2': { 'action-1' : Qvalue-1, ... }, ... }
此外,注意你要求利用一個衰減$\epsilon$(探索)因子。所以,隨着試驗的增長,$\epsilon$會向0減少。這是由於,代理程序會從它的行爲中學習,而後根據習得的行爲行動。並且當$\epsilon$達到特定閾值後(默認閾值爲0.01),代理程序被以它所學到的東西來做檢測。做爲初始的Q-Learning實現,你將實現一個線性衰減$\epsilon$的函數。
要從最初的Q-learning程序得到結果,你須要調整下面的標誌和設置:
'enforce_deadline'
- 將此標誌設定爲True
來強制駕駛代理程序捕獲它是否在合理時間內到達目的地。'update_delay'
- 將此標誌設定爲較小數值(好比0.01
)來減小每次試驗中每步之間的時間。'log_metrics'
- 將此標誌設定爲True
將模擬結果記錄爲在/logs/
目錄下的.csv
文件,Q-table存爲.txt
文件。'n_test'
- 將此標誌設定爲'10'
則執行10次測試試驗。'learning'
- 將此標誌設定爲'True'
來告訴駕駛代理使用你的Q-Learning實現。此外,使用下面的$\epsilon$衰減函數:
$$ \epsilon_{t+1} = \epsilon_{t} - 0.05, \hspace{10px}\textrm{for trial number } t$$
若是你在實施時遇到困難,嘗試把'verbose'
標誌設爲True
來調試。調試時,在這裏設定的標誌會返回到它們的默認設定。重要的是你要理解每一個標誌作什麼而且解釋它們怎麼影響模擬!
當你成功完成初始的Q-Learning模擬程序後,運行下面代碼單元格來使結果可視化。注意當相同的模擬運行時,log文件會被覆寫,因此要留意載入的log文件!
# Load the 'sim_default-learning' file from the default Q-Learning simulation
vs.plot_trials('sim_default-learning.csv')
利用上面的從你默認的Q-Learning模擬中獲得的可視化結果,像在問題3那樣,給出關於駕駛代理程序的分析和若干觀察。注意模擬程序應該也產生了Q-table存在一個文本文件中,能夠幫到你觀察代理程序的算法。你能夠考慮的一些狀況:
回答:
類似之處,隨機探索action
20次,由於衰減函數1 - 0.05t,每次epsilon衰減0.05,20次訓練正好就能夠從1降低到0
是,圖中探索率(Exploration factor)隨實驗次數(Trial Number)的增長,直線降低
隨着試驗次數增長,Total Bad actions呈現降低趨勢,Reward per Action是增長的。
很低
建立一個優化Q-Learning的駕駛代理程序的第三步,是執行優化!如今Q-Learning算法已經實現而且駕駛代理程序已經成功學習了,須要調整設定、調節參數讓駕駛代理程序學習安全性和效率。一般這一步須要不少試驗和錯誤,由於某些設定一定會形成更糟糕的學習。要記住的一件事是學習的行爲自己和須要的時間:理論上,咱們能夠容許代理程序用很是很是長的時間來學習;然而,Q-Learning另外一個目的是將沒有習得行爲的試驗試驗變爲有習得行爲的行動。例如,訓練中總讓代理程序執行隨機動做(若是$\epsilon = 1$而且永不衰減)固然可使它學習,可是不會讓它行動。當改進你的Q-Learning實現時,要考慮作一個特定的調整的意義,以及它是否邏輯上是否合理。
要從最初的Q-learning程序得到結果,你須要調整下面的標誌和設置:
'enforce_deadline'
- 將此標誌設定爲True
來強制駕駛代理程序捕獲它是否在合理時間內到達目的地。'update_delay'
- 將此標誌設定爲較小數值(好比0.01
)來減小每次試驗中每步之間的時間。'log_metrics'
- 將此標誌設定爲True
將模擬結果記錄爲在/logs/
目錄下的.csv
文件,Q-table存爲.txt
文件。'learning'
- 將此標誌設定爲'True'
來告訴駕駛代理使用你的Q-Learning實現。'optimized'
- 將此標誌設定爲'True'
來告訴駕駛代理你在執行一個優化版本的Q-Learning實現。優化Q-Learning代理程序能夠調整的額外的標誌:
'n_test'
- 將此標誌設定爲某個正數(以前是10)來執行那麼屢次測試試驗。'alpha'
- 將此標誌設定爲0 - 1之間的實數來調整Q-Learning算法的學習率。'epsilon'
- 將此標誌設定爲0 - 1之間的實數來調整Q-Learning算法的起始探索因子。'tolerance'
- 將此標誌設定爲某個較小的大於0的值(默認是0.05)來設定測試的epsilon閾值。此外,使用一個你選擇的$\epsilon$ (探索因子)衰減函數。注意不管你用哪一個函數,必定要以合理的速率衰減到'tolerance'
。Q-Learning代理程序到此才能夠開始測試。某個衰減函數的例子($t$是試驗的數目):
$$ \epsilon = a^t, \textrm{for } 0 < a < 1 \hspace{50px}\epsilon = \frac{1}{t^2}\hspace{50px}\epsilon = e^{-at}, \textrm{for } 0 < a < 1 \hspace{50px} \epsilon = \cos(at), \textrm{for } 0 < a < 1$$
若是你想的話,你也可使用$\alpha$ (學習率) 的衰減函數,固然這一般比較少見。若是你這麼作了,確保它知足不等式$0 \leq \alpha \leq 1$。 若是你在實施時遇到困難,嘗試把'verbose'
標誌設爲True
來調試。調試時,在這裏設定的標誌會返回到它們的默認設定。重要的是你要理解每一個標誌作什麼而且解釋它們怎麼影響模擬!
當你成功完成初始的Q-Learning模擬程序後,運行下面代碼單元格來使結果可視化,請注意爲了達到項目要求你須要在安全性和可靠性上得到至少都爲A的評分。注意當相同的模擬運行時,log文件會被覆寫,因此要留意載入的log文件!
# Load the 'sim_improved-learning' file from the improved Q-Learning simulation
vs.plot_trials('sim_improved-learning.csv')
# Load the 'sim_improved-learning' file from the improved Q-Learning simulation
vs.plot_trials('sim_improved-learning.csv')
利用上面的從你改進的Q-Learning模擬中獲得的可視化結果,像在問題6那樣,給出關於改進的駕駛代理程序的最終分析和觀察。你須要回答的問題:
回答:
使用了ϵ=0.995的t次方,這個指數函數epsilon是單調變化的,隨着試驗數目t的增長而減小的。
測試以前大概須要1200次訓練
tolerance = 0.001和alpha爲默認值0.5,tolerance下降有助於提升訓練次數,訓練的次數足夠多將各類狀態遇到基本就能夠達到較好的訓練效果,alpha平衡了已有經驗和新的探索對智能車行動的影響。epsilon的機率進行探索,起始值取1,是爲了剛開始讓其大膽嘗試新的事物,隨着試驗次數增長,ε探索減小,而從前面學到的經驗中學習更多。
安全性和可靠性有所提升
成功學習到一個合適的策略
滿意
有時,對於重要的問題「我要讓個人代理程序學習什麼?」的答案,只是理論性的,沒法具體描述。然而這裏,你能夠具體定義代理程序要學什麼,就是美國通行權交通法案。這些法律是已知信息,你能夠基於這些法律,爲智能出租車進一步定義每個狀態所作的最優動做。在那種狀況下,咱們稱這一系列最優狀態-動做配對爲最優策略。所以,不像那些理論性的回答,不只經過收到的獎勵(懲罰),並且純觀察,代理程序是否在「錯誤」地行動能很清晰地得知。若是代理程序闖了紅燈,咱們既看見它得到了一個負面獎勵,也知道這是一個錯誤的行爲。這能夠用來幫你驗證駕駛代理程序習得的策略是否正確,或只是個次優策略。
給出幾個關於最優策略是什麼樣子的例子(用你已定義的狀態)。以後,查看'sim_improved-learning.txt'
文本文件,看你的改進的Q-Learning算法的結果。_每一個從模擬中紀錄的狀態,對於給定的狀態,策略(得分最高的動做)是否正確?是否對於有些狀態,有策略不一樣於預期的最優策略?_給出一個狀態和記錄的狀態-動做的獎勵,解釋爲何正是個正確的策略。
回答:
sim_improved-learning.txt(對應狀態:目標,燈,對面,左,右)
('left', 'red', None, 'forward', 'forward')
-- forward : -37.36
-- None : 1.70
-- right : -14.77
-- left : -19.75
上面顯示應該左轉,當前爲紅燈,對面車是None,左邊車是前行的,右邊車是前行的,因爲是紅燈且要左轉,因此最佳策略爲None,算法也是None爲正,獎勵最大,紅燈是不能夠左轉的,不然違反交通規則,右轉不違反交通規則,因此right爲負獎勵,但比left高。
2.('forward', 'red', None, None, 'left')
-- forward : -10.33
-- None : 1.86
-- right : 0.98
-- left : -9.50
上面顯示當前應該前行,可是爲紅燈,對面車是None,左車是None,右車是左轉,因此最佳策略爲None,算法也是None爲正,且最大,右轉是不違反交通規則的,雖然不符合預期,可是不會出事故,因此權值爲正數且小於None爲0.98,直行和左轉都是違反交通規則的,因此都是負數
3.('forward', 'red', 'right', None, None)
-- forward : -10.07
-- None : 2.25
-- right : 0.65
-- left : -37.40
上面顯示當前應該直行,燈爲紅色,對面車是右轉,左車是None,右車是None,因爲迎面車有車右轉,若再直行則發生事故,紅燈右轉不違反交通規則,因此獎勵爲正僅次於None,因此最佳策略爲None,算法也是None爲正,且獎勵最高
'gamma'
¶也許你會好奇,做爲Q-Learning算法的一部分,以前要求你在實現中不要使用折扣引子'gamma'
。在算法中包含將來獎勵能有助於在將來狀態回溯到當前狀態時的反向正面獎勵。本質上,若是給予駕駛代理程序執行若干動做到達不一樣狀態的選擇,包含將來獎勵會是代理程序偏向能夠獲得更多獎勵的狀態。一個例子是駛向目的的駕駛代理程序:全部行動和獎勵都相等,那麼理論上若是到達目的地會有額外獎勵,駛向目的會得到更好的獎勵。然而,即便在這個項目裏,駕駛代理程序也要在規定的時間裏到達目的地,包含將來獎勵不會有益於代理程序。實際上,若是代理程序給予屢次試驗學習,它甚至會給Q-value帶來負面影響!
在項目中有兩個特色使得將來獎勵在這個Q-Learning算法無效。一個特色是關於智能出租車自己,另外一個是關於環境。你能指出它們是什麼以及爲何將來獎勵不會在這個項目中起效?
回答:
注意:當你寫完了全部的代碼,而且回答了全部的問題。你就能夠把你的 iPython Notebook 導出成 HTML 文件。你能夠在菜單欄,這樣導出File -> Download as -> HTML (.html)把這個 HTML 和這個 iPython notebook 一塊兒作爲你的做業提交。
歡迎掃碼關注,或搜索大數據與知識圖譜,按期分享大數據與知識圖譜相關知識點: