談Reinforcement Learning與能夠學習進化的程序

1.嬰兒怎麼學習?

舉個例子,回想一下當您剛出生時,您是怎麼學習抓住一個物體的? 很多人都覺得,我們生來就會啊, 這還用學? 但是科學證明,嬰兒學會抓住一個物體的技能需要大概三個月來完成。而且,這個過程是由嬰兒獨立學習完成的,可以完全不需要人的指導。這個過程是怎麼完成的呢? 

首先,嬰兒必須能看到物體,然後控制手臂上的肌肉,使手不斷地靠近目標。這是一個很高難度的過程,首先,假設人的手臂上有20塊肌肉, 每塊肌肉10種不同程度的伸縮度,而手靠近目標需要花費大概5秒的時間,那麼每一秒,我們將面臨10^20種選擇,那麼假設花5秒去靠近物體,那麼總共會有10^20^5種肌肉控制方式的可能,假如讓你每秒試10000次(誇張...), 那麼你還是得花上幾十萬年纔有可能碰到你親愛的小狗什麼之類的...

一個簡單的抓取物品的手臂控制就幾乎不可能靠簡單地嘗試完成,那麼其他的活動您也別參加了,好好在家躺着就好了。

以上講的嘗試的方法是可怕的。 一個人只靠盲目地嘗試,甚至不能在地球毀滅之前學會控制自己的一隻手臂。 所以我們肯定遺漏了些什麼東西,這些東西能夠幫助我們更快更好地去學習, 不管是抓取物品還是呀呀學語。

現在想一想,我們人在這個學習中能獲得什麼信息? 對了,我們自己能看到自己手的位置, 這個信息正是幫助我們學習的關鍵。 每次我們嘗試不同的肌肉強度組合,我們都能看到, 手位置變化的結果。我們能夠通過手位置的變化,獲得有用的調整肌肉強度的信息, 從而使得整個使用肌肉的學習具有強烈的導向性。而我們會記住這些肌肉使用的規律,並且在日後的學習中,不斷地改進規律,最後使我們使用手臂簡單而輕鬆。

除了嬰兒學抓東東, 當然還有一些更爲"計算機科學家"喜聞樂見的學習例子,比如學下象棋。而我們在熟悉了象棋規則之後,就能通過自己與相同或者不同的人對弈,就能不斷提高自己的棋藝,甚至成爲一代高手。但是仔細地看學下棋這個過程, 每一步棋的時候,都會有大概50種選擇,那麼50步的棋就會有50^50種策略的選擇。又是一個天文數字,我們怎麼能夠就在幾十或者幾百次嘗試之後就能漸漸地找到一些很好的策略,來幫助我們獲得勝利呢?


在我們嘗試地解決以上問題之前,讓我們弄清楚我們最後想要的是什麼東西----是一個策略(Policy). 這個策略會告訴我們,在某一步(或某一個狀態)該進行什麼動作。 策略會將 (狀態域) ---影射到 --> (動作域). 比如在下象棋時,別人中炮將軍時,你可以選擇飛象,或者可以把將移開,... and so on. 又如嬰兒學動手, 當手在某一個位置時,策略會告訴你,下一步應該怎麼動哪幾塊肌肉了,於是您在策略的傾情指導下,就能夠不斷的靠近目標,完成所想之事。


2. 搜索策略?

如何在茫茫策海中,找到我們心宜的那個最優策略? 於是我們整個問題就變成了一個在大空間內搜索的問題了.

最笨的方法是,把所有的策略都試一遍,然後比較哪一個策略更好。而策略的數量太多了,根本不可能把所有策略都找到,並且比較。

所以有很多先進的找策略的方法, 比如使用遺傳算法,隨機把(策略1, 2,3,4,...,M)看一個個種羣,然後,通過比較這些種羣的適應程度(比如說策略1能讓你下棋100局贏20局,那麼適應度就是0.2),進行選擇, 複製, 變異,讓那些表現不錯的策略的種羣數量更多一些,這樣最後就能夠找到一些較爲滿意的策略。 

