Unity ML-agents 參數(shù)設(shè)置解明

本文首發(fā)于:行者AI

Unity 是全球最受歡迎的游戲開發(fā)引擎之一恩伺,有大量的游戲開發(fā)者在使用Unity開發(fā)他們的游戲棘劣。在這個(gè)AI拢蛋、大數(shù)據(jù)等流行詞遍布各行各業(yè)的時(shí)代,Unity也沒有被潮流拋下搔预,推出了他們自己的基于深度強(qiáng)化學(xué)習(xí)來(lái)訓(xùn)練游戲AI的工具包Unity ML-agents霹期。這個(gè)工具包功能豐富,十分強(qiáng)大拯田±欤可以幫助你在你的游戲內(nèi)實(shí)現(xiàn)一個(gè)新的AI算法,并且快速的用到你的游戲當(dāng)中。這么強(qiáng)大的工具包難以在一篇文章里面概括其所有功能吭产。本文就先拋磚引玉侣监,稍微討論一下Unity ML-agents訓(xùn)練的時(shí)候需要用到的各種參數(shù)的意義,其常用的取值又是如何臣淤。

本文所有內(nèi)容參考Unity ML-agents的官方文檔(地址:https://github.com/Unity-Technologies/ml-agents/tree/main/docs

1. 訓(xùn)練參數(shù)設(shè)置

在你開始你的訓(xùn)練之前橄霉,你需要針對(duì)你的訓(xùn)練任務(wù)設(shè)定一個(gè)訓(xùn)練參數(shù)文件(一般是一個(gè).yaml文件)。

接下來(lái)就簡(jiǎn)單介紹一下ml-agents環(huán)境里的參數(shù)設(shè)置概要邑蒋。本文主要參考ml-agents最新版本關(guān)于參數(shù)設(shè)置的官方文檔姓蜂,做了一些概括性的翻譯并加入一定個(gè)人理解。

具體文檔地址:https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Training-Configuration-File.md

訓(xùn)練參數(shù)主要分為常用訓(xùn)練參數(shù)(Common Trainer Configurations), 訓(xùn)練方式專用參數(shù)(Trainer-specific Configurations)寺董,超參數(shù)(hyper-parameters) 覆糟,獎(jiǎng)勵(lì)信號(hào)參數(shù)(Reward Signals), 行為克抡诳А(Behavioral Cloning),使用RNN增強(qiáng)智能體記憶能力的參數(shù)(Memory-enhanced Agents using Recurrent Neural Networks)造虏,以及自我對(duì)抗訓(xùn)練參數(shù)(Self-Play)這幾個(gè)大的模塊御吞。這幾個(gè)模塊下面又有一些小的模塊,在后文會(huì)進(jìn)一步說(shuō)明漓藕,而且這些模塊并不需要總是全都去設(shè)定陶珠。事實(shí)上,除了前三個(gè)模塊是幾乎每個(gè)環(huán)境訓(xùn)練必須的參數(shù)之外享钞,其他的模塊僅用在需要使用到對(duì)應(yīng)功能的訓(xùn)練任務(wù)揍诽。接下來(lái)具體說(shuō)明每個(gè)參數(shù)的含義。

2. 常用訓(xùn)練參數(shù)模塊(Common Trainer Configurations)

  • trainer_type: (default = ppo) 這個(gè)參數(shù)決定了使用什么智能體訓(xùn)練算法栗竖,現(xiàn)在暫時(shí)只支持Proximal Policy Gradient(PPO暑脆,具體應(yīng)為OpenAI版本的PPO2),Soft Actor-Critic(SAC)狐肢,以及MA-POCA添吗。前兩種都只是單智能體訓(xùn)練算法。 注意:在你改動(dòng)了訓(xùn)練算法后份名,記得去調(diào)整一下后面的相應(yīng)參數(shù)碟联。對(duì)于不同的算法,下面的參數(shù)也往往有不同的適用范圍僵腺,并非無(wú)縫銜接的鲤孵。下面會(huì)具體說(shuō)明。

  • summary_freq: (default = 50000) 這個(gè)參數(shù)決定了多少步數(shù)(step)之后辰如,開始記錄我們的訓(xùn)練統(tǒng)計(jì)數(shù)據(jù)普监。

  • time_horizon: (default = 64) 這個(gè)參數(shù)決定了在多少步數(shù)之后,開始把收集到的經(jīng)驗(yàn)數(shù)據(jù)放入到經(jīng)驗(yàn)池(experience buffer)。這個(gè)量同樣也決定了使用多少步后的采樣來(lái)對(duì)當(dāng)前動(dòng)作的預(yù)期獎(jiǎng)勵(lì)進(jìn)行訓(xùn)練鹰椒。簡(jiǎn)單來(lái)說(shuō)锡移,這個(gè)值如果越大,就相當(dāng)于你更接近于一局(episode)游戲的真實(shí)回報(bào)漆际,從而偏差更小淆珊。但是由于要進(jìn)行一局游戲才能更新一個(gè)動(dòng)作的獎(jiǎng)勵(lì)預(yù)期,這個(gè)過(guò)程相當(dāng)?shù)拈L(zhǎng)奸汇,并且每局游戲可能情況變化很大施符。不同局之間,做同樣的動(dòng)作可能最終收益大相徑庭(因?yàn)檫@個(gè)動(dòng)作可能其實(shí)對(duì)這個(gè)游戲的影響根本沒有那么大)擂找,從而導(dǎo)致方差較大戳吝。反過(guò)來(lái),當(dāng)你采樣的步數(shù)太小贯涎,可能對(duì)最終的獎(jiǎng)勵(lì)預(yù)估會(huì)偏差很大听哭,但是可能帶來(lái)較小的方差。其實(shí)這也跟機(jī)器學(xué)習(xí)里面經(jīng)典的簡(jiǎn)單模型復(fù)雜模型(過(guò)擬合欠擬合)問(wèn)題一樣塘雳,需要在方差和偏差當(dāng)中取一個(gè)平衡陆盘。官方建議當(dāng)你的環(huán)境太大(跑一步耗時(shí)太長(zhǎng))或者你設(shè)置的獎(jiǎng)勵(lì)比較密集的時(shí)候,可以把這個(gè)值設(shè)的低一點(diǎn)败明,反之則需要增大隘马。比如在足球比賽這樣獎(jiǎng)勵(lì)非常稀疏的任務(wù)當(dāng)中,范例文檔設(shè)置的該參數(shù)值為1000妻顶。 注意酸员,這個(gè)參數(shù)決定了采樣的步數(shù),和batch_size讳嘱、 buffer_size幔嗦、 epoch等參數(shù)亦有聯(lián)系。后面提到這些參數(shù)的時(shí)候會(huì)再對(duì)其中關(guān)系加以說(shuō)明呢燥。常見范圍:32 - 2048

  • max_steps: (default = 500000) 這個(gè)參數(shù)決定了本次訓(xùn)練任務(wù)總共會(huì)進(jìn)行多少步數(shù)崭添。如果你有多個(gè)同樣動(dòng)作的智能體,他們每個(gè)的步數(shù)都會(huì)計(jì)入到這個(gè)總步數(shù)當(dāng)中叛氨;同樣的呼渣,如果你有多個(gè)環(huán)境并行的在多臺(tái)服務(wù)器上運(yùn)行,所有環(huán)境里的智能體的總步數(shù)都會(huì)計(jì)入考慮寞埠。所以屁置,當(dāng)你并行訓(xùn)練多agent算法的時(shí)候,務(wù)必將這個(gè)值設(shè)的更大一些仁连。常見范圍:5e5 - 1e7

  • keep_checkpoints: (default = 5) 這個(gè)參數(shù)決定了保留多少個(gè)訓(xùn)練時(shí)候產(chǎn)生的checkpoint蓝角,其中每一個(gè)checkpoint都是在checkpoint_interval步數(shù)后產(chǎn)生的阱穗。

  • checkpoint_interval: (default = 500000) 如前文所說(shuō),這個(gè)參數(shù)決定了每多少步數(shù)以后使鹅,你的模型會(huì)存儲(chǔ)一個(gè)節(jié)點(diǎn)揪阶。

  • init_path: (default=None) 這個(gè)參數(shù)決定了你的模型是否從某個(gè)之前訓(xùn)練好的模型存儲(chǔ)點(diǎn)繼續(xù)訓(xùn)練。需要提供模型的確切位置患朱,比如說(shuō)鲁僚,./models/{run-id}/{behavior_name}。其實(shí)在訓(xùn)練的時(shí)候裁厅,使用--initialize-from這個(gè)CLI參數(shù)就足以讓所有的訓(xùn)練任務(wù)從同一個(gè)存儲(chǔ)模型繼續(xù)訓(xùn)練冰沙,提供這個(gè)參數(shù)是為了方便讓不同的訓(xùn)練從不同的模型繼續(xù)訓(xùn)練(需要逐個(gè)設(shè)定)。很少用到

  • threaded:(default = false) 開啟python的多線程功能來(lái)實(shí)現(xiàn)一邊訓(xùn)練一邊存儲(chǔ)模型执虹,避免I/O消耗太多時(shí)間拓挥。官方建議在開啟self-play功能的時(shí)候盡量避免使用該功能。

