技術 | 強化學習入門以及代碼實現


介紹html

目前,對於全球的科學家而言,「如何去學習一種新技能」已經成爲最基本的研究課題之一。解決這個問題的意願顯而易見——若是可以解決這個問題,那麼人類就有望作到某些從未想過的事情。換句話說,咱們能夠訓練機器去作更多本來人類要作的工做,迎來真正的人工智能時代。python

雖然,對於上述問題,目前咱們尚未一個完整的回答,但有一些事情是十分明確的。不考慮技能方面的學習,咱們首先的是在與環境的交互過程當中進行學習。無論是學習開車,仍是嬰兒學習走路,學習的基礎都是與環境的交互過程。在互動中學習是全部學習理論以及智力發展理論的最根本的概念。git

強化學習github

今天,咱們將探討強化學習。其中與環境的交互是深度學習的基礎,一般伴有明確的目的。有些人認爲,強化學習是實現強人工智能的真正但願。這麼說確實沒錯,由於強化學習擁有着巨大的潛力。web

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

若是你已經掌握並理解了強化學習的基礎知識,那麼請繼續閱讀這篇文章。讀完本文以後,你將會對強化學習以及代碼實現過程有一個透徹的瞭解。網絡

注:在代碼實現部分,咱們假設你已經有了 Python 的基本知識。若是你還不知道 Python,那麼你應該先看看這篇教程。app

https://www.analyticsvidhya.com/blog/2016/01/complete-tutorial-learn-data-science-python-scratch-2/框架

目錄dom

  1. 強化學習問題的表現形式

  2. 與其餘機器學習方法的比較

  3. 解決強化問題的框架

  4. 強化學習的實現

  5. 增長強化學習的複雜性

  6. 深刻了解強化學習的最新進展

  7. 其餘資源

1. 強化學習問題的表現形式

強化學習不只須要學習作什麼,也須要學習如何根據與環境的交互採起相應的行動。強化學習的最終結果,就是要實現系統回報信號的最大化。學習者事先並不知道要去執行什麼行爲,須要本身去發現哪一種行動能產生最大的回報。讓咱們經過一個簡單的例子來解釋一下。

咱們以一個正在學習走路的孩子爲例進行講解。


如下是孩子在學習走路時所要採起的步驟:

  1. 孩子關注的第一件事,就是觀察身邊的人是如何走路的。身邊的人使用兩條腿走路,一次走一步,一步一步按照次序往前走。孩子會抓住這個概念,而後努力去模仿這個過程。

  2. 但很快他/她又會明白,在走路以前,必須先站起來!在學習走路的過程當中,站立對於孩子來講是一個挑戰。所以,孩子試圖本身站起來,他/她不斷跌倒,可是仍然決定站起來。

  3. 然而接下來,還有另一個挑戰須要應付。站起來是相對容易的,可是要保持站立狀態就是另外一個挑戰了。在狹小的空間中找到支撐,孩子就能成功保持站立狀態。

  4. 如今,孩子的真正任務就是開始學習走路了。可是學習走路提及來很容易,而實際作起來就不是那麼容易了。在孩子的大腦中須要處理不少事情,好比平衡身體、決定接下來放哪一個腳、放在哪裏。

這聽起來像是一個很困難的任務,對嗎?事實上,這確實是一個挑戰,先要學習站立,而後才能學習行走。可是,如今咱們不都學會了走路嘛,不再會被這個問題所困擾了。如今你應該能夠明白,爲何學習走路對於孩子來講很是困難了。

讓咱們用具體的形式來表述上面的例子。例子所要陳述的問題是「走路問題」,其中孩子是一個試圖經過採起行動(走路)來操縱環境(在地上走路)的智能體,他/她試圖從一個狀態(即,他/她走的每一步)轉移到另外一個狀態。當他/她完成任務的一個子模塊(即孩子走了幾步)時,孩子會得到獎勵(好比,一些巧克力),可是當他/她不會走路時,他/她不會收到任何巧克力(這是一個負反饋過程)。這就是對強化學習問題的簡單描述。

                    

下面的連接,是介紹強化學習的很好的視頻。


https://youtu.be/m2weFARriE8

 2. 與其餘機器學習方法的比較

強化學習是機器學習算法中的一類。如下是有關機器學習算法類型的描述。


讓咱們比較一下強化學習算法和其餘類型算法之間的區別:

