91精品国产综合久久四虎久久_国产成人午夜高潮毛片_99er视频精品免费观看_2020亚洲熟女在线观看_日本女优人体写真_国内黄色毛片_年轻的老师中文版在线_丰满女邻居做爰_久久久久久精品成人免费图片

利用TensorFlow進行強化學習
利用梯度下降法求解問題,在Doom游戲中訓練AI智能體
編者注:您可以訪問 GitHub上的 所有代碼, 并在這里查看IPython Notebook 。
更多人工智能內(nèi)容請關(guān)注2018年4月10-13日人工智能北京大會。

深入強化學習可能是一個難以掌握的領(lǐng)域。 在人們試圖學習如何解決強化學習問題時,很難在海量的縮略詞和機器學習模型間找到一個最好的著力點。強化學習理論并非新鮮事物,事實上,一部分強化學習的理論可以追溯到20世紀50年代中期。 如果你是強化學習領(lǐng)域徹頭徹尾的新手,我建議你查閱我以前的文章『關(guān)于強化學習和OpenAI Gym的介紹』,學習強化學習的基礎(chǔ)知識。

深度強化學習需要更新大量的梯度,深度學習工具(如TensorFlow)對于計算這些梯度非常有用。 深度強化學習也要求抽象地表示視覺狀態(tài),在這種情況下,卷積神經(jīng)網(wǎng)絡(luò)效果最好。 在本文中我們將使用Python,TensorFlow和強化學習庫Gym來解決3D 游戲Doom中的醫(yī)療包收集問題。 要獲取完整的代碼和所需的依賴庫,請訪問本文的GitHub倉庫Jupyter Notebook 。

探索環(huán)境

在這種環(huán)境下,Doom玩家站在酸性液體上,為了保持存活,需要學習如何搜尋并收集醫(yī)療包。

doom1-96ad625b93312eff34378ebcc18612d4

圖1.訓練環(huán)境,感謝Justin Francis提供圖片

為了解決這一問題,強化學習算法的選擇之一是使用REINFORCE作為基線算法。 Reinforce是非常簡單的 —— 在環(huán)境的一個周期中,它需要的數(shù)據(jù)僅包括兩種:狀態(tài),以及獎勵。 Reinforce 被稱為策略梯度法(Policy Gradient Method),因為它只是評估和更新智能體的策略。 策略(Policy)就是在當前狀態(tài)下,智能體的行為方式。 例如,在一個名為『Pong』的彈球游戲中,一個簡單的策略是:如果球沿著某個角度移動,最好的動作就是將球拍移動到相對該角度的同一側(cè)位置。 在使用卷積神經(jīng)網(wǎng)絡(luò)來估計任何給定狀態(tài)(state)下的最佳策略之前,我們會使用同一個網(wǎng)絡(luò)來估計給定狀態(tài)下的價值(value)或預期的長期收益(reward)。

我們會通過使用Gym庫來定義我們的環(huán)境。

env = gym .? make ( ‘ppaquette/DoomHealthGathering-v0’ )

在試圖讓智能體進行學習之前,讓我們通過觀察隨機游走智能體,看一下基線標準。 很明顯,我們有很多東西要『學習』。

doom_rand-60f71a435a54d4492ef90b6559add58b

圖2.采取隨機行動的智能體,由Justin Francis提供

建立我們的機器學習環(huán)境

Reinforce被認為是一種蒙特卡洛學習法,這意味著,我們將收集整個實驗的數(shù)據(jù),然后在實驗結(jié)束時進行計算。 在這個例子里,我們會收集一批數(shù)據(jù)來訓練。 我們將把我們的環(huán)境訓練數(shù)據(jù)設(shè)置為空白列表,在每一步結(jié)束時,我們會把數(shù)據(jù)附加(append)到這些列表中去

states , actions , rewards = [], [], []

接下來,定義一些我們所使用的神經(jīng)網(wǎng)絡(luò)將用到的超參數(shù)。

# Hyper Parameters

alpha = 1e-4

gamma = 0.99

Alpha是我們一般說的學習率,gamma是我們的獎勵貼現(xiàn)率。 獎勵貼現(xiàn)是一種度量未來潛在總獎勵的方法,它是基于智能體的歷史行為所獲得的獎勵進行估計的。如果貼現(xiàn)率趨近于0,那么智能體就會變得只關(guān)心即時獎勵,而不考慮未來的潛在回報。 我們可以寫一個簡單的函數(shù),在一次跑通關(guān)的場景下評估一組獎勵,具體如下:

def discount ( r , gamma , normal ):

discount = np .? zeros_like ( r )

G = 0.0

for i in reversed ( range ( 0 , len ( r ))):

G = G * gamma + r [ i ]

discount [ i ] = G

# Normalize

if normal :

mean = np .? mean ( discount )

std = np .? std ( discount )

discount = ( discount – mean ) / ( std )

return discount

我們來評估下面幾組獎勵:

discounting-c723118b9266d62c79010d4b99989ee5