3. 接下來(lái)是一些常見超參數(shù)(hyper-parameters)的詳細(xì)設(shè)定

  • hyperparameters → learning_rate: (default = 3e-4)袋励,這個(gè)參數(shù)決定了梯度下降的學(xué)習(xí)率侥啤。當(dāng)該值過(guò)大時(shí)訓(xùn)練會(huì)變的不穩(wěn)定(reward不能穩(wěn)步上升,時(shí)常大幅震蕩)茬故。常見范圍:1e-5 - 1e-3

  • hyperparameters → batch size:這個(gè)參數(shù)決定了每次更新參數(shù)的時(shí)候愿棋,會(huì)有多少步的(state,action蓝厌, reward...) 狀態(tài)元組被用來(lái)進(jìn)行學(xué)習(xí)徽千。注意:這個(gè)參數(shù)應(yīng)該永遠(yuǎn)是buffer_size的幾分之一(因?yàn)閷?shí)際上程序會(huì)先將buffersize拿來(lái)切分成batchsize大小的幾個(gè)batches。所以buffer_size永遠(yuǎn)要能被batch_size整除)。 對(duì)于一個(gè)連續(xù)動(dòng)作空間的訓(xùn)練任務(wù)驯杜,這個(gè)參數(shù)應(yīng)該設(shè)定在1000以上這個(gè)級(jí)別(因?yàn)閯?dòng)作空間需要盡可能多的采樣來(lái)得到不同的數(shù)據(jù)),如果是離散空間玩般,這個(gè)值往往設(shè)定在幾十到幾百就好了(根據(jù)你動(dòng)作空間的大小來(lái)定)爆袍。常見范圍:(連續(xù)-PPO)512 - 5120;(連續(xù)-SAC)128 - 1024坞琴;(離散哨查,PPO&SAC):32 - 512.

  • hyperparameters → buffer size: (default = 10240 for PPO and 50000 for SAC) 。 PPO:對(duì)于PPO算法來(lái)說(shuō)剧辐,程序先要集滿buffer_size那么多步數(shù)之后才會(huì)開啟一輪訓(xùn)練寒亥。然后如前文所說(shuō),每次收集夠了buffer_size個(gè)狀態(tài)元組之后荧关,我們把buffer里面的狀態(tài)分成buffer/batch_size個(gè)batch溉奕,然后每個(gè)batch進(jìn)行一次訓(xùn)練更新參數(shù), 這個(gè)過(guò)程重復(fù)epoch(epoch也是一個(gè)超參數(shù))次。所以實(shí)際上每過(guò)一個(gè)buffer_size的采樣之后忍啤,參數(shù)都會(huì)進(jìn)行num_epoch * buffer/batch次數(shù)的更新加勤。通常一個(gè)較大的buffer_size會(huì)帶來(lái)一個(gè)更加穩(wěn)定的訓(xùn)練結(jié)果。 SAC:對(duì)于SAC算法來(lái)說(shuō),通常來(lái)說(shuō)經(jīng)驗(yàn)池要是其設(shè)episode長(zhǎng)度的幾千倍鳄梅,從而能讓它訓(xùn)練的時(shí)候同時(shí)利用到較舊和最近的采樣叠国。常見范圍:(PPO)2048 - 409600;(SAC) 50000 - 1000000

  • hyperparameters → learning_rate_schedule: (default = linear for PPO and constant for SAC) 這個(gè)參數(shù)決定了是否使用學(xué)習(xí)率衰減的辦法來(lái)穩(wěn)定訓(xùn)練戴尸。兩個(gè)可選的模式分別是linear和constant粟焊,前者會(huì)對(duì)你的學(xué)習(xí)率進(jìn)行線性遞減,后者則不會(huì)改變校赤。通常來(lái)說(shuō)吆玖,學(xué)習(xí)率越大,往往容易出現(xiàn)訓(xùn)練不穩(wěn)定马篮,學(xué)習(xí)率越小則容易出現(xiàn)長(zhǎng)時(shí)間訓(xùn)練不收斂的情況沾乘。所以使用學(xué)習(xí)率衰減先用較大的學(xué)習(xí)率快速的找到一個(gè)極值點(diǎn)方向,然后再逐步收縮學(xué)習(xí)率使得訓(xùn)練穩(wěn)定在極值附近浑测,而不會(huì)來(lái)回?cái)[動(dòng)翅阵。官方建議,對(duì)PPO開啟linear模式迁央,進(jìn)行線性遞減掷匠,以達(dá)到更快的收斂速度。對(duì)SAC來(lái)說(shuō)岖圈,則建議維持學(xué)習(xí)率不變讹语。

4. 接下來(lái)介紹一些常用的網(wǎng)絡(luò)模型的超參數(shù)

  • twork_settings → hidden_units:(default = 128) 這個(gè)參數(shù)決定了你的訓(xùn)練網(wǎng)絡(luò)隱藏層的神經(jīng)元數(shù)量,或者說(shuō)它的維度蜂科。這個(gè)數(shù)值的大小決定了神經(jīng)網(wǎng)絡(luò)對(duì)游戲狀態(tài)的表達(dá)能力顽决。簡(jiǎn)單來(lái)說(shuō),較大的隱藏層往往對(duì)更大的觀察空間有著較好的表達(dá)能力导匣。所以這個(gè)值應(yīng)該隨著觀察空間的維度變大而變大才菠。常見范圍:32 - 512

  • network_settings → num_layers: (default = 2) 這個(gè)參數(shù)決定了你的訓(xùn)練網(wǎng)絡(luò)的層數(shù)。這個(gè)數(shù)字越大贡定,你的模型越深赋访。雖然多層疊加能夠提高模型對(duì)環(huán)境的表達(dá)能力。但是模型并不是越深越好缓待,過(guò)深的層數(shù)往往會(huì)帶來(lái)梯度消失的問(wèn)題蚓耽,并且會(huì)使得訓(xùn)練速度變緩。建議優(yōu)先加大hiddent_unitys再加大本參數(shù)命斧。常見范圍:1 - 3

  • network_settings → normalize: (default = false) 這個(gè)參數(shù)決定了模型是否對(duì)輸入的觀察向量進(jìn)行歸一化(normalization)田晚。具體公式大概為 (obs - mean) / std,其中mean和std分別是observation的平均值和標(biāo)準(zhǔn)差国葬。官方建議贤徒,對(duì)于復(fù)雜的連續(xù)動(dòng)作空間任務(wù)芹壕,使用normalization可能有幫助,但是對(duì)于簡(jiǎn)單的離散任務(wù)使用normalization則可能帶來(lái)負(fù)作用接奈。

  • network_settings → vis_encode_type: (default = simple) 這個(gè)參數(shù)決定了你的編碼器的結(jié)構(gòu)踢涌。注意,ppo也好序宦,sac也好睁壁,只是一個(gè)訓(xùn)練架構(gòu),不同的任務(wù)你使用ppo也需要不同的編碼器互捌。比如說(shuō)一個(gè)卡牌類游戲潘明,你可以把所有的觀察向量用普通的全連接層處理,但是如果是一個(gè)動(dòng)作游戲秕噪,你的觀察可能是一張圖片钳降,那么這個(gè)時(shí)候你最好使用CNN作為你的特征提取編碼器。這個(gè)參數(shù)就是在讓你選擇使用何種編碼器腌巾。simple是一個(gè)兩層的卷積網(wǎng)絡(luò)遂填;Nature CNN則是使用Human Level Reinforcement Learning這篇文章的實(shí)現(xiàn);resent則是使用IMPALA RESNET這種架構(gòu)澈蝙,這個(gè)網(wǎng)絡(luò)的特點(diǎn)在于提取pattern能力強(qiáng)吓坚,不易梯度消失。match3則是更適合于卡牌游戲的一種CNN結(jié)構(gòu)灯荧,特點(diǎn)是更小的結(jié)構(gòu)但是可以捕捉空洞空間的表示信息礁击。fully_connected則是一個(gè)單層全連接層。 因?yàn)榫矸e核大小的匹配要求逗载,每種編碼方式有一個(gè)最小輸入維度的下限客税。比如simple最小20 * 20;nature_cnn最小支持36 * 36撕贞;resent最小支持15 *
    15,match3最小支持5 * 5测垛, 注意:使用match3來(lái)處理超大的輸入維度可能會(huì)拖慢訓(xùn)練速度捏膨。

  • network_settings → contioning_type: (default = hyper) 這個(gè)參數(shù)決定了是否使用hypernetwork來(lái)處理任務(wù)目標(biāo)的信息。hyper網(wǎng)絡(luò)的參數(shù)比較多食侮,當(dāng)使用hyper網(wǎng)絡(luò)的時(shí)候請(qǐng)減少隱藏網(wǎng)絡(luò)的層數(shù)号涯。

