介紹
目前,對於全球科學家而言,“如何去學習一種新技能”成為了一個最基本的研究問題。為什么要解決這個問題的初衷是顯而易見的,如果我們理解了這個問題,那么我們可以使人類做一些我們以前可能沒有想到的事。或者,我們可以訓練去做更多的“人類”工作,常遭一個真正的人工智能時代。
雖然,對於上述問題,我們目前還沒有一個完整的答案去解釋,但是有一些事情是可以理解的。先不考慮技能的學習,我們首先需要與環境進行交互。無論我們是學習駕駛汽車還是嬰兒學習走路,學習都是基於和環境的相互交互。從互動中學習是所有智力發展和學習理論的基礎概念。
強化學習
今天,我們將探討強化學習,這是一種基於環境相互交互的學習算法。有些人認為,強化學習是實現強人工智能的真正希望。這種說法也是正確的,因為強化學習所擁有的潛力確實是巨大的。
目前,有關強化學習的研究正在快速增長,人們為不同的應用程序生成各種各樣的學習算法。因此,熟悉強化學習的技術就變得尤其重要了。如果你還不是很熟悉強化學習,那么我建議你可以去看看我以前有關強化學習文章和一些開源的強化學習平台。
一旦你已經掌握和理解了強化學習的基礎知識,那么請繼續閱讀這篇文章。讀完本文之后,你會對強化學習有一個透徹的了解,並且會進行實際代碼實現。
注:在代碼實現部分,我們假設你已經有了Python的基本知識。如果你還不知道Python,那么你應該先看看這篇教程。
1. 確定一個強化學習問題
強化學習是學習如何去做,如何根據與環境的交互采取相應的行動。最終的結果就是使得系統的回報信號數值最大化。學習者不會被告知去執行哪個行動,而是要他自己去發現哪種行動將產生最大的回報。讓我們通過一個簡單的例子來解釋一下:
我們將一個正在學習走路的孩子作為一個例子。
以下是孩子在學習走路時所要采取的步驟:
1.孩子會觀察的第一件事,就是注意你是如何走路的。你使用兩條腿,一次走一步,一步一步往前走。孩子會抓住這個概念,然后試圖去模仿你。
2.但很快他/她又會明白,在走路之前,孩子必須先站起來!在學習走路的時候,這對於孩子來說是一個挑戰。因此,孩子試圖自己站起來,他/她不斷跌倒,但是任然不斷地站起來。
3.然而還有另外一個挑戰需要應付。站起來是相對容易的,但是要保持站立狀態就是另一個挑戰了。在一個狹小的空氣中,找到支撐,孩子設法保持站立。
4.現在,孩子的真正任務就是開始學習走路了。但是學習走路說起來很容易,而實際做起來就不是那么容易了。在孩子的大腦中需要處理很多事情,比如平衡身體,決定哪個腳是下一次需要放下的,放在哪里。
這聽起來像是一個很困難的任務,對嗎?它實際上確實是一個挑戰,先要學習站立,然后才能學習行走。但是,現在我們不都學會了走路嘛,再也不會被這個問題所困擾了。現在,你可以明白,為什么這對於孩子是多么困難的原因了。
讓我們形式化上面的例子。例子所要陳述的問題是“走路問題”,其中孩子是一個試圖通過采取行動(走路)來操縱環境(在地上走路)的智能體,他/她試圖從一個狀態(即,他/她走的每一步)轉移到另一個狀態。當他/她完成任務的一個子模塊(即,孩子走了幾步)時,孩子會獲得獎勵(比如,一些巧克力),但是當他/她不會走路時,他/她不會收到任何巧克力(這是一個負反饋過程)。這就是像話學習問題的簡單描述。
這是一個有關強化學習很好的介紹視頻。
2. 與其他機器學習方法的比較
強化學習屬於更打雷的機器學習算法。以下是有關機器學習算法類型的描述。
讓我們比較一下強化學習算法和別的類型算法之間的區別:
- 監督學習與強化學習:在監督學習中,在外部有一個“監督主管”,它擁有所有環境的知識,並且與智能體一起共享這個知識,從而幫助智能體完成任務。但是這樣存在一些問題,因為在一個任務中,其中存在如此多的子任務之間的組合,智能體應該執行並且實現目標。所以,創建一個“監督主管”幾乎是不切實際的。例如,在象棋游戲中,存在數萬個可以移動的玩法。因此,去創建一個可以獲勝的玩法知識庫是一個單調乏味的任務。在這些問題中,從自己的經驗中學習,並且獲得知識是更加合理可行的。這就是強化學習和監督學習的主要區別。在監督學習和強化學習中,在輸入和輸出之間都存在映射。但是在強化學習中,存在的是對智能體的獎勵反饋函數,而不是像監督學習直接告訴智能體最終的答案。
- 無監督學習與強化學習:在強化學習中,有一個從輸入到輸出的映射過程,但是這個過程在無監督學習中是不存在的。在無監督學習中,主要任務是找到一個最基礎的模式,而不是一種映射關系。例如,如果任務是向用戶推薦新聞文章,則無監督學習算法是先查看該人以前讀過的類似文章,並把它們推薦給其他人。而強化學習算法則是,通過用戶的一些文章,並且獲得用戶的不斷反饋,從而構建一個“知識圖譜”,從而得知用戶與文章之間的喜愛關系。
還有第四種類型的機器學習,成為半監督學習,其本質上是監督學習和無監督學習的組合。它不同於強化學習,類似於監督學習和半監督學習具有直接的參照答案,而強化學習不具有。
3.解決強化學習問題的框架
為了理解如何去解決一個強化學習問題,讓我們通過一個經典的例子來說明一下強化學習問題——多臂賭博機。首先,我們需要了解探索與開發的基本問題,然后去定義解決強化學習問題的框架。
Tiger Machine如上圖,假設你已經在Tiger Machine上面玩了很多次了。
現在你想做的是從Tiger Machine上面獲得最大的回報,並且盡可能的快。你會怎么做呢?
一個比較天真的想法是,只選擇一個Tiger Machine,然后一整天都在玩它。這聽起來非常無聊,但Tiger Machine可能會給你一些“報酬”,即讓你贏錢。使用這種方法,你可能中獎的概率大約是0.00000.....1。也就是說,大多數時間你可能知識坐在Tiger Machine面前虧錢。正式說明一下,這可以被定義為一種純粹的開發方法。但是這是最佳選擇嗎?答案當然是否定的。
讓我們看看另外一種方法。我們可以拉每個Tiger Machine的拉桿,並且向上帝祈禱,讓我們至少打中一個。當然,這是另一種天真的想法,你只會一天都在拉動拉桿,但只是給你一點點報酬。正式說明一下,這種方法只是一種純粹的探索方法。
這兩種方法都不是最優的,我們必須在它們之間找到適當的平衡點,已獲得最大的回報。這被稱為強化學習的探索和開發困境。
首先,我們正式的定義解決強化學習問題的框架,然后列出可能的方法來解決這個問題。
馬爾科夫決策過程:
在強化學習場景中,我們定義問題的數學框架被稱之為馬爾科夫決策過程。這可以被設計為:
- 狀態集合:S
- 動作集合:A
- 獎勵函數:R
- 策略:π
- 價值:V
我們必須采取一定的行動(A),讓我們從開始狀態移動到結束狀態(S)。每當我們采取一個行動之后,我們都會得到一定的回報作為獎勵。當然,所獲得的獎勵的性質(正面獎勵還是負面獎勵)是由我們的行動決定的。
我們的策略集合(π)是由我們的動作集合來確定的,而我們得到的回報確定了我們的價值(V)。在這里,我們的任務就是通過選擇正確的策略來最大化我們的價值。所以我們必須最大化下面的方程:
對於時間t,所有可能的S。
旅行推銷員問題
讓我們通過另外一個例子來說明一下。
這個問題是一系列旅行商(TSP)問題的代表。任務是以盡可能低的成本,完成從地點A到地點F。兩個字母之間的每條邊上的數字表示兩地之間的距離花費。如果這個值是負數,那么表示經過這條路,你會得到一定的報酬。我們定義價值是當你用選擇的策略走完整個路程時,所獲得的總價值。
這里說明一下符號:
- 狀態節點集合:{A,B,C,D,E,F}
- 動作集合是從一個地點到另一個地點:{A->B, C->D, etc}
- 獎勵函數是邊上的值
- 策略函數指的是完整的路徑規划,比如: {A -> C -> F}
現在假設你在地點A,唯一你能看見的路就是你下一個目的地(也就是說,你只能看見B,D,C,E),而別的地點你是不知道的。
你可以采取貪心算法,去獲取當前狀態下最有利的步驟,也就是說你從{A -> (B,C,D,E)}中選擇采取 {A->D} 這種方法。同樣,現在你所在的地點是D,想要到達地點F。你可以從{D -> (B, C, F)} 中采取 {D -> F} 這個方法,可以讓你得到最大的報酬。因此,我們采取這一條路。
至此,我們的策略就是采取{A -> D -> F},我們獲得的回報是-120。
恭喜!你剛剛就實現了強化學習算法。這種算法被稱之為 epsilon 貪婪算法。這是一種逐步測試從而解決問題的貪婪算法。現在,如果見你(推銷員)想再次從地點A到地點F,你總是會選擇這一條路了。
其他旅游方式?
你能猜出我們的策略是屬於哪個類別(純粹的探索還是純粹的開發)嗎?
請注意,我們采取的策略並不是一個最佳策略。我們必須“探索”一點,然后去尋找最佳的策略。在這里,我們采取的方法是局域策略的而學習,我們的任務是在所有可能的策略中找到最佳的策略。有很多的方法都可以解決這個問題,在這里,我們簡要的列出一些主要類別:
- 策略優先:我們的重點是找到最佳的策略
- 回報優先:我們的重點是找到最佳的回報價值,即累計獎勵
- 行動優先:我們的重點是在每個步驟上采取最佳行動
在以后的文章中,我會深入討論強化學習算法。到那時,你可以參考這篇關於強化學習算法調研的論文。
4.強化學習的實現
接下來,我們將使用深度Q學習算法。Q學習是一種基於策略的學習算法,它具有和神經網絡近似的函數表示。這個算法被Google使用,並且打敗了Atari游戲。
讓我們看看Q學習的偽代碼:
1.初始化價值表 ‘Q(s, a)’.
2.觀察當前的狀態值 ‘s’.
3.基於動作選擇一個策略(例如,epsilon貪婪)作為該狀態選擇的動作.
4.根據這個動作,觀察回報價值 ’r’ 和下一個新的狀態 s.
5.使用觀察到的獎勵和可能的下一個狀態所獲得的最大獎勵來更新狀態的值。根據上述公式和參數進行更新。
6.將狀態設置為新的狀態,並且重復上述過程,直到達到最終狀態。
Q學習的簡單描述可以總結如下:
我們首先來了解一下 Cartpole 問題,然后繼續編寫我們的解決方案。
當我還是一個孩子的時候,我記得我會選擇一根木棍,並試圖用一只手指去使它保持平衡。我和我的朋友過去有這樣一個比賽,看誰能讓木棍保持平衡的時間更多,誰就能得到一塊巧克力作為獎勵。
這里有一個簡單的視頻來描述一個真正的 Cart-Pole 系統。
讓我們開始編寫代碼吧!
在開始編寫之前,我們需要先安裝幾個軟件。
步驟一:安裝 keras-rl包
在終端中,你可以運行以下命令:
git clone https://github.com/matthiasplappert/keras-rl.git cd keras-rl python setup.py install
步驟二:安裝CartPole環境的依賴
我們假設你已經安裝好了pip,那么你只需要使用以下命令進行安裝:
pip install h5py
pip install gym
步驟三:開始編寫代碼
首先我們需要導入一些我們需要的模塊
import numpy as np import gym from keras.models import Sequential from keras.layers import Dense, Activation, Flatten from keras.optimizers import Adam from rl.agents.dqn import DQNAgent from rl.policy import EpsGreedyQPolicy from rl.memory import SequentialMemory
然后,設置相關變量
ENV_NAME = 'CartPole-v0' # Get the environment and extract the number of actions available in the Cartpole problem env = gym.make(ENV_NAME) np.random.seed(123) env.seed(123) nb_actions = env.action_space.n
之后,我們來構建一個非常簡單的單層神經網絡模型。
model = Sequential() model.add(Flatten(input_shape=(1,) + env.observation_space.shape)) model.add(Dense(16)) model.add(Activation('relu')) model.add(Dense(nb_actions)) model.add(Activation('linear')) print(model.summary())
接下來,我們配置和編譯我們的智能體。我們將策略設置為 Epsilon 貪婪,我們還將我們的存儲空間設置為序列存儲,因為我們要需要存儲我們執行操作的結果和每一個操作所獲得的獎勵。
policy = EpsGreedyQPolicy() memory = SequentialMemory(limit=50000, window_length=1) dqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory, nb_steps_warmup=10, target_model_update=1e-2, policy=policy) dqn.compile(Adam(lr=1e-3), metrics=['mae']) # Okay, now it's time to learn something! We visualize the training here for show, but this slows down training quite a lot. dqn.fit(env, nb_steps=5000, visualize=True, verbose=2)
現在,讓我們來測試一下我們的強化學習模型
dqn.test(env, nb_episodes=5, visualize=True)
下圖是模型的輸出結果:
瞧,你剛剛就建立了一個強化學習機器人!
5.增加復雜性
現在,你已經看到了強化學習的一個基本實現,讓我們開始學習更多的問題吧,每次增加一點點復雜性。
漢諾塔問題
對於那些不知道比賽的人來說,漢諾塔問題是在1883年發明的。它是由3根木棍和一系列大小不一的圓盤組成的(比如,上圖中的3個)。從最左側的木棍開始,目的是以最少的移動次數,把最左邊的圓盤移動到最右邊的圓盤上。
如果我們要處理這個問題,那么我們先從處理狀態開始:
- 初始狀態:三個圓盤都在最左邊的木棍上(從上到下,依次編號為1,2,3)
- 結束狀態:三個圓盤都在最右邊的木棍上(從上到下,依次編號為1,2,3)
所有可能的狀態:
這里是我們可能得到的27種狀態:
其中,(12)3* 表示,圓盤1和圓盤2在最左邊的木棍上面(從上往下編號),圓盤3在中間那個木棍上面,最右邊的木棍沒有圓盤。
數值獎勵:
由於我們想要以最少的移動步數解決這個問題,所以我們可以給每個移動賦予 -1 的獎勵。
策略:
現在,如果我們不考慮任何的技術細節,那么前一個狀態可能會存在幾種下一個狀態。比如,當數值獎勵為-1時,狀態 (123)** 會轉移到狀態 (23)1,或者狀態 (23)1 。
如果你現在看到了一個並發進行的狀態,那么上面提到的這27個狀態的每一個都可以表示成一個類似於旅行商問題的圖,我們可以通過通過實驗各種狀態和路徑來找到最優的解決方案。
3 x 3 魔方問題
雖然我可以為你解決這個問題,但是我想讓你自己去解決這個問題。你可以按照我上述同樣的思路,你應該就可以解決了。
從定義開始狀態和結束狀態開始,接下來,定義所有可能的狀態及其轉換,以及獎勵和策略。最后,你應該就可以使用相同的方法來構建自己的解決方案了。
6.深入了解強化學習的最新進展
正如你所認識到的,一個魔方的復雜性比漢諾塔問題要高很多倍。現在,讓我們來想象一下棋類游戲中的狀態和選擇的策略數量吧,比如圍棋。最近,Google DeepMind公司創建了一個深度強化學習算法,並且打敗了李世石。
最近,隨着在深度學習方面的成功。現在的重點是在慢慢轉向應用深度學習來解決強化學習問題。最近洪水一般的消息就是,由Google DeepMind創建的深度強化學習算法打敗了李世石。在視頻游戲中也出現了類似的情況,開發的深度強化學習算法實現了人類的准確性,並且在某些游戲上,超越了人類。研究和實踐仍然需要一同前進,工業界和學術界共同策划努力,以實現建立更好地自適應學習機器人。
以下是幾個已經應用強化學習的主要領域:
- 博弈論和多個智能體交互
- 機器人
- 計算機網絡
- 車載導航
- 醫學
- 工業物流
還有這么多的領域沒有被開發,結合目前的深度學習應用於強化學習額熱潮,我相信以后肯定會有突破!
這里是最近的消息之一:
7.其他資源
我希望你現在能夠深入了解強化學習的工作原理。這里還是一些額外的資源,以幫助你學習更多有關強化學習的內容。后期文章我將會帶大家進入強化學習的學習旅程中,敬請期待~~~
