人工智能的新希望-強化學習全解
編譯團隊 | Jennifer Zhu 賴小娟 張禮俊
作者 | FAIZAN SHAIKH
很多人說,強化學習被認為是真正的人工智能的希望。本文將從7個方面帶你入門強化學習,讀完本文,希望你對強化學習及實戰中實現算法有著更透徹的了解。
介紹
許多科學家都在研究的一個最基本的問題是“人類如何學習新技能?”。 理由顯而易見– 如果我們能解答這個問題,人類就能做到很多我們以前沒想到的事情。 另一種可能是我們訓練機器去做更多的“人類”任務,創造出真正的人工智能。
雖然我們還沒有上述問題的全部答案,但有一些事情是清楚的。不論哪種技能,我們都是先通過與環境的互動來學習它。無論是學習駕駛汽車還是嬰兒學步,我們的學習都是基于與環境的互動。 從這些互動中學習是所有關于學習與智力的理論的基礎概念。
強化學習
今天我們將探討強化學習(Re-inforcement Learning) 一種基于與環境互動的目標導向的學習。強化學習被認為是真正的人工智能的希望。我們認為這是正確的說法,因為強化學習擁有巨大的潛力。
強化學習正在迅速發展。它已經為不同的應用構建了相應的機器學習算法。因此,熟悉強化學習的技術會對深入學習和使用機器學習非常有幫助。如果您還沒聽說過強化學習,我建議您閱讀我之前關于強化學習和開源強化學習(RL)平臺的介紹文章
(https://www.analyticsvidhya.com/blog/2016/12/getting-ready-for-ai-based-gaming-agents-overview-of-open-source-reinforcement-learning-platforms/)。
如果您已經了解了一些強化學習的基礎知識,請繼續閱讀本文。讀完本文,您將會對強化學習及實戰中實現算法有著更透徹的了解。
附:下面這些算法實現的講解中,我們將假設您懂得Python的基本知識。如果您還不知道Python,建議可以先看看這個Python教程
(https://www.analyticsvidhya.com/blog/2016/01/complete-tutorial-learn-data-science-python-scratch-2/)。
輕松搞定強化學習
(1-4是強化學習的步驟,5-7是其他資源)
- 1. 提出一個強化學習的問題
- 2. 強化學習 v.s. 其他機器學習方法
- 3. 解決強化學習問題的基本框架
- 4. 用python實現強化學習算法
- 5. 更復雜的應用
- 6. 強化學習的最新進展
- 7. 其他強化學習的資源
1. 提出一個強化學習的問題
強化學習的目的是學習如何做一件事情,以及如何根據不同的情況選擇不同的行動。 它的最終結果是為了實現數值回報信號的最大化。強化學習并不告訴學習者采取哪種行動,而是讓學習者去發現采取哪種行動能產生最大的回報。 下面讓我們通過一個孩子學走路的簡單例子(下圖)來解釋什么是強化學習。
上圖:孩子學走路。
以下是孩子在學習走路時要采取的步驟:
- 首先孩子將觀察你是如何行走的。你用兩條腿,一步一步走。得到這個概念后,孩子試圖模仿你走路的樣子。
- 但孩子很快發現,走路之前必須站起來!這是一個試圖走路必經的挑戰。所以現在孩子試圖先站起來,雖然經歷掙扎和滑倒,但仍然決心站起來。
- 然后還有另一個挑戰要應付:站起來很容易,但要保持站立又是另一項挑戰!孩子揮舞著雙手,似乎是想找到能支撐平衡的地方,設法保持著站立。
- 現在孩子開始他/她真正的任務––走路。這是件說比做容易的事。要記住很多要點,比如平衡體重,決定先邁哪個腳,把腳放在哪里。
這聽起來像一個困難的任務嗎?實際上站起來和開始走路確實有點挑戰性,但當你走熟練了就不會再覺得走路難。不過通過我們的分析,現在的您大概明白了一個孩子學走路的困難點。
讓我們把上面的例子描述成一個強化學習的問題(下圖)。這個例子的“問題”是走路,這個過程中孩子是一個試圖通過采取行動(行走)來操縱環境(孩子行走的表面)的智能體(agent)。他/她試圖從一個狀態(即他/她采取的每個步驟)到另一個狀態。當他/她完成任務的子模塊(即采取幾個步驟)時,孩子將得到獎勵(讓我們說巧克力)。但當他/她不能完成走幾步時,他/她就不會收到任何巧克力(亦稱負獎勵)。這就是對一個強化學習問題的簡單描述。
上圖:把小孩子學走路的過程(圖下方)歸納成一個強化學習的問題(圖上方)。
這里我們還推薦一個不錯的對強化學習的視頻介紹(https://www.youtube.com/watch?v=m2weFARriE8)。
2. 強化學習 v.s. 其他機器學習方法
強化學習是機器學習算法的一個大的類型。下圖描述了機器學習方法的類型。
上圖:機器學習的方法分類:藍色方框從左到右依次為監督學習,無監督學習和強化學習。
讓我們來比較一下強化學習和其他種類機器學習方法:
● 監督學習(supervised learning)v.s. 強化學習:在監督學習中,有一個外部“監督者”(supervisor)。“監督者”了解環境,并與智能體共享環境信息以完成任務。但這其中存在一些問題,智能體可以通過執行許多種不同子任務的組合來達到目標。所以創建一個“監督者””幾乎是不切實際的。例如在象棋游戲中,有成千上萬種走法。因此,創建一個可以下象棋的知識庫是一個單調乏味的任務。在這樣的問題中,從經驗中學習更為可行。這可以說是強化學習和監督學習的主要區別。在監督學習和強化學習中,輸入和輸出之間都存在映射(mapping)。但在強化學習中,還存在對智能體進行反饋的獎勵函數,這在監督學習中是不存在的。
● 無監督學習(unsupervised learning) v.s. 強化學習:在強化學習中,有一個從輸入到輸出的映射。這種映射在無監督學習中并不存在。在無監督學習中,主要任務是找到數據本身的規律而不是映射。例如,如果任務是向用戶建議新聞文章,則無監督學習算法將查看該人先前讀過的文章并向他們建議類似的文章。而強化學習算法將通過建議少量新聞文章給用戶,從用戶獲得不斷的反饋,然后構建一個關于人們喜歡哪些文章的“知識圖”。
此外,還有第四種類型的機器學習方法,稱為半監督學習(semi-supervised learning),其本質上是監督學習和無監督學習的結合(利用監督學習的標記信息,利用未標記數據的內在特征)。它類似于監督學習和半監督學習,不具有強化學習具備的反饋機制(獎賞函數)。(譯者注:這里應該是原文作者的筆誤,強化學習有映射,映射是每一個狀態對應值函數。而無監督學習沒有標記信息,可以說是沒有映射的。我想這里作者想要表達的是半監督學習區別于強化學習的地方是半監督學習沒有強化學習的反饋這個機制。)
3. 解決強化學習問題的基本框架
為了了解如何解決強化學習問題,我們將分析一個強化學習問題的經典例子––多搖臂老虎機問題。 首先,我們將去回答探索 v.s. 利用的根本問題,然后繼續定義基本框架來解決強化學習的問題。
上圖:賭場里的“老虎機”。
假設你有很多吐出隨機獎金的老虎機(即投幣式游戲機,見上圖)。
現在你想盡可能快地從老虎機獲得最多的獎金。你會怎么做?
一個幼稚的方法可能是只選擇一個老虎機,并拉一整天的杠桿。聽起來好無聊,但這種方法可能會給你贏點小錢。你也有可能會中大獎(幾率接近0.00000 ... .1),但大多數時候你可能只是坐在老虎機面前虧錢。這種方法的正式定義是一種純利用(pureexploitation)的方法。這是我們的最佳選擇嗎?答案是不。
讓我們看看另一種方法。我們可以拉每個老虎機的杠桿,并向上帝祈禱,至少有一個會中獎。這是另一個幼稚的方法,能讓你拉一整天的杠桿,但老虎機們只會給你不那么好的收獲。正式地,這種方法也被正式定義為一種純探索(pureexploration)的方法。
這兩種方法都不是最優的方法。我們得在它們之間找到適當的平衡以獲得最大的回報。這被稱為強化學習的探索與利用困境。
首先,我們要正式定義強化學習問題的框架,然后列出可能的解決方法。
馬爾可夫決策過程:
在強化學習中定義解法的數學框架叫做馬爾可夫決策過程(Markov Decision Process)。 它被設計為:
● 一系列狀態的集合(Set of states),S
● 一系列行動的集合(Set of actions),A
● 獎勵函數(Reward function),R
● 策略(Policy),π
● 價值(Valu),V
我們必須采取行動(A)從我們的開始狀態過渡到我們的結束狀態(S)。我們采取的每個行動將獲得獎勵(R)。 我們的行為可以導致正獎勵或負獎勵。
我們采取的行動的集合(A)定義了我們的策略(π),我們得到的獎勵(R)定義了我們的價值(V)。 我們在這里的任務是通過選擇正確的策略來最大化我們的獎勵。 所以我們必須對時間t的所有可能的S值最大化。
旅行推銷員問題
讓我們通過另一個例子來進一步說明如何定義強化學習問題的框架。
上圖:旅行推銷員的例子。A–F表示地點,之間的連線上的數字代表在兩個地點間的旅行成本。
這顯示的是旅行推銷員問題。推銷員的任務是以盡可能低的成本從地點A到地點F。 這兩個位置之間的每條連線上的數字表示旅行這段距離所需花費的成本。負成本實際上是一些出差的收入。 我們把當推銷員執行一個策略累積的總獎勵定義為價值。
這里,
● 一系列狀態的集合是那些節點,即{A,B,C,D,E,F}
● 采取的行動的集合是從一個地方到另一個地方,即{A→B,C→D等}
● 獎勵函數是節點的連線上的值,即成本
● 策略是完成任務的“方式”,即{A - > C - > F}
現在假設你在位置A,在這個平臺上唯一可見路徑是你下一目的地的(亦稱可觀測的空間),除此之外所有都是未知的。
當然你可以用貪婪算法選擇下一步最有可能的,從{A -> (B, C, D, E)}子集中選出{A -> D}。同樣的你在位置D,想要到達F,你可以從{D -> (B, C, F)}中選擇,可以看出由于{D -> F}路徑花費最小,選擇此路徑。
到此為止,我們的規則是{A -> D -> F},價值為-120.
恭喜你!你剛剛完成了一個強化學習算法。這個算法被稱作ε-貪心算法,以貪心方式解決問題。現在如果你(銷售人員)想要再次從位置A到F,你總是會選擇相同的策略。
其他的旅行方式?
你可以猜測到我們的策略屬于哪一個類別么(例如,純探索vs純開發)?
可以看出我們選擇的并不是最優策略,我們必須去一點點“探索”來發現最優策略。在這里我們使用的方法是基于策略的學習,我們的任務是在所有可能策略中發現最優策略。解決這個問題有很多不同的方式,簡單列舉主要類別如下:
● 基于策略,重點是找到最優策略
● 基于價值,重點是找到最優價值,例如,累計獎勵
● 基于動作,重點是在執行每一步動作時,確定什么是最優動作
我會嘗試在以后的文章中更深入地講述強化學習算法,那時,你們就可以參考這篇強化學習算法調查的文章(https://www.jair.org/media/301/live-301-1562-jair.pdf)。(譯者注:這里是原文作者的一個筆誤。Q-learning,它可以用一個線性函數作為function approximator, 也可以通過列舉每一個q-state的值來做。用神經網絡來做Q-learning的function approximator應該是15年Google Deepmind發表在Nature的文章開始的,那篇文章中稱該算法為deep-Q-network,后來統稱為deep q learning)
4. 強化學習的實踐案例
我們會使用深度Q學習算法,Q學習是基于策略的,用神經網絡來近似值函數的學習算法。Google使用該算法在Atari游戲中擊敗了人類。
讓我們看看Q學習的偽代碼:
- 初始化價值表‘Q(s,a)’.
- 觀測到當前狀態點’s’.
- 基于策略選擇該狀態下的行動’a’(例如,ε-貪心)
- 采取行動并觀察獎勵值’r’及新狀態點’s’
- 根據上面描述的公式及參數,用觀測到的獎勵值及下一狀態可能的最大獎勵值更新狀態點新值。
- 設置新狀態,重復此流程直至到達最后目標點。
Q學習算法的簡單描述可以總結如下:
該圖是Q學習算法流程圖
我們先看看什么是Cartpole問題,再繼續編程提供解決方案
當我還是一個小孩的時候,我記得我會撿一根棍子試著用一只手讓它保持平衡。我和我的朋友們一起比賽看誰讓棍子保持平衡的時間最長就可以得到“獎勵”,一塊巧克力!
開始我們的代碼前,我們需要先安裝一些東西,
步驟1:安裝keras-rl庫
從終端運行以下命令:
- git clone https://github.com/matthiasplappert/keras-rl.git
- cd keras-rl
- python setup.py install
步驟2:安裝CartPole環境組件
假設你已經安裝了pip,使用pip命令安裝以下庫
- pip install h5py
- pip install gym
步驟3:啟動
首先我們要導入所需模塊
- 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 theCartpole 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())
接下來,配置并編譯我們的代理端。我們將策略設成ε-貪心算法,并且將存儲設置成順序存儲方式因為我們想要存儲執行操作的結果和每一操作得到的獎勵。
- policy = EpsGreedyQPolicy()
- memory = SequentialMemory(limit=50000, window_length=1)
- dqn = DQNAgent(modelmodel=model, nb_actionsnb_actions=nb_actions, memorymemory=memory,nb_steps_warmup=10,
- target_model_update=1e-2, policypolicy=policy)
- dqn.compile(Adam(lr=1e-3), metrics=['mae'])
- dqn.fit(env, nb_steps=5000, visualize=True, verbose=2)
現在測試強化學習模型
- dqn.test(env, nb_episodes=5, visualize=True)
- This will be the output of our model:
這就是模型輸出結果:
瞧!你構建了一個強化模型的雛形!
5. 增加復雜性
現在你已經有了一個強化學習的基礎成品,讓我們來進一步的每次增加一點點復雜度以解決更多的問題。
問題-漢諾塔
對于不知道該游戲的人簡單說明一下——發明于1883年,由3根桿及一些逐增大小的圓盤(如上圖中所示的3個一樣)從最左邊的桿開始,目標是從選擇最小移動次數將所有圓盤從最左邊移動到最右邊(你可以從維基百科得到更多訊息(https://en.wikipedia.org/wiki/Tower_of_Hanoi))。
如果我們要映射這個問題,從定義狀態開始:
● 開始狀態 – 3個圓盤都在最左邊桿上(從上到下依次為1、2、3)
● 結束狀態 – 3個圓盤都在最右邊桿上(從上到下依次為1、2、3)
所有可能的狀態:
列舉可能的27個狀態:
圖中(12)3*代表的是圓盤1和圓盤2依次在最左邊桿上(從上到下),圓盤3在中間桿上,*表示最右邊桿為空
數字獎勵:
因為我們想以最少步數來解決問題,我們可以設定每一步的獎勵為-1。
規則:
現在,不考慮任何技術細節,我們可以標記出在以上狀態間可能出現的轉移。例如從獎勵為-1的狀態(123)** 到狀態 (23)1*,也可以是到狀態(23)*1。
同樣地,你看出了上面提到的27個狀態的每一個都類似于之前銷售人員旅行的示意圖。我們可以根據之前的經驗找出最優解決方案選擇不同狀態和路徑。
問題 - 3 x 3 魔方
當我在為你解決這個問題的同時,也想要你自己也做一做。遵照我上面使用的相同步驟,你可以更好的理解和掌握。
從定義開始和結束狀態開始,接下來,定義所有可能的狀態和相應的狀態轉移獎勵和規則。最后,使用相同的方法你可以提供解決魔方問題的方案。
6. 強化學習的研究現狀
你已經意識到了魔方問題的復雜度比漢諾塔高了好幾個倍,也明白每次可選擇的操作數是怎么增長的。現在想想圍棋游戲里面狀態數和選擇,行動起來吧!最近谷歌DeepMind創建了一個深度強化學習算法打敗了李世石!
隨著近來涌現的深度學習成功案例,焦點慢慢轉向了應用深度學習解決強化學習問題。李世石被谷歌deepmind開發的深度強化學習算法開打敗的新聞鋪天蓋地襲來。同樣的突破也出現在視頻游戲中,已經逼近甚至超出人類級別的準確性。研究仍然同等重要,不管是行業還是學術界的翹楚都在共同完成這個構建更好的自我學習機器的目標。
圖為李世石與AlphaGo參與圍棋人機大戰中
深度學習應用的主要領域如下:
● 游戲原理及多智能體交互
● 機器人學
● 計算機網絡
● 車輛導航
● 醫藥學
● 行業物流
隨著近期將深度學習應用于強化學習的熱潮,毫無疑問還有許多未探索的事在等待著更多的突破來臨!
其中一條最近的新聞:
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)
結束語
我希望你們能喜歡閱讀這篇文章,如果你們有任何疑慮和問題,請在下面提出。如果你們有強化學習的工作經驗請在下面分享出來。通過這篇文章我希望能提供給你們一
個強化學習的概況,以及算法如何實際實施的,希望對你們有用。
來源:
https://www.analyticsvidhya.com/blog/2017/01/introduction-to-reinforcement-learning-implementation/?winzoom=1
【本文是51CTO專欄機構大數據文摘的原創譯文,微信公眾號“大數據文摘( id: BigDataDigest)”】