5. Trainer-specific Configurations

接下來(lái)我們介紹一下針對(duì)不同訓(xùn)練算法的專門參數(shù)。

5.1 PPO-specific Configurations (PPO專門參數(shù))

  • beta: (default = 5.0e-3) 這個(gè)參數(shù)決定了鼓勵(lì)探索多樣化策略的熵正則項(xiàng)的強(qiáng)度(entropy regularization)锯七。簡(jiǎn)單來(lái)說(shuō)链快,熵正則化通常是為了豐富我們的策略函數(shù)探索不同策略和動(dòng)作,我們使用一個(gè)KL散度去衡量新的策略和老策略的相似性眉尸,并通過(guò)增加entropy來(lái)讓動(dòng)作策略更加隨機(jī)域蜗。換句話說(shuō)巨双,當(dāng)beta越大,越鼓勵(lì)探索霉祸。調(diào)節(jié)這個(gè)參數(shù)要結(jié)合TensorBoard里面的entropy和reward來(lái)看筑累。當(dāng)你的entropy下降的時(shí)候,reward仍然沒有起色丝蹭,那就把這個(gè)beta增大使得entropy能夠再持續(xù)一段時(shí)間慢宗。常見范圍:1e-4 - 1e-2

  • epsilon: (default = 0.2) 這個(gè)參數(shù)決定了策略更新的速度。這個(gè)參數(shù)就是ppo2論文里面的clip范圍奔穿,這個(gè)范圍限制了每一次參數(shù)更新偏離范圍镜沽,以保證ppo能夠依靠importance sampling作為一個(gè)on policy的方法繼續(xù)訓(xùn)練。 可以發(fā)現(xiàn)當(dāng)epsilon越大贱田,我們的舊策略參數(shù)theta’變動(dòng)較小缅茉。這可以使得訓(xùn)練更加穩(wěn)定,但是隨之而來(lái)的就是更慢的收斂速度湘换。常見范圍:0.1 - 0.3

  • lambd: (default = 0.95) 這個(gè)參數(shù)根據(jù)官方文檔說(shuō)明是決定了我們的算法多大程度上依賴預(yù)估的獎(jiǎng)勵(lì)值宾舅,又多大程度上依賴實(shí)際的獎(jiǎng)勵(lì)值。實(shí)際上這個(gè)laambda指的是GAE方法中的一個(gè)超參數(shù)lambda彩倚。GAE方法是在策略梯度下降中常用的一種Advantage筹我,用于更新控制policy在gradient方向上的更新幅度。GAE方法簡(jiǎn)單來(lái)說(shuō)就是求TD(0), TD(1) 一直到TD無(wú)窮(即蒙特卡洛采樣)的一個(gè)加權(quán)平均值帆离。lambda這個(gè)值介于0到1之間蔬蕊,當(dāng)lambda等于0時(shí)就是TD(0)估計(jì),當(dāng)lambda等于1時(shí)就是蒙特卡洛采樣哥谷。常見范圍:0.9 - 0.95

  • num_epoch:(default = 3) 這個(gè)參數(shù)決定了每次進(jìn)行梯度下降更新的次數(shù)岸夯。詳見前文buffersize的部分。常見范圍:3 - 10

