Deep Reinforcement Learning: Pong from Pixels
這是一篇遲來很久的關(guān)于增強(qiáng)學(xué)習(xí)(Reinforcement Learning, RL)博文。增強(qiáng)學(xué)習(xí)最近非常火!你一定有所了解,現(xiàn)在的計(jì)算機(jī)能不但能夠被全自動(dòng)地訓(xùn)練去玩兒ATARI(譯注:一種游戲機(jī))游戲(直接輸入游戲的原生的像素?cái)?shù)據(jù)),還能擊敗圍棋的世界冠軍、模擬四足動(dòng)物上躥下跳。機(jī)器人還能學(xué)習(xí)如何進(jìn)行復(fù)雜的控制任務(wù),甚至比直接編寫的程序效果還要好。這些在各個(gè)方面的領(lǐng)先都應(yīng)該被歸功于增強(qiáng)學(xué)習(xí)遍地開花般的研究。我本人在過去幾年中也對(duì)增強(qiáng)學(xué)習(xí)非常感興趣:我完成了Richard Sutton的書,看完了David Silver的課程,看了John Schulmann的講義,寫了一個(gè)基于Javascript的增強(qiáng)學(xué)習(xí)的庫(kù),并且在DeepMind公司的DeepRL組實(shí)習(xí)了一個(gè)夏天,而最近的工作有些涉及到一個(gè)全新的增強(qiáng)學(xué)習(xí)評(píng)測(cè)工具箱OpenAI Gym的設(shè)計(jì)和開發(fā)。所以我實(shí)際上已經(jīng)在這條賊船上帶了一整年,但是直到現(xiàn)在我還沒抽出時(shí)間去寫一篇簡(jiǎn)短的博客來闡述增強(qiáng)學(xué)習(xí)是什么、為什么增強(qiáng)學(xué)習(xí)這么重要、如何開發(fā)一個(gè)增強(qiáng)學(xué)習(xí)的程序,以及它的應(yīng)用背景會(huì)是什么。
幾個(gè)增強(qiáng)學(xué)習(xí)的例子。從左到右:深度Q學(xué)習(xí)網(wǎng)絡(luò)玩兒ATARI,AlphaGo,伯克利堆積木機(jī)器人Legos,物理模擬的四足動(dòng)物在地面奔跑。
回憶一下增強(qiáng)學(xué)習(xí)近期進(jìn)展的本質(zhì)是一件很有趣的事情。我比較直白地認(rèn)為人工智能受到了以下一個(gè)因素的掣肘(此處原文為hold back AI,總覺得有些怪怪的):
與計(jì)算機(jī)視覺界所經(jīng)歷的一樣,增強(qiáng)學(xué)習(xí)的發(fā)展進(jìn)程不像想你想的那樣起源于什么驚世駭俗的靈感。在計(jì)算機(jī)視覺界,2012年的AlexNet幾乎就是1990年代卷積神經(jīng)網(wǎng)絡(luò)(ConvNets)的高規(guī)格版本。與之相似的是,2013年ATARI的深度Q學(xué)習(xí)(Deep Q Learning)的論文實(shí)際上在功能上近似于一個(gè)標(biāo)準(zhǔn)的算法(Q學(xué)習(xí),Q Learning,函數(shù)逼近,你可以在Sutton1998年編寫的標(biāo)準(zhǔn)的增強(qiáng)學(xué)習(xí)書籍上找到),函數(shù)逼近實(shí)際上使用了一個(gè)卷積網(wǎng)絡(luò)。AlphaGo使用了帶有蒙特卡洛樹搜索的策略梯度(Policy Gradients),其實(shí)這些也是慣用的組件。當(dāng)然,也還需要用到大量的技巧和一點(diǎn)兒耐心讓它能夠正確地運(yùn)轉(zhuǎn)起來,同時(shí)也需要在那些之前被提出的傳統(tǒng)算法中應(yīng)用上一些聰明的小技巧,但是對(duì)于一階近似來說,能產(chǎn)生如此巨大的成就并不是取決于算法,而是(與計(jì)算機(jī)視覺類似)據(jù)取決計(jì)算能力、數(shù)據(jù)和基礎(chǔ)設(shè)施。
話題回到增強(qiáng)學(xué)習(xí)。我很喜歡去寫博客來說明一件看上去很夢(mèng)幻的東西和其背后的簡(jiǎn)單的原理。【譯注:這句話的原話語法結(jié)構(gòu)太復(fù)雜了,駕馭不住啊】。我見過很多人不敢相信我們能夠全自動(dòng)地讓機(jī)器像人類一樣學(xué)會(huì)去玩兒大部分ATARI游戲,甚至只需要一個(gè)算法、直接輸入像素、從零做起,效果非常震驚,我自己嘗試過。但是我們所用的核心方法其實(shí)非常的簡(jiǎn)單粗暴(盡管我知道現(xiàn)在回想起來好像這么說會(huì)引發(fā)一些爭(zhēng)議)。無論如何,我將會(huì)帶你了解Policy Gradients算法(PG),即在這個(gè)時(shí)候了解增強(qiáng)學(xué)習(xí)的最佳切入點(diǎn)。如果還是個(gè)怎強(qiáng)學(xué)習(xí)的門外漢,你一定會(huì)好奇為什么我不去介紹DQN算法呢?它可是一個(gè)更廣為人知的增強(qiáng)學(xué)習(xí)算法,并且在玩兒ATARI游戲的論文中經(jīng)常出鏡。這是由于Q學(xué)習(xí)并不是一個(gè)非常強(qiáng)大的算法(你可以說DQN在2013年很強(qiáng)大(好吧我是在半開玩笑地說~))。事實(shí)上,大多數(shù)人更傾向于使用策略梯度算法,甚至包括最早DQN論文的作者,他發(fā)現(xiàn)如果參數(shù)調(diào)的好,則它比Q學(xué)習(xí)效果還要好。我們首選PG算法是因?yàn)樗嵌说蕉?End to end)的:有一個(gè)顯式的策略,和一個(gè)能夠直接優(yōu)化期望回報(bào)(expected reward)的規(guī)范的方法。好的,作為例子,我們將會(huì)從零開始,在像素級(jí)別,使用一個(gè)深度神經(jīng)網(wǎng)絡(luò),并用PG來學(xué)習(xí)去玩兒ATARI的游戲(Pong!)。所有這些事情只需要130行的Python就能搞定,并且只用到了numpy庫(kù)。讓我們?cè)囋嚢?#xff01;
Pong from pixels
Pong這個(gè)游戲。
Pong是馬爾可夫決策過程(Markov Descision Process, MDP)的一個(gè)例子:圖中的每一個(gè)結(jié)點(diǎn)都是游戲過程中的一個(gè)特定狀態(tài),每一條邊都是一個(gè)(通常是概率意義上的)可能的變換。每一條邊帶有一個(gè)“回報(bào)”(reward),而任務(wù)的目標(biāo)是在任意狀態(tài)計(jì)算出一條最優(yōu)的路徑來最大化回報(bào)。
Pong這個(gè)游戲非常適合用來解釋一個(gè)簡(jiǎn)單的增強(qiáng)學(xué)習(xí)的任務(wù)。在ATARI2600版本的這個(gè)游戲中,你需要控制一側(cè)的擋板(另一側(cè)由一個(gè)還算靠譜的AI控制)然后你需要通過撞擊擋板將球反彈給對(duì)方(我貌似不用解釋的太詳細(xì)了對(duì)吧?)。我們可以用更加底層角度看待這個(gè)任務(wù):我們接收到了一幀圖像(一個(gè)210x160x3的字節(jié)數(shù)組(從0到255的整數(shù)值表示像素值)),然后我們來決定是要讓擋板向上還是向下(這是一個(gè)二進(jìn)制的選擇)。在每一次選擇之后,游戲模擬器執(zhí)行動(dòng)作然后給我們一個(gè)回報(bào):一個(gè)+1回報(bào)表示我們成功將球擊向?qū)κ?#xff0c;一個(gè)-1回報(bào)表示丟了球,或者一個(gè)0回報(bào)表示其他情況。當(dāng)然,我們的目標(biāo)是通過移動(dòng)擋板來得到很多很多的回報(bào)。
在我們解決這個(gè)問題的時(shí)候,我們要做幾個(gè)假設(shè),因?yàn)槲覀兊年P(guān)注點(diǎn)并不是Pong這個(gè)游戲,而是在于研究一個(gè)復(fù)雜的高維問題,比如說操縱機(jī)器人,裝配和導(dǎo)航。Pong只是一個(gè)有趣的測(cè)試?yán)?#xff0c;而總有一天我們會(huì)寫出一個(gè)非常通用并且能做很多有用的任務(wù)的AI系統(tǒng)。
策略網(wǎng)絡(luò)(Policy Network)
首先,我們要去定義“策略網(wǎng)絡(luò)”這個(gè)概念。它能作為我們的“玩家”(或者“代理”,即agent)。這個(gè)網(wǎng)絡(luò)能夠以當(dāng)前的游戲狀態(tài)為輸入,并且能夠決定我們應(yīng)該采取什么動(dòng)作(向上或者向下)。為了計(jì)算方便,我們使用了一個(gè)兩層神經(jīng)網(wǎng)絡(luò),接受原生的圖像像素作為輸入(一共100,800個(gè)數(shù)(210*160*3)),然后產(chǎn)生一個(gè)數(shù)字來表示“向上移動(dòng)擋板”的概率。通常情況下我們會(huì)用“stochastic”策略,就是說我們只產(chǎn)生一個(gè)向上移動(dòng)的概率值。每一次迭代我們都會(huì)從這個(gè)概率分布去采樣(就好像投擲一枚不均勻的硬幣)來決定到底是向上還是向下(譯注:這個(gè)產(chǎn)生出來的值只是一個(gè)向上的概率,而不是說當(dāng)這個(gè)值大于某個(gè)閾值就向上,小于閾值就向下。真正使用的時(shí)候就是以這個(gè)概率值去拋硬幣。也就是說幾遍這個(gè)概率告訴你百分之90要向上,你也是有可能采樣獲得“向下”這個(gè)決策的)。這么做的原因我們會(huì)在講解訓(xùn)練算法部分仔細(xì)說明。
我們的策略網(wǎng)絡(luò)(Policy Network)是一個(gè)兩層的全連接網(wǎng)絡(luò)。
為了更加詳實(shí)地闡述,這里我們用Python/Numpy來實(shí)現(xiàn)這個(gè)策略網(wǎng)絡(luò)。假設(shè)我們有一個(gè)變量x,里面有(經(jīng)過預(yù)處理之后的)像素信息。這時(shí)候我們可以計(jì)算:
h = np.dot(W1, x) # 計(jì)算隱層單元激活值 h[h<0] = 0 # 使用Relu非線性變換:閾值是0 logp = np.dot(W2, h) # 第二層 p = 1.0 / (1.0 + np.exp(-logp)) # sigmoid 函數(shù)(輸出一個(gè)概率值)在代碼中,W1和W2是兩個(gè)隨機(jī)初始化的矩陣。這里沒有用到偏置因?yàn)椴皇呛苤匾R⒁馕覀冊(cè)谧詈笠粚邮褂昧藄igmoid非線性變換,它能將輸出值修整到[0,1]區(qū)間(譯注:這樣才是概率嘛!)。從直覺上來說,隱藏單元的神經(jīng)元(在W1上的每一行權(quán)重)應(yīng)該能探測(cè)到不同的游戲場(chǎng)景(比如說球在頂部,擋板在中間),而在W2中的權(quán)值應(yīng)該能在各種情況下決定我們是要向上移動(dòng)還是向下移動(dòng)。我們現(xiàn)在講W1和W2隨機(jī)初始化之后,將會(huì)導(dǎo)致這個(gè)AI抽風(fēng)式地運(yùn)動(dòng)。所以我們需要做的就是找到一個(gè)合適的W1和W2讓這個(gè)AI稱為Pong的專家!
額外說一下preprocessing。我們其實(shí)需要至少將兩幀輸入到策略網(wǎng)絡(luò)中,否則網(wǎng)絡(luò)將沒法探測(cè)到運(yùn)動(dòng)(譯注:一張照片并不能表示球的運(yùn)動(dòng)方向等)。為了讓這件事更簡(jiǎn)單一些(我在我的Macbook上測(cè)試過),我將會(huì)做一個(gè)微小的預(yù)處理。比如說我們實(shí)際輸入的是兩幀的“區(qū)別”(比如說將當(dāng)前幀減上一幀得到的結(jié)果)。
聽起來不太可能
現(xiàn)在我需要讓你明白一個(gè)增強(qiáng)學(xué)習(xí)任務(wù)到底有多難。我們有100,800個(gè)數(shù)(210*160*3)在我們的策略網(wǎng)絡(luò)中(這個(gè)網(wǎng)絡(luò)的W1和W2很容易就會(huì)包含上百萬個(gè)參數(shù))。假設(shè)我們決定向上移動(dòng)擋板。在當(dāng)前時(shí)間幀,游戲認(rèn)為獲得0回報(bào)(譯注:因?yàn)榍蜻€沒撞到擋板,所以并不是成功反擊的+1回報(bào),也不是丟球的-1回報(bào),而是0回報(bào)),而在下一個(gè)時(shí)間幀,又將會(huì)有100,800個(gè)數(shù)字。我們需要重復(fù)這個(gè)步驟高達(dá)上百次,直到出現(xiàn)一次非0的回報(bào)(譯注:成功反彈或者丟球)。假設(shè)我們最終得到了+1回報(bào)。這很棒,但是我們?nèi)绾沃谰烤故鞘裁磳?dǎo)致了這個(gè)回報(bào)的發(fā)生?我們?cè)趧倓偰菐隽诵┦裁?#xff1f;或者說在第76幀做了什么?或者是不是我們?cè)诘?0幀時(shí)的操作和第90幀時(shí)做了某個(gè)至關(guān)重要的動(dòng)作?那么我們?cè)撊绾沃肋@上百萬的參數(shù)該調(diào)整那些、該如何調(diào)整才能后續(xù)的測(cè)試中達(dá)到更好的效果?我們將這個(gè)問題稱為“credit assignment”問題(credit assignment problem)。以Pong為例我們知道,一個(gè)+1回報(bào)表示球成功地傳給了對(duì)手。真實(shí)情況是我們將球反擊出了一個(gè)正確的軌跡,但實(shí)際上這是因?yàn)槲覀兒芫靡郧澳骋粠龀隽苏_的決定,比如說,有可能是20幀之前的某個(gè)操作就決定了最后能將球擊中。而在這之后的操作可能對(duì)是否能得到回報(bào)并不起作用(譯注:如果能預(yù)測(cè)球的落點(diǎn),在地20幀的時(shí)候把擋板放對(duì)就ok了,后面不論擋板怎么調(diào)整,只要擊球時(shí)還在這個(gè)位置,就能得到回報(bào)了)。說了這么多就是為了告訴你,我們面臨的這個(gè)問題非常之復(fù)雜,并且看起來是很難解決的。
有監(jiān)督學(xué)習(xí) (Supervised Learning)
在深入了解用到Policy Gradients的解決方案之前,我還想帶你回憶一下有監(jiān)督學(xué)習(xí)的基本知識(shí),因?yàn)樗鰪?qiáng)學(xué)習(xí)非常相似。參考下圖。在傳統(tǒng)的有監(jiān)督學(xué)習(xí)中,我們將一張圖片輸入到網(wǎng)絡(luò)中,然后獲取一些概率值。比如說“向上”、“向下”的二類分類問題。我所展示的是log概率(-1.2, -0.36)而不是概率(30%和70%),因?yàn)槲覀兘?jīng)常去優(yōu)化正確類別的log概率,這在數(shù)學(xué)上要更好一些,而且這對(duì)于優(yōu)化問題來說是等價(jià)的,因?yàn)閘og是單調(diào)的。現(xiàn)在,在有監(jiān)督學(xué)習(xí)中,我們必須要用到label。例如,我們被告知了現(xiàn)在應(yīng)該讓擋板向上(label 0)。此時(shí)我們需要將UP對(duì)應(yīng)的log概率設(shè)為1,然后運(yùn)行梯度下降算法去計(jì)算?Wlogp(y=UP|x)。這個(gè)梯度將會(huì)告訴我們這上百萬個(gè)參數(shù)中的每一個(gè)都應(yīng)該如何調(diào)整,來讓網(wǎng)絡(luò)稍微傾向于輸出“向上”。例如。網(wǎng)絡(luò)中上百萬個(gè)參數(shù)中的一個(gè)有可能具有梯度-2.1,這就意味著如果我們?cè)谶@個(gè)參數(shù)上增加一個(gè)很小的正值(比如0.001),那么log概率將會(huì)增加2.1*0.001(如果是負(fù)值則就會(huì)減小)。如果我們這樣更新參數(shù),那么網(wǎng)絡(luò)在下次看到一張非常相似的圖片的時(shí)候,就會(huì)更加傾向于去輸出“向上”。
策略梯度 (Policy Gradients)
但是,在增強(qiáng)學(xué)習(xí)的過程中,我們沒有正確的label那該怎么辦?所以我要介紹一種被稱作是Policy Gradients的方法(如下圖所示)。當(dāng)我們的策略網(wǎng)絡(luò)計(jì)算出向上的概率是30%(log概率是-1.2),向下的概率是70%(log概率是-0.36).我們現(xiàn)在從這個(gè)分布中去采樣;比如說,假設(shè)我們采樣得到的結(jié)果是“向下”(譯注:采樣方法比如說,產(chǎn)生一個(gè)0~1的均勻分布的隨機(jī)數(shù),判斷這個(gè)數(shù)>=0.7還是<0.7,對(duì)應(yīng)決定輸出是“向上”還是“向下”)
,然后我們?cè)谟螒蛑袌?zhí)行這個(gè)操作。這時(shí)候我們會(huì)注意到一個(gè)有趣的現(xiàn)象:我們可以像有監(jiān)督學(xué)習(xí)中那樣,立刻在“向下”的梯度上賦值1.0,然后去找到能讓網(wǎng)絡(luò)以后略微傾向做出“向下”動(dòng)作的梯度向量。但是問題是,直到目前為止,我們也不知道“向下”這個(gè)操作是好是壞。但這不是個(gè)大問題,我們可以等一陣然后看看結(jié)果。比如對(duì)Pong這個(gè)游戲來說,我們能夠一直等到游戲結(jié)束,然后獲得收益(如果贏了就是+1,如果輸了就是-1),然后認(rèn)為相對(duì)應(yīng)的值就是我們所做的操作的梯度(本例中是“向下”)。在下面的例子里,“向下”最終會(huì)導(dǎo)致游戲失敗。所以如果我們用-1表示“向下”對(duì)應(yīng)的log概率然后進(jìn)行反向傳播我們將會(huì)讓網(wǎng)絡(luò)對(duì)這個(gè)輸入在以后不鼓勵(lì)做出“向下”的操作(顯然是這樣,因?yàn)檫@個(gè)動(dòng)作將會(huì)導(dǎo)致最后輸?shù)粲螒?#xff09;。
也就是說:我們用一個(gè)隨機(jī)的策略來產(chǎn)生動(dòng)作,如果這個(gè)動(dòng)作在未來最終帶來好的結(jié)果那么將會(huì)被鼓勵(lì),如果這個(gè)動(dòng)作在未來最終帶來壞的結(jié)果那么將會(huì)被壓制。除此之外,甚至在我們贏得或輸?shù)粲螒驎r(shí),回報(bào)不一定要求是+1或者-1。它可以是任何表示最終效果的度量手段。例如我們可以認(rèn)為如果任務(wù)做的好,那么回報(bào)就是10.0,如果最終結(jié)果還不錯(cuò),那我們就把它作為梯度而不用-1,然后進(jìn)行反向傳播算法。這就是神經(jīng)網(wǎng)絡(luò)美妙的地方;使用它們就好像在作弊一樣:你能夠?qū)⒁话偃f個(gè)參數(shù)綁定在一個(gè)運(yùn)算速度高達(dá)1 teraflop的機(jī)器上然后用上SGD(隨機(jī)梯度下降)。它看起來并不靠譜,但神奇的是我們正生活在一個(gè)讓他能靠譜運(yùn)轉(zhuǎn)的世界。
Training Protocol (譯注:實(shí)在不知道怎么翻譯了)
下面詳細(xì)介紹一下訓(xùn)練過程。首先我們初始化策略網(wǎng)絡(luò)的W1,W2然后進(jìn)行100次Pong的游戲(我們稱這些策略叫做“rollouts”)。假設(shè)每一次游戲由200幀組成,所以我們一共要進(jìn)行20,000次“向上”或者“向下”的決定,而且對(duì)于每個(gè)決定,我們都能夠知道梯度,這個(gè)梯度則告訴了我們想要在未來做出更好的決策應(yīng)該做出怎樣的調(diào)整。現(xiàn)在只剩下去對(duì)我們做的每個(gè)決策標(biāo)記上是“好”還是“壞”了。例如我們贏了12場(chǎng)游戲,輸了88場(chǎng)游戲。我們將會(huì)用在贏的游戲過程中做出的200*12=2400個(gè)決策做出“正”的更新(對(duì)采樣得到的動(dòng)作賦值+1的梯度,然后進(jìn)行BP算法,參數(shù)更新將會(huì)鼓勵(lì)我們所采取的這些動(dòng)作)。然后我們會(huì)將其他在輸?shù)舻挠螒蛑兴龅?00*88=17600個(gè)決策標(biāo)記為“負(fù)”的更新(不鼓勵(lì)采取這些動(dòng)作)。然后網(wǎng)絡(luò)將會(huì)逐漸偏向做出有用的動(dòng)作,而減少做出無用的動(dòng)作。然后我們?cè)儆梦覀冚p微修正過的新的策略網(wǎng)絡(luò)進(jìn)行100場(chǎng)游戲,然后再去輕微地更新策略網(wǎng)絡(luò)。
策略梯度:讓動(dòng)作執(zhí)行一會(huì)兒,看看什么動(dòng)作將會(huì)產(chǎn)生高回報(bào),那么就提高這部分動(dòng)作在當(dāng)前情況下出現(xiàn)的概率。
圖中展示了4場(chǎng)游戲。每一個(gè)黑色的圓圈就是一個(gè)游戲的狀態(tài)(圖的下部有三個(gè)例子),每一個(gè)箭頭代表一次狀態(tài)轉(zhuǎn)換,上面標(biāo)注的是采樣得到的動(dòng)作。在這個(gè)例子中,我們贏了兩場(chǎng)游戲,輸了兩場(chǎng)游戲。通過策略梯度算法,我們用兩場(chǎng)贏了的游戲的數(shù)據(jù)來稍微鼓勵(lì)網(wǎng)絡(luò)做出這兩個(gè)episode(譯注一場(chǎng)游戲的一系列決策稱為一個(gè)episode)中的每一步。相反的,我們用輸?shù)舻膬蓤?chǎng)游戲的數(shù)據(jù)來稍微抵制網(wǎng)絡(luò)做出這兩個(gè)episode中的每一步。
如果你仔細(xì)想想這個(gè)過程,你會(huì)發(fā)現(xiàn)一些有趣的事情。比如說如果我們?cè)诘?0幀時(shí)做了一個(gè)“正確”的動(dòng)作(比如將球正確地反擊回去),但是在第150幀的時(shí)候卻丟了球該怎么辦?如果此時(shí)每一個(gè)動(dòng)作都被標(biāo)記成“不好”的動(dòng)作(因?yàn)槲覀儊G了球),那么會(huì)不會(huì)在第50幀的動(dòng)作也會(huì)被壓制?是的,它會(huì)被抵制。然而其實(shí)你可以考慮一下當(dāng)游戲進(jìn)行了成千次甚至上百萬次時(shí),雖然你第一次正確的反擊本應(yīng)讓你偏向贏得游戲,但平均來說,正確更新的數(shù)量還是要大于錯(cuò)誤更新的數(shù)量的,所以最終你的策略將會(huì)學(xué)習(xí)到做出正確的動(dòng)作。
2016年12月9日更新:從另一個(gè)視角解釋
在上面解釋中,我用到了諸如“將梯度設(shè)置成xx然后用反向傳播算法”這樣的話,這是基于你們很熟悉如何編寫你自己的反向傳播的算法,或者經(jīng)常使用Torch之類的需要自己顯示地寫出梯度的框架。然而,如果你經(jīng)常用的是Theano或者TensorFlow,你有可能會(huì)對(duì)這句話有些困惑,因?yàn)樵谶@些框架中,代碼是圍繞著損失函數(shù)組織的,而反向傳播算法是全自動(dòng)進(jìn)行的,并且很難去對(duì)它做修改。在這種情況下,從另一個(gè)角度解釋這件事或許更加直觀。在最簡(jiǎn)單的有監(jiān)督學(xué)習(xí)任務(wù)中,目標(biāo)函數(shù)是最大化∑ilogp(yi|xi),其中xi和yi是訓(xùn)練樣本(比如說是圖片和它們的標(biāo)簽)。策略梯度與有監(jiān)督學(xué)習(xí)除了這兩點(diǎn)以外是完全一樣的:1)我們沒有正確的標(biāo)簽yi,所以我們用網(wǎng)絡(luò)看到xi時(shí)采樣的動(dòng)作作為“假標(biāo)簽”來代替。2)我們基于最終的結(jié)果(譯注:贏或輸)來調(diào)整基于多個(gè)樣本相乘的損失函數(shù)(譯注:因?yàn)樽罱K的損失函數(shù)會(huì)由多個(gè)樣本相乘組成,參見極大似然估計(jì)MLE),就是說,我們要對(duì)有效的動(dòng)作提高它的log概率,對(duì)無效的動(dòng)作降低它的log概率。綜上所述,我們的損失函數(shù)現(xiàn)在應(yīng)該是這樣:∑iAilogp(yi|xi),其中yi是我們采樣得到的動(dòng)作,Ai是一個(gè)被稱為“advantage”的數(shù)。比如在Pong例子中,當(dāng)我們經(jīng)過整個(gè)episode最終贏得了勝利Ai就是+1,反之如果我們輸了就是-1.這能保證我們動(dòng)作的log概率在好結(jié)果中會(huì)被最大化,壞結(jié)果中會(huì)被最小化。所以說,增強(qiáng)學(xué)習(xí)完全就是有監(jiān)督學(xué)習(xí),只不過區(qū)別在于數(shù)據(jù)集是在不斷變化的(每次都會(huì)有不同的episode),然后與"advantage"相乘,然后我們每次采樣得到的數(shù)據(jù)集只會(huì)做一次(或者少量的)更新。
(譯注:與有監(jiān)督學(xué)習(xí)相比,RL重點(diǎn)在于在整個(gè)episode結(jié)束前,是不能確定每個(gè)標(biāo)簽的。所以說,產(chǎn)生一個(gè)episode->更新策略網(wǎng)絡(luò)->再基于最新的策略網(wǎng)絡(luò)產(chǎn)生新的episode->循環(huán)進(jìn)行。)
更加通用的“advantage”函數(shù)
我之前說過要多講一講“回報(bào)”。目前為止,我們?nèi)ピu(píng)價(jià)一個(gè)動(dòng)作的好壞都是依據(jù)最終會(huì)不會(huì)贏得游戲。一個(gè)更加通用的增強(qiáng)學(xué)習(xí)的設(shè)計(jì)是我們將會(huì)在每一個(gè)時(shí)間步都獲得一個(gè)回報(bào)rt。一個(gè)常用的選擇就是“discounted reward”。所以上圖的最終回報(bào)(eventual reward)就會(huì)變成Rt=∑∞k=0γkrt+k。其中,γ是一個(gè)0~1之間的數(shù),稱作是discount factor(取值比如說0.99)。這個(gè)表達(dá)式說明,我們對(duì)于一個(gè)采樣動(dòng)作的鼓勵(lì)強(qiáng)度,是后續(xù)所有回報(bào)的加權(quán)求和決定的,但是后面回報(bào)的重要性是以指數(shù)級(jí)衰減的。在實(shí)踐中,標(biāo)準(zhǔn)化這些回報(bào)也非常重要。比如說我們要計(jì)算所有100場(chǎng)Pong游戲中的20,000個(gè)動(dòng)作的回報(bào)Rt。一個(gè)比較好的做法就是在把這些數(shù)據(jù)送到BP算法之前,對(duì)這些回報(bào)做一下標(biāo)準(zhǔn)化的操作(比如通過減均值除標(biāo)準(zhǔn)差的方法)。這樣我們總能大約鼓勵(lì)一半的動(dòng)作、壓制一半的動(dòng)作。從數(shù)學(xué)上來說,這也可以被認(rèn)為是一種控制策略梯度的方差的一個(gè)技巧。更加相近的解釋可以參考這里
推導(dǎo)策略梯度
下面我會(huì)大概說一說策略梯度是怎樣從數(shù)學(xué)中得到的。策略梯度是一個(gè)更加廣義的概念——“score function gradient estimator”的特殊形式。通常的情況下我們需要計(jì)算形如Ex~p(x|θ)[f(x)]的表達(dá)式,比如說計(jì)算一個(gè)標(biāo)量值函數(shù)(scalar valued score function) f(x)服從以θ為參數(shù)的概率分布p(x;θ)的期望。提示:f(x)可以作為我們的回報(bào)函數(shù)(或者更通用地說,可以作為advantage函數(shù)),而p(x)是策略網(wǎng)絡(luò),也就是給定任意圖象I后對(duì)動(dòng)作a的分布函數(shù)p(a|I)。那么,我們感興趣的是我們應(yīng)該如何通過參數(shù)θ來修正這個(gè)分布,使得它能對(duì)樣本有著更高的得分,而這個(gè)得分是由f決定的(即,我們應(yīng)該如何修改網(wǎng)絡(luò)的參數(shù)才能讓動(dòng)作樣本得到更高的分?jǐn)?shù))。我們有下面的公式:
?θEx[f(x)]=?θ∑xp(x)f(x)=∑x?θp(x)f(x)=∑xp(x)?θp(x)p(x)f(x)=∑xp(x)?θlogp(x)f(x)=Ex[f(x)?θlogp(x)]definition of exceptionswap sum and gradientboth multiply and divide byp(x)use the face that?θlog(z)=1z?θzdefinition of exception譯注:經(jīng)過上面的公式,我們想要計(jì)算 ?θE[f(x)],不再需要真的去計(jì)算帶有函數(shù)f(x)的梯度了。只需要1)按照某個(gè)概率分布采樣,2)直接計(jì)算Ex[f(x)?θlogp(x)]來代替即可。這么做的好處是我們可以定義一個(gè)非常復(fù)雜的打分函數(shù)f(x),甚至這個(gè)函數(shù)可以不可微,因?yàn)槲覀冊(cè)诤罄m(xù)的求導(dǎo)中,完全沒有這個(gè)函數(shù)的參與,只要概率分布可微就行了。所以,在實(shí)際應(yīng)用中,f(x)常常是一個(gè)復(fù)雜的函數(shù),而p(x)則可以是一個(gè)由神經(jīng)網(wǎng)絡(luò)組成的策略網(wǎng)絡(luò)等模型,因?yàn)樯窠?jīng)網(wǎng)絡(luò)一般是可微的。
說人話就是:我們有某個(gè)概率分布p(x;θ)(為了簡(jiǎn)便所以寫成p(x)),并且可以從中進(jìn)行采樣(比如說從一個(gè)高斯分布)。對(duì)于每一個(gè)樣本,我們可以對(duì)其用評(píng)分函數(shù)(score function)f打分,即輸入樣本到函數(shù)中,得到一個(gè)標(biāo)量值作為分?jǐn)?shù)。這個(gè)等式告訴了我們應(yīng)該如何調(diào)整分布(由參數(shù)θ控制)才能得到用f評(píng)價(jià)的更高的分?jǐn)?shù)。特別地,它像是在說:抽一些樣本x,然后評(píng)價(jià)一下它們的分?jǐn)?shù)f(x),然后對(duì)每個(gè)x再計(jì)算一下第二項(xiàng)?θlogp(x;θ)。第二項(xiàng)的內(nèi)容是啥?它是一個(gè)向量:也就是能夠知道我們?cè)趨?shù)空間應(yīng)該如何調(diào)整才能使x出現(xiàn)的概率盡可能大。換句話說,如果我們有在?θlogp(x;θ)的方向有連續(xù)不斷的θ,我們將會(huì)看到產(chǎn)生x的概率將會(huì)稍稍增加。在回顧一下公式,它還告訴我們我們要把這個(gè)方向與那個(gè)標(biāo)量打分函數(shù)(scalar-valued score)f(x)相乘。這會(huì)使得具有更高得分的樣本對(duì)概率密度的“拖拽”力度要比分?jǐn)?shù)低的樣本大一些。所以如果我們基于多個(gè)從p中采樣的樣本去更新概率密度函數(shù),我們將會(huì)在想得分更高的樣本方向多偏離一些,這能夠讓得分更高的樣本更有可能被采樣出來。
一張關(guān)于分?jǐn)?shù)梯度函數(shù)的可視化圖。左:一個(gè)高斯分布,在其中采樣了幾個(gè)樣本(藍(lán)色點(diǎn))。在每一個(gè)藍(lán)色點(diǎn)上,我們也畫出了對(duì)應(yīng)高斯均值參數(shù)的log概率的梯度(譯注:即 ?θlogp(x;θ))。箭頭指向了想要使分布更容易采樣到樣本的調(diào)整方向的均值。中:一些打分函數(shù)對(duì)樣本給出了-1分,而在一些小區(qū)域中給出了+1分(注意此處不必須是一個(gè)可微的標(biāo)量值函數(shù))。現(xiàn)在箭頭被染色了,因?yàn)樵诟轮邪顺朔?#xff0c;我們會(huì)將所有綠色和紅色的箭頭分別取平均。右:經(jīng)過參數(shù)更新之后,綠色的箭頭和相反的紅色箭頭(譯注:與-1相乘表示取向量的反方向)會(huì)將分布向左下角輕輕推動(dòng)。正如我們所希望的一樣,現(xiàn)在再?gòu)倪@個(gè)分布中取值,將會(huì)更容易得到更高的分?jǐn)?shù)。
希望我講明白了這與增強(qiáng)學(xué)習(xí)之間的連接。我們的策略網(wǎng)絡(luò)就是讓我么能夠采樣出一系列比其他動(dòng)作更好的動(dòng)作(通過advantage函數(shù)判斷好壞)。這些數(shù)學(xué)公式的片段告訴我們了一種能夠修正策略參數(shù)的方法就是先讓動(dòng)作執(zhí)行一會(huì)兒,然后計(jì)算采樣的動(dòng)作的梯度,乘上它們的得分,然后將他們加起來,這就是上面做的事情。想要了解更詳盡的來龍去脈,我推薦你去閱讀John Schulman's lecture.
學(xué)習(xí)
好了,我們已經(jīng)介紹了策略梯度的直觀想法并且簡(jiǎn)單了解了它的起源。我實(shí)現(xiàn)了一個(gè)總共130行的Python腳本,它使用了OpenAI Gym的ATARI2600 Pong游戲。我訓(xùn)練了一個(gè)包括了200個(gè)隱層單元的兩層策略梯度網(wǎng)絡(luò),并且用RMSProp算法在batch大小為10的episodes上訓(xùn)練(每一個(gè)episode都包含了幾場(chǎng)游戲,因?yàn)楸荣愖罡叱煽?jī)就是21分)。我并沒有調(diào)整太多的代碼,然后在我的Macbook(非常慢)上運(yùn)行了3個(gè)晚上,最終得到的策略網(wǎng)絡(luò)能比AI玩家稍微好一點(diǎn)。Episode的數(shù)量共計(jì)8,000左右,算法大約玩兒了200,000場(chǎng)Pone的游戲(非常多!對(duì)不?),大約做了800次梯度的更新。我朋友告訴我說如果你在GPU上用卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練幾天,你能更加頻繁地打敗AI玩家,如果你要是能把參數(shù)調(diào)的好一些,你就能永遠(yuǎn)處于支配地位(就是說,贏得每一場(chǎng)游戲)。然而,我沒有話太多的時(shí)間去計(jì)算或者調(diào)優(yōu),在用Pong AI成功驗(yàn)證了主要的思想并且效果還不錯(cuò)我就停掉了程序。
學(xué)習(xí)到的權(quán)重
我們可以看一看學(xué)習(xí)到的權(quán)重的內(nèi)容。經(jīng)過預(yù)處理,我們輸入的都是80x80大小的圖片(當(dāng)前幀減去上一幀。譯注:保留一部分運(yùn)動(dòng)信息)。我們現(xiàn)在取W1的每一行,把他們展開成80x80的大小然后畫出來(譯注:此處可能跟之前提到的210x160x3的結(jié)構(gòu)不太一樣。這里的輸入圖片單張只存為80x80=6400,然后傳輸?shù)?00個(gè)神經(jīng)元中,所以矩陣W1的維度是6400x200)。下圖表示了40個(gè)(共計(jì)200個(gè))神經(jīng)元的可視化結(jié)果。白色的像素表示正值,黑色的像素表示負(fù)值。我們會(huì)發(fā)現(xiàn)有幾個(gè)神經(jīng)元被調(diào)整出了特定的球的運(yùn)動(dòng)路徑,并被編碼成了“黑白相間”的線段。由于球只能在一點(diǎn)處被擊中,所以這些神經(jīng)元能處理多個(gè)任務(wù)并且會(huì)在球沿著線的多個(gè)位置“激發(fā)”(譯注:此處的激發(fā)應(yīng)該不是指擊球。而是說當(dāng)球沿著這些路徑的時(shí)候,這些神經(jīng)元將會(huì)活躍起來,處于激發(fā)的狀態(tài))。“黑白相間”很有趣,因?yàn)樵谇蜻\(yùn)動(dòng)的過程中,神經(jīng)元像sin函數(shù)一樣波動(dòng)是由于使用了ReLU作為激活函數(shù),它會(huì)在軌跡的不同位置上離散式地激活(譯注:ReLU在x大于0的時(shí)候是線性,小于0時(shí)就是0,所以不是隨時(shí)激活)。圖片看起來有一些噪聲,我覺得或許用上L2正則效果會(huì)好一些(譯注:加上L2正則項(xiàng)能一定程度上避免過擬合,即避免了圖像“記住”一些特例,更容易分辨一些“普遍的特征”。這些特例可能就會(huì)產(chǎn)生圖像上的噪聲)。
哪些事情沒發(fā)生
所以說,到目前為止,我們從原始像素點(diǎn)去學(xué)習(xí)到了如何利用策略梯度去進(jìn)行Pong游戲,并且效果也非常好。這個(gè)方法時(shí)“guess-and-check”的一種理想形式。“guess”表示從我們當(dāng)前的策略出發(fā)產(chǎn)生一個(gè)動(dòng)作序列,而“check”表示我們要估計(jì)能產(chǎn)生正回報(bào)的動(dòng)作。講的更詳細(xì)一些,這代表了我們目前這個(gè)增強(qiáng)學(xué)習(xí)問題所能達(dá)到的最好的效果。能夠?qū)W習(xí)到這樣的行為令人印象深刻,但是如果你能直觀地了解到這個(gè)算法并且知道它如何工作的,你會(huì)有一點(diǎn)兒遺憾。尤其是,什么情況下它會(huì)不好使?
與人類如何學(xué)習(xí)進(jìn)行Pong游戲相對(duì)比。你向人們展示這個(gè)游戲,然后告訴他們規(guī)則“你要控制這個(gè)擋板,它能向上向下運(yùn)動(dòng),你的任務(wù)就是將球傳給其他由AI控制的玩家”,然后就準(zhǔn)備就緒可以開始了。注意其中由這么幾個(gè)區(qū)別:
- 在實(shí)踐種,我們通常會(huì)用某種方式來交流溝通這個(gè)任務(wù),但是對(duì)于標(biāo)準(zhǔn)的增強(qiáng)學(xué)習(xí)來說,你只能假設(shè)一個(gè)回報(bào)函數(shù)然后從與環(huán)境的交互中進(jìn)行探索。而當(dāng)人類參與到Pong中時(shí),如果沒有明確的關(guān)于回報(bào)函數(shù)的知識(shí)(尤其是回報(bào)函數(shù)是靜態(tài)但是隨機(jī)的)時(shí),人類在學(xué)習(xí)的過程中將會(huì)面臨很多困難。但是策略梯度就則不關(guān)心這些,并且可能比人類做的還優(yōu)秀。相似地,如果我們把各幀的像素隨機(jī)地置換,對(duì)于人類來說很有可能玩兒不好,但是對(duì)于策略梯度來說甚至可能都感覺不出什么區(qū)別(如果它們用的都是全連接網(wǎng)絡(luò)的話)
- 人類是帶有大量先驗(yàn)知識(shí)的,比如基本的物理學(xué)(球會(huì)反彈而不會(huì)瞬間移動(dòng),也不太可能會(huì)突然停住,因?yàn)樗鼛в幸恍┧俣?#xff09;。和一些基本的心理學(xué)(AI對(duì)手“渴望”去贏,那就有可能用某種顯而易見的策略去移動(dòng)球等等)。而且你心中有“控制”擋板的這個(gè)概念,并且會(huì)反映在向上向下的按鍵上。與此相反,我們的算法從零開始但很快就讓人印象深刻(因?yàn)樗_實(shí)有效)和沮喪(因?yàn)槲覀儾⒉恢浪裁磿r(shí)候就失效了)
- 策略梯度是一種暴力搜索的方法,正確的動(dòng)作最終會(huì)被發(fā)現(xiàn)并且固化到策略中。人類會(huì)構(gòu)建一個(gè)強(qiáng)大又抽象的模型,然后用它做規(guī)劃。在Pong中,我們能推理出對(duì)手比較慢,所以“將球高速反擊”將會(huì)是一個(gè)比較好的策略,這可能會(huì)導(dǎo)致對(duì)手無法在足夠的時(shí)間內(nèi)碰到球。然而,我們也會(huì)最終將這策略以肌肉記憶的形式固化在身體里。例如,當(dāng)我們想要學(xué)習(xí)一種新的需要移動(dòng)的任務(wù)(比如說學(xué)習(xí)駕駛一輛手動(dòng)變速的車)你在剛開始會(huì)需要經(jīng)常思考,但是最終會(huì)變得不需要思考,自動(dòng)就能進(jìn)行了。
- 策略梯度必須直接輸入正回報(bào),并且需要經(jīng)常體驗(yàn)到正匯報(bào),以便于它能慢慢地推動(dòng)策略參數(shù)偏向能重復(fù)產(chǎn)生高回報(bào)動(dòng)作的狀態(tài)。而人類能在不需要直接體驗(yàn)的回報(bào)(譯注:知道最終結(jié)果前)就能知道那些動(dòng)作更容易獲得高回報(bào)。我不用將我的汽車撞毀幾百次才能緩慢地學(xué)會(huì)如何避免碰撞。
蒙特祖瑪?shù)膹?fù)仇(Montezuma's Revenge):一個(gè)對(duì)我們的增強(qiáng)學(xué)習(xí)算法來說非常復(fù)雜的游戲。玩家必須跳躍、攀爬、拿到鑰匙然后打開門。計(jì)算機(jī)隨機(jī)采樣了幾十億次的移動(dòng),但是99%都是會(huì)掉下去摔死或者被怪物殺死。換句話說,它非常難以進(jìn)入到獎(jiǎng)勵(lì)狀態(tài)(譯注:絕大部分的采樣最終都是負(fù)回報(bào),幾乎沒有正回報(bào),所以沒法訓(xùn)練)。
另一個(gè)非常難的游戲Frostbite,人類能理解運(yùn)動(dòng),一些東西可以接觸,另外一些東西不能接觸,游戲的目標(biāo)是一塊一塊搭建一個(gè)冰屋。Building Machines That Learn and Think Like People是一個(gè)不錯(cuò)的關(guān)于這個(gè)游戲的分析和關(guān)于人與機(jī)器之間區(qū)別的討論。
我想要強(qiáng)調(diào)一點(diǎn),相反地,有很多游戲策略梯度能輕易打敗人類。特別是任何會(huì)經(jīng)常有回報(bào)信號(hào),并且需要精準(zhǔn)操控、快速反應(yīng)的游戲。那些不需要做長(zhǎng)期規(guī)劃的游戲很合適。這些短期的游戲的動(dòng)作與回報(bào)之間的關(guān)系能夠被算法輕易地“發(fā)掘”到,然后悄悄地被策略驅(qū)使著完善自己。這在我們開發(fā)的Pong的智能體中已經(jīng)出現(xiàn):它能學(xué)習(xí)到一種策略,等待球靠近然后在邊緣將它接到,因?yàn)檫@樣能以很高的速度將球傳回去。我們的智能體多次用到了這個(gè)策略。深度Q學(xué)習(xí)在很多ATARI游戲上都用這樣的方式打敗了人類,比如說Pinball, Breakout等等。
總結(jié)一下,一旦你理解這些算法工作的“技巧”,你就能推理出它們的強(qiáng)項(xiàng)和弱項(xiàng)。現(xiàn)在人類距離構(gòu)建一個(gè)抽象、并且具有豐富的游戲表示來幫助我們進(jìn)行規(guī)劃并且能快速學(xué)習(xí)的系統(tǒng)還差得遠(yuǎn)。總有一天,一臺(tái)計(jì)算機(jī)將會(huì)意識(shí)到一個(gè)像素?cái)?shù)組是一把鑰匙、一扇門,并且能意識(shí)到要撿起鑰匙去開門。但是現(xiàn)在我們里這個(gè)還是非常遙遠(yuǎn)的,而這個(gè)領(lǐng)域是一個(gè)熱門的研究領(lǐng)域。
神經(jīng)網(wǎng)絡(luò)中的不可導(dǎo)運(yùn)算
我想提一個(gè)跟策略梯度玩兒游戲無關(guān)的應(yīng)用:它能夠讓我們?nèi)ピO(shè)計(jì)并訓(xùn)練一個(gè)由不可導(dǎo)單元組成的神經(jīng)網(wǎng)絡(luò)。這個(gè)概念第一次由Williams于1992年介紹,并且最近在《Recurrent Models of Visual Attention》中用“hard attention”這個(gè)名字重新發(fā)展起來。這個(gè)模型用一系列低解析度的“foveal glances”來處理圖像。特別是在每一次迭代中,RNN都會(huì)收到圖像的一個(gè)小片段,然后隨機(jī)采樣一個(gè)下一次會(huì)看到的位置。比如說,RNN有可能正在看(5, 30)這個(gè)位置,然后看到了圖像的一個(gè)小片段,然后決定去看(24, 50)這個(gè)未知,以此類推。這個(gè)想法有個(gè)問題就是這將會(huì)產(chǎn)生一個(gè)“下一次看哪里”的分布,然后從這個(gè)分布采樣一個(gè)位置。但不幸的是,這個(gè)操作是一個(gè)不可導(dǎo)的操作,因?yàn)槲覀儾恢廊绻蓸拥玫狡渌奈恢脤?huì)有什么變化。具體一些地說,考慮一個(gè)神經(jīng)網(wǎng)絡(luò),接受一些輸入產(chǎn)生一些輸出:
我們會(huì)發(fā)現(xiàn)大部分的箭頭(藍(lán)色的)像往常一樣都是可導(dǎo)的,但是一些變換形式有可能包含一些不可導(dǎo)的采樣操作(紅色的)。我們能正確地對(duì)藍(lán)色箭頭用BP算法,但是紅色箭頭所表示的依賴關(guān)系我們是沒法用BP算法的。
而策略梯度則則解決了這個(gè)問題!我們可以將網(wǎng)絡(luò)的一部分看作是嵌入在一個(gè)大網(wǎng)絡(luò)中的隨機(jī)策略。因此,在訓(xùn)練過程中我們將會(huì)產(chǎn)生幾個(gè)樣本(就是下圖中的分支),然后我們會(huì)去鼓勵(lì)產(chǎn)生那些最終能帶來正回報(bào)的樣本(比如說需要在整個(gè)過程結(jié)束后才能評(píng)價(jià)損失函數(shù)值的時(shí)候)。換句話說,我們將會(huì)像平時(shí)一樣去用BP算法來訓(xùn)練藍(lán)色箭頭表示的參數(shù),而對(duì)于紅色箭頭中的參數(shù),我們現(xiàn)在會(huì)用策略梯度的方法來向前傳遞,然后鼓勵(lì)能采樣出使最終損失降低的樣本。這個(gè)想法有一個(gè)很好的形式化說明:《Gradient Estimation Using Stochastic Computation Graphs》
可訓(xùn)練的存儲(chǔ)I/O
你可能會(huì)在很多其他的論文中見到這個(gè)想法。比如說,神經(jīng)圖靈機(jī)(Neural Turing Machine)有一個(gè)“磁帶存儲(chǔ)器”,并且能從上面讀取數(shù)據(jù),向上面寫入數(shù)據(jù)。執(zhí)行寫操作一般會(huì)執(zhí)行形如m[i] = x的操作,其中的i和x是通過一個(gè)RNN控制器網(wǎng)絡(luò)(RNN controller network)來產(chǎn)生的。然而,這個(gè)操作是一個(gè)不可導(dǎo)操作,因?yàn)椴]有一個(gè)信號(hào)告訴我們?nèi)绻覀兿蛞粋€(gè)不同的位置j != i寫入,損失函數(shù)會(huì)有什么變化。因此,神經(jīng)圖靈機(jī)必須去做“soft”讀和寫操作。它要預(yù)測(cè)產(chǎn)生一個(gè)分布a(每一個(gè)元素都是0~1之間,而且和為1,然后在我們要寫入的索引附近的位置應(yīng)該有很多峰值。譯注:表示這個(gè)位置更容易被采樣得到),然后執(zhí)行for all i: m[i] = a[i]\*x。雖然現(xiàn)在可導(dǎo)了,但是我們不得不付出很大的計(jì)算代價(jià),因?yàn)楸仨氃L問每一個(gè)內(nèi)存單元去寫入。想象一下,當(dāng)每一次賦值操作都會(huì)訪問整個(gè)內(nèi)存!
(譯注:這一段是說,神經(jīng)圖靈機(jī)不能像真的計(jì)算機(jī)一樣,直接就能向某個(gè)內(nèi)存單元寫入。因?yàn)檫@樣的操作是不可導(dǎo)的。解決方法就是通過產(chǎn)生一個(gè)分布,然后從這個(gè)分布中采樣得到每一個(gè)“每一個(gè)內(nèi)存單元內(nèi)是否寫入數(shù)據(jù)”的樣本,然后通過遍歷每一個(gè)內(nèi)存單元與這個(gè)樣本共同控制是否寫入內(nèi)容。這樣雖然讓這個(gè)問題變得可導(dǎo)、能用BP算法運(yùn)算,但是每一次操作都會(huì)伴隨著對(duì)所有內(nèi)存單元的訪問。)
然而,我們能用策略梯度(在理論上)來解決這個(gè)問題,而RL-NTM也就是這么做的。我們現(xiàn)在還是預(yù)測(cè)一個(gè)attention分布a,但是現(xiàn)在我們不再做soft寫入,而是采樣得到一個(gè)寫入的位置:i=sample(a); m[i]=x。在訓(xùn)練過程中,我們將會(huì)對(duì)一個(gè)小批i進(jìn)行這個(gè)操作,而最終要看哪一個(gè)分支工作的最好。而且在測(cè)試階段,我們只需要對(duì)一個(gè)位置進(jìn)行寫入/讀取就可以了,這回打來巨大的計(jì)算力的解放。然而,就像這篇論文中指出的一樣,這個(gè)策略非常難以發(fā)揮作用,因?yàn)椴蓸涌倳?huì)導(dǎo)致意外的錯(cuò)誤。現(xiàn)在,大家一致認(rèn)為策略網(wǎng)絡(luò)只有在只包含了幾個(gè)離散的選擇時(shí)才有效,當(dāng)需要從巨大的搜索空間中搜索時(shí),這個(gè)方法就變得毫無希望了。
然而,我們擁有策略梯度算法和大量的數(shù)據(jù)和計(jì)算能力,我們現(xiàn)在能想的長(zhǎng)遠(yuǎn)一些,比如說我們能夠設(shè)計(jì)一個(gè)神經(jīng)網(wǎng)絡(luò),去學(xué)習(xí)如何與一個(gè)巨大的、不可導(dǎo)的模塊進(jìn)行交互,例如LaTeX的編譯器(比如說你可以做一個(gè)字符級(jí)的RNN然后產(chǎn)生LaTeX代碼然后編譯),或者一個(gè)SLAM(Simultaneous Localization and Mapping)系統(tǒng)、一個(gè)LQR(Linear Quadratic Regulator)求解器,或者其他的什么東西。再比如說,一個(gè)超級(jí)智能的東西能夠?qū)W習(xí)如何用TCP/IP協(xié)議與互聯(lián)網(wǎng)進(jìn)行交互(這顯然是一個(gè)沒法求導(dǎo)的問題)去了解如何接管這個(gè)世界的致命信息。
結(jié)語
我們看到了策略梯度這個(gè)功能強(qiáng)大,適用范圍廣泛的算法,并且作為例子我們從零開始用130行Python代碼實(shí)現(xiàn)并訓(xùn)練了一個(gè)ATARI Pong的像素級(jí)智能體。同樣的算法還可以被用來訓(xùn)練很多其他的游戲,總有一天它會(huì)為很多現(xiàn)實(shí)世界中復(fù)雜控制問題的解決帶來希望。我想要在這篇文章的結(jié)尾處再寫幾句:
關(guān)于推動(dòng)AI
我們已經(jīng)了解到這些算法使用了包里搜索的方法,也就是剛開始隨機(jī)地游走,然后一定會(huì)跌跌撞撞地得到至少一次回報(bào),然后再理想情況下,這個(gè)過程要重復(fù)很多次,直到策略分布通過調(diào)整它的參數(shù)能夠做出合理的動(dòng)作。我們也了解到這些問題對(duì)人類來說也是非常困難的。這就好像快速構(gòu)建一個(gè)抽象模型——我們僅僅在研究中觸及冰山一角(盡管很多然都在嘗試)。這些抽象模型非常難(如果不是不可能的話)以明確地被評(píng)注,這也就是為什么我們最近在(無監(jiān)督)生成模型和程序歸納(Program Induction)領(lǐng)域表現(xiàn)出極大興趣的原因。
關(guān)于復(fù)雜機(jī)器人的應(yīng)用
算法并不能簡(jiǎn)單地推廣到需要大量探索的場(chǎng)景中。比如說,一個(gè)機(jī)器人應(yīng)用中有可能包含了一個(gè)(或幾個(gè))機(jī)器與現(xiàn)實(shí)世界中的實(shí)時(shí)交流。我們上面提到的算法在這個(gè)場(chǎng)景中可能沒法使用。一個(gè)試圖解決這個(gè)問題的相關(guān)工作是deterministic policy gradients。這個(gè)方法不是通過從隨機(jī)策略中采樣然后鼓勵(lì)這個(gè)采樣能獲得更高的分?jǐn)?shù),而是通過確定的策略直接從第二個(gè)網(wǎng)絡(luò)(稱為critic)中獲得梯度信息并對(duì)打分函數(shù)建模。這個(gè)方法能夠在高維動(dòng)作場(chǎng)景中取得更好的效果,而動(dòng)作采樣的方法收斂性不強(qiáng)。但是目前從經(jīng)驗(yàn)上看來想要讓它有效果還是需要很多繁瑣的工作需要做的。另一個(gè)相關(guān)的方法是規(guī)模化機(jī)器人(scale up robotics),就像谷歌的機(jī)械臂農(nóng)場(chǎng),或許還包括Tesla的Model S和自動(dòng)駕駛技術(shù)
還有另一種方法能使得搜索過程更加容易,那就是加上額外的監(jiān)督信息。在一些特定的情況,機(jī)器能獲取到人類專家的指導(dǎo)。比如說AlphaGo就首度利用了監(jiān)督學(xué)習(xí)的方法去預(yù)測(cè)人類圍棋專家的落子,然后去再通過策略梯度針對(duì)贏得游戲的“真實(shí)的”目標(biāo)函數(shù)微調(diào)之后,模仿人類的落子策略。在一些情況下只需要不多的專家指導(dǎo)(比如遠(yuǎn)程操作機(jī)器人),話有一些其他技術(shù)通過apprenticeship learning利用這些數(shù)據(jù)。最后如果沒有任何人類提供的監(jiān)督數(shù)據(jù),仍然有些代價(jià)很高的優(yōu)化算法可以用。比如說trajectory optimization就是一個(gè)廣為人知的動(dòng)力模型(比如說物理引擎中的F=ma),或者其他可以通過學(xué)習(xí)局部近似的動(dòng)態(tài)模型(常見于非常靠譜的框架Guided Policy Search)
關(guān)于使用策略梯度的最佳實(shí)踐
在上面我提到過,我想做一些在RNN那篇博文中做過的事情。我在那篇文章中展示了RNN的魔力,并且展示了一個(gè)自動(dòng)序列生成問題。但事實(shí)上,想要讓這些模型正確工作起來是需要很多小技巧的,它需要小心而又專業(yè)地調(diào)參,并且在很多時(shí)候,用這么復(fù)雜的模型就像大炮轟蚊子。可能一個(gè)更簡(jiǎn)單的方法在90%的情況下都是有效的。同樣,對(duì)于策略梯度來說,它也不是全自動(dòng)就能用的:你需要大量的樣本,然后永遠(yuǎn)訓(xùn)練下去,當(dāng)它不好使的時(shí)候也很難去debug。你應(yīng)該在決定使用火箭筒之前先試試玩具槍。在增強(qiáng)學(xué)習(xí)的例子中,有一個(gè)很厲害的基準(zhǔn)方法你應(yīng)該先試試,那就是交叉熵方法(Cross-entropy Method, CEM)。它是一個(gè)由進(jìn)化算法啟發(fā)而成的簡(jiǎn)單的隨機(jī)向上的“猜測(cè)、驗(yàn)證”方法。如果你一定要在你的問題中嘗試使用策略梯度,那就一定要多花些經(jīng)歷在很多論文tricks的章節(jié)。從最簡(jiǎn)單的開始,使用一種PG的變種TRPO。它在實(shí)踐中幾乎總是比最普通的策略梯度算法有效。它的核心思想是避免因參數(shù)更新導(dǎo)致策略變化的太頻繁,強(qiáng)制增加了一個(gè)子一組數(shù)據(jù)上得到的新老兩個(gè)分布KL距離的約束(而不是結(jié)合上所有的梯度,關(guān)于這個(gè)想法最簡(jiǎn)單的例子就是線搜索(line search)然后一直檢查KL距離)。
好的!我希望我已經(jīng)大致給你講明白了什么是增強(qiáng)學(xué)習(xí),以及其中的難點(diǎn)是什么。如果你非常渴望去幫助增強(qiáng)學(xué)習(xí)的發(fā)展,那我邀請(qǐng)你在OpenAI Gym中嘗試一下:)下次見。
原文: http://karpathy.github.io/2016/05/31/rl/?_utm_source=1-2-2
總結(jié)
以上是生活随笔為你收集整理的Deep Reinforcement Learning: Pong from Pixels的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlyog安装包_sqlyog社区版和
- 下一篇: [机器学习]正则化方法 -- Regul