當前位置:
首頁 > 科技 > 強化學習如何更好理解?只需要看懂《權利的遊戲》就行了!

強化學習如何更好理解?只需要看懂《權利的遊戲》就行了!

GIF/1.7M

來源:becominghuman.ai

作者:Jaley H Dholakiya

「機器人圈」編譯:BaymaxZ

如果各位圈友對強化學習十分感興趣,又觀看過《權利的遊戲》(Game of Thrones,簡稱GOT)的話(最好是1-7季),這個博客就太適合不過了。

強化學習!聽起來很時髦,不是嗎?嗯,確實是。想像一下,如果你可以教一台機器如何在一個環境中,基於獎勵或懲罰來行事。就像孩子們被火燙過一次,就能學會力篝火遠一點一個道理。但它實際上如何工作的呢。

簡述強化學習

我們將「風暴降生」丹妮莉絲·坦格利安(Daenerys Targaryen)視為我們關注的智能體(agent),我們都知道當她說「dracary」時會發生什麼(指龍母噴火)。憤怒被釋放,環境亦發生變化。每次情況變化都會對丹妮莉絲或智能體造成獎勵/懲罰(reward/penalty)。這提高了她的策略(policies),並且與提利昂·蘭尼斯特(Tyrion Lannister)一起採取更好的動作。在憤怒之後,她轉移到一個新的王國或下一個狀態(state)。在了解強化學習之前,先學習這幾個常用的術語,這一點很重要。

必須知道的強化學習中的術語

1.狀態值函數:Vs

對於一個給定的策略和環境,它在一個狀態中有多好?它可以回答約翰·斯諾(John Snow)正在徘徊的問題……哪個州/地方更有價值,臨冬城或龍石島?

2.動作值函數:Va(s)

對於給定的策略和環境,從狀態s採取動作a有多好?

獎勵和懲罰

在我們討論深入的事情之前,讓我們明白,什麼是獎勵。獎勵是與達成狀態有關的獎金。它就像牛仔一樣,把所有的山羊從牧場趕下山就能得到獎勵。這也很像在的臉書上發布文章時你大腦分泌的多巴胺。R(R(St))代表立即獎勵,還有折扣獎勵r(r(St)=R(St)+γ*R(S)+ gamma2 R(S_)...)。折扣獎勵更像是你在Facebook上發布有爭議的帖子時所得到的,即時獎勵是好的,但未來的回報是非常負面的,最終使你重新思考發布的內容。折扣是你計算中要考慮的未來數量。γ= 1,意味著你將來會考慮一切,而γ= 0表示你根本不考慮未來,只關心立即的回報。在實際情況下,我們保持在0.9左右。

