從俄羅斯方塊,邁向強化學習大門
小編說:強化學習在機器學習中的難度不低,它需要很多方面的知識輔助,同時自身也已經形成了一個龐大的體系。本文介紹了強化學習的基本概念,幫助讀者瞭解強化學習的目標和特點。本文選自《強化學習精要:核心演算法與TensorFlow實現》。
什麼是強化學習?
“強化學習”這個詞並不那麼容易理解,“強化”在這裡是一個動詞還是一個名詞,又或者是一個人名?還有人把它稱為“增強學習”,其實名字所表達的含義差不多,但總感覺這個名字並沒有很清楚地表達它想表達的含義,即使一些對強化學習有一定經驗的人也可能感到疑惑。
不得不承認,當今很多知識和概念都是從西方傳來的,強化學習也是一個“外來品”。它的英文是Reinforcement Learning,在英文辭典裡查詢reinforcement 這個詞,我們找到了下面的解釋:
something that strengthens or encourages something, such as a response to someone’s behavior that is intended to make that person more likely to behave that way again.
將英文翻譯後的大概意思是:“reinforcement”是一種“套路”,或者是某種方法,也可能是某種形式。它會強化或者鼓勵某個人或者某個事物以更高的可能性產生同樣的行為。當然,這裡的行為不只是讓某個人或事物去做某些事情,也可能是不去做某些事情,具體產生什麼樣的行為取決於使用什麼樣的“reinforcement”。
1 . 巴浦洛夫的狗
簡單地說,強化學習的完整含義是利用這種“套路”完成學習。這個抽象的概念還有一個心理學上的解釋,不禁讓筆者想起了一個經典的心理學實驗:巴浦洛夫的狗。在這個經典的實驗中,每次實驗者都對著狗搖鈴鐺,並給狗一點食物。久而久之,鈴鐺和食物的組合影響了狗的行為,此後每次對著狗搖鈴鐺,狗就會不由自主地流口水,並期待食物的到來,這樣實驗者就讓狗“學會”了鈴鐺和食物的關係,這也可以算作強化學習的一個簡單的例子。
瞭解了這個套路的一個具體例子,我們現在思考的是:能不能將這個套路的活動過程抽象成一個框架,使我們能更方便地將這個框架應用到更多的例項上呢?經過前輩們的苦心研究,最終我們得到了一個具有很高抽象度的強化學習框架。在“巴浦洛夫的狗”實驗中,我們發現了下面幾個關鍵要素。
狗:實驗的主角。
實驗者:負責操控和運轉實驗。
鈴鐺:給狗的一個刺激。
口水:狗對刺激的反應。
食物:給狗的獎勵,也是改變狗行為的關鍵。
接下來,我們要給上面的每個要素賦予一個抽象的名字。
實驗的主角:Agent。這個詞不好翻譯,一般翻譯為智慧體,但是這個翻譯更像意譯,和英文單詞本身的含義有點距離。
實驗的操控者:System Environment,一般翻譯為系統環境。
給Agent 的刺激(鈴鐺):Observation,一般翻譯為觀察值,但是在很多強化學習文獻中,會將其等價為狀態(State)。
Agent 的反應(口水):Action,一般翻譯為行動。
Agent 的獎勵(食物):Reward,一般翻譯為回報或者反饋。
在經典的強化學習中,智慧體要和環境完成一系列的互動。
(1)在每一個時刻,環境都將處於一種狀態。
(2)智慧體將設法得到環境當前狀態的觀測值。
(3)智慧體根據觀測值,結合自己歷史的行為準則(一般稱為策略,Policy)做出行動。
(4)這個行動會影響環境的狀態,使環境發生一定的改變。Agent 將從改變後的
環境中得到兩部分資訊:新的環境觀測值和行為給出的回報。這個回報可以是正向的,也可以是負向的。這樣Agent 就可以根據新的觀測值做出新的行動,這個過程如下所示。
可以想象,在實驗的早期,當實驗者對著狗搖鈴鐺時,狗並不會有任何準備進食的反應;隨著實驗的進行,鈴鐺和食物這兩個觀測內容不斷地刺激狗,使狗最終提高了準備進食這個行動的可能性。實際上,這樣的互動模式在很多場景下都會出現。
2 . 俄羅斯方塊
我們以一個經典的電子遊戲俄羅斯方塊為例,回顧強化學習的整個過程。
以與巴浦洛夫的狗相同的角度看待俄羅斯方塊遊戲,我們發現此時的實驗者就是遊戲製作團隊,而被實驗的物件就是玩家。實驗者通過構建一個俄羅斯方塊遊戲的環境,強化玩家一些行為的可能性。控制玩家行為的關鍵在於遊戲的得分機制,由於我們明確了玩家的目標是儘可能地獲得更高的分數,那麼遊戲團隊對什麼樣的行為強化,玩家就傾向於產生什麼樣的行為。
從上面的描述中我們發現,如果遊戲團隊對消除方塊的行動給予強化,那麼玩家將更傾向於產生消除方塊的行為;如果遊戲團隊對不消除方塊的行動給予強化,玩家會更傾向於產生不消除方塊的行為,當然這樣會更快地結束遊戲。如果遊戲團隊只對某種特定的消除方塊行為(例如,用“豎條”一次性消除多行方塊)給予較大的強化,那麼玩家會盡可能地產生這種行為,其他消除方塊技巧的使用頻率會降低。實際上,俄羅斯方塊這款遊戲就是採用了這樣的設計方案。
我們通過兩個例子闡述了強化學習的核心思想:通過某種手段影響被實驗者的行為。為了實現這個目標,實驗者需要構建一個完整的實驗環境,通過給予被實驗者一定的觀測和回報,讓其產生實驗者想要的結果。
理解了這個思想,就算邁進了強化學習的大門。
強化學習效果的評估
下面我們介紹強化學習的兩個顯著特點,正是這兩個特點使得它與其他學習方法存在不同。
1 . 不斷試錯
前面提到強化學習通過一些手段影響Agent 的行動,這實際上是站在環境或實驗者的角度來看的。如果站在Agent 的角度,就是另外一幅景象:根據環境狀態給出行動的Agent 有時會收到較多回報,有時回報較少,回報可以以數值的形式標示,那麼Agent還可能收到負的回報。究竟怎樣才能獲得最多的回報呢?Agent 自己並不知道,“實驗者”也不會告訴Agent。所以Agent 需要根據回報的多少不斷地調整自己的策略,從而儘可能多地獲得回報。這個過程中Agent 需要不斷嘗試,嘗試應對狀態的各種可能的行動,並收集對應的回報,只有收集到各種反饋資訊,才能更好地完成學習任務。因此這是一個不斷試錯(Trial and Error)的過程,只有經過嘗試、遇到失敗,才能獲得最終的成功。
2 . 看重長期回報
強化學習的任務通常需要長時間的互動,比如上面提到的俄羅斯方塊遊戲,玩家與遊戲互動的週期可以是一局遊戲。在這樣的時間跨度下,眼前一步或兩步操作獲得的回報就變得沒那麼重要了。前面也提到,俄羅斯方塊對同時消除不同層數方塊的獎勵不同,分4 次消除一行方塊得到的分數遠遠小於一次消除4 行方塊得到的分數。消除一行方塊比較簡單,只需要幾個方塊就可以做到;而消除4 行方塊就比較困難,需要前期方塊的累積和準確地擺放一根豎棍。更難的方塊擺放也使玩家更快地積累分數,從而更快贏得勝利,這和遊戲設計者的初衷一致。因此,從更長遠的角度看,玩家要學習如何一次消除多行,而不是追逐短期的得分。當然,追求長期分數需要多探索、多嘗試,也可能遇到更多的失敗(例如沒等到豎棍出現),所以看重長期回報和不斷試錯存在一定的一致性。
正因為這兩個特點,我們在評價強化學習演算法的優劣上與其他演算法不同。除了一些常見的衡量指標(演算法的效果、計算時間、穩定性和泛化性等),我們還要重點考慮一個指標:學習時間。由於學習和嘗試相關,所以這個指標一般也看作嘗試和探索的次數。如果一個演算法需要嘗試的次數比較多,我們一般認為演算法要花費的時間比較長;如果一個演算法需要嘗試的次數比較少,那麼相對來說花費的時間比較短。
站在機器學習的角度,我們可以認為嘗試的樣本本身會影響學習的時間,例如樣本的代表性、重合度等。對強化學習來說,由於學習本身的特點,我們需要考慮訓練樣本的使用率(Sample Efficiency)。不同演算法對樣本的重複使用次數不同,有的演算法對於嘗試的樣本只能使用一次,而有的演算法可以反覆使用同樣的樣本。
訓練樣本的使用率會直接影響學習時間。前面提到Agent 的學習樣本要通過自身與環境的互動得到,而這個過程是要花費時間的。需要的樣本量少,學習時間就可以縮短;反之學習時間會比較長。對計算機模擬的學習問題來說,樣本量並不算個大問題,因為計算機可以在短時間內快速模擬出大量的樣本;但是對於在真實場景進行訓練的問題來說,產生樣本意味著要在真實世界的時間尺度下進行互動,花費的時間會很長。
為了一點效果的提升花費大量的時間,對我們來說有點得不償失。因此,很多研究人員都在思考如何提高真實世界學習的速度,這就涉及提高樣本利用率、遷移學習等內容。這樣我們就瞭解了強化學習關注的兩個目標:學習效果和學習時間。
本文節選自《強化學習精要:核心演算法與TensorFlow實現》
馮超 著
相關文章
- 俄羅斯方塊練習
- canvas實現俄羅斯方塊Canvas
- 俄羅斯方塊(JS+CSS)JSCSS
- Tetris 俄羅斯方塊遊戲遊戲
- wxpython入門第十一步(俄羅斯方塊)Python
- 【Java遊戲】java俄羅斯方塊!Java遊戲
- Flutter Web 實戰 - 俄羅斯方塊FlutterWeb
- 使用JavaScript實現一個俄羅斯方塊JavaScript
- 初學者——Java之實現簡易俄羅斯方塊Java
- 最新《 java實戰開發俄羅斯方塊教程》Java
- Python 實戰開發俄羅斯方塊遊戲Python遊戲
- 基於Flutter的俄羅斯方塊小遊戲Flutter遊戲
- 如何讓 Emacs 俄羅斯方塊變得更難Mac
- 基於MonoGame重製《俄羅斯方塊》遊戲MonoGAM遊戲
- c#實現簡單的俄羅斯方塊C#
- 俄羅斯方塊聯機小遊戲的實現遊戲
- 如何讓AI教機器自己玩俄羅斯方塊?AI
- 前端筆記之JavaScript物件導向(四)元件化開發&輪播圖|俄羅斯方塊實戰前端筆記JavaScript物件元件化
- 用React、Redux、Immutable做俄羅斯方塊 | 掘金技術徵文ReactRedux
- 俄羅斯方塊歷史發展與變革創新
- 使用C#和MonoGame開發俄羅斯方塊遊戲C#MonoGAM遊戲
- Python:遊戲:300行程式碼實現俄羅斯方塊Python遊戲行程
- 函數語言程式設計嘗試之俄羅斯方塊函數程式設計
- “漢字俄羅斯方塊”《一字不落》今日上架Steam
- 為了上班摸魚我用Python製作了俄羅斯方塊?Python
- python開發俄羅斯方塊小遊戲程式碼例項Python遊戲
- [分享]純python3手寫Tetris(俄羅斯方塊)遊戲Python遊戲
- 300行Python程式碼實現俄羅斯方塊,致敬逝去的童年Python
- 用 SQL 寫的俄羅斯方塊遊戲「GitHub 熱點速覽」SQL遊戲Github
- pyqt5製作俄羅斯方塊小遊戲-----原始碼解析QT遊戲原始碼
- 俄羅斯一所大學通過區塊鏈儲存文憑區塊鏈
- 俄羅斯玩偶
- 俄羅斯:‘區塊鏈屬於我們’區塊鏈
- 回顧「俄羅斯方塊」曾經的一段蒸汽波時代
- 《俄羅斯方塊》系列 35 週年 一窺遊戲歷年玩法演變遊戲
- 超越《俄羅斯方塊》後,《我的世界》想打造一個更具野心的世界
- Python3+pygame實現的俄羅斯方塊 程式碼完整 有演示效果PythonGAM
- 【補檔STM32】STM32F103俄羅斯方塊遊戲實現遊戲