監督學習與強化學習:在監督學習中,其外部有一個「監督主管」,這個「監督主管」擁有環境方面的知識,而且與智能體一塊兒共享這個知識,從而幫助智能體完成任務。可是這存在一些問題,由於存在如此多的子任務之間的組合,智能體要實現其目標的話,這些組合都是能夠利用的。因此,建立一個「監督主管」幾乎是不切實際的。例如,在象棋遊戲中,存在數萬個移動方法。所以,建立玩法知識庫的任務將會單調而乏味。有一個更加合理可行的方法,就是設法從本身的經歷中學習,並以此得到所需的知識。這就是強化學習和監督學習的主要區別。在監督學習和強化學習中,輸入和輸出之間都存在映射。可是在強化學習中,存在的是對智能體的獎勵反饋函數,而不是像監督學習同樣,直接告訴智能體最終的答案。

無監督學習與強化學習:在強化學習中,有一個從輸入到輸出的映射過程,可是這個過程在無監督學習中是不存在的。在無監督學習中,主要任務是找到一種最基本的模式,而不是映射關係。例如,若是任務是向用戶推薦新聞文章,那麼無監督學習算法首先將會查看該人之前讀過的相似文章,並把它們推薦給其餘人。而強化學習算法則是,經過用戶閱讀的某文章,不斷得到用戶的反饋,從而構建一個「知識圖譜」,推測用戶喜歡的文章。

還有第四種類型的機器學習,稱爲半監督學習。半監督學習本質上是監督學習和無監督學習的組合。它不一樣於強化學習,而是與監督學習相相似。半監督學習會直接給出參照答案,而強化學習不會。

3. 解決強化學習問題的框架

爲了理解解決強化學習問題的過程,讓咱們經過一個經典的例子來解釋一下強化學習問題——多臂賭博機。首先,咱們須要瞭解探索與開發的基本問題,而後去定義解決強化學習問題的框架。


如上圖中的老虎機,假設你已經在老虎機上面玩了不少次了。

如今你想作的是從老虎機上面得到最大的回報,而且儘量快地得到這個回報。你會怎麼作呢?

                          

一個比較天真的想法是,只選擇一個老虎機,而後一成天都去玩它。這聽起來很是無聊,但老虎機確實可能會給你一些「回報」,即讓你贏錢。使用這種方法,你可能中獎的機率大約是0.00000.....1。也就是說,大多數時間你可能知識坐在老虎機面前虧錢。正式說明一下,咱們能夠將其定義爲一種純粹的開發方法。可是這是最佳選擇嗎?答案固然是否認的。

讓咱們看看另一種方法。咱們能夠拉每一個老虎機的拉桿,而且向上帝祈禱,讓咱們至少打中一個。固然,這是另外一種天真的想法,它只會讓你一天都在拉動拉桿,但只是給你一點點報酬。正式說明一下,這種方法只是一種純粹的探索方法。

這兩種方法都不是最優的,咱們必須在它們之間找到適當的平衡點,以得到最大的回報。這就是強化學習中「探索VS開發」的兩難選擇。

首先,咱們來正式地定義一下解決強化學習問題的框架,而後列出可能的方法來解決這個問題。

馬爾科夫決策過程

在強化學習場景中,用於解決問題的數學框架叫作馬爾科夫決策過程。這能夠被設計爲:

  • 狀態集合:S

  • 動做集合:A

  • 獎勵函數:R

  • 策略:π

  • 價值:V

要想從開始狀態轉變到結束狀態(S),咱們必須採起必定的行動(A)。每當咱們採起一個行動以後,咱們都會獲得必定的回報做爲獎勵。固然,所得到的獎勵的性質(正面獎勵仍是負面獎勵)是由咱們的行動決定的。

策略集合(π)取決於咱們的動做集合,而咱們獲得的回報將會決定咱們的價值(V)。在這裏,咱們的任務就是選擇正確的策略來最大化咱們的價值。因此咱們必須最大化下面的方程:

                                                                 

在時間點t,咱們必須最大化S中全部可能的值。

旅行推銷員問題

讓咱們經過另一個例子來講明一下。      

這個問題是一系列旅行商(TSP)問題的表明。任務是以儘量低的成本從地點A到達地點F。兩個字母之間的每條邊上的數字表示兩地之間的花費。若是這個值是負數,那麼表示通過這條路,你會獲得必定的報酬。這裏咱們定義的價值(Value)是運用選擇的策略走完整個路程時,所得到的總價值。