馬可夫鏈與君臨(King's landing)

我們都知道瘋王(指伊里斯·坦格利安二世)的故事吧?君臨(King』s Landing)是高度戰鬥的地方。現在,我們假設只有兩個國家競爭——蘭尼斯特斯(Lannisters)和史塔克(Starks)。現在假設史塔克正掌握著它。他們將來掌握它的可能性是多少?馬可夫鏈將告訴我們答案。

看下面的代碼:

import numpy as np # S: State Value of house : Its probability of retaining kings landing # P: Transition Matrix : from houseA to houseB, what is probability of transistion. houses = ["lannisters","starks"] S = {"lannisters": 0, "starks":1} P = {"from_lannisters":{"to_lannisters": 0.8, "to_starks" : 0.2 }, "from_starks": {"to_starks": 0.1, "to_lannisters": 0.9}} for i in range(5): lannisters_future_stateval, starks_future_stateval = 0,0; lannisters_future_stateval = S["lannisters"]*P["from_lannisters"]["to_lannisters"]+ S["starks"]*P["from_starks"]["to_lannisters"]; starks_future_stateval = S["lannisters"]*P["from_lannisters"]["to_starks"]+ S["starks"]*P["from_starks"]["to_starks"]; S["lannisters"]=lannisters_future_stateval S["starks"] = starks_future_stateval print "Voila, '%s' have been winners with %0.2f%% probability to be in king's landing "%(max(S, key=S.get),100*max(S.values()))

在上面的代碼中,S被初始化為[0,1],這意味著史塔克正掌握它。P代表轉移概率矩陣。因此,P [「from_lannisters」] [「to_starks」]表示史塔克繼承君臨的概率。我們來看看君臨歷史上的一系列事件。

Lannisters - > Starks - > Lannisters- > Lannisters - > Lannisters - > Starks - > Lannisters - >Lannisters - >…

這個連續的繼承是由過渡矩陣來模擬和解釋的。我們感興趣的是,史塔克或蘭尼斯特斯的穩定狀態值在君臨。所以我們開始以史塔克為統治者,但把歷史真理放在首位,以決定君臨的命運。我們發現,蘭尼斯特斯在任何時候在君臨的概率都是81%。你也可以使用它來模擬你的飲食習慣。

貝爾曼最優性方程

馬爾科夫過程的貝爾曼最優性方程式,我們可以把它比喻成有七個國家打仗。知道哪個王國有陰謀的最好辦法就是:

·步驟1:給每個王國一個數字(初始狀態值)

·步驟2:根據我對鄰居王國的攻擊概率(由以往記錄)更新值

V(蘭尼斯特斯)= p(攻擊臨冬城)* [攻擊臨冬城的即時獎勵+γ*臨冬城的狀態值] +其他鄰國也相同……

·步驟3:重複直到收斂。

我們故意留下開放式方程,因為方程式根據需要和模式不斷變化。所有你需要記住的是,有一些圖形評估發生在狀態,以獲得狀態值。這個值神秘地捕捉和吸收了所有關於獎勵等的判斷所需要的信息。從馬可夫特性直接得出,如果提供了現在的狀態價值,那麼它將以前的狀態分解成下一個狀態。

約翰?斯諾之旅的馬可夫獎勵流程

記得第一次當火和冰見面嗎?我正在談論的是約翰?斯諾與丹妮莉絲?坦格利安相見!其實,我們正在談論他從龍石島回到牆外。該部分在劇中本身非常簡短。所以這裡的狀態是[龍石島,白港,臨冬城]。你可以通過步行去臨冬城,或者你可以通過航海去白港,然後去臨冬城。但是,在白港潛伏的間諜和海盜一直存在著危險。

馬爾科夫的獎勵過程並不是什麼新鮮事物,與之前的馬可夫鏈相同,捆綁著與達成狀態相關的即時獎勵(在我們的案例中,它表示到達了臨冬城,到達白港等)。我們計算的是,約翰·斯諾在某個特定的狀態/地方有多大的獎勵?換句話說,我們將計算「狀態值」,它代表了在這個狀態的獎勵。

# Markov Reward Process Example # Finding Rewarding states for journey of John Snow from dragonstone to winterfell import numpy as np import copy S ={"dragonstone": 1,"whiteharbor":1, "winterfell":1} # Active States T=["alive-terminal","dead-terminal"] # Terminal States R = {"dragonstone": 0,"whiteharbor":10, "winterfell":50,"alive-terminal":100,"dead-terminal":-50} P ={"from_dragonstone":{"to_whiteharbor":0.5,"to_winterfell":0.1,"to_dead-terminal":0.4}, "from_whiteharbor":{"to_winterfell":0.1,"to_dead-terminal":0.9}, "from_winterfell":{"to_alive-terminal":0.9,"to_dead-terminal":0.1}} # Probabilistic Transition Matrix gamma = 0.1 for i in range(45): S1 = copy.copy(S); for castle in S1.keys(): reward =0; from_castle='from_'+castle future_states = P[from_castle] for to_castle in future_states: reward=reward+P[from_castle][to_castle]*R[to_castle[3:]]; S1[castle] = S[castle]+ gamma*(reward-S1[castle]) S = copy.copy(S1); print S

請注意,在上述馬爾科夫獎勵過程中,我們在任何時候沒有決策我們的行為。我們只是評估給定環境的狀態值(即轉換矩陣,即時獎勵)。該策略僅在馬爾科夫決策過程的背景下形成,而不是馬爾科夫獎勵過程。當我們動作有自由時,決策的權利就來了。讓我們來看馬爾可夫決策過程。

馬爾可夫決策過程——是時候動作了!

MDP和MRP在數學上是相似的,但上下文將它們分開。MDP為你提供選擇。我們學習在MDP中採取特定動作的策略。可以通過以下兩種方法學習MDP:值迭代、策略迭代。

在值迭代中,你不會單獨學習策略。你一直在考慮從給定狀態的最有益的動作作為策略,並同時使用它來更新狀態值。它往往會慢一些,因為我們一次又一次地改變最佳動作(對於一個給定的狀態),導致擾動。它最終會收斂,但是所花費的時間一般不會超過策略迭代。與值迭代不同,策略迭代選擇策略(來自一個狀態的一組動作),對其進行評估,直到收斂。一旦值收斂,我們選擇一種基於值的狀態穩定值的新策略,然後評估新策略。我們一直這樣做,直到策略沒有變化。你可以看到,這裡有兩個步驟:策略評估和策略更新。看看下邊那個很酷的示例代碼,以了解不同之處。

約翰·斯諾回家路線

約翰·斯諾打算攜帶MDP機器告訴他,哪個動作在某個地方/狀態是最好的。他可以採取的動作一般是通過陸地、海上或龍。對於每個動作,有可能在不同的地方/狀態降落。我們將會學到的是從任何狀態/地方選擇的最佳策略。代碼可以自解釋,所以你可以在jupyter上運行這個代碼,自己就知道是怎麼回事了。我假設你們都安裝了numpy,這聽起來很合理。

值迭代

# Markov Decision Process Example import numpy as np import copy S ={"dragonstone": 1,"whiteharbor":1, "winterfell":1} # Active States T=["alive-terminal","dead-terminal"] # Terminal States R = {"dragonstone": 0,"whiteharbor":10, "winterfell":50,"alive-terminal":100,"dead-terminal":-50} P ={"from_dragonstone":{"land":{"to_winterfell":0.5,"to_dead-terminal":0.5}, "sea":{"to_whiteharbor":0.1,"to_dead-terminal":0.9}, "dragon":{"to_winterfell":0.95,"to_dead-terminal":0.05}}, "from_whiteharbor":{"land":{"to_winterfell":0.6,"to_dead-terminal":0.4}}, "from_winterfell":{"land":{"to_alive-terminal":0.9,"to_dead-terminal":0.1}}} gamma = 0.1 A ={"from_dragonstone":{"land":1, "sea":1, "dragon":1}, "from_whiteharbor":{"land":1}, "from_winterfell":{"land":1}} Policy = {"from_dragonstone":"land","from_whiteharbor":"land","from_winterfell":"land"} # Solution by Value Iteration for i in range(15): S1 = copy.copy(S); for castle in S1.keys(): from_castle='from_'+castle future_states = P[from_castle] action_reward={} for action in A[from_castle]: reward =0; for to_castle in future_states[action]: reward=reward+P[from_castle][action][to_castle]*R[to_castle[3:]]; action_reward[action]=reward Policy[from_castle]=max(action_reward,key=action_reward.get) S1[castle] = S[castle]+ gamma*(max(action_reward.values())-S1[castle]) S = copy.copy(S1); print 'Value Function',S print 'Learned Policy',Policy

策略迭代

# Markov Decision Process Example import numpy as np import copy S ={"dragonstone": 1,"whiteharbor":1, "winterfell":1} # Active States T=["alive-terminal","dead-terminal"] # Terminal States R = {"dragonstone": 0,"whiteharbor":10, "winterfell":50,"alive-terminal":100,"dead-terminal":-50} P ={"from_dragonstone":{"land":{"to_winterfell":0.5,"to_dead-terminal":0.5}, "sea":{"to_whiteharbor":0.1,"to_dead-terminal":0.9}, "dragon":{"to_winterfell":0.95,"to_dead-terminal":0.05}}, "from_whiteharbor":{"land":{"to_winterfell":0.6,"to_dead-terminal":0.4}}, "from_winterfell":{"land":{"to_alive-terminal":0.9,"to_dead-terminal":0.1}}} gamma = 0.1 A ={"from_dragonstone":{"land":1, "sea":1, "dragon":1}, "from_whiteharbor":{"land":1}, "from_winterfell":{"land":1}} Policy = {"from_dragonstone":"land","from_whiteharbor":"land","from_winterfell":"land"} #Solution by Policy Iteration Policy = {"from_dragonstone":"land","from_whiteharbor":"land","from_winterfell":"land"} for i in range(50): S1 = copy.copy(S); #Step 1 : Update Value Fuction for castle in S1.keys(): from_castle='from_'+castle future_states = P[from_castle] action = Policy[from_castle] #Based on policy for to_castle in future_states[action]: reward=reward+P[from_castle][action][to_castle]*R[to_castle[3:]]; action_reward[action]=reward S1[castle] = S[castle]+ gamma*(reward-S1[castle]) S = copy.copy(S1); #Step 2 : Update Policy for castle in S1.keys(): from_castle='from_'+castle future_states = P[from_castle] action_reward={} for action in A[from_castle]: reward =0; for to_castle in future_states[action]: reward=reward+P[from_castle][action][to_castle]*R[to_castle[3:]]; action_reward[action]=reward Policy[from_castle]=max(action_reward,key=action_reward.get) #Update Policy print 'Value Function',S print 'Learned Policy',Policy


點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器人圈 的精彩文章:

DeepMind與牛津聯合授課並開放全部學習資料
如何快速掌握機器學習和Python?你一定需要這27張清單
AWD-LSTM語言模型是如何實現的
漲姿勢!「手動」調試神經網路,可以這樣做
從線性回歸到神經網路,機器學習工程師的進階之路

TAG:機器人圈 |

您可能感興趣

如何唱歌好聽?理解了這些你也行!
怎樣從挫折中讓自己變的更強大?|心理解讀
你所理解的努力是什麼樣的?
社會精英、行業翹楚的成就和所得難道不是智相應的造作嗎?該如何理解呢?
凡事何必都看淡,自己理解就很好
為什麼要帶孩子去旅行,如何讓他理解旅行的意義?
強迫症的人們,該如何理解和懂他們呢?
凡事看淡,不如自己理解就好
搞笑漫畫:細思極恐,你看到懂了他們師徒理解的意思了嗎?
感情不就是需要理解和磨合的嗎
你是如何理解遊戲中的「手感」的?
「堅持夢想有什麼不對的呢」:就算不被理解,也要勇敢追求啊
你是怎樣理解健身的呢? 一定要正確的理解它, 不要曲解!
怎樣撫摸狗才能讓它開心?很多新手寵主都理解錯了,你做對了嗎?
荒野行動:那些最無法理解的玩家背包,你一定看不懂!
《都挺好》大結局:理解了蘇大強,也就看懂了人性
愛過了就好!塗磊對愛情的理解,教你如何愛人
為什麼要理解並如何理解人性?
忍讓真的能換來他的理解嗎?女人你可以善良,但是不要太大方了!
如何過上良好的生活?看看這個哲學學派是如何理解和對待的