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.對於不遵守此聲明或者其他違法使用本文內容者,本人依法保留追究權等。