可以觀察到,高貼現(xiàn)率的存在,導致了由于場景的結(jié)尾存在大額獎勵,中間出現(xiàn)的大量懲罰都被忽視了。 我們還可以給我們『貼現(xiàn)后總獎勵』加入標準化,以確保獎勵的取值范圍較小,這對在DOOM游戲環(huán)境中解決問題是至關(guān)重要的。

我們的價值函數(shù)將不斷地對任何狀態(tài)下的『貼現(xiàn)后總獎勵』進行估計。

建立卷積神經(jīng)網(wǎng)絡(luò)

接下來,我們將建立卷積神經(jīng)網(wǎng)絡(luò),以狀態(tài)進行輸入,并輸出動作概率和狀態(tài)的價值。 我們會有三個動作可供選擇:前進,右移,左移。 策略近似(policy approximation)的設(shè)計與圖像分類完全相同,不同之處在于,圖像分類的輸出是每個類別的置信度(概率),我們的輸出將代表我們對采取某種行動的信心。 與大型圖像分類模型相比,在強化學習領(lǐng)域,簡單的網(wǎng)絡(luò)模型效果最佳。

我們將使用和大名鼎鼎的DQN算法類似的方法,使用convnet。 我們的神經(jīng)網(wǎng)絡(luò)會把經(jīng)過處理、調(diào)整完大小的84×84像素的圖像作為輸入,通過一個16通道,卷積核為8×8,步長為4的卷積,再接著一個32個通道,卷積核為8×8內(nèi)核,步長為4的卷積,最后接一個有256個神經(jīng)元的全連接層。對于卷積層,我們將使用VALID填充選項,這會很激進地讓圖像特征的尺寸變小。

我們的策略逼近函數(shù)以及價值逼近函數(shù)將共享相同的卷積神經(jīng)網(wǎng)絡(luò)來計算求值。

# Conv Layers

convs = [ 32 ]

kerns = [ 8 ]

strides = [ 4 ]

pads = ‘valid’

fc = 256

activ = tf .? nn . elu

# Policy Network

conv1 = tf .? layers .? conv2d (

inputs = X ,

filters = convs [ 0 ],

kernel_size = kerns [ 0 ],

strides = strides [ 0 ],

padding = pads ,

activation = activation ,

name = ‘conv1’ )

conv2 = tf .? layers .? conv2d (

inputs = conv1 ,

filters = convs [ 1 ],

kernel_size = kerns [ 1 ],

strides = strides [ 1 ],

padding = pads ,

activation = activation ,

name = ‘conv2’ )

flat = tf .? layers .? flatten ( conv2 )

dense = tf .? layers .? dense (

inputs = flat ,

units = fc ,

activation = activation ,

name = ‘fc’ )

logits = tf .? layers .? dense (

inputs = dense ,

units = n_actions ,

name = ‘logits’ )

value = tf .? layers .? dense (

inputs = dense ,

units = 1 ,

name = ‘value’ )

calc_action = tf .? multinomial ( logits , 1 )

aprob = tf .? nn .? softmax ( logits )

action_logprob = tf .? nn .? log_softmax ( logits )

在深度學習中,權(quán)重初始化非常重要。默認情況下, tf.layers將使用glorot均勻分布初始化函數(shù)(有時也稱為xavier初始化)來初始化權(quán)重。 如果初始化的權(quán)重方差過大,則智能體的行為會發(fā)生系統(tǒng)性偏差,如果方差過小,那么智能體的行為會非常隨機。 理想情況下,智能體在一開始會采取隨機的行為,然后慢慢地改變權(quán)重,以獲得獎勵的最大化。 在強化學習中,這就是所謂的探索與開發(fā)(Exploration vs. Exploitation),因為一開始,智能體會隨機地探索環(huán)境,并且在每次更新后,會把行動決策的概率更多的分配給那些傾向于獲得良好獎勵的行動。

度量和提高算法的表現(xiàn)

現(xiàn)在我們已經(jīng)建立了模型,我們將如何讓它去學習?答案非常簡單。我們想要改變網(wǎng)絡(luò)的權(quán)重,這樣就會增加其采取某種行動的置信度,對權(quán)重改變的值基于我們對價值函數(shù)估計的準確度。 一言以蔽之,我們需要盡量減少我們的總損失。

為了在TensorFlow中實現(xiàn)這種方法,我們通過使用sparse_softmax_cross_entropy函數(shù)來度量我們的策略損失。這里的『稀疏』(sparse),意味著我們的行動的標簽是整數(shù),而logits是我們未經(jīng)過激發(fā)的策略輸出數(shù)值。這個函數(shù)為我們先計算softmax,再求對數(shù)損失(log loss)。 如果采取一個行動的信心/置信度接近1,那么對應(yīng)的損失接近0。

然后,我們將交叉熵損失乘以貼現(xiàn)后總獎勵與我們計算的價值估計之差。 我們再使用常見的均方誤差損失函數(shù)來計算我們的價值損失函數(shù)。 然后我們把損失加在一起來計算我們的總損失。

# Define Losses

pg_loss = tf .? reduce_mean (( D_R – value ) * sparse_softmax_cross_entropy_with_logits ( logits = logits , labels = Y ))