這裏說明一下符號:

  • 全部狀態的集合至關於圖中的節點:{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的話,你大概會一直選擇這條路線了。

其餘旅遊方式?

你能猜出咱們的策略是屬於哪一個類別(純粹的探索VS純粹的開發)嗎?

請注意,咱們採起的策略並非最佳的策略。要想尋找最佳的策略,咱們必須更具「探索精神」。在這裏,咱們採起的方法是局域策略學習,咱們的任務是在全部可能的策略中找到最佳的策略。有不少的方法均可以解決這個問題,在這裏,我簡要的列出一些主要的內容:

  • 策略優先:咱們的重點是找到最佳的策略

  • 回報優先:咱們的重點是找到最佳的回報價值,即累計獎勵

  • 行動優先:咱們的重點是在每一個步驟上採起最佳行動

在之後的文章中,我會深刻討論強化學習算法。到那時,你能夠參考這篇關於強化學習算法的調研論文

https://www.jair.org/media/301/live-301-1562-jair.pdf

4. 強化學習的實現

接下來,咱們將使用深度Q學習算法。Q學習是一種基於策略的學習算法,它的函數表示和神經網絡近似。Google就是採用了這種算法戰勝了Atari遊戲。

讓咱們看看Q學習的僞代碼:

  1. 初始化價值表 ‘Q(s, a)’。

  2. 觀察當前的狀態值 ‘s’。

  3. 基於動做選擇一個策略(例如,epsilon貪婪)做爲該狀態選擇的動做。

  4. 根據這個動做,觀察回報價值 ’r’ 和下一個新的狀態 ‘s’。

  5. 使用觀察到的獎勵和可能的下一個狀態所得到的最大獎勵來更新狀態的值。根據上述公式和參數進行更新。

  6. 將狀態設置爲新的狀態,而且重複上述過程,直到達到最終狀態。

Q學習的簡單描述能夠總結以下:

                               

咱們首先來了解一下 Cartpole 問題,而後再繼續編寫咱們的解決方案。

當我仍是一個孩子的時候,我記得我會挑選一根木棍,並試圖用一隻手指去使它保持平衡。過去,我和個人朋友有過這樣一個比賽:誰能讓木棍保持平衡的時間更久,誰就能獲得一塊巧克力做爲獎勵。

如下連接是一個簡短的視頻,描述的是真正的 Cart-Pole 系統。

https://youtu.be/XiigTGKZfks

讓咱們開始編寫代碼吧!

在開始編寫以前,咱們須要先安裝幾個軟件。

步驟一:安裝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建立的深度強化學習算法戰勝了李世石。在視頻遊戲中也出現了相似的狀況,深度強化學習算法達到了人類水平的準確性,甚至在某些遊戲中,超越了人類。研究和實踐仍然須要共同發展,工業界和學術界須要共同努力,以創建出更好地、能自我學習的機器人。


http://www.tomshardware.com/news/alphago-defeats-sedol-second-time,31377.html

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

  • 博弈論和多個智能體交互

  • 機器人

  • 計算機網絡

  • 車載導航

  • 醫學

  • 工業物流

咱們能夠看到,仍然有許許多多的領域還沒有得以開發,加之人們對深度學習的熱情很是高漲,我相信之後確定會有更多的突破!

下面是一則最近的消息:

                                       

7. 其餘資源

我但願你如今可以深刻了解強化學習的工做原理。這裏仍是一些額外的資源,能夠幫助你學習更多有關強化學習的內容。

有關強化學習的視頻

https://www.analyticsvidhya.com/blog/2016/12/21-deep-learning-videos-tutorials-courses-on-youtube-from-2016/

有關強化學習的書籍

https://webdocs.cs.ualberta.ca/~sutton/book/bookdraft2016sep.pdf

GitHub上有關強化學習的資料庫

https://github.com/aikorea/awesome-rl

David Silver的強化學習課程

https://www.youtube.com/playlist?list=PLV_1KI9mrSpGFoaxoL9BCZeen_s987Yxb

本文做者 Faizan Shaikh

是 AnalyticsVidhya 的數據科學實習生,目前致力於研究深度學習,目標是利用本身的技能,推進AI研究的進展。

相關文章
相關標籤/搜索