王霞
(福建船政交通職業(yè)學(xué)院 信息與智慧交通學(xué)院,福建 福州 350007)
Unity3D是一個(gè)廣為人知的專業(yè)游戲開發(fā)平臺(tái),而將機(jī)器學(xué)習(xí)技術(shù)與Unity3D相結(jié)合則可以提高游戲研發(fā)效率[1-2]。機(jī)器學(xué)習(xí)技術(shù)(尤其是深度增強(qiáng)學(xué)習(xí))適用于復(fù)雜任務(wù)的學(xué)習(xí)和控制,通過采用Unity Machine Learning Agents(ML-Agents)等工具包,可以實(shí)現(xiàn)Unity3D與深度學(xué)習(xí)平臺(tái)Tensorflow之間的通信[3]。近端策略優(yōu)化(Proximal Policy Optimization,PPO)是一種能用于連續(xù)控制的強(qiáng)化學(xué)習(xí)算法,是目前性能較好的策略算法[4]。本研究在Unity3D平臺(tái)中實(shí)現(xiàn)了PPO算法的訓(xùn)練框架,并使用這個(gè)框架來試驗(yàn)不同的訓(xùn)練設(shè)置。
PPO算法易于實(shí)現(xiàn),能在連續(xù)的狀態(tài)和動(dòng)作空間中取得非常好的效果。PPO的目標(biāo)函數(shù)具有以下的形式[5]:
L(θ)=Et[min(rt(θ)Advt,clip(rt(θ),1-ε,1+ε)Advt]
(1)
這個(gè)目標(biāo)函數(shù)取前一個(gè)目標(biāo)值和clip函數(shù)值之間的最小值,其中ε是超參數(shù)。Adv的值大于0意味著算法所采取的行動(dòng)具有優(yōu)勢(shì)。如果0
在ML框架中,Agent負(fù)責(zé)接收觀察的結(jié)果(狀態(tài)),大腦根據(jù)這些狀態(tài)決定選擇動(dòng)作以最大化當(dāng)前的獎(jiǎng)勵(lì)。大腦與不同的Agent相連,負(fù)責(zé)決定Agent所需要采取的行動(dòng)。由此決定需要使用哪種類型的大腦以及要處理的狀態(tài)空間和動(dòng)作空間的類型及其大小。在學(xué)習(xí)的過程中,大腦將被設(shè)置為外部類型意味著通過TensorFlow來做出動(dòng)作和決定;而內(nèi)部類型的大腦可以在ML模型的內(nèi)部做出決策。
在進(jìn)行訓(xùn)練之前,需要選擇模型的超參數(shù)。這些參數(shù)是用來調(diào)整訓(xùn)練的設(shè)置,所使用的超參數(shù)設(shè)置及其定義如下表1所示:
表1 超參數(shù)取值和含義
表1(續(xù))
首先實(shí)現(xiàn)一個(gè)簡單的游戲場(chǎng)景來了解工作原理。該場(chǎng)景由一個(gè)玩家和一個(gè)目標(biāo)組成,游戲的目的是讓玩家到達(dá)目標(biāo)。對(duì)于學(xué)院,將使用通用的學(xué)院設(shè)置,將大腦設(shè)置為具有1個(gè)觀察和1個(gè)動(dòng)作,并且狀態(tài)和動(dòng)作空間都將設(shè)置為連續(xù)的。當(dāng)代理達(dá)到最大步數(shù)或接觸目標(biāo)時(shí),會(huì)調(diào)用代理重置算法。該算法將代理和目標(biāo)隨機(jī)放置在一些預(yù)定義的位置上,并保存了代理和目標(biāo)之間的初始距離。接下來,代理采用觀察收集算法收集觀察。在得到一個(gè)觀察結(jié)果后,代理將其傳遞給大腦以決定選擇哪個(gè)動(dòng)作,使用兩個(gè)物體之間的距離作為觀察結(jié)果。盡量保持觀察次數(shù)盡可能少,同時(shí)讓代理有足夠的信息來完成任務(wù),代理使用動(dòng)作選擇算法來選擇動(dòng)作和計(jì)算相應(yīng)的回報(bào)。由大腦決定的動(dòng)作存儲(chǔ)在數(shù)組中,由于只有一個(gè)動(dòng)作,因此該動(dòng)作的值會(huì)被存儲(chǔ)在該數(shù)組的第一個(gè)條目中。動(dòng)作的取值范圍是-1和1之間,代理最大的移動(dòng)步長為SAgent。如果代理和目標(biāo)之間的距離足夠小,將獎(jiǎng)勵(lì)設(shè)置為1,并將完成標(biāo)志標(biāo)記為 true。 為了加快學(xué)習(xí)進(jìn)度,當(dāng)代理和目標(biāo)之間的距離過大時(shí),將設(shè)置額外的懲罰。此時(shí)獎(jiǎng)勵(lì)被設(shè)置為-0.1。
圖1展示了在訓(xùn)練過程中累積回報(bào)的變化情況。此處的最大步數(shù)是5 000 000。從圖中可以看到,在訓(xùn)練迭代了2 500 000步之后算法開始穩(wěn)定。
由于僅使用一個(gè)代理進(jìn)行訓(xùn)練需要較長的收斂時(shí)間,為了提高訓(xùn)練效率,可以考慮使用多個(gè)代理。與一個(gè)代理相比,多個(gè)代理可以收集更多的經(jīng)驗(yàn)來更新本策略和價(jià)值函數(shù)。圖2展示了多個(gè)代理的訓(xùn)練收斂過程。與圖1相比,多個(gè)代理的累計(jì)回報(bào)大約在25 000步后就穩(wěn)定,說明采用多個(gè)代理能更快地收斂。
接下來考慮一個(gè)三維(3D)的場(chǎng)景,此時(shí)代理需要至少兩個(gè)動(dòng)作才能在三維空間中移動(dòng),而且觀察次數(shù)的增加導(dǎo)致訓(xùn)練時(shí)間更長。對(duì)于該場(chǎng)景,使用球坐標(biāo),并按照以下方程將其轉(zhuǎn)換為笛卡爾坐標(biāo):
x=rsinθcosφ
y=rsinθsinφ
(2)
z==rcosφ
為代理設(shè)置了2個(gè)動(dòng)作,6個(gè)觀察值。代理收集的觀察不僅有橫、縱坐標(biāo),還有豎坐標(biāo)。代理使用動(dòng)作選擇算法(如算法1所示)選擇動(dòng)作和計(jì)算回報(bào)。在該算法中,大腦需要選擇2個(gè)動(dòng)作。與前一種場(chǎng)景不同的是,該算法沒有使用固定的懲罰值-0.1,而是根據(jù)與代理與目標(biāo)的距離來設(shè)置可變的懲罰值,即當(dāng)代理與目標(biāo)的距離越大,懲罰值就會(huì)變大。算法通過設(shè)置邊界來避免代理遠(yuǎn)離目標(biāo),當(dāng)代理超過預(yù)設(shè)的邊界時(shí),算法將懲罰值設(shè)置為一個(gè)較大的負(fù)數(shù)。
算法1 三維場(chǎng)景的動(dòng)作選擇算法1: the←GetThe(actVector);2: phi←GetPhi(actVector);3: mag←UpdateMag(mf *sin(the)*cos(phi), 4: mf *sin(the)*sin(phi),5: cos(the));6: moveAgent(mag);7: dist←CalDist(agent.pos, target.pos);8: r←-dist/(inidist×maxStep);9: if agent.x > rB and agent.y cB and agent.z > dB do10: r←-1;11: return;12: end if13: if dist < thre do14: r←maxStep - curStep;15: return;16: end if17: return;
在訓(xùn)練期間,代理可能會(huì)學(xué)習(xí)到次優(yōu)行為,例如緩慢地移動(dòng)向目標(biāo)。針對(duì)這個(gè)問題,可以設(shè)置更大的獎(jiǎng)勵(lì)。當(dāng)代理靠近或者達(dá)到目標(biāo)時(shí),算法設(shè)置一個(gè)較大的獎(jiǎng)勵(lì),以縮短代理的學(xué)習(xí)過程,使代理盡可能快地到達(dá)目標(biāo)。
圖3展示了三維場(chǎng)景中累計(jì)回報(bào)隨著迭代次數(shù)增加的變化情況。由圖可知,累計(jì)回報(bào)大約在1 500 000次迭代后趨向穩(wěn)定,此時(shí)算法收斂。
接下來,考慮一個(gè)更為復(fù)雜的汽車避障場(chǎng)景。汽車的后輪負(fù)責(zé)驅(qū)動(dòng)車輛,前輪用于轉(zhuǎn)向。需要使用2個(gè)動(dòng)作來使汽車移動(dòng):一個(gè)動(dòng)作負(fù)責(zé)驅(qū)動(dòng)前進(jìn),另一個(gè)負(fù)責(zé)轉(zhuǎn)向。代理的觀察值不僅包括汽車的移動(dòng)速度和汽車與目標(biāo)的距離,還包括扭矩和前輪的轉(zhuǎn)向角。
代理使用算法2來選擇動(dòng)作和計(jì)算相應(yīng)的回報(bào)值。
算法2 無障礙汽車動(dòng)作選擇算法1: tor←GetTor(actVector);2: tor← tor * 200;3: ang←GetAngle(actVector);4: SetTor(tor);5: SetAngle(ang);6: dist←CalDist(agent.pos, target.pos);7: r ←-dist/(inidist×maxStep);8: if dist < thre do9: r←10;10: return;11: end if12: return;
使用隨機(jī)生成的目標(biāo)來訓(xùn)練汽車。從圖4所示的結(jié)果可知,在訓(xùn)練開始時(shí),汽車的學(xué)習(xí)速度非???,累計(jì)回報(bào)不斷增加。但隨著迭代次數(shù)的增加,累計(jì)回報(bào)逐漸下降,并趨于穩(wěn)定。這是因?yàn)楫?dāng)目標(biāo)在代理前面時(shí),代理能更快地達(dá)到目標(biāo)。但是當(dāng)目標(biāo)在后方時(shí),代理一開始的表現(xiàn)會(huì)變得不穩(wěn)定,隨后才慢慢穩(wěn)定了自己的速度,追趕后面的目標(biāo)。
接下來在隨機(jī)生成的目標(biāo)旁邊設(shè)置一個(gè)障礙物,考察強(qiáng)化學(xué)習(xí)算法在該場(chǎng)景下的性能。將目標(biāo)隨機(jī)放置在障礙物的一側(cè)。在每一個(gè)episode中,障礙物都會(huì)出現(xiàn)在汽車前面的位置。在該場(chǎng)景中,觀察的數(shù)量顯著增加,這是因?yàn)樾枰恍╆P(guān)于汽車周圍的信息。使用了11條長度為15個(gè)單位、從汽車出發(fā)的射線來感知汽車周圍的信息。當(dāng)汽車與障礙物接近時(shí),將即時(shí)回報(bào)設(shè)置為-10。當(dāng)射線與目標(biāo)接觸時(shí),該射線的編碼將被設(shè)置為rdist/15。當(dāng)射線沒有與目標(biāo)接觸時(shí),將射線編碼為-1。
在訓(xùn)練開始時(shí),智能體會(huì)隨機(jī)走到障礙物的一側(cè),以盡快找到目標(biāo)。在多次迭代之后,智能體學(xué)習(xí)到了與目標(biāo)接觸射線的距離和智能體與目標(biāo)之間的距離關(guān)系,因此收斂速度變快了(如圖5所示)。
本文在Unity3D的環(huán)境中研究了深度增強(qiáng)學(xué)習(xí)訓(xùn)練框架的實(shí)現(xiàn)。首先在一維的簡單場(chǎng)景中實(shí)現(xiàn)了深度增強(qiáng)學(xué)習(xí)模型的訓(xùn)練框架。然后,逐步增加場(chǎng)景的復(fù)雜性:從一維到三維,最后到汽車避障問題,并為這些問題實(shí)現(xiàn)了相應(yīng)的訓(xùn)練框架,考察了深度增強(qiáng)學(xué)習(xí)模型的收斂性能。未來的研究將實(shí)現(xiàn)自動(dòng)化的模型訓(xùn)練,以減少繁瑣的人工操作。