遺傳算法的確能夠讓你找到一些較爲滿意的策略。但是在狀態空間太大的時候,遺傳算法需要的時間和空間都比較多(因爲你需要一個龐大的種羣來實現並行的搜索)。

增強學習(Reinforcement Learning) 將是另一種強大的策略搜索工具,特別適用於有交互的學習過程,也就是說問題可以抽象成狀態動作的變化的模型。比如說打籃球, (你手的位置和速度, 球所在的位置,球的速度) 就是一個狀態, 而你的動作,將是(對肌肉的作用1,對肌肉的作用2...n)每塊肌肉的強度指令。 而你的動作將會對你的下一個狀態產生影響, e.g.改變你手的位置,速度,球的位置和速度。  一旦你的問題能夠抽象成這種 狀態 與動作的模型,而 狀態之間的轉移又是靠動作來發生的。 那麼就能夠通過RL進行學習,從而改進你對 每次動作的選擇,最後達到最優。

而策略在RL,中的表示就是,某個狀態該選擇哪個動作的對應關係。 更美麗地說, 你需要用RL來解決問題,你的問題必須能抽象成像下圖這種模型。


RL 需要處理的問題的模型, (r 是reward, 表示每個狀態的回報)


有了RL的模型,那麼RL解決問題的本質就在於, 通過賦於每個狀態一個reward, 和這些狀態的轉移特性,我們能夠找到一個狀態轉移的策略,使得所有經過的狀態的回報總和(價值)達到最大。像上圖中, 當前處於狀態4,RL解決問題的方法在於,找到一個策略,能從(狀態4 --> 狀態1 --> 狀態5). 這就是這個模型下最優的策略。 這個策略就像一個查詢表(look-up table), 將狀態對應到動作上.

狀態 動作
4 8
1 1
2 2
3 1
5 N/A
一個最優的策略的例子

總的來說, RL的學習過程就是, 先定義狀態的回報(比如贏棋爲1, 輸棋爲-1, 其餘爲-0.02). 然後通過不斷地嘗試,從而統計出狀態之間的轉移關係。 最後通過動態規劃求解出一個最優策略。 我們能夠通過不斷地嘗試,獲得更多的狀態 和 這些狀態之間的更精確 轉移概率。 於是我們就能通過 動態規劃 求解出一個更好的策略來。 所以(更多的經驗和嘗試)  將帶來 (更好的策略)。


當然,這篇文章裏,只力求能給你一個增強學習(RL)的大致概念。更精確的模型會有更加誘人的特性。比如

1. 狀態之間的轉移並不是確定的,而是概率分佈的,比如中國象棋中,你中炮將軍的話,下一個狀態很可能是,別人"化士", 或者 把“將”移開,或者吃掉你的"炮". 所以這時候,你的狀態轉移模型就需要用概率轉移模型來表示了。 但類似的是,不管是概率分佈的概率轉移模型還是確定的狀態轉移模型,我們都可以通過 嘗試,並且統計嘗試的結果來獲得這些轉移模型。

2. 價值 不再是 該策略下經過的狀態回報總和了, 而是一個期望值。

 p.s.   更精確的模式的定義,和更精確的描述可以參考第5部分的一些資源。 需要詳細瞭解的內容可能有, 如何定義價值函數,如何建立概率轉移模型,如何使用動態規劃。


3. 學習系統的建立

所以RL的學習系統的建立分爲幾個步驟:

1. 把世界抽象成 具有狀態, 動作(選擇)會影響狀態的變化的模型(馬爾可夫決策過程)。

2. 確定這個學習系統的目標,從而爲這個世界中的一些狀態賦以收益值。目標就是獲得最大的收益的總和(價值)。 設計收益=給定目標