6. Reward Signals

獎(jiǎng)勵(lì)信號(hào)可分為兩種们妥,一種是外在的(extrinsic)來(lái)自于環(huán)境的獎(jiǎng)勵(lì)猜扮,一種是內(nèi)在的(intrinsic)來(lái)自于內(nèi)部的獎(jiǎng)勵(lì)(比如好奇心獎(jiǎng)勵(lì)等)。不管是內(nèi)部還是外部獎(jiǎng)勵(lì)信號(hào)监婶,都至少要設(shè)定兩個(gè)參數(shù)旅赢,一個(gè)是信號(hào)強(qiáng)度(strength),一個(gè)是信號(hào)衰減率(gamma)惑惶。并且煮盼,你需要至少設(shè)定一種獎(jiǎng)勵(lì),不然沒辦法訓(xùn)練带污。

6.1 Extrinsic Rewards

  • extrinsic → strength: (default = 1.0) 這個(gè)參數(shù)決定了模型收到的外部環(huán)境獎(jiǎng)勵(lì)信號(hào)的強(qiáng)度僵控。 常見范圍:1.00

  • extrinsic → gamma:(default = 0.99) 這個(gè)參數(shù)決定了遠(yuǎn)期獎(jiǎng)勵(lì)的衰減率。簡(jiǎn)單來(lái)說(shuō)鱼冀,加入我們的模型在某一步收到了100的獎(jiǎng)勵(lì)报破,那么我們前一步的獎(jiǎng)勵(lì)應(yīng)該是多少呢悠就?如果上一步?jīng)]有得到其他的獎(jiǎng)勵(lì),那么上一步我們的收益就應(yīng)該是gamma * 100 = 99泛烙, 同理理卑,再上一步的收益就是gamma^2 * 100, 以此類推蔽氨。直觀的理解藐唠,gamma約接近一,那么較后期的收益也能反饋到前期的動(dòng)作鹉究。反之就是動(dòng)作策略進(jìn)行學(xué)習(xí)的時(shí)候會(huì)更加倚重于短期內(nèi)的回報(bào)宇立。對(duì)于那種獎(jiǎng)勵(lì)較為稀疏,必須通過(guò)一系列動(dòng)作之后才能獲得一次獎(jiǎng)勵(lì)的任務(wù)自赔,務(wù)必將這個(gè)值設(shè)定得更接近于一妈嘹,反之則可以稍微小一些。常見范圍:0.8 - 0.995