value_loss = value_scale * tf .? reduce_mean ( reduce_mean ( D_R – value ))

entropy_loss = – entropy_scale * tf .? reduce_sum ( aprob * aprob ( aprob ))

loss = pg_loss + value_loss – entropy_loss

# Create Optimizer

optimizer = tf .? train .? AdamOptimizer ( alpha )

grads = tf .? gradients ( loss , trainable_variables ())

grads , _ = tf .? clip_by_global_norm ( clip_by_global_norm , gradient_clip ) # gradient clipping

grads_and_vars = list ( zip ( grads_and_vars ()))

train_op = optimizer .? apply_gradients ( grads_and_vars )

# Initialize Session

sess = tf .? Session ()

init = tf .? global_variables_initializer ()

sess .? run ( init )

訓練智能體

我們現(xiàn)在準備好訓練游戲智能體了。 我們把當前狀態(tài)輸入神經(jīng)網(wǎng)絡(luò),并通過調(diào)用tf.multinomial函數(shù)來獲取我們需要采取的行動。 我們執(zhí)行這一行動,并把狀態(tài),行動和未來的獎勵進行存儲。然后,我們將新調(diào)整大小的state2作為我們當前的狀態(tài)存儲,并不斷重復此過程直到游戲結(jié)束。 我們會將狀態(tài),行動和獎勵數(shù)據(jù)添加到一個新的列表中,使用這個數(shù)據(jù)輸入到網(wǎng)絡(luò)中進行一個批次(batch)的評估。

根據(jù)我們所使用的權(quán)重初始化方法,我們的智能體最終應(yīng)該會訓練200個批次,達到一個平均獎勵為1200的水平,求解完這個虛擬環(huán)境。 對于這個環(huán)境,OpenAI給出的解決問題的標準是:連續(xù)100次平均獎勵超過1000。如果允許智能體進行時間更久的訓練的話,平均獎勵值能達到1700,似乎無法達到更高的平均值了。這是我的智能體經(jīng)過1000個批次的訓練達到的效果:

doomFinal-d2b9b3fcac1fee42e34095d6922f10a1

圖3.Justin Francis訓練了1000個批次之后的模型效果。感謝Justin Francis提供圖片

如果你想在任意給定的圖像幀上測試你的智能體,你需要做的,就是把這個狀態(tài)輸入網(wǎng)絡(luò),并觀察輸出。 如下所示,如果智能體正在面對一堵墻壁,有90%的置信度認為最好的行動是右轉(zhuǎn)。而在下圖最右側(cè)的圖片中,智能體只有61%的置信度認為向前進是最好的行動。

compare-5382b7a073403a5418eeb3781c5da828

圖4.對不同狀態(tài)進行比較,感謝Justin Francis提供圖片

如果你心思比較敏銳的話,你可能會認為61%的置信概率似乎是一個顯然是『不錯』,卻并不是那么好的行動。你這么想就對了。 我懷疑我們的智能體學習到的主要目標,是避免撞到墻上;而且由于智能體只能通過存活來獲取獎勵,所以它并不是專門去拿醫(yī)療包,拾起醫(yī)療包只是為了茍延殘喘。在某種意義上,我不會認為這個智能體是完全智能的。這個智能體也幾乎完全不考慮左轉(zhuǎn)這種行動。它擁有了一個簡單的策略,它是自己學習到的,而且十分有效!

tensorboard-51b64513d9469018aaf747a48439e44b

圖5.對損失函數(shù)和獎勵函數(shù)的比較。感謝Justin Francis提供圖片

更進一步

所以,我希望你現(xiàn)在了解了策略梯度方法的基礎(chǔ)知識。 這些是更高級的策略梯度法的基礎(chǔ),高級方法包括Advantage Actor-Critic方法, A3CPPO等等。 Reinforce模型不考慮狀態(tài)遷移(state transitions),動作價值(action values)或TD錯誤。 它也需要處理信任分配(credit assignment)問題。 要解決這些問題,您需要多個神經(jīng)網(wǎng)絡(luò)和更多的智能體訓練數(shù)據(jù)。 還有很多實驗可以用來提高模型性能,比如調(diào)整超參數(shù)。 通過一些比較小的修改,你可以使用這個完全一樣的神經(jīng)網(wǎng)絡(luò)來解決很多Atari游戲。 所以,自己去嘗試看看你能解決多少問題吧!

這篇博文是O’Reilly和TensorFlow的合作產(chǎn)物。請閱讀我們的編輯獨立聲明

Justin Francis

Justin Francis目前是加拿大Alberta大學的本科生。 Justin在其所在大學的工程俱樂部『自動駕駛機器人汽車項目』(arvp.org)的軟件團隊中,幫助他人進行深度學習和強化學習算法的實驗和部署。 在更早之前,他是一個非營利的『社區(qū)合作自行車店』的創(chuàng)始人和教育家,并且花了兩年的時間在帆船上對格魯吉亞海峽進行探索和體驗。

登山(來源: Pixabay )