所謂強化學習就是智能系統從環境到行為映射的學習,以使獎勵信號(強化信號)函數值最大。如果Agent的某個行為策略導致環境正的獎賞(強化信號),那么Agent以后產生這個行為策略的趨勢便會加強 -《百科》

簡單來說就是給你一只小白鼠在迷宮里面,如果他走出了正確的步子,就會給它正反饋(糖),否則給出負反饋(點擊),那么,當它走完所有的道路后。無論比把它放到哪兒,它都能通過以往的學習找到最正確的道路。

下面直接上例子:

假設我們有5間房,如下圖所示,這5間房有些房間是想通的,我們分別用0-4進行了標注,其中5代表了是是出口。

我們使用一副圖來表示,就是下面這個樣子

在這個例子里,我們的目標是能夠走出房間,就是到達5的位置,為了能更好的達到這個目標,我們為每一個門設置一個獎勵。比如如果能立即到達5,那么我們給予100的獎勵,其它沒法到5的我們不給予獎勵,權重是0了,如下圖所示

5因為也可以到它自己,所以也是給100的獎勵,其它方向到5的也都是100的獎勵。 在Q-learning中,目標是權重值累加的最大化,所以一旦達到5,它將會一直保持在這兒。

想象下我們有一個虛擬的機器人,它對環境一無所知,但它需要通過自我學習知道怎么樣到外面,就是到達5的位置。

好啦,現在可以引出Q-learning的概念了,“狀態”以及“動作”,我們可以將每個房間看成一個state,從一個房間到另外一個房間的動作叫做action,state是一個節點,而action是用一個剪頭表示。

現在假設我們在狀態2,從狀態2可以到狀態3,而無法到狀態0、1、4,因為2沒法直接到0、1、4;從狀態3,可以到1、4或者2;而4可以到0、3、5;其它依次類推。

所以我們能夠把這些用一個矩陣來表示:

這個矩陣就是傳說中的Q矩陣了,這個矩陣的列表表示的是當前狀態,而行標表示的則是下一個狀態,比如第三行的行標是2,如果取第四列,比如說2,4就表示了從2->4的收益是0,而-1就表示了沒法從一個狀態到另外一個狀態。

Q矩陣初始化的時候全為0,因為它的狀態我們已經全部知道了,所以我們知道總的狀態是6。如果我們并不知道有多少個狀態,那么請從1個狀態開始,一旦發現新的狀態,那么為這個矩陣添加上新的行和列。

于是我們就得出了如下的公式:

Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all actions)]

根據這個公式,Q矩陣值 = R的當前值 + ?Gamma(系數)* Q最大的action(看不懂不要緊,后面有例子)

我們的虛擬機器人將通過環境來學習,機器人會從一個狀態跳轉到另一個狀態,直到我們到達最終狀態。我們把從開始狀態開始一直達到最終狀態的這個過程稱之為一個場景,機器人會從一個隨機的開始場景出發,直到到達最終狀態完成一個場景,然后立即重新初始化到一個開始狀態,從而進入下一個場景。

因此,我們可以將算法歸納如下

Q-learning算法如下:

1 設置gamma相關系數,以及獎勵矩陣R

2 將Q矩陣初始化為全0

3 For each episode:

設置隨機的初使狀態

Do While 當沒有到達目標時

選擇一個最大可能性的action(action的選擇用一個算法來做,后面再講)

根據這個action到達下一個狀態

根據計算公式:Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all actions)]計算這個狀態Q的值

設置當前狀態為所到達的狀態

End Do

End For

其中Gamma的值在0,1之間(0 <= Gamma <1)。如果Gramma接近0,對立即的獎勵更有效。如果接近1,整個系統會更考慮將來的獎勵。

以上就是整個算法了,并不是很難的,下面來看個一段人肉算法操作,讓你徹底明白這個算法。

人肉算法步驟

首先將Q初始化一個全為0的矩陣,Q是我們目標矩陣,我們希望能夠把這個矩陣填滿

然后初始化我們的R矩陣,假設這個值我們都是知道的,如下圖所示

現在,假設我們的初始位置是state1,首先檢查一下我們的R矩陣,在R矩陣中發現從state1可以到2個位置:state3、state5,我們隨機選擇一個方向,比如我們現在從1到5,我們可以用公式

Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all actions)]

Q(1, 5) = R(1, 5) + 0.8 * Max[Q(5, 1), Q(5, 4), Q(5, 5)]= 100 + 0.8 * 0 = 100

來計算出Q(1,5), 因為Q矩陣是初始化為0,所以 Q(5,1), Q(5,4),Q(5,5)都是0,所以Q(1,5)的值為100,現在5變成了當前狀態,因為5已經是最終狀態了,所以,這個場景就結束鳥,Q矩陣變成如下

然后我們再隨機的選擇一個狀態,比如現在選了狀態3為我們的初始狀態,好啦,來看我們R矩陣;有3個可能性的1、2、4我們隨機的選擇1,繼續用公式計算:

Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all actions)]

Q(3, 1) = R(3, 1) + 0.8 * Max[Q(1, 2), Q(1, 5)]= 0 + 0.8 * Max(0, 100) = 80

然后,更新矩陣,矩陣變成了這個樣子

我們的當前狀態變成了1,1并不是最終狀態,所以算法還是要往下執行,此時,觀察R矩陣,1有1->3, 1->5兩個選擇,子這里我們選擇 1->5這個action有著較高回報,所以我們選擇了1->5, 重新計算Q(1,5)的值

Q(state, action) = R(state, action) + Gamma * Max[Q(next state, all actions)]

Q(1, 5) = R(1, 5) + 0.8 * Max[Q(1, 2), Q(1, 5)]= 0 + 0.8 * Max(0, 100) = 80

為什么要重新計算呢?因為某些值可能會發生變化,計算完后更新矩陣

因為5已經是最終狀態了,所以結束我們本次場景迭代。

經過循環迭代,我們得出了最終結果,是這個樣子的

經過正則化處理,矩陣最終會變成這個樣子

強化學習到此結束。我們的機器人自動學習到了最優的路徑,就是按照最大獎勵值的路徑就可以啦

如圖紅線所示,代表了各個點到達終點的最優路徑

這是一個級簡的算法,隱藏了很多細節,出去吹NB是夠了,實踐上實現起來還是有許多問題的。

下面就是細節代碼了,對實現剛興趣的繼續往下看。

我們之前說了,選擇動作的依據是“選擇一個最大可能性的action”,那么這個動作要怎么選呢?

我們選擇最大收益的那個值,比如在R矩陣中,總是選擇值最大的那個

算法我們可以通過代碼來表示就是這樣

大家想一下這樣是否會存在問題呢?當然有,如果有幾個最大值怎么處理呢?,如果有幾個最大值的話我們就隨機的取一個唄

是不是這樣就可以了呢?大家想一下,萬一在當前動作收益很小,小收益到達的狀態的后續action可能會更大,所以,我們不能直接選取最大的收益,而是需要使用一個新的技術來探索,在這里,我們使用了epsilon,首先我們用產生一個隨機值,如果這個隨機值小于epsilon,那么下一個action會是隨機動作,否則采用組大值,代碼如下

但實際上這種做法還是有問題的,問題是即使我們已經學習完畢了,已經知道了最優解,當我們選擇一個動作時,它還是會繼續采取隨機的動作。有許多方法可以克服這個,比較有名稱之為mouse learns: 沒循環一次就減少epsilon的值,這樣隨著學習的進行,隨機越來越不容易觸發,從而減少隨機對系統的影響,常用的減少方法有以下幾種,大家可以根據情況選用