6.2 Intrinsic Reward

  • curiosity → strength: (default = 1.0) 這個(gè)參數(shù)決定了好奇心獎(jiǎng)勵(lì)的強(qiáng)度绍妨。這個(gè)比例需要調(diào)整到一個(gè)剛好的程度润脸,使得好奇心獎(jiǎng)勵(lì)既不會(huì)淹沒了外部獎(jiǎng)勵(lì)的信號(hào),又不會(huì)和外部獎(jiǎng)勵(lì)比起來(lái)過(guò)于不值一提他去。常見范圍:0.001 - 0.1

  • curiosity → gamma: (default = 0.99)如前所述毙驯,這個(gè)參數(shù)決定了遠(yuǎn)期獎(jiǎng)勵(lì)的衰減率。詳見上文灾测。

  • curiosity → network_settings: 這個(gè)參數(shù)主要是用來(lái)決定ICM模型的隱藏層維度的爆价。即不能太大也不能太小。(64 - 256)

  • curiosity → learning_rate: (default = 0.99) 這個(gè)參數(shù)決定了你的ICM模型的學(xué)習(xí)率媳搪。過(guò)大的學(xué)習(xí)率會(huì)導(dǎo)致訓(xùn)練不穩(wěn)定铭段,過(guò)小的學(xué)習(xí)率會(huì)導(dǎo)致收斂緩慢。常見范圍:1e-5 - 1e-3