(設定完以後,你現在擁有: 一, 收益分佈函數(每個狀態對應的收益是多少), 二, 狀態的集合, 動作的集合)

---------------- 設定結束, 以下是學習-----------------------

3. 讓學習系統隨便跑幾次,通過統計獲得狀態轉移概率。

4. 使用 動態規劃 求解出在當前 狀態轉移概率下的 最優的 價值,和最優的 策略


4. 使用RL解決一個會下棋的程序

 如果你對上面的流程還不是太清晰,那麼下面的例子會幫助你看到怎麼使用RL建立一個 可學習的模型, 並且如何在不斷的嘗試中成長!!!

 一個最簡單的下棋遊戲, Tic Tic Tac. 如果不清楚這個棋是什麼。。。那算了...沒有童年,問問你旁邊的人吧... 

這個遊戲一共有9個格, 可能出現的狀態有1024個. 現在我們要用RL建立一個模型,能夠使其在不斷嘗試中進化,學習,改進自己。 

  3.1. 首先我們要建立狀態的描述.

     狀態 = [x11, x12, x13; x21, x22, x23; x31, x32, x33];  x 的值可能爲3個值 (0 無子, 1 下O,  2 下X). 

  3.2  定義狀態的回報(reward)

     這時候,我們定義只有獲勝的情況reward = 1, 其他狀態的reward = 0.

  3.3. 通過嘗試獲得狀態轉移概率表

    通過多次嘗試得出一個狀態轉移概率表, 如下圖, 可以計算出狀態100到狀態101, 102,...113, 124, 115的轉移概率。

    

   3.4  通過已知的轉移概率表,用 動態規劃 計算出 每個狀態的價值(Value), 和一個最優的策略。 這裏很顯然, action 1,2 的選擇要比 action 3,3要好。最優的策略肯定會選擇action 1,2而不會選擇3,3.


   3.5 通過不斷地 嘗試獲得更多的狀態, 和更精確的狀態轉移概率。 從而,再進行3.4步, 得到更優的策略。


5. RL與其他可用的思想算法之間的比較

  5.1. 搜索樹

    搜索樹需要對後面的N步進行模擬,並且對結果進行統計分析。需要對問題進行龐大的預測和搜索, 這在更復雜的遊戲中,是很難實現的。

    可以看到,RL最大的優點在於,RL善於處理那些擁有很大未知性的問題。 並且可以通過,已知的知識建立起一些很好的策略。最大程度地去解決問題。它並不需要巨大的搜索空間,模型的建立是通過程序的不斷嘗試和交互進行改進的。


  5.3 增強學習 是監督學習嗎?

     監督學習(supervised learning)和RL的區別在於, 監督學習必須提供十分精確的例子。 比如說學習下棋的時候,必須給出每一步的例子,進行訓練。 或者在訓練一個聲帶系統發聲的時候,需要給出每塊聲帶肌肉震動收縮的例子。 但是實際上,人們有時候很難得到完整精確的例子(比如說打球的時候,身體每塊肌肉的運動的例子),卻只能給出每次嘗試以後的結果,比如說,這次擊球的誤差,聲帶系統發聲的相似程度,或者告訴你這盤棋的最後結果。 

     而且RL學習的系統,給出的反饋往往不是實時的,而是有延時的, 也就是你下棋,下了N步之後,在最後的一步才能得到評價輸或贏的反饋。 而你必須使用這些反饋去指導你之前做決策的過程。 這種有延時的反饋信息, 很難被監督學習所利用。 監督學習更多的是去學習,同一個時間內,兩個事情的對應關係。


6. 學習RL的資源

Andrew Ng 講的RL,真是不錯.  http://www.youtube.com/watch?v=RtxI449ZjSc

introduction to RL:   http://webdocs.cs.ualberta.ca/~sutton/book/the-book.html


希望這篇文章能對你有所幫助, 有關博客的內容,可以發郵件進行交流, pynblogs AT gmail




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章