轉自:http://blog.csdn.net/revolver/article/details/50177219html
今年上半年(2015年2月),Google在Nature上發表了一篇論文:Human-level control through deep reinforcement learning。文章描述瞭如何讓電腦本身學會打Atari 2600電子遊戲。Atari 2600是80年代風靡美國的遊戲機,總共包括49個獨立的遊戲,其中不乏咱們熟悉的Breakout(打磚塊),Galaxy Invaders(小蜜蜂)等經典遊戲。Google算法的輸入只有遊戲屏幕的圖像和遊戲的得分,在沒有人爲干預的狀況下,電腦本身學會了遊戲的玩法,並且在29個遊戲中打破了人類玩家的記錄。前端
Google究竟是如何作到的呢?答案固然是深度學習了。算法
先來看看Google給出的神經網絡架構。後端
網絡的最左邊是輸入,右邊是輸出。遊戲屏幕的圖像(其實是4幅連續的圖像,能夠理解爲4個通道的圖像)通過2個卷積層(論文中寫的是3個),而後通過2個全鏈接層,最後映射到遊戲手柄全部可能的動做。各層之間使用ReLU激活函數。網絡
這個網絡怎麼看着這麼眼熟?這和咱們識別MNIST數字時用的卷積神經網絡是同樣同樣的。數據結構
但是轉念又一想,仍是不對。咱們識別MNIST數字的時候,是Supervised Learning(監督學習)。每一個圖像對應的輸出是事先知道的。但是在遊戲中並非這樣,遊戲環境給出的只是得分。算法須要根據得分的變化來推斷以前作出的動做是否是有利的。架構
這就像訓練寵物同樣。當寵物作出了指定動做以後,咱們給它一些食物做爲獎勵,使它更加堅信只要作出那個動做就會獲得獎勵。這種訓練叫作Reinforcement Learning(強化學習)。app
強化學習並無指定的輸出,環境只對算法作出的動做給出相應的獎勵,由算法來主動發現什麼時間作出什麼動做是合適的。強化學習的難處在於,獎勵每每是有延時的。好比在一個飛機遊戲中,玩家指揮本身的飛機在合適的時機發射子彈,相應的獎勵要等到子彈擊中敵機纔會給出。從發射子彈到擊中敵機之間有一個時間延遲。那麼算法如何跨越這個時間延遲,把擊中敵機所獲得的獎勵映射到以前發射子彈的這個動做上呢?框架
要解釋這個問題,咱們須要首先來談一下強化學習是怎麼一回事。機器學習
Reinforcement Learning(強化學習)
先借用一下維基百科的描述:
強化學習是機器學習中的一個領域,強調如何基於環境而行動,以取得最大化的預期利益。其靈感來源於心理學中的行爲主義理論,即有機體如何在環境給予的獎勵或懲罰的刺激下,逐步造成對刺激的預期,產生能得到最大利益的習慣性行爲。 |
在強化學習的世界裏,咱們的算法(或者說人工智能)被稱爲Agent,它與環境發生交互。Agent從環境中獲取狀態(state),並決定本身要作出的動做(action)。環境會根據其自身的邏輯給Agent予以獎勵(reward)。這個獎勵有正向和反向之分。好比動物生活在大天然中,吃到食物便是一個正向的獎勵,而捱餓甚至失去生命就是反向的獎勵。動物們靠着本身的本能趨利避害,增大本身獲得正向獎勵的機會。若是反過來講,就是避省得到反向的獎勵,而捱餓什麼的最終會致使死亡。因此動物生存的惟一目的其實就是避免死亡。
在電子遊戲世界(特指Atari 2600這一類的簡單遊戲。不包括推理解密類的遊戲)中:
插播:
爲何不包括推理解密類遊戲呢?其實Google把遊戲簡單分爲兩類:Perfect Information和Imperfect Information。
Perfect Information類的遊戲能夠經過當前屏幕上的畫面瞭解到全部的狀態信息,如打磚塊,小蜜蜂,各類棋類都屬於這一類遊戲。這類遊戲又能夠叫作Markov遊戲。Google這篇論文就是主要針對這一類。
Imperfect Information類的遊戲不但要看當前屏幕上的畫面,還要記住全部的歷史畫面。如撲克牌等。要解決這類遊戲也不是沒有可能,只須要在神經網絡里加入閉環反饋就能夠了。這就是Recurrent Neural Network(RNN)遞歸神經網絡。關於RNN,請參考個人另外一篇筆記:深度學習筆記(五)用Torch實現RNN來製做一個神經網絡計時器
Q-Value
上面說到策略能夠用動做的價值Q-value(其實是Quality-Value)來表示。但這個價值到底表明什麼呢?咱們學政治課的時候都知道,商品的價值是凝結在商品中的無差異的人類勞動。那麼這個動做的價值又凝結了什麼東西呢?這個價值又是以什麼單位來衡量的呢?
因爲咱們算法的目的只有一個,那就是儘可能多的得到獎勵(Reward)。因此動做的價值毫無疑問就是以Reward的多少來衡量的。一個動做的價值等於作了這個動做以後一段時間以內Agent所能得到的最大的獎勵。
舉個例子,假設你面臨跳槽,若是跳到新公司,從此五年內的預期收入是500萬。若是留在原來的公司,從此五年的預期收入爲300萬。那麼你」跳槽「這個動做的Q-value就是500萬,而「不跳槽」這個動做的Q-value爲300萬。
所謂價值,固然是要根據設定的時間段而定的。爲了計算方便,咱們通常不會設定爲「5年」這樣一個固定的時間段。而是給將來的Reward打一個折扣。好比明年的預期收入要打一個0.9折,後年的預期收入打0.9的二次方折,大後年的預期收入打0.9的三次方的折。這樣,越遙遠的收入就顯得越不重要,其實也起到了限制時間段的做用。
Q-Value Tabular Representation(Q函數的表格形式)
前面說到,策略能夠用一個記錄着Q-value的二維表格來表示。咱們來舉一個實際的例子吧。
假設咱們有一張地圖,地圖上有6個格子。遊戲開始時你會出如今任意一個藍色的格子裏,你的任務是走到End終點。由於你的口袋上漏了一個洞,你每踏上一個藍色的格子,你的口袋會掉出一塊錢,而你走到終點的那一刻,你會獲得10塊錢,同時遊戲結束。若是你試圖走出邊界,你會留在原來的那個格子裏,並失去1塊錢。
好了,遊戲規則很是簡單。爲了要獲取最大的利益,你須要找出一個最佳策略。在這麼簡單的遊戲設定下,你能夠用Q的表格形式來表示你的策略。我已經幫你把表格畫好了,你只須要把合適的數字填進去。(爲了計算方便,咱們不對將來的獎勵作打折處理)
假設你身處狀態C,那麼向下走會獲得10塊錢。因此C狀態的向下的動做Q-value等於10。一樣,E狀態向右的動做也等於10。
若是你身處B狀態,向下能夠走到E,經過E能夠走到終點並得到10塊錢,可是在路過E的時候要損失1塊錢,因此總的預期是9元。一樣B狀態向右也是9。
若是你身處D,最好的方法是向右走到E,再經過E走到終點。這樣的預期一樣是9元。
若是你身處A,那麼你能夠向下走到D,而後經過E走到終點,這樣預期是8元。固然也能夠向右走到B,而後選擇經過C或E走到終點,預期一樣是8元。因此A狀態的向下和向右的動做都是8。
還有一些空格沒有填。好比從E向左走,很明顯這不是最佳的走法。不過若是你硬要這麼走的話,你還能夠從D走回E而後走到終點。但你走了一些冤枉路,你的收入將會是8。
按照這種邏輯,咱們能夠把其餘的格子填滿。
這樣,咱們就獲得一個策略。按照這個策略,當你身處某個狀態的時候,你能夠選擇四個動做中Q-value最高的那個來執行。
如今,策略咱們是定出來了。但是這個策略是以咱們人腦的智慧高屋建瓴的來完成的,對於電腦來說該怎麼辦呢?先彆着急,這一節的目的只是講如何用二維的表格來表示一個策略。至於如何用算法找出最佳策略,咱們後面再講。
Q-Value Function Approximation(Q函數擬合形式)
在大多數Atari遊戲中,狀態的個數幾乎能夠說是無限多的。畫面每變化一點點,就是一個新的狀態。咱們不可能爲每一個狀態指定一個最佳的動做,而是須要把相近的狀態概括到一塊兒。好比,咱們能夠這樣描述某個策略:「當子彈從左邊射向個人飛機時,我應該向右移動;當子彈從右邊射向個人飛機時,我應該向左移動「。這個策略實際上把全部可能的屏幕狀態分紅了兩類,分別把他們映射到手柄的向左和向右鍵。這種對局部圖像進行描述從而進行分類的任務,用卷積神經網絡來作是最合適不過的了。
具體來說有兩種方式:1. 將狀態和動做作爲輸入,相應動做的Q-value作爲輸出;2. 將狀態做爲輸入,一次性輸出每一個動做的Q-value。
在Google的論文裏,就使用了相似第二種的網絡形式把遊戲畫面映射到按鍵動做。網絡的輸入端是4幀連續的圖像,通過3個卷積層和2個全鏈接層映射到18個輸出節點,每一個節點表明一個手柄按鍵動做的價值(Q-value)。
Temporal difference(時間差分)
直到如今,咱們最大的一個疑問其實還未解決:咱們上面提到的那個卷積神經網絡究竟是怎麼在沒有監督的狀況下訓練出來的呢?答案就是本身向本身學習,並且是向將來的本身學習。是否是很神奇?這就是Temporal Difference。其實就是根據Agent在連續時間點之間作出判斷的差值來實現學習的目的。
擴展知識:
通常對於計算機算法而言,想要從環境中學習到經驗並找出最佳策略,有三種不一樣的方法能夠選擇:
1. 動態規劃(Dynamic Programming)方法。計算機專業的同窗確定不會陌生。在地圖上找出兩點之間的最短路徑(也算是一種學習)用的就是這種方法。但這種方法的缺點在於,環境必須是已知的。若是要算出最短路徑(最佳策略),最起碼要把地圖(環境)告訴Agent才能夠。而Google並無告訴算法任何關於Atari2600遊戲的知識,因此動態規劃並不能解決這類問題。
2. 蒙特卡羅(Monte-Carlo)方法。蒙特卡羅是摩納哥的一個賭城,這種方法說白了就是隨機瞎猜的方法。不斷的改變策略,並在環境中不斷嘗試,直到找出回報最多的策略。實際上,生物在天然界的進化就是遵循這樣一種方法。每種生物都把不可勝數的後代散播到咱們這個地球上,每一個後代的個體都在基因上有微小的差異。基因優秀的生存下來,繼續繁衍後代。聽起來這種方法是不錯的。可是每學習一次都要以物種個體的死亡爲代價,這樣學習的代價太大,學習的速度也太慢。另外,經過這種方法學習的經驗是不具備推理性的。由於它沒法判斷究竟是以前的具體是哪一個動做致使了死亡的結果,只能把從出生到死亡之間的時間段裏作出的全部動做當成一個總體策略來處理,這個策略由個體的基因決定。而算法選擇總體保留或者總體銷燬這個基因樣本。
3. TD(Temporal difference)方法。Google就是用的這種方法。
咱們先來舉一個例子:
假設咱們要根據從週一到週日的天氣情況來預測週日的天氣。咱們從週一開始觀察,週一夜咱們給出一個預測,這個預測會很不許確。週二晚上的時候,因爲咱們已經觀察了兩天,並且時間離週日又接近了一些,因此咱們的預測會比周一準確一些。一直到週六晚上,咱們的預測會愈來愈準確。直到時間到達週日,咱們的預測變成100%準確,由於實際上咱們已經知道答案了。
這就是Temporal Difference的基本假設:下一時刻對於結果的預測必定會比上一時刻的預測更準確。
因此咱們的方法就是讓週一的預測向週二靠近,週二的預測向週三靠近......週六的預測向週日靠近。週日就不用再靠近了,由於當天的天氣就是標準答案。
具體到算法上,流程大概是這樣的:
1. 首先咱們須要有一個神經網絡(或者是別的什麼預測器),它的輸入是當天的日期和當天觀測到的一些數據,輸出是對週日天氣的預測。用數字來表示:1爲晴天,0爲雨天。這個神經網絡的初始狀態是隨機的,處於一種混沌狀態,它給出的預測值也能夠當作是隨機數。
2. 咱們開始從週一開始收集觀察數據,把收集到的數據放進神經網絡,它吐出一個結果。固然這個結果沒有任何意義,由於它是隨機生成的。
3. 時間來到週二,咱們又收集到了一些數據。把週二的數據放進神經網絡,又吐出一個結果。這個結果仍然是隨機的沒有任何意義。但總算是和週一的結果有些差異。
4. 把週一的日期和觀察數據和週二的預測結果組成一對樣本,用來訓練咱們的神經網絡。注意,這時候咱們的訓練轉變成了監督學習。因爲咱們會選擇一個很小的learning rate,咱們的神經網絡會改變一點點,使得下一次若是咱們又在週一這天觀察到和這個週一相似的數據時,咱們的預測會更加接近這個週二的結果了。等等,剛纔不是說週二的預測結果只是個隨機數嗎?那這樣的學習還有什麼意義呢?先不要着急......
5. 咱們一每天的觀察和學習,直到來到了週日。今天,咱們要把週六的日期和觀察數據和週日的預測結果(其實就是ground truth)組成一對樣原本訓練網絡了。此次的訓練才真正開始有意義了。當咱們下一次遇到和週六相似的狀況時,咱們就能更加準確的預測週日的天氣了。這樣,一週的觀察和學習生活就結束了。
6. 咱們又開始了新的一週,從新從週一開始預測週日的天氣。此次咱們有了上一週的經驗(所謂經驗,就是上一週留下來的那個神經網絡)。在這一週的學習中,前幾天的學習仍然是很盲目的。但從週六開始,這種自我學習就開始有了一些方向性。由於週六給出的預測已是有一些根據的。因此它有能力給週五的神經網絡一些指導性意見。
7. 時間一週一週的過去了。週六的網絡老是可以學習到Ground Truth。而週五的網絡老是能向週六的網絡學習......週一的網絡老是向週二的網絡學習。隨着時間的推移,全部的網絡都不一樣程度的學習到了Ground Truth。
是否是有一點感受了?讓咱們再看一下以前的那個例子。
此次咱們要遵循一個嚴格的算法來獲得最佳策略。用這種方法叫作Q-learning。這是一個迭代的過程。首先,把全部動做的Q-value初始化爲0。而後,遵循下面的規則進行迭代:
某個狀態下某個動做的Q-value = 該動做致使的直接獎勵 + 該動做致使的狀態中最有價值動做的Q-value
這個公式其實有個名字叫作Bellman Equation。這個公式很是很是重要,是整個Reinforcement Learning的理論核心。用通俗的話講就是:若是你要作出一個選擇,你須要考慮兩個方面,一是你作出選擇後當即獲得的回報是多少,二是你的選擇致使的一系列變化在將來能給你多少回報。將這二者加起來,就是你某項選擇的價值。
若是有人給你一億讓你吃屎,你吃嗎?很明顯,當即回報是一億,吃完以後名譽受損可能影響別人對你的見解,吃不吃你本身考慮吧。
咱們來實際操做一下。首先在咱們的表格裏把全部的Q-value初始化爲0。
而後按照Bellman Equation進行迭代。
第一次迭代以後,全部沒有踏上終點的動做都變成了-1,只有C的向下和E的向右變成了10。咱們來看看爲何。
拿A狀態的向右動做爲例。這個動做致使的結果是B狀態,並得到-1的獎勵。而B狀態的後續動做的價值都是0(初始化的值)。因此此次迭代的結果是-1加上0,等於-1。
再拿C狀態的向下動做舉例。這個動做致使的結果是遊戲結束,並得到+10的獎勵。遊戲結束後也沒有後續的獎勵了。因此迭代的結果是+10。
繼續往下迭代:
咱們發現全部能致使E或C的動做都變成了9。
拿B狀態舉例,B狀態後續到c的價值爲-1,由c到end的價值爲+10 ,b的狀態值=b到c的價值(-1)+c到end的價值(+10)=9
而後是第三次迭代:
第四次迭代:
通過四次迭代,咱們的表格已經收斂,繼續迭代也不會發生變化了。這就說明,咱們已經找到了最佳策略。這個策略和咱們憑人腦制定的策略是同樣的。
進入真正的Atari遊戲
通過上面的講解,咱們瞭解到幾條事實:
因爲本文並不涉及如何編寫代碼,因此我只想用文字來描述一下,在訓練的過程當中到底發生了些什麼。
假設咱們選擇了Breakout(打磚塊)遊戲。
起初,咱們創建了一個卷積神經網絡,這就是AI的大腦。網絡前端接受屏幕傳來的圖像,網絡後端只有三個輸出節點,分別表明向左移動,向右移動和不移動。網絡的內部參數是隨機初始化的,網絡末端的Q-value也基本是隨機的。這個大腦裏面是一片混沌,它不會根據眼前的畫面作出判斷,只會隨機的移動屏幕最下方的「球拍」。
咱們打開開關,遊戲開始運行。小球開始從上方掉下來。咱們的「球拍」幾乎不可能接到小球。每次小球掉落下去以後遊戲就結束了。但立刻又從新開始。
在這個過程當中,屏幕圖像源源不斷的從神經網絡的前端傳進來,經過無數隨機權重的神經脈絡,鏈接到最後端的三個輸出節點上。
"大腦「在作出隨機動做的同時也在不停的學習。因爲根本沒有得到Reward,」大腦「只是單純的拿n+1幀的圖像對應的3個Q-value做爲第n幀圖像的學習目標。
這時的學習實際上是盲目的。用隨機初始化的網絡隨機的生成一些數據來訓練,獲得的結果也必然是一片混亂。因此,在這個階段,神經網絡跟沒有學習到任何有意義的東西。
直到......
小球偶爾也會落在球拍上反彈回去。擊中球拍並不會得到Reward,因此網絡的訓練仍然和以前同樣無動於衷。
當小球向上擊中一個磚塊的時候,遊戲給出1分做爲Reward。從這時開始,「訓練」才真正變得有意義了。在小球擊中磚塊的瞬間,磚塊消失不見。因爲神經網絡接受的是4幀連續的圖像,其實是一個小動畫,記錄了磚塊消失的過程。在這一幀發生的訓練,其輸入樣本用的是上一幀的4幅圖像(小球立刻要擊中磚塊),而輸出樣本是擊中磚塊後的圖像經過網絡所生成的3個Q-value再加上剛纔獲得的1分。
這一幀的訓練意義非同尋常,它告訴「大腦」:在小球立刻要擊中磚塊這樣一種狀態下,不論你作出什麼動做,都會獲得比隨機水平高出1分。
這一過程不斷的重複,當「大腦」經歷過屢次擊中磚塊的瞬間,它腦中的卷積核就會試圖找出這些畫面中有哪些共同點。終於有一天,當擊中過足夠屢次磚塊以後,「大腦」終於明白,這些畫面的共同點是:畫面的某處都存在一個相同的pattern——小球和磚塊很是接近並且小球正在向磚塊飛去。「大腦」終於明白了它人生中的第一件事。
之後的每幀圖像,它都會在圖像中尋找這樣的pattern,若是找到了,就會在輸出端的3個動做節點給出3個比平時高一點的Q-value。
這時,「大腦」並無將得分和動做聯繫在一塊兒。這3個動做對它來講價值沒有什麼區別。它仍然是隨機的給出一些動做。
「大腦」也會發現擊中磚塊前兩幀的圖像會「致使」前一幀的圖像。在小球接近磚塊的過程當中,算法會不斷的把下一幀的Q-value拿過來做爲前一幀的圖像的結果來訓練。
漸漸地,「大腦」會認爲全部小球飛向磚塊的圖像都應該對應較高的Q-value。也就是說,這些狀態都是「有利」的。
下一步,「大腦」會繼續領悟:是小球與球拍的碰撞「致使」了小球向上運動,並有很大多是飛向磚塊。因此小球與球拍的碰撞是「有利」的。
到目前爲止,「大腦」仍是沒有搞清楚這3個動做到底有什麼區別。
遊戲繼續,「大腦」繼續隨機的發出動做。
有時候,小球會貼着球拍的邊緣掉下去。只有在這個時候,才能體現出動做帶來的好處。好比,小球落到球拍左邊緣時,若是這時碰巧發出了一個向左的動做,那麼就會引起碰撞,不然小球就會跌落下去。在引起碰撞的狀況下,「大腦」會把「碰撞」的Q-value(比較高)賦給向左這個動做。而向右和不移動這兩個動做獲得的卻只是小球落下去的Q-value(比較低)。
長此以往,「大腦」就會明白當小球將要從左邊略過球拍的時候,向左的動做比較有利;將要從右邊略過的時候,向右的動做比較有利。
這樣推廣開來,「大腦」就會慢慢的找出合適的策略,越玩越好,逐漸達到完美的程度。
總結
說到這裏,相信你已經能對強化學習有了一個大體的瞭解。接下來的事情,應該是如何把這項技術應用到咱們的工做中,讓它發揮出其巨大的潛能,創造出前人沒法想象的價值。
自從Google發表了那篇驚世駭俗的論文以來,在個人心裏裏,人工智能的大門已經正式向人類打開,美好的將來也在向咱們招手。從某種意義上講,其巨大的影響力已經讓咱們手頭的工做變得毫無價值,而咱們應該抓緊時間去認真研究這新出現的技術,儘快的發揮它的巨大勢能。正如KK的比喻那樣:你正用一把鐵鏟在挖水渠,但你卻忽然據說明天會有人租一臺挖掘機來過來,這時你還會繼續挖下去嗎?