7. Memory-enhanced Agents Using Recurrent Neural Networks

7.1 可以通過(guò)增加記憶模塊的辦法來(lái)增加模型的表達(dá)能力秦爆。注意序愚,memory section要加在network下面

  • network_settings → memory → memory_size: (default=128) 這個(gè)參數(shù)決定了你的LSTM網(wǎng)絡(luò)的隱藏層的維度。這個(gè)值必須是偶數(shù)等限。大小視你的狀態(tài)的復(fù)雜程度而定展运。最好要能夠足夠大,才能學(xué)習(xí)到如何記憶之前的情況精刷。常見范圍:32 - 256

  • network_settings → memory → sequence_length: (default = 64) 這個(gè)參數(shù)決定了你的記憶網(wǎng)絡(luò)RNN循環(huán)的次數(shù)或者說(shuō)是序列長(zhǎng)度。為了能夠訓(xùn)練這么長(zhǎng)的序列蔗候,我們的采集到的經(jīng)驗(yàn)也需要有這么長(zhǎng)怒允。所以根據(jù)我的猜測(cè),盡管文檔沒有明說(shuō)锈遥,但是這個(gè)參數(shù)一定要小于time_horizon的值纫事。另外勘畔,這個(gè)數(shù)如果設(shè)定的太小,那么可能他無(wú)法記住太多的東西丽惶,反過(guò)來(lái)炫七,如果太大,訓(xùn)練會(huì)很慢钾唬。

7.2 使用記憶網(wǎng)絡(luò)需要注意以下幾點(diǎn)

  • LSTM 網(wǎng)絡(luò)在連續(xù)動(dòng)作空間任務(wù)上表現(xiàn)不佳万哪,官方建議更多的用在離散動(dòng)作空間的任務(wù)上面。

  • 添加了一個(gè)RNN層會(huì)增加神經(jīng)網(wǎng)絡(luò)的復(fù)雜度抡秆,務(wù)必適度降低神經(jīng)網(wǎng)絡(luò)的層數(shù)奕巍。

  • 一定要記住把memory_size設(shè)定為偶數(shù)。

