從多臂賭博機問題到強化學習
多臂賭博機,每次投幣後只能選擇按下一個臂,這個臂會有一定的概率給出獎勵,但是我們並不知道每個臂給獎勵的概率分佈,那麼如何獲得最大收益呢?我們有兩種策略,探索和利用, 探索是把所有的機會均分給每個臂,根據歷史獲得獎勵的頻率去近似它的真實獎勵概率;利用就是每次都選擇獲得獎勵頻率最大的那個臂。探索可以更好的瞭解它的概率分佈,從而制定更好的策略,缺點是會失去很多獲得獎勵的機會。而利用能抓住獲得獎勵的機會,但是可能得不到最優的方案。那麼我們需要在其中做一個折中:即遊戲開始的初期,我們採用比較多的探索和較小的利用,而隨着遊戲次數的增加,我們逐漸增加利用而減小探索。
這個策略就是 策略,每一步以 的概率選擇探索,以 的概率選擇利用,隨着遊戲的進行,慢慢減小 。
上述的策略在利用的時候每次選擇的都是歷史平均獎勵較大的臂,這是因爲此時賭博機是stationary的,也就是說每個臂的概率分佈是不會隨着遊戲的進行而改變的,因此只要探索的次數夠大,就能用頻率去逼近真實概率,那麼每次只需要選擇概率最大的臂即可。
假設現在店裏的老闆看你贏的這麼舒服,悄悄地調整你這個機器每個臂獎勵概率,不讓你這麼容易就把握規律怎麼辦?這個時候就是non-stationary了,如果還選擇歷史平均概率最大的臂這種策略就有問題咯,那麼就輪到MDP上場了,即現在每次在利用的時候會選擇未來累計獎勵期望最大的那個臂,也就是Q值最大的那個臂,這就回到了我們經典的強化學習算法Q-learning來了。那麼,如何知道這個Q值呢,這個時候就需要一些額外的信息,比如老闆在什麼時候調整機器,如何調整的等其他特徵,這個就是我們需要觀察的狀態,這些狀態能幫我們一定程度上消除這種動態性,因此我們需要在不同的狀態下去估計每個臂的Q值,最終找到一種最優策略,能夠逼近每個臂在不同狀態下的最優的Q值,即爲強化學習的目標。
注意,stationary的賭博機是沒有狀態,而只有動作和獎勵,我們是通過對環境(賭博機)的建模來求解的,類似model-based強化學習。對於non-stationary的賭博機,我們若只觀察老闆調機器的狀態來作出動作的選擇的話是model-free的強化學習;若既觀察老闆調機器,又對當前的老虎機進行建模的話,就是model-based強化學習。關於model-free和model-based方法,請看這裏
什麼?你說可不可以不觀察一些額外信息,也能玩轉non-stationary的賭博機,那你肯定褲子都輸光;然而我們現實生活中,那些遊戲機爲啥能賺你的錢,你自己心裏沒點數嗎?
經典強化學習-Q學習
強化學習的本質基於馬爾可夫鏈(MDP),認爲未來狀態只與現在的狀態有關,而與過去無關,換句話說,凡是符合現在的動作可以影響未來這樣的過程,都可以用強化學習建模。
強化學習的目標是要在當前狀態下選擇未來收益最大的動作,那麼未來收益怎麼衡量?用 表示t時刻收到的獎勵報酬,那麼在t=0時刻未來的收益即爲 ,這裏 爲折扣因子,表示未來時刻的收益相對現在的即時獎勵是有個折扣的;那麼在t=1時刻未來的收益呢?當然是 。我們把t=0時刻的未來收益展開發現:
當前時刻未來收益 = 現在的即時獎勵+ 乘以下一個時刻的未來收益, 我們令狀態價值函數 表示狀態 下的未來收益,那麼根據上式就有: 。我們把這個式子推廣到t時刻就得到了貝爾曼方程(Bellman Equation): ,當知道了此時刻和下一時刻的收益之間的關係,我們就能應用動態規劃的思想去求解。
上面的狀態價值函數 的意義表示某一個狀態下的未來收益,是執行所有動作的平均收益,那麼我們可以更加細化:用動作價值函數 表示狀態 下執行動作 的未來收益,那麼就有 ,這裏的 指的是策略,表示一系列決策過程,如在 下執行 動作,而 下執行 動作等等,直到最後一個狀態。注意此時的 已不是某個狀態下的平均收益,而是在 狀態下執行 動作後的收益。
那麼我們的決策目標就是找到一個最優策略 能夠最大化我們未來的收益,因此最大收益爲 ,也就是說在最優策略下,最優的動作價值函數是最大的,那麼很顯然,我們可以通過動態規劃構造滿足一個最優子結構的狀態關係:t時刻的最優Q值,等於t時刻的即時獎勵加上t+1時刻的最優Q值,即t+1時刻Q的最大值,如下:
那麼我們就可以利用上面的關係式去估計最優的Q值,因此更新Q-learning提供了以下對Q值的更新方法:
即每次用 作爲當前最優Q值的估計值,並計算這個估計值與當前Q值的差距(temporary difference)來指導當前Q值的更新,其中 表示更新的步長。
當然還有其他更新Q值的方法,如DQN,它用一個具有參數 的網絡去估計當前的Q值 ,並計算最優Q的估計值與當前Q值的歐式距離作爲損失函數:
來指導網絡的更新(梯度下降法),當然最主要的還是它使用一些其他的方法去穩定這個更新過程。
DQN:
兩個重要的突破:
1. experience reply: 把每步agent經歷狀態,獎勵,動作儲存到經驗池裏,然後mini-batch採樣來更新網絡,這樣可以打破樣本之間的強依賴,穩定網絡的更新
2. target network frezing: 每次迭代,計算Q的目標值 時使用的是target網絡的輸出,這個target網絡的參數會保持一段時間不變,在經過了一定的迭代步數後,實時更新的Q網絡參數會複製到target網絡中。這個好處也是能夠穩定訓練過程。
Double Q-network
在標準的Q學習中,Q的值是有很多噪音的,因此會給對Q的估計值帶來偏差。我們每次計算 時,選擇了target網絡中使Q值最大的動作,而且用這個最大Q值來更新網絡,此時,這個最大Q值可能是高估的overestimate,真實情況這個Q值其實沒那麼大,這種情況發生在我們每次只選擇樣本的最大值來估計隨機變量期望的最大值。解決方法就是引入訓練在不同樣本上的兩個網絡,一個用來選擇最優的動作,一個用來估計這個動作在這個狀態下的Q值,具體來說,用Q網絡選擇最優動作,用target網絡做估值,這樣可以減小overestimate, 所有就有Double Q-learning計算Q值
Prioritised replay
前面DQN,對經驗池的各個樣本是均勻採樣,而Prioritised replay對樣本的重要性進行了建模,計算每條樣本的更新距離 ,以所有的樣本的更新距離構建一個採樣分佈:更新距離大的樣本更容易被採樣,這樣就會讓網絡優先考慮那些差距大的樣本,加快訓練的收斂速度
Dueling Network
將DQN的輸出分爲狀態值和動作優勢的和 ,動作優勢 可以簡單理解爲這個動作 在狀態 下的優勢(advantage),我們選擇優勢大的動作執行,此時這個動作的Q值也是最大的,因爲每個動作的advantage都加上同樣的狀態值V纔等於Q值。
那麼直接在網絡的倒數第二層將V和A分開,然後在最後一層加起來這樣不就可以嗎?事實上這樣並不行:4.5+0.5=5,3+2=5,同樣等於5,但是相加的組合卻有很多種,而我們的V其實相當於Q的均值,是這個狀態的平均表現估計值,A相當於Q在V上的波動,代表每個動作的相對優勢,因此需要把兩部分固定,如對於Q=5,固定V在4.5左右,A在0.5上下波動;對於Q=6, V=5.6左右, A=0.5左右波動,那麼就有了以下做法:
這樣會強制V讓接近最優的Q值,即 ,因爲此時最好的A也只能讓後面的括號爲0,因此A的波動其實在一個小負值到零之間,爲了讓A更好可以被優化,比如我們一般喜歡讓變量在0附近優化,去除bias,因此可以讓A減去A的平均值,如下:
這樣對訓練過程的穩定和收斂都很有幫助。很多情況下,不管你採用什麼樣的action對下一步的狀態轉變是沒什麼影響的。主要是比如狀態很好的時候,狀態值V很大,這個時候選擇什麼樣的action都可以獲得較好的reward,也就是每個動作的A都差不多。所以這個時候,爲了制定策略,最好是把action的作用給提取出來,去除狀態值對於決策的影響,相當於減去了baseline,這樣模型對於action之間的即使細微的差別也更容易發現。
PG
前面的DQN都是基於Value值迭代的,計算每個動作的Q值,選擇Q值最大的動作執行,此外,我們還有一種基於policy迭代的方法,能夠直接對各個動作的概率進行建模,這種方法就是策略梯度policy gradient (PG),此時網路輸出的是各個動作的概率,在選擇動作時,直接進行均勻採樣,那麼概率大的動作更容易被採樣執行,更新的梯度爲: ,此時 代表的是未來真實的累計獎勵,然而我們在執行每一步的過程中,並不知道未來的累計獎勵(對於Model-free的方法 ),所以我們只能讓agent一直執行動作到一輪遊戲結束,再根據貝爾曼方程向前推導每一步的 ,然後對整個網絡進行更新,所以是基於episode的更新,這個算法就是著名的REINFORCE算法
Actor-critic
在上面PG中,我們可以用 來代替 值,因爲 其實就是最優獎勵 一個估計,因此我們可以得到策略梯度爲: ,但是我們如何在基於策略迭代的方法中獲得Q值呢,那麼就引出來actor-critic方法:用actor的輸出表示動作策略 ,用critic對 值建模,此時critic網絡的輸入是狀態s和選擇的動作a,這種方法同時結合了值迭代和策略迭代,實際表現最好
對於上面的Actor-critic方法,策略梯度 會存在一定的問題:對於每個動作,可能 都是正值,因此每個動作都會被鼓勵,只是鼓勵的幅度大小不同,爲了突出每個動作的相對優勢,我們的策略梯度改爲 ,此時我們的critic輸出的是 ,可以與actor共用feature層,而且動作優勢可以由狀態值和即時獎勵計算: 。用梯度策略更新完actor後,然後再用值迭代的方法更新critic
DPG
上面的動作狀態空間是離散的,但是如果動作空間是連續的,動作的個數無窮大,那麼上述就不適用了。所以對於連續狀態空間,更多的用的是決定性的策略梯度deterministic policy gradient (DPG),此時actor的輸出是動作的連續值,而critic的輸入是所有動作的連續值(actor的輸出值)和狀態,然後我們用值迭代方法更新critic,獲得的每個動作的梯度回傳到actor裏更新actor網絡