强化学习之原理详解、算法流程及Python代码
開頭先附上強化學(xué)習(xí)(reinforcement learning)的學(xué)習(xí)視頻:https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/,趕緊進行強化學(xué)習(xí)吧!
1.強化學(xué)習(xí)就是程序或智能體(agent)通過與環(huán)境不斷地進行交互學(xué)習(xí)一個從環(huán)境到動作的映射,學(xué)習(xí)的目標(biāo)就是使累計回報最大化。
2.強化學(xué)習(xí)是一種試錯學(xué)習(xí),因其在各種狀態(tài)(環(huán)境)下需要盡量嘗試所有可以選擇的動作,通過環(huán)境給出的反饋(即獎勵)來判斷動作的優(yōu)劣,最終獲得環(huán)境和最優(yōu)動作的映射關(guān)系(即策略)。
馬爾可夫決策過程(MDP)
馬爾可夫決策過程(Markov Decision Process)通常用來描述一個強化學(xué)習(xí)問題。
智能體agent根據(jù)當(dāng)前對環(huán)境的觀察采取動作獲得環(huán)境的反饋,并使環(huán)境發(fā)生改變的循環(huán)過程
蒙特卡洛強化學(xué)習(xí)
1.在現(xiàn)實的強化學(xué)習(xí)任務(wù)中,環(huán)境的轉(zhuǎn)移概率、獎勵函數(shù)往往很難得知,甚至很難得知環(huán)境中有多少狀態(tài)。若學(xué)習(xí)算法不在依賴于環(huán)境建模,則稱為免模型學(xué)習(xí),蒙特卡洛強化學(xué)習(xí)就是其中一種。
2.蒙特卡洛強化學(xué)習(xí)使用多次采樣,然后求取平均累計獎賞作為期望累計獎賞的近似。
蒙特卡洛強化學(xué)習(xí):直接對狀態(tài)動作值函數(shù)Q(s,a)進行估計,每采樣一條軌跡,就根據(jù)軌跡中的所有“狀態(tài)-動作”利用下面的公式對來對值函數(shù)進行更新。
每次采樣更新完所有的“狀態(tài)-動作”對所對應(yīng)的Q(s,a),就需要更新采樣策略π。但由于策略可能是確定性的,即一個狀態(tài)對應(yīng)一個動作,多次采樣可能獲得相同的采樣軌跡,因此需要借助ε貪心策略:
蒙特卡洛強化學(xué)習(xí)算法需要采樣一個完整的軌跡來更新值函數(shù),效率較低,此外該算法沒有充分利用強化學(xué)習(xí)任務(wù)的序貫決策結(jié)構(gòu)。
Q-learning算法結(jié)合了動態(tài)規(guī)劃與蒙特卡洛方法的思想,使得學(xué)習(xí)更加高效。
深度強化學(xué)習(xí)(DRL)
傳統(tǒng)強化學(xué)習(xí):真實環(huán)境中的狀態(tài)數(shù)目過多,求解困難。
深度強化學(xué)習(xí):將深度學(xué)習(xí)和強化學(xué)習(xí)結(jié)合在一起,通過深度神經(jīng)網(wǎng)絡(luò)直接學(xué)習(xí)環(huán)境(或觀察)與狀態(tài)動作值函數(shù)Q(s,a)之間的映射關(guān)系,簡化問題的求解。
Deep Q Network(DQN)
Deep Q Network(DQN):是將神經(jīng)網(wǎng)略(neural network)和Q-learning結(jié)合,利用神經(jīng)網(wǎng)絡(luò)近似模擬函數(shù)Q(s,a),輸入是問題的狀態(tài)(e.g.,圖形),輸出是每個動作a對應(yīng)的Q值,然后依據(jù)Q值大小選擇對應(yīng)狀態(tài)執(zhí)行的動作,以完成控制。
自主學(xué)習(xí)Flappy Bird游戲
深度強化學(xué)習(xí)
2013年,Deep Mind團隊在NIPS上發(fā)表《Playing Atari with Deep Reinforcement Learning》一文,在該文中首次提出Deep Reinforcement Learning一詞,并且提出DQN(Deep Q-Networt)算法,實現(xiàn)了從純圖像輸入完全通過學(xué)習(xí)來玩Atari游戲。
Flappy Bird自主學(xué)習(xí)程序基本框架
訓(xùn)練過程
訓(xùn)練過程過程主要分為以下三個階段:
1.觀察期(OBSERVE):程序與模擬器進行交互,隨機給出動作,獲取模擬器中的狀態(tài),將狀態(tài)轉(zhuǎn)移過程存放在D(Replay Memory)中;
2.探索期(EXPLORE):程序與模擬器交互的過程中,依據(jù)Replay Memory中存儲的歷史信息更新網(wǎng)絡(luò)參數(shù),并隨訓(xùn)練過程降低隨機探索率ε;
3.訓(xùn)練器(TRAIN):ε已經(jīng)很小,不再發(fā)生改變,網(wǎng)絡(luò)參數(shù)隨著訓(xùn)練過程不斷趨于穩(wěn)定。
1.打開游戲模擬器,不執(zhí)行跳躍動作,獲取游戲的初始狀態(tài)
2.根據(jù)ε貪心策略獲得一個動作(由于神經(jīng)網(wǎng)絡(luò)參數(shù)也是隨機初始化的,在本階段參數(shù)也不會進行更新,所以統(tǒng)稱為隨機動作),并根據(jù)迭代次數(shù)減小ε的大小
3.由模擬器執(zhí)行選擇的動作,能夠返回新的狀態(tài)和反饋獎勵
4.將上一狀態(tài)s,動作a,新狀態(tài)s’,反饋r組裝成(s,a,s‘,r)放進Replay Memory中用作以后的參數(shù)更新
5.根據(jù)新的狀態(tài)s‘,根據(jù)ε貪心策略選擇下一步執(zhí)行的動作,周而復(fù)始,直至迭代次數(shù)到達探索期
探索期與觀察期的唯一區(qū)別在于會根據(jù)抽樣對網(wǎng)絡(luò)參數(shù)進行更新。
1.迭代次數(shù)達到一定數(shù)目,進入探索期,根據(jù)當(dāng)前狀態(tài)s,使用ε貪心策略選擇一個動作(可以是隨機動作或者由神經(jīng)網(wǎng)絡(luò)選擇動作),并根據(jù)迭代次數(shù)減小ε的值
2.由模擬器執(zhí)行選擇的動作,能夠返回新的狀態(tài)和反饋獎勵
3.將上一狀態(tài)s,動作a,新狀態(tài)s’,反饋r組裝成(s,a,a‘,r)放進Replay Memory中用作參數(shù)更新
4.從Replay Memory中抽取一定量的樣本,對神經(jīng)網(wǎng)絡(luò)的參數(shù)進行更新
5.根據(jù)新的狀態(tài)s‘,根據(jù)ε貪心策略選擇下一步執(zhí)行的動作,周而復(fù)始,直至迭代次數(shù)到達訓(xùn)練器
相關(guān)庫的介紹和安裝
tensorflow庫
TensorFlow是谷歌2015年開源的一個人工智能學(xué)習(xí)系統(tǒng)。主要目的是方便研究人員開展機器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)方面的研究,目前這個系統(tǒng)更具有通用性,也可廣泛用于其他計算領(lǐng)域。
TensorFlow
支持多種前端語言,包括python(python也是tensorflow支持最好的前端語言),因此一般大家利用python實現(xiàn)對tensorflow的調(diào)用。
安裝:conda install tensorflow
openCV庫
OpenCV是一個開源的跨平臺的計算機視覺庫,實現(xiàn)了大量的圖像處理和計算機視覺方面的通用算法。
本實驗采用opencv對采集的游戲畫面進行預(yù)處理
安裝:Mac+anaconda安裝opencv3非常麻煩,如需安裝請查看我的另一篇文章。
PyGame庫
Pygame是一個跨平臺的模塊,專為電子游戲設(shè)計。
Pygame相當(dāng)于是一款游戲引擎,用戶無需編寫大量的基礎(chǔ)模塊,而只需完成游戲邏輯本身就可以了。
本實驗游戲模擬器采用Pygame實現(xiàn)。
安裝:conda install pygame
tensorflow庫的基本使用
理解TensorFlow
1.使用圖(graph)來表示計算任務(wù);
2.在被稱之為會話(Session)的上下文(context)中執(zhí)行圖;
3.使用tensor(張量)表示數(shù)據(jù);
4.通過變量(variable)維護狀態(tài);
5.使用feed和fetch可以為任意的操作(arbitrary operation)賦值或者從其中獲取數(shù)據(jù)。
6.TensorFlow是一個編程系統(tǒng),使用圖來表示計算任務(wù)。圖中的節(jié)點被稱作op(Operation),op可以獲得0個或多個tensor,產(chǎn)生0個或多個tensor。每個tensor是一個類型化的多維數(shù)組。例如:可以將一組圖像集表示成一個四維的浮點數(shù)組,四個維度分別是[batch,height,weight,channels]。
7.圖(graph)描述了計算的過程。為了進行計算,圖必須在會話中啟動,會話負責(zé)將圖中的op分發(fā)到cpu或gpu上進行計算,然后將產(chǎn)生的tensot返回。在python中,tensor就是numpy.ndarray對象。
8.TensorFlow程序通常被組織成兩個階段:構(gòu)建階段和執(zhí)行階段。
????????? 構(gòu)建階段:op的執(zhí)行順序被描述成一個圖;
?????????? 執(zhí)行階段:使用會話執(zhí)行圖中的op
??????????? 例如:通常在構(gòu)建階段創(chuàng)建一個圖來表示神經(jīng)網(wǎng)絡(luò),在執(zhí)行階段反復(fù)執(zhí)行圖中的op訓(xùn)練? 神經(jīng)網(wǎng)絡(luò)。
9.交互式會話(InteractiveSession):為了方便實用Ipython之類的python交互環(huán)境,可以使用交互式會話(interactiveSession)來代替Session,使用類似Tensor.run()和Operation.eval()來代替Session.run(),避免使用一個變量來持有會話。
10.feed操作:
前面的例子中,數(shù)據(jù)均以變量或常量的形式進行存儲。Tensorflow還提供了Feed機制,該機制可以臨時替代圖中任意操作中的tensor。最常見的用例是使用tf.placeholder()創(chuàng)建占位符,相當(dāng)于是作為圖中的輸入,然后使用Feed機制向圖中占位符提供數(shù)據(jù)進行計算,具體使用方法見接下來的樣例。
自主學(xué)習(xí)flappy bird實例程序編寫
?
轉(zhuǎn)自:https://www.jianshu.com/p/42507aa63b05
總結(jié)
以上是生活随笔為你收集整理的强化学习之原理详解、算法流程及Python代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】梯度提升树(GBDT)的原理
- 下一篇: Python 学习笔记(半ZZ半自己写)