8. Self Play 參數(shù)設(shè)置

self play 這個(gè)section只有在對(duì)抗性訓(xùn)練的時(shí)候需要使用儒士,如果僅僅只有一個(gè)agent的止,或者多個(gè)agent中沒有任何意義上的交互,則不需要設(shè)定這一個(gè)參數(shù)着撩。Unity ml-agent也是利用self play參數(shù)的加入來(lái)啟動(dòng)它自帶的對(duì)抗性訓(xùn)練模塊诅福。

參考(https://github.com/Unity-Technologies/ml-agents/blob/ddfe054e204415d76b39be93f5bcbec1b456d928/docs/Training-Configuration-File.md#self-play

  • trainer_steps 和 ghost steps : 在理解self play參數(shù)之前我們需要先理解兩個(gè)概念,trainer_steps 和 ghost_steps拖叙。在一個(gè)對(duì)抗訓(xùn)練當(dāng)中氓润,我們往往需要固定住一些agent的參數(shù),在一定的步驟里面讓他們作為對(duì)手去訓(xùn)練我們的agents憋沿。那么我們的learning agents進(jìn)行的步數(shù)就是trainer_steps旺芽,而與之相對(duì)的,那些固定參數(shù)的對(duì)手所走的步數(shù)就是ghost_steps辐啄,為什么這兩個(gè)值要分別計(jì)數(shù)呢采章?因?yàn)橛行┯螒虿⒉皇菍?duì)稱對(duì)抗訓(xùn)練(asymmetrical game),比如我們訓(xùn)練一個(gè)2v1的場(chǎng)景壶辜,這時(shí)候在學(xué)習(xí)的隊(duì)伍是2個(gè)agent悯舟,對(duì)手可能就是1個(gè)agent。在這種情況下砸民,trainer_steps的增長(zhǎng)就會(huì)兩倍快于ghost_steps抵怎,因?yàn)槲覀冇?jì)步的時(shí)候都是計(jì)算總和。理解了這兩個(gè)概念之后岭参,再來(lái)看下面的參數(shù)設(shè)定就會(huì)清楚很多反惕,不然會(huì)一頭霧水。

  • save_steps: 這個(gè)值決定了我們的learning agents演侯,每save_steps個(gè)trainer steps會(huì)去存儲(chǔ)一個(gè)當(dāng)前策略的參數(shù)姿染。另外,如果save_steps足夠大秒际,比如我們把剛才例子里的save_steps改成20480悬赏,那么在存儲(chǔ)一次快照之前狡汉,參數(shù)就要進(jìn)行至少80次更新,這樣每個(gè)快照之間的難度曲線就會(huì)更陡峭闽颇,使得每次訓(xùn)練的不穩(wěn)定性增大盾戴,但是帶來(lái)的可能是更好的最終結(jié)果,以及在復(fù)雜任務(wù)上更好的表現(xiàn)兵多。

  • team_change和swap_steps:剛才我們已經(jīng)討論過(guò)了什么是trainer steps尖啡,什么是ghost steps。現(xiàn)在來(lái)看一下這兩個(gè)值怎么在對(duì)抗訓(xùn)練中決定我們更換對(duì)手的頻率中鼠。team_change 參數(shù)是決定我們要用同一個(gè)learning agent訓(xùn)練多少次的參數(shù)可婶。比如我們現(xiàn)在有紅藍(lán)兩隊(duì)球隊(duì),如果我們?cè)O(shè)定team_change=10000援雇,那紅隊(duì)就會(huì)先訓(xùn)練10000個(gè)trainer steps才會(huì)輪到藍(lán)隊(duì)矛渴。而swap_steps則決定了我們?cè)谝淮蝨eam change之中,要更換幾次對(duì)手惫搏。用上面的例子來(lái)看具温,就是紅隊(duì)在這10000個(gè)trainer steps里面要面對(duì)幾個(gè)不同的藍(lán)隊(duì)的過(guò)去的快照。這里有一個(gè)簡(jiǎn)單的公式可以計(jì)算這種關(guān)系筐赔,假設(shè)我們現(xiàn)在有設(shè)定team change為t铣猩,然后想要切換對(duì)手的次數(shù)為x,而我們的隊(duì)伍有a1個(gè)agents茴丰,對(duì)手的隊(duì)伍有a2個(gè)agents达皿,則我們的swap_steps = (a2/a1) * (t / x), 如果這是一個(gè)對(duì)稱對(duì)抗游戲贿肩,則上式可以簡(jiǎn)化為 t/x峦椰。 可以看見,team_changes 和 swap_steps汰规,共同決定了一個(gè)更換對(duì)手的頻率汤功,這個(gè)頻率越大,如同我們前面分析過(guò)的那樣溜哮,我們可能會(huì)遇到更多不同等級(jí)和策略的對(duì)手滔金,從而會(huì)學(xué)到更多東西,但也造成了訓(xùn)練不穩(wěn)定茂嗓,參數(shù)難以收斂的問(wèn)題餐茵。但是每個(gè)learning agent學(xué)到的策略可能更加不局限于某種對(duì)手,更加通用述吸,不會(huì)過(guò)擬合忿族。

  • play_against_latest_model_ratio: (default = 0.5) 這個(gè)參數(shù)決定了你和自己當(dāng)前的模型對(duì)決的概率。這個(gè)值越大約容易和當(dāng)前的自己的策略對(duì)決,也就更少的和自己以往的snapshot交戰(zhàn)肠阱。

