乾貨|淺談強化學習的方法及學習路線

FlyAI發表於2018-04-03

乾貨|淺談強化學習的方法及學習路線

作者:Angel_Kitty

來源:http://www.cnblogs.com/ECJTUACM-873284962/

一、介紹

目前,對於全球科學家而言,“如何去學習一種新技能”成為了一個最基本的研究問題。為什麼要解決這個問題的初衷是顯而易見的,如果我們理解了這個問題,那麼我們可以使人類做一些我們以前可能沒有想到的事。或者,我們可以訓練去做更多的“人類”工作,常遭一個真正的人工智慧時代。

雖然,對於上述問題,我們目前還沒有一個完整的答案去解釋,但是有一些事情是可以理解的。先不考慮技能的學習,我們首先需要與環境進行互動。無論我們是學習駕駛汽車還是嬰兒學習走路,學習都是基於和環境的相互互動。從互動中學習是所有智力發展和學習理論的基礎概念。

二、強化學習

今天,我們將探討強化學習,這是一種基於環境相互互動的學習演算法。有些人認為,強化學習是實現強人工智慧的真正希望。這種說法也是正確的,因為強化學習所擁有的潛力確實是巨大的。

目前,有關強化學習的研究正在快速增長,人們為不同的應用程式生成各種各樣的學習演算法。因此,熟悉強化學習的技術就變得尤其重要了。如果你還不是很熟悉強化學習,那麼我建議你可以去看看我以前有關強化學習文章和一些開源的強化學習平臺。

一旦你已經掌握和理解了強化學習的基礎知識,那麼請繼續閱讀這篇文章。讀完本文之後,你會對強化學習有一個透徹的瞭解,並且會進行實際程式碼實現。

注:在程式碼實現部分,我們假設你已經有了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.gitcd keras-rlpython setup.py install

步驟二:安裝CartPole環境的依賴

我們假設你已經安裝好了pip,那麼你只需要使用以下命令進行安裝:

pip install h5pypip install gym

步驟三:開始編寫程式碼

首先我們需要匯入一些我們需要的模組

import numpy as np import gym from keras.models importSequentialfrom keras.layers importDense,Activation,Flattenfrom keras.optimizers importAdamfrom rl.agents.dqn importDQNAgentfrom rl.policy importEpsGreedyQPolicyfrom rl.memory importSequentialMemory

然後,設定相關變數

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建立的深度強化學習演算法打敗了李世石。在視訊遊戲中也出現了類似的情況,開發的深度強化學習演算法實現了人類的準確性,並且在某些遊戲上,超越了人類。研究和實踐仍然需要一同前進,工業界和學術界共同策劃努力,以實現建立更好地自適應學習機器人。

乾貨|淺談強化學習的方法及學習路線

以下是幾個已經應用強化學習的主要領域:

  • 博弈論和多個智慧體互動
  • 機器人
  • 計算機網路
  • 車載導航
  • 醫學
  • 工業物流

還有這麼多的領域沒有被開發,結合目前的深度學習應用於強化學習額熱潮,我相信以後肯定會有突破!

End


相關文章