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

做者:Angel_Kittypython

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

1、介紹github

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

雖然,對於上述問題,咱們目前尚未一個完整的答案去解釋,可是有一些事情是能夠理解的。先不考慮技能的學習,咱們首先須要與環境進行交互。不管咱們是學習駕駛汽車仍是嬰兒學習走路,學習都是基於和環境的相互交互。從互動中學習是全部智力發展和學習理論的基礎概念。網絡

2、強化學習併發

今天,咱們將探討強化學習,這是一種基於環境相互交互的學習算法。有些人認爲,強化學習是實現強人工智能的真正但願。這種說法也是正確的,由於強化學習所擁有的潛力確實是巨大的。app

目前,有關強化學習的研究正在快速增加,人們爲不一樣的應用程序生成各類各樣的學習算法。所以,熟悉強化學習的技術就變得尤爲重要了。若是你還不是很熟悉強化學習,那麼我建議你能夠去看看我之前有關強化學習文章和一些開源的強化學習平臺。框架

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

注:在代碼實現部分,咱們假設你已經有了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

相關文章
相關標籤/搜索