behaviors:
  SoccerTwos: #游戲的名字
    trainer_type: ppo #選定使用何種訓(xùn)練算法
    hyperparameters: #PPO算法的超參數(shù)設(shè)置
      batch_size: 2048 
      buffer_size: 20480 # buffer大小必須是batch大小的整數(shù)倍,這里是十倍
      learning_rate: 0.0003
      beta: 0.005  #熵正則的超參數(shù)
      epsilon: 0.2 #PPO算法的clip范圍
      lambd: 0.95  #GAE算法的lambda
      num_epoch: 8 #每次更新訓(xùn)練多少次
      learning_rate_schedule: linear #學(xué)習(xí)率衰減方式朴读,這里是線性衰減
    network_settings: #處理observation信息的網(wǎng)絡(luò)結(jié)構(gòu)設(shè)置
      normalize: false 
      hidden_units: 256
      num_layers: 2
      vis_encode_type: simple 
    reward_signals: #獎(jiǎng)勵(lì)超參數(shù)設(shè)置
      extrinsic:
        gamma: 0.99
        strength: 1.0
    keep_checkpoints: 5 #一共保留最近的五個(gè)checkpoint
    checkpoint_interval: 100000 #每100000個(gè)timestep保存一個(gè)checkpoint
    max_steps: 50000000 #最多訓(xùn)練這么多不(注意屹徘,這是多個(gè)agent加起來(lái)的值)
    time_horizon: 1000
    summary_freq: 5000 
    threaded: false # 是否使用線程,在使用self-play功能時(shí)最好關(guān)掉
    self_play: #self-play相關(guān)參數(shù)設(shè)定
      save_steps: 50000
      team_change: 250000
      swap_steps: 2000
      window: 10 #一共保留十個(gè)過(guò)去過(guò)去的snapshot
      play_against_latest_model_ratio: 0.5
      initial_elo: 1200.0 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末衅金,一起剝皮案震驚了整個(gè)濱河市噪伊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氮唯,老刑警劉巖鉴吹,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異惩琉,居然都是意外死亡豆励,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門瞒渠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)良蒸,“玉大人,你說(shuō)我怎么就攤上這事伍玖∧厶担” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵窍箍,是天一觀的道長(zhǎng)串纺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)椰棘,這世上最難降的妖魔是什么纺棺? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮晰搀,結(jié)果婚禮上五辽,老公的妹妹穿的比我還像新娘。我一直安慰自己外恕,他們只是感情好杆逗,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鳞疲,像睡著了一般罪郊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尚洽,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天悔橄,我揣著相機(jī)與錄音,去河邊找鬼。 笑死癣疟,一個(gè)胖子當(dāng)著我的面吹牛挣柬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睛挚,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼邪蛔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扎狱?” 一聲冷哼從身側(cè)響起侧到,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淤击,沒想到半個(gè)月后匠抗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡污抬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年汞贸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壕吹。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡著蛙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耳贬,到底是詐尸還是另有隱情踏堡,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布咒劲,位于F島的核電站顷蟆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏腐魂。R本人自食惡果不足惜帐偎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蛔屹。 院中可真熱鬧削樊,春花似錦、人聲如沸兔毒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)育叁。三九已至迅脐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間豪嗽,已是汗流浹背谴蔑。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工豌骏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隐锭。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓窃躲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親钦睡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子框舔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容