目錄
- ML-Agents(七)訓練指令與訓練組態檔
- 一、背景
- 二、訓練命令
- 三、訓練組態檔
- 四、用PPO訓練
- 組態檔引數
- 訓練統計引數
- 五、用SAC訓練
- 組態檔引數
- 訓練統計引數
- 六、獎勵信號(Reward Signals)
- 開啟獎勵信號
- 獎勵信號型別
- 外部獎勵信號(Extrinsic Reward Signal)
- 好奇心獎勵信號(Curiosity Reward Signal)
- GAIL獎勵信號
- 七、總結
ML-Agents(七)訓練指令與訓練組態檔
一、背景
到現在為止,官方的示例已經研究三個了,但是說實話自己去按官方的組態檔訓練,有時候并不能完全訓練出好的模型,而且官方的組態檔配置項都不是很明白,因此想在看下一個示例之前,先來研究一下官方關于組態檔的檔案,通俗點就是翻譯一下,有可能其中會找到我之前在訓練模型時遺漏的點,
當然如果大家有時間的話,還是可以去學習一下ML-Agents的理論,就是機器學習那套,我自己的話直接把ML-Agents當黑盒來用了,一般我的理念就是先學會怎么用,要知道能解決什么問題,然后遇到不懂得再看原理,這樣就是有好有壞,主要看個人喜好,
以下翻譯內容主要來自ml-agents的github檔案:
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-ML-Agents.md
二、訓練命令
先來翻譯一下官方檔案中Command Line Training Options部分,這一部分主要是在Anaconda的命令列里要輸入的訓練命令字,之前我們已經見過一些了,例如--run-id=<run-identifier>就是存盤訓練模型的名稱,--sampler=<file>就是讀取可變引數配置等,下面我們來看一下官方比較全的命令:
-
--env=<env>:指定要訓練的可執行環境,這個命令是可選的,因為我們之前訓練都是利用UnityIDE直接去訓練的,因此之前的命令我都沒有加這個,但是如果你的訓練環境是發布出來的可執行程式,那就需要加這個命令來指定發布后的程式路徑了, -
--curriculum=<file>:如果你的訓練是Curriculum Learning,這個命令可以指定你要訓練的課程組態檔,官方也有一個示例(Wall Jump)專門展示了Curriculum Learning這種訓練型別,這里我們之后的文章再去深入研究, -
--lesson=<n>:指定在執行Curriculum Learning時要開始的課程,默認為0, -
--sampler=<file>:用于指定訓練環境的可變引數的組態檔,我們之前也有提到過,具體內容可以看ML-Agents(四)3DBall補充の引入泛化, -
--save-freq=<n>:指定在訓練程序中保存模型的頻率,默認為50000,這個命令之前也沒有用過,具體是什么用途有待考察, -
--keep-checkpoints=<n>:指定了要保存模型的檢查點的最大數量,該屬性與上面的--save-freq=<n>有命令關,即在n步后,會記錄一個檢查點,此外,新的檢查點形成,會使得老的檢查點洗掉,默認存5個檢查點,當然,這個命令也沒用過,明白的童靴可以留言交流一下, -
--num-envs=<n>:指定在訓練時,從幾個Unity環境實體中收集資料,默認為1,當然如果是發布的程式,你就可以多開幾個程式讓訓練資料更多, -
--run-id=<run-identifier>:為每個訓練指定一個識別符號(id),這個id主要用于命名保存的訓練模型、統計資訊以及模型名稱(就是在models、summaries檔案夾下),默認id為“ppo”,如果用tensorboard查看訓練統計資料,則每個訓練模型的唯一id也是你設定的<run-idetifier>, -
--seed=<n>:指定一個數字作為訓練代碼使用的亂數生成器的seed, -
--env-args=<string>:為可執行程式傳參,具體給Unity傳參可以參考官方檔案Unity Command Line Arguments,例如,命令mlagents-learn config/trainer_config.yaml --env-args --num-orcs 42會將--num-ors 42傳遞給可執行檔案, -
--base-port:指定啟動的埠,用于多個Unity程式連接會依次分配一個埠,默認是5005,當然我們之前都是直接使用IDE進行訓練的,所以這一項直接可以忽略, -
--inference:指定是否僅在推理模式下運行,這種模式會忽略對對模型的訓練,要加載現有的訓練模型,需要結合--reusme以及run-id來使用, -
--resume:如果設定這一項,則訓練代碼會在訓練前加載已經訓練好的模型去初始化神經網路,訓練代碼會在models/<run-id>目錄下查找訓練模型,這個選項僅在模型存在且具有與場景中當前代理相同的行為名稱(Behavior Name)時才有效,--inference和--resume我還沒想到有什么適用場合,基本上就是用已有的訓練模型繼續訓練來用的?目前看起來還用不到, -
--force:當要使用之前已經使用過的run-id來訓練模型會拋出錯誤,適用--force來強制覆寫原有id的資料模型和資料統計, -
--initialize-form=<run-identifier>:指定一個已存在的訓練模型來初始化新的訓練模型,但是注意,當前的訓練環境行為引數要與之前保存的訓練模型引數相同才可以, -
--no-graphics:指定Unity以-batchmode運行,并且不初始化圖形驅動程式,當然注意只適用于訓練中不涉及視覺觀察(Observations,讀取像素訓練),關于Unity不利用GPU運行請查看這里Unity官方檔案, -
--debug:此選項可以輸出代碼某些部分的除錯代碼日志, -
--cpu:強制只使用CPU訓練, -
Unity設定:
--width:Unity運行時視窗的寬度,單位像素,默認84(IDE訓練可忽略),--height:有width,就有height,與上相同,指高度,默認84,同樣IDE訓練可忽略,--quality-level:設定Unity的QualitySettings.SetQualityLevel屬性,即畫面質量,默認為5,--time-scale:設定Unity的Time.timeScale屬性,即游戲時間縮放比例,默認為20,最大為100,下次試試把這個值調大一些,是否可以加快訓練速度,--target-frame-rate:設定Unity的Application.targetFrameRate,即設定游戲幀率,默認為-1,即不設定,一般為60幀每秒,
OK,以上就是官方已有的命令,下面來看一下與訓練效果相關的組態檔各個屬性是什么含義,
三、訓練組態檔
在官方ml-agents的原始碼中,組態檔都在config檔案夾下,例如有config/trainer_config.yaml,config/sac_trainer_config.yaml,gail_config.yaml等組態檔,它們分別指定了當使用PPO(Proximal Policy Optimization)、SAC(Soft Actor-Critic)、GAIL(Generative Adversarial Imitation Learning)的訓練方法、超引數和一些附加值,其實這三種訓練方法就是ml-agents支持的三種訓練型別,這些組態檔都是yaml格式的,一開始是的部分是default部分,對于所有訓練都適用,當然在指定的訓練部分可以重設定default里的屬性來覆寫default里的設定,每一部分的開頭即是Unity中Behavior Parameters腳本的Behavior Name屬性,
| 屬性 | 描述 | 適用的訓練型別 |
|---|---|---|
| batch_size | 梯度下降每次迭代的樣本批量大小,相對于正常資料,如果過小,訓練資料收斂困難,過大處理速度加快,但所需記憶體(顯存)增大,不過該值并非越大越好, | PPO,SAC |
| batches_per_epoch | 在模仿學習中,在訓練模型之前收集的訓練示例數量, | |
| beta | 熵正則化的強度, | PPO |
| buffer_size | 更新策略模型之前要收集的經驗數量,在SAC中,為經驗快取取得最大大小, | PPO,SAC |
| buffer_init_steps | 在更新策略模型之前要收集到緩沖區中的經驗總數, | SAC |
| epsilon | 影響策略在訓練程序中的形成速度, | PPO |
| hidden_units | 神經網路隱含層的單位數, | PPO,SAC |
| init_entcoef | 在訓練開始時,agent應該探索多深, | SAC |
| lambd | 正則化引數, | PPO |
| learning_rate | 梯度下降的初試學習率, | PPO,SAC |
| learning_rate_schedule | 確定學習速度隨時間的變化, | PPO,SAC |
| max_steps | 在訓練期間要模擬步驟的最大步數, | PPO,SAC |
| memory_size | 一個agent必須保留的記憶體大小,主要用于遞回神經網路的訓練,示例Hallway用到了該屬性,詳見Using Recurrent Neural Networks, | PPO,SAC |
| normalize | 是否自動標準化觀測值, | PPO,SAC |
| num_epoch | 執行梯度下降優化時,通過經驗緩沖區的遍歷次數, | PPO |
| behavioral_cloning | 使用演示引導神經網路的策略,詳見Pretraining Using Demonstrations中的(Optional) Behavioral Cloning Using Demonstrations, | PPO,SAC |
| reward_signals | 用來訓練策略的獎勵信號,適用于Curiosity和GAIL,詳見Reward Signals, | PPO,SAC |
| save_replay_buffer | 退出訓練時保存到回放快取區,并在恢復時加載, | SAC |
| sequence_length | 定義當訓練時,經驗序列必須為多長,僅用于遞回神經網路的訓練,詳見Using Recurrent Neural Networks, | PPO,SAC |
| summary_freq | 設定多久一次保存統計資料,主要決定了在tensorboard中顯示資料點的數量, | PPO,SAC |
| tau | 在SAC訓練中,如何主動更新用于引導值估計的目標網路, | SAC |
| time_horizon | 在將每個agent添加到經驗緩沖區之前,需要多少步訓練, | PPO,SAC |
| trainer | 要執行的訓練型別:"ppo","sac","offline_bc"或"online_bc", | PPO,SAC |
| train_interval | 更新代理的頻率, | SAC |
| num_update | 在每次更新期間用于更新代理的最小批量數, | SAC |
| use_recurrent | 使用遞回神經網路進行訓練,詳見Using Recurrent Neural Networks, | PPO,SAC |
| init_path | 從之前保存的模型初始化trainer, | PPO,SAC |
以上大部分都是直譯,其中有許多深度學習的相關內容,如果翻譯不準確請見諒,還有我這里的地址不是官方github地址,由于我圖快捷,把ml-agents克隆到gitee上了,所以打開應該是我的gitee倉儲,影回應該不大,
官方檔案又對以下內容分別作了檔案:
- Training with PPO
- Training with SAC
- Using Recurrent Neural Networks
- Training with Curriculum Learning
- Training with Imitation Learning
- Training with Environment Parameter Randomization
下面我主要再研究一下Training with PPO、Training with SAC以及Reward Signals,其中最后一篇Traning with Environment Parameter Randomization已經在ML-Agents(四)3DBall補充の引入泛化研究過了,有興趣的童靴可以去看看,剩下的幾篇我準備在具體官方示例中再研究,
四、用PPO訓練
這章對應官方檔案 Training with Proximal Policy Optimization,檔案一開始主要就是介紹了PPO,PPO是如何與Unity訓練的等等,開頭都是些客套話,該檔案主要說明一點:要成功地訓練一個強化學習模型通常涉及調整訓練超引數,而該檔案則包含一些最佳實踐,用于參考來調優訓練程序,下面直接開始,
組態檔引數
-
Reward Signals
在強化訓練中,目標就是要學習一種使獎勵最大化的策略(Policy),在基礎層面上,獎勵是由環境給予的,然而我們可能會遇到獎勵擁有不同行為的agent,例如,我們可以讓agent探索新的狀態而獲得獎勵,而不是僅僅給予明確的獎勵;再例如,我們還可以使用混合獎勵信號來幫助學習程序,
使用
reward_signals可以定義獎勵信號,ML-Agents默認提供三種獎勵信號:外部(環境)獎勵信號、好奇心獎勵信號(可用于agent進行探索)和GAIL獎勵信號(對抗模仿學習),具體的Reward Signals一會兒來看, -
Lambda
lambd對應于當計算廣義優勢估計時使用的lambd引數,這個引數可以被認為是agent在計算更新值估計時,依賴其當前估計值的多少,低值對應于agent更多地依賴于當前值估計(可能是高偏差),高值對應于更多的依賴于環境中收到的實際獎勵(可能是高方差),該引數提供了兩者之間的平衡值,正確的值可使得更穩定的訓練程序,推薦范圍:
0.9-0.95 -
Buffer Size
buffer_size對應于在我們對模型進行任何學習或更新前,需要收集多少經驗(包括agent的observations、actions以及獲得的rewards),這應該是batch_size的倍數,通常,較大的buffer_size對應于更穩定的訓練更新,推薦范圍:
2048-409600 -
Batch Size
batch_size是一個梯度下降迭代更新的樣本數量,它應該始終是buffer_size的一小部分,如果你的agent使用的是連續動作空間(Continuous Type),那這個值應該要大一些(大約1000s);如果agent使用的是離散動作空間(Discrete Type),那這個值應該小一些(大約10s),Continuous Type推薦范圍:
512-5120Discrete Type推薦范圍:
32-512 -
Number of Epochs
num_epoch是在梯度下降程序中通過經驗快取區的次數,batch_size越大,這個值越大也是可接受的,減少該值將確保更新更穩定,但是會降低學習速度,推薦范圍:
3-10 -
Learning Rate
learning_rate對應于每個梯度下降更新步驟的強度,如果訓練不穩定,該值應該減少,并且獎勵不能持續增加,推薦范圍:
1e-5-1e-3 -
(可選)Learning Rate Schedule
learning_rate_schedule對應于學習率如何隨時間變化,對于PPO來說,建議在max_steps之前降低學習速率,這樣學習才能更穩定地收斂,但是在某些情況下(例如訓練時間未知),可以禁用此功能,選擇項:
linear(默認):線性衰減learning.rate,在max_steps到達最大步數時到達0constant:在整個訓練程序中,保持學習速率恒定,
-
Time Horizon
time_horizon對應于在將每個agent添加到經驗快取區之前要收集多少訓練步數,當在一個episode結束之前達到此值時,將使用一個值估計來預測agent當前狀態的總體預期回報,因此,該引數在偏差較小但變化較大的估計值(長時間范圍)和偏差較大但變化較小的估計值(短時間范圍)之間進行權衡,在一個episode里agent如果頻繁獲得獎勵或者episode數量非常大的情況下,該值更小可能更理想,該值應該足夠大,以捕獲agent動作序列中所有重要行為,推薦范圍:
32-2048 -
Max Steps
max_steps對應于在訓練程序中運行了多少步模擬(乘以跳幀),對于較復雜的問題,該值應該增大,推薦范圍:
5e5-1e7 -
Beta
beta對應于熵正則化的強度,這使得策略更具“隨機性”,該值使得agent在訓練程序中正確地探索動作空間,增加該值將使得agent執行更多的隨機動作,該值應該被調整成,使得entropy(熵)在tensorboard中顯示隨著獎勵的增加而緩慢減小,如果entropy下降太快,則增加beta,如果entropy下降太慢,則減小beta,推薦范圍:
1e-4-1e-2 -
Epsilon
epsilon對應于梯度下降更新程序中新舊policy之間可接受的差異閾值,將此值設定得較小將導致更穩定的更新,但也會減慢訓練程序,推薦范圍:
0.1-0.3 -
Normalize
normalize對應于是否對輸入的矢量觀測值(vector observation)進行規范化處理,這種歸一化是基于矢量觀測值的平均值和方差,規范化對于復雜的連續控制(continuous control)問題很有用,但對于較簡單的離散控制(discrete control)可能反而有害, -
Number of Laters
num_layers對應于觀察值輸入之后或在視覺觀察的CNN編碼之后存在多少個隱藏層,對于簡單的問題,更少的層數可使得訓練更加迅速、高效,對于更復雜的控制問題,可能需要更多的層,推薦范圍:
1-3 -
Hidden Units
hidden_units對應于神經網路的每個全連接層中有多少個單元,對于簡單的問題,正確的操作是將觀察輸入直接組合,因此該值應該較小,對于動作是觀察變數之間非常復雜的互動問題,這個值應該較大,推薦范圍:
32-512 -
(可選)Visual Encoder Type
vis_encode_type對應于visual observations進行編碼的編碼器型別,有效地選項包括:simple(默認):有兩個卷積層組成的簡單編碼器nature_cnn:由三個卷積層組成,詳見 CNN implementation proposed by Mnih et al.resnet:由三個堆疊的層組成,每個對疊層具有兩個剩余塊,從而形成了比其他兩個更大的網路,詳見 IMPALA Resnet implementation
-
(可選)Recurrent Neural Network Hyperparameters
以下超引數僅在
use_recurrent為true時使用,-
Sequence Length
sequence_length對應于訓練程序中通過網路傳遞的經驗序列的長度,該值應該足夠大以捕獲agent隨時間推移可能需要記住的任何資訊,例如,如果agent需要記住物體的速度,則該值可能很小,如果agent需要記住一段episode開始時只給出一次的資訊,那么該值應該更大,推薦范圍:
4-128 -
Memory Size
memory_size對應于存盤策略的遞回神經網路隱藏狀態的浮點數陣列的大小,該值必須是2的倍數,并且應該與期望agent成功完成任務所需記住的資訊量成比例,推薦范圍:
32-256
-
-
(可選)Behavioral Cloning Using Demonstrations
在某些情況下,你可能希望使用player記錄的行為來引導agent的策略,這可以幫助指導agent獲得獎勵,行為克隆(BC)增加了模擬演示的訓練操作,而不是試圖使報酬最大化,
要使用BC,請在
trainer_config中添加一個behavioral_cloning部分,例如:behavioral_cloning: demo_path: ./Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo strength: 0.5 steps: 10000以下為BC可用的超引數,
-
Strength
strength對應于模仿的學習率相對于PPO的學習率,大致對應的使我們允許BC對policy的影響強度,推薦范圍:
0.1-0.5 -
Demo Path
demo_path是.demo檔案或.demo檔案目錄的路徑,有關.demo檔案的更多資訊,詳見imitation learning guide, -
Steps
在BC期間,通常希望agent在“看到”獎勵后停止使用演示,并允許其優化過去可用的demonstrations和/或概括所提供的演示之外的內容,
steps對應于激活BC的訓練步驟,BC的學習率將隨步驟逐步提高,將steps設定為0,以便在整個訓練程序中持續模仿, -
(可選)Batch Size
batch_size是梯度下降更新的一次迭代的樣本數,如果未指定,則默認為PPO的batch_size,推薦范圍(Continuous):
512-5120推薦范圍(Discrete):
32-512- (可選)Number of Epochs
num_epoch是在梯度下降程序中通過經驗快取區的次數,如果未指定,則默認為PPO的num_epoch,推薦范圍:
3-10-
(可選)Samples Per Update
samples_per_update是每個模擬更新期間使用的最大樣本數,如果演示資料集非常大,則可能需要降低該值,以避免在演示上過渡擬合策略,設定為0,以便在每個更新步驟中對所有演示進行訓練,默認值:
0(所有)推薦范圍:大于等于PPO的
buffer_size -
(可選)Advanced: Initialize Model Path
init_path可以指定在開始訓練之前初始化以前訓練的模型,注意,以前的模型的訓練配置需要與當前運行的相同,并且使用相同版本的ML-Agents保存,同時要提供全路徑存盤,例如./models/{run-id}/{behavior_name},如果要從不同的運行中初始化不同的行為,則使用該項,大多數情況下,使用
--initialize-fromCLI引數足以從同一運行中初始化所有模型,
-
訓練統計引數
使用PPO訓練后,在tensorboard的引數解釋,
-
Cumulative Reward
獎勵的總體趨勢應隨時間不斷增減,預計會有小的欺負,根據任務的復雜性,獎勵可能不會顯著增加,有可能直到訓練到數百萬步才增加,
-
Entropy
該值對應于決策的隨機性,在訓練期間該值應該不斷減小,如果該值下降的太快或者根本沒有減小,則應該調整
beta(當使用discrete action space時), -
Learning Rate
默認情況下,在line schedule中,該值會隨時間減小,除非
learning_rate_schedule設定為constant, -
Policy Loss
策略損失,該值會在訓練程序中振蕩,通常它們應該小于1.0,
-
Value Estimate
該值應該隨著獎勵積累的增加而增加,它們對應于agent預測自己在任何給定時間點上會得到多少獎勵,
-
Value Loss
該值會隨著獎勵的增加而增加,一旦獎勵變得穩定,該值則應降低,
五、用SAC訓練
對應官方檔案: Training with Soft-Actor Critic
與PPO不同的是,SAC(Soft-Actor Critic)是off-policy訓練,這意味著它可以從過去任何時候收集的經驗中學習,收集經驗后,它們被放置在經驗回放緩沖區,并在訓練期間隨機抽取,這使得SAC大大提高了采樣效率,與PPO相比學習相同的任務通常采樣量少5-10倍,但是,SAC往往需要更多的模型更新,對于較重或較慢的環境(大約每步0.1s或更長時間),SAC是一個不錯的選擇,SAC也是一種“最大熵”演算法,并且可以以固有方式進行探索,
為了訓練agent,你需要向agent提供一個或多個獎勵信號,agent需要嘗試最大化獎勵信號,獎勵信號有關部分在第六章看,以下配置引數內容有些與PPO重復,也有SAC單獨定義的引數,
組態檔引數
-
Reward Signals
在強化訓練中,目標就是要學習一種使獎勵最大化的策略(Policy),在基礎層面上,獎勵是由環境給予的,然而我們可能會遇到獎勵擁有不同行為的agent,例如,我們可以讓agent探索新的狀態而獲得獎勵,而不是僅僅給予明確的獎勵;再例如,我們還可以使用混合獎勵信號來幫助學習程序,
使用
reward_signals可以定義獎勵信號,ML-Agents默認提供三種獎勵信號:外部(環境)獎勵信號、好奇心獎勵信號(可用于agent進行探索)和GAIL獎勵信號(對抗模仿學習),具體的Reward Signals一會兒來看, -
(可選)Number of Updates for Reward Signal
獎勵信號的
reward_signal_num_update對應于在每次更新程序中采樣并用于更新獎勵信號的小批量數,默認情況下,在每次主policy更新時都會更新一次獎勵信號,但是,為了模仿某些學習論文(e.g. Kostrikov et. al, Blondé et. al)中的中的訓練程序,我們可能需要更新N次策略,然后將獎勵信號(GAIL)更新M次,此時我們可以將SAC的train_interval和num_update設定為N,并將reward_signals下的reward_signal_num_update改為M,默認操作下,reward_signal_num_update設定為num_update,推薦范圍:
num_update -
Buffer Size
buffer_size對應于在我們對模型進行任何學習或更新前,需要收集多少經驗(包括agent的observations、actions以及獲得的rewards),該值應該很大,大概是你的eposodes的數千倍,以便SAC可以從新、舊經驗中學習,它也應該比batch_size大得多,推薦范圍:
50000-1000000 -
Buffer Init Steps
buffer_init_steps是在嘗試進行訓練之前預填充緩沖區的經驗數,由于未經訓練的策略是相當隨機的,因此用隨機動作預填充緩沖區對于探索非常有用,通常,至少應預填一些episodes經驗,推薦范圍:
1000-10000 -
Batch Size
batch_size是一個梯度下降迭代更新的樣本數量,它應該始終是buffer_size的一小部分,如果你的agent使用的是連續動作空間(Continuous Type),那這個值應該要大一些(大約1000s);如果agent使用的是離散動作空間(Discrete Type),那這個值應該小一些(大約10s),Continuous Type推薦范圍:
128-1024Discrete Type推薦范圍:
32-512 -
Initial Entropy Coefficient
init_entcoef是訓練開始時設定的初始熵系數,在SAC中,激勵agent使其行為熵化,可以促進更好的探索,熵系數用bonus entropy reward來衡量真正的獎勵,熵系數會自動調整為預設的目標熵,因此init_entcoef僅對應于熵加成的初始值,開始時增加init_entrcoef以進行更多探索,減少該值則可以更快的收斂于一個解決方案,Continuous Type推薦范圍:
0.5-1.0Discrete Type推薦范圍:
0.05-0.5 -
Train Interval
train_interval是每個agent訓練事件之間采取的步驟數,通常,我們可以在每個步驟之后進行訓練,但是如果環境的步驟很少或者非常頻繁,那么在步驟之間不會有任何有趣的新資訊,此時可以適當增加train Interval,推薦范圍:
1-5 -
Number of Updates
num_update對應于每個訓練事件中期間采樣并用于培訓的最小批量數,在SAC中,單個“update”對應于從經驗回放緩沖區抓取一批batch_szie大小的資料,并使用這個小批量資料更新模型,通常情況下,該值可以保留為1,但是,為了模仿某些淪為(e.g. Kostrikov et. al, Blondé et. al),我們可能需要在獲取去其他樣本之前,用不同的小批量樣本更新N次,我們可以將train_interval和num_update設定為N來完成此操作,推薦范圍:
1 -
Tau
tau對應于SAC模型更新期間目標Q更新的大小,在SAC中,有兩個神經網路:目標和策略,目標網路用于引導給定狀態下策略對未來獎勵的估計,然后根據tau慢慢更新此目標,通常,該值應該保留為0.005,對于簡單問題,以穩定性為代價,可以將tau增加到0.01可能會減少學習時間,推薦范圍:
0.005-0.01 -
Learning Rate
learning_rate對應于每個梯度下降更新步驟的強度,如果訓練不穩定,該值應該減少,并且獎勵不能持續增加,推薦范圍:
1e-5-1e-3 -
(可選)Learning Rate Schedule
learning_rate_schedule對應于學習率如何隨時間變化,對于PPO來說,建議在max_steps之前降低學習速率,這樣學習才能更穩定地收斂,但是在某些情況下(例如訓練時間未知),可以禁用此功能,選擇項:
linear(默認):線性衰減learning.rate,在max_steps到達最大步數時到達0constant:在整個訓練程序中,保持學習速率恒定,
-
Time Horizon
time_horizon對應于每個agent添加到經驗緩沖區之前要收集的經驗步驟,與PPO相比,這個引數對SAC的重要性要小得多,通常可以設定為接近episode長度,推薦范圍:
32-2048 -
Max Steps
max_steps對應于在訓練程序中運行了多少步模擬(乘以跳幀),對于較復雜的問題,該值應該增大,推薦范圍:
5e5-1e7 -
Normalize
normalize對應于是否對輸入的矢量觀測值(vector observation)進行規范化處理,這種歸一化是基于矢量觀測值的平均值和方差,規范化對于復雜的連續控制(continuous control)問題很有用,但對于較簡單的離散控制(discrete control)可能反而有害, -
Number of Layers
num_layers對應于觀察值輸入之后或在視覺觀察的CNN編碼之后存在多少個隱藏層,對于簡單的問題,更少的層數可使得訓練更加迅速、高效,對于更復雜的控制問題,可能需要更多的層,推薦范圍:
1-3 -
Hidden Units
hidden_units對應于神經網路的每個全連接層中有多少個單元,對于簡單的問題,正確的操作是將觀察輸入直接組合,因此該值應該較小,對于動作是觀察變數之間非常復雜的互動問題,這個值應該較大,推薦范圍:
32-512 -
(可選)Visual Encoder Type
vis_encode_type對應于visual observations進行編碼的編碼器型別,有效地選項包括:simple(默認):有兩個卷積層組成的簡單編碼器nature_cnn:由三個卷積層組成,詳見 CNN implementation proposed by Mnih et al.resnet:由三個堆疊的層組成,每個對疊層具有兩個剩余塊,從而形成了比其他兩個更大的網路,詳見 IMPALA Resnet implementation
-
(可選)Recurrent Neural Network Hyperparameters
-
Sequence Length
sequence_length對應于訓練程序中通過網路傳遞的經驗序列的長度,該值應該足夠大以捕獲agent隨時間推移可能需要記住的任何資訊,例如,如果agent需要記住物體的速度,則該值可能很小,如果agent需要記住一段episode開始時只給出一次的資訊,那么該值應該更大,推薦范圍:
4-128 -
Memory Size
memory_size對應于存盤策略的遞回神經網路隱藏狀態的浮點數陣列的大小,該值必須是2的倍數,并且應該與期望agent成功完成任務所需記住的資訊量成比例,推薦范圍:
32-256 -
(可選)Save Replay Buffer
save_replay_buffer設定在退出和重新開始訓練時保存和加載經驗回放緩沖區以及模型,這將有助備份恢復,因為收集的經驗不會被洗掉,注意,回放緩沖區可能非常大,并且會占用大量磁盤空間,因此默認該功能為禁用狀態,默認:
False
-
-
(可選)Behavioral Cloning Using Demonstrations
在某些情況下,你可能希望使用player記錄的行為來引導agent的策略,這可以幫助指導agent獲得獎勵,行為克隆(BC)增加了模擬演示的訓練操作,而不是試圖使報酬最大化,
要使用BC,請在
trainer_config中添加一個behavioral_cloning部分,例如:behavioral_cloning: demo_path: ./Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo strength: 0.5 steps: 10000以下為BC可用的超引數,
-
Strength
strength對應于模仿的學習率相對于PPO的學習率,大致對應的使我們允許BC對policy的影響強度,推薦范圍:
0.1-0.5 -
Demo Path
demo_path是.demo檔案或.demo檔案目錄的路徑,有關.demo檔案的更多資訊,詳見imitation learning guide, -
Steps
在BC期間,通常希望agent在“看到”獎勵后停止使用演示,并允許其優化過去可用的demonstrations和/或概括所提供的演示之外的內容,
steps對應于激活BC的訓練步驟,BC的學習率將隨步驟逐步提高,將steps設定為0,以便在整個訓練程序中持續模仿, -
(可選)Batch Size
batch_size是梯度下降更新的一次迭代的樣本數,如果未指定,則默認為SAC的batch_size,推薦范圍(Continuous):
512-5120推薦范圍(Discrete):
32-512 -
(可選)Advanced: Initialize Model Path
init_path可以指定在開始訓練之前初始化以前訓練的模型,注意,以前的模型的訓練配置需要與當前運行的相同,并且使用相同版本的ML-Agents保存,同時要提供全路徑存盤,例如./models/{run-id}/{behavior_name},如果要從不同的運行中初始化不同的行為,則使用該項,大多數情況下,使用
--initialize-fromCLI引數足以從同一運行中初始化所有模型,
-
訓練統計引數
-
Cumulative Reward
獎勵的總體趨勢應隨時間不斷增減,預計會有小的欺負,根據任務的復雜性,獎勵可能不會顯著增加,有可能直到訓練到數百萬步才增加,
-
Entropy Coefficient
SAC是一種“最大化熵”的強化學習演算法,使用SAC訓練的agent在解決問題的同時被激勵產生隨機行為,熵系數平衡了激勵隨機行為與最大化獎勵之間的平衡,該值會自動調整,以便agent在訓練程序中保留一定程度的隨機性,在開始訓練時,該值應該穩定下降,并達到一個小的值,然后區域穩定,如果下降得過快或者需要很長時間才能下降,
init_entcoef的只應該進行調整, -
Entropy
該值與決策的隨機性是一致的,在訓練程序中,初始值應該增加,達到一個峰值,然后隨著熵系數(Entropy Coefficient)的下降而下降,這是因為在一開始,由于較高的Entropy Coefficient,agent被激勵為更隨機的探索,如果它下降的太快或者需要太長時間才能下降,則應調整
init_entcoef, -
Learning Rate
在默認情況下,該值保持一個常量,除非
learning_rate_schedule設定為linear, -
Policy Loss
該值可能會隨著policy的探索而增加,但是隨著agent學習如何解決任務而應長期減少,
-
Value Estimate
該值應該隨著Cumulative Reward的增加而增加,它對應于agent預測自己在任何給定時間點會收到多少獎勵,它們也可能在開始時增加,因為agent被獎勵為隨機的(see: Entropy and Entropy Coefficient),但是應該隨著Entropy Coefficient的減少而減少,
-
Value Loss
該值會隨著獎勵的增加而增加,一旦獎勵變得穩定,該值則應降低,
六、獎勵信號(Reward Signals)
對應官方檔案:Reward Signals
在強化學習中,agent的最終目標是發現一種使得獎勵最大化的行為或策略,通常獎勵是由你的環境定義的,并且與達成某個目標相對應,這就是所謂的“外部的(extrinsic)”獎勵,因為它們是在學習演算法外部定義的,
但是,獎勵也可以定義在環境之外,以鼓勵agent以某些方式行事,或幫助其學習真正的外部獎勵,我們把這些獎勵稱為“內在的(intrinsic)”獎勵,agent將學習最大化的總獎勵可以是外部獎勵信號和內部獎勵信號的結合,
ML-Agents允許以模塊化的方式定義獎勵信號,一共提供了三種獎勵信號,這些信號可以混合和匹配以幫助訓練agent的行為,extrinsic獎勵信號表示是環境中定義的獎勵,默認情況下時啟用的,當外部獎勵稀少時,curiosity獎勵信號會幫助agent探索,
開啟獎勵信號
獎勵信號像其他超引數一樣,在trainer_config.yaml檔案中定義,config/trainer_config.yaml和config/gail_config.yaml提供了一個示例,要啟用獎勵信號,在組態檔中需要增加reward_signals部分,例如,除了好奇心獎勵信號和GAIL獎勵信號外,要啟用外部信號,可以按以下方式定義:
reward_signals:
extrinsic:
strength: 1.0
gamma: 0.99
curiosity:
strength: 0.02
gamma: 0.99
encoding_size: 256
gail:
strength: 0.01
gamma: 0.99
encoding_size: 128
demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
除了任何特定類別的超引數外,每個獎勵信號還應至少定義兩個引數:strength和gamma,注意,要洗掉某個獎勵信號,你應該從reward_signals完全洗掉其條目,并且任何時候都應該至少留下一個獎勵信號,
獎勵信號型別
外部獎勵信號(Extrinsic Reward Signal)
外部獎勵信號僅僅是環境給出的獎勵,洗掉它迫使agent忽略環境獎勵,
-
Strength
strength是原始獎勵的倍乘系數,通常范圍將根據獎勵信號來變化,推薦范圍:
1.0 -
Gamma
gamma對應于未來獎勵的折扣因子,可以認為這是agent應該在多遠的將來關心可能的回報,在agent為了準備在遙遠的將來的獎勵情況下,該值應該很大,如果希望獎勵更加及時,則該值可能更小,推薦范圍:
0.8-0.995
好奇心獎勵信號(Curiosity Reward Signal)
好奇心獎勵將啟動agent內在的好奇心模塊,這是Pathak等人在“Curiosity-driven Exploration by Self-supervised Prediction”中描述的方法的一種實作,它訓練兩個網路:
-
一個逆向模型,該模型采用agent的當前和下一個觀察值,對它們進行編碼,并使用編碼來預測觀察值之間采取的動作,
-
一個正向模型,它采用當前已編碼的觀測值和動作,并預測下一個已編碼的觀測值,
正向模型的損失(預測值和實際觀測值之間的差異)被用作內在獎勵,因此模型越好奇,獎勵越大,
更多資訊可以查看以下網站:
https://arxiv.org/abs/1705.05363
https://pathak22.github.io/noreward-rl/
https://blogs.unity3d.com/2018/06/26/solving-sparse-reward-tasks-with-curiosity/
下面來看一下具體設定值:
-
Strength
在好奇心獎勵信號開啟情況下,
strength對應于內在好奇心模塊產生的好奇心獎勵的大小,應該對其進行調整,以確保它足夠大而不會被環境中的外部獎勵淹沒,同樣,它也不應該太大,以致于掩蓋了外部獎勵信號,推薦范圍:
0.001-0.1 -
Gamma
gamma對應于未來獎勵的折扣因子,推薦范圍:
0.8-0.995 -
(可選)Encoding Size
encoding_size對應于好奇心模塊使用的編碼大小,該值應該足夠小,以鼓勵ICM壓縮原始的觀察,但也不應該太小,以防ICM學習區分顯示的行為和實際的行為,默認值:
64推薦范圍:
64-256 -
(可選)Learning Rate
learning_rate適用于更新內在好奇心模塊的學習率,如果訓練不穩定且Curiosity Loss不穩定,則通常應該減小該值,默認值:
3e-4推薦范圍:
1e-5-1e-3
GAIL獎勵信號
GAIL,即對抗性生成模仿學習,是一種使用對抗性方法的模擬學習演算法,與GANs(Generative Adversarial Networks)相似,在這個框架中,第二個神經網路,即鑒別器,被用來區分觀察/動作是來自于demonstration還是來自于agent,這個鑒別器可以檢查一個新的觀察/動作,并根據它認為這個新的觀察/動作所提供的演示的接近程度來提供獎勵,
在每個訓練程序中,agent都會嘗試學習如何最大程度地提高獎勵,然后,對鑒別器進行訓練,以更好地區分demonstrations和agent的狀態/動作,這樣,當agent越來越擅長模仿演示時,鑒別器缺變得越來越嚴格,agent必須努力地“愚弄(fool)”它,
這種方法學習的策略將產生類似于演示的狀態和動作,與直接克隆操作相比,所需的演示次數更少,除了單純從演示中學戲外,還可以將GAIL獎勵信號與外部獎勵信號混合以知道學習程序,
使用GAIL需要來自Unity環境的記錄演示,詳見imitation learning guide,
-
Strength
strength是原始獎勵的倍乘系數,注意,將GAIL獎勵信號與外部獎勵信號一起使用時,如果你的演示不理想(如來自人的操作演示),則應該將該值設定得較低,以便受過訓練的agent專注于獲得外部獎勵,而不是完全地復制演示,在這些情況下,將該值保持在約0.1以下,推薦范圍:
0.01-1.0 -
Gamma
gamma對應于未來獎勵的折扣因子,推薦范圍:
0.8-0.9 -
Demo Path
demo_path是.demo檔案或.demo檔案目錄的路徑,詳見imitation learning guide, -
(可選)Encoding Size
encoding_size對應于鑒別器使用的隱藏層的大小,該值應該足夠小,以鼓勵鑒別器壓縮原始觀察結果,但也不能太小,以防止其學習區分演示時和實際的行為,大幅增加該值會對訓練時間產生負面影響,默認值:
64推薦范圍:
64-256 -
(可選)Learning Rate
learning_rate適用于更新鑒別器的學習率,如果訓練不穩定且GAIL loss不穩定,通常應該減少該值,默認值:
3e-4推薦范圍:
1e-5-1e-3 -
(可選)Use Actions
use_actions確定鑒別器是應該根據觀察和操作進行鑒別,還是僅僅根據觀察值進行區分,如果你希望agent模仿演示中的操作,則將其設定為True,如果你希望agent可能使用不同的操作而達到演示中相同的狀態,則將其設定為False,設定為False更有可能是穩定的,特別是在演示不完美的情況下,但是學習的速度可能較慢,默認值:
false -
(可選)Variational Discriminator Bottleneck
use_vail可啟動鑒別器中的變分瓶頸,這迫使鑒別器學習一種更籠統的表示,并降低了其在鑒別方面“太好”的傾向,從而使得學習更加穩定,然而,它確實增加了訓練時間,如果你注意到你的模仿學習是不穩定的,或者不能學習手頭的任務,那就嘗試啟動這個功能,默認值:
false
七、總結
以上就是這次的內容,主要就是的官方檔案做一個翻譯,順便對各種引數進行一個理解,許多引數其實是和深度學習相關,如果翻譯有誤請見諒指出,共同學習~
寫文不易~因此做以下申明:
1.博客中標注原創的文章,著作權歸原作者 煦陽(本博博主) 所有;
2.未經原作者允許不得轉載本文內容,否則將視為侵權;
3.轉載或者參考本文內容請注明來源及原作者;
4.對于不遵守此宣告或者其他違法使用本文內容者,本人依法保留追究權等,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/2220.html
標籤:其他
