關于ML-Agents插件的入門,請查看我前面的博文: Unity強化學習之ML-Agents的使用
本文內容基于ML-Agents的官方檔案:Training ML-Agents以及Training Configuration File
參考文章:ML-Agents(七)訓練指令與訓練組態檔
ML-Agents命令
查看所有的命令:
mlagents-learn --help
訓練的基本命令是:
mlagents-learn <trainer-config-file> --env=<env_name> --run-id=<run-identifier>
-
<trainer-config-file>是訓練器配置 YAML 的檔案路徑,里面包含所有超引數值,<env_name>(可選)是包含要訓練的代理的Unity 可執行檔案的名稱(包括路徑) ,如果不寫,則訓練將在編輯器中進行,<run-identifier>是一個唯一的名稱,主要用于命名保存的訓練模型、統計資訊以及模型名稱,訓練程序產生的檔案都保存在results/<run-identifier>檔案夾中, -
–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,當然如果是發布的程式,你就可以多開幾個程式讓訓練資料更多, -
–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)時才有效, -
–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幀每秒,
ML-Agents配置
引數配置
在組態檔YAML檔案中,你可以添加以下引數:
環境設定:
env_settings:
env_path: FoodCollector
env_args: null
base_port: 5005
num_envs: 1
seed: -1
max_lifetime_restarts: 10
restarts_rate_limit_n: 1
restarts_rate_limit_period_s: 60
引擎設定:
engine_settings:
width: 84
height: 84
quality_level: 5
time_scale: 20
target_frame_rate: -1
capture_frame_rate: 60
no_graphics: false
檢查點設定:
checkpoint_settings:
run_id: foodtorch
initialize_from: null
load_model: false
resume: false
force: true
train_model: false
inference: false
Torch設定:
torch_settings:
device: cpu
所有功能展示(基于PPO)
如果我們使用了所有的訓練功能的PPO演算法(包含記憶,行為克隆,好奇心,GAIL和self-play),組態檔應該這樣寫(自己靈活選擇功能):
behaviors:
BehaviorPPO:
trainer_type: ppo
hyperparameters:
# Hyperparameters common to PPO and SAC
batch_size: 1024
buffer_size: 10240
learning_rate: 3.0e-4
learning_rate_schedule: linear
# PPO-specific hyperparameters
# Replaces the "PPO-specific hyperparameters" section above
beta: 5.0e-3
beta_schedule: constant
epsilon: 0.2
epsilon_schedule: linear
lambd: 0.95
num_epoch: 3
# Configuration of the neural network (common to PPO/SAC)
network_settings:
vis_encode_type: simple
normalize: false
hidden_units: 128
num_layers: 2
# memory
memory:
sequence_length: 64
memory_size: 256
# Trainer configurations common to all trainers
max_steps: 5.0e5
time_horizon: 64
summary_freq: 10000
keep_checkpoints: 5
checkpoint_interval: 50000
threaded: false
init_path: null
# behavior cloning
behavioral_cloning:
demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
strength: 0.5
steps: 150000
batch_size: 512
num_epoch: 3
samples_per_update: 0
reward_signals:
# environment reward (default)
extrinsic:
strength: 1.0
gamma: 0.99
# curiosity module
curiosity:
strength: 0.02
gamma: 0.99
encoding_size: 256
learning_rate: 3.0e-4
# GAIL
gail:
strength: 0.01
gamma: 0.99
encoding_size: 128
demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
learning_rate: 3.0e-4
use_actions: false
use_vail: false
# self-play
self_play:
window: 10
play_against_latest_model_ratio: 0.5
save_steps: 50000
swap_steps: 2000
team_change: 100000
SAC部分展示
如果使用的是SAC而不是PPO演算法,只需要做簡單的修改:
behaviors:
BehaviorSAC:
trainer_type: sac
hyperparameters:
# SAC-specific hyperparameters
# Replaces the "PPO-specific hyperparameters" section above
buffer_init_steps: 0
tau: 0.005
steps_per_update: 10.0
save_replay_buffer: false
init_entcoef: 0.5
reward_signal_steps_per_update: 10.0
# 下面內容相同
配置說明
batch_size:一次性抽取多少條資料樣本一起訓練,連續動作空間推薦:512-5120,離散動作空間推薦:32-512
buffer_size:經驗池容量,推薦:2048-409600
epsilon:影響策略在訓練程序中的成型速度,對應新舊策略之間可接受的差異閾值,較小有較穩定的穩定,但會減慢訓練程序,推薦:0.1-0.3
init_entcoef:在訓練開始時,agent應該探索多深,
learning_rate:學習率,資料更新強度,訓練不穩定應降低該值,推薦:1e-5-1e-3
learning_rate_Schedule:對應于學習率如何隨時間變化,逐漸降低學習速率可以更穩定收斂,linear指線性衰減,maxSteps達到0,constant不衰減,
max_steps:每一個episode執行的最大步數,推薦:5e5-1e7
normalize:是否自動標準化觀測值,這對于復雜連續控制問題很有用,但對于簡單離散控制可能反而有害,
behavioral_cloning:使用演示引導神經網路的策略,strength:模仿學習的學習率,推薦:0.1-0.5,demo_path:是.demo檔案的路徑,Steps:對應于激活BC的步驟,,BC的學習率隨步驟逐步提高,設定為0會在整個訓練程序中持續模仿,
save_replay_buffer:退出訓練時保存到回放緩沖區,并在恢復時加載,
summary_freq:設定多久一次保存統計資料,主要決定了在tensorboard中顯示資料點的數值,
time_horizon:在將每個agent添加到經驗緩沖池之前,需要經過多少步訓練,推薦:32-2048
train_interval:更新智能體的頻率,
use_recurrent:是否使用回圈神經網路,以下引數在use_recurrent為true時使用,sequence_length:訓練中通過網路傳遞的經驗序列的長度,較大的值可以記住較長時間的資訊,推薦:4-128,memory_size:對應了存盤策略的回圈神經網路隱藏狀態的浮點數陣列大小,必須是2的倍數,并且與期望agent成功完成任務所需記住的資訊量成比例,推薦:32-256
Reward Signals:在強化訓練中,目標就是要學習一種是獎勵最大化的策略,在基礎層面上將來是由環境給出的,然而我們很可能遇到鼓勵探索的agent,我們可以讓agent探索新的狀態而獲得獎勵,而不是僅僅給予明確的獎勵;我們還可以使用混合獎勵信號來幫助學習程序,使用reward_signals可以定義獎勵信號,ML-Agents默認提供三種獎勵信號:外部獎勵信號(環境給予)、好奇心獎勵信號(鼓勵探索)、GAIL獎勵信號(對抗模仿學習),
lambd:agents更新估計值時依賴于當前值的多少,趨近于1時則靠近更新值,趨近于0靠近當前的估計值,推薦:0.9-0.95
num_epoch:梯度下降程序中通過經驗池的次數,batch_size越大它可以設定得越大,減小該值可以確保更新穩定,但降低學習速率,推薦:3-10
num_layer:觀察值輸入后或CNN之后存在的隱藏層的數量,復雜的問題需要更多的層,推薦:1-3
hidden_units:對應神經網路每個全連接層有多少個單元,推薦:32-512
vis_encode_type:對應于可視化觀測進行編碼的編碼器型別,選項包含:simple(默認):兩個卷積層組成的簡單編碼器,nature_cnn:三個卷積層組成,詳見https://www.nature.com/articles/nature14236,resnet:由三個堆疊的層構成,是比其他兩個更大的網路,詳見https://arxiv.org/abs/1802.01561,
init_path:指定在開始訓練之前訓練的模型,注意以前的模型的訓練配置需要與當前運行的相同,并且使用相同版本的ML-Agents保存,同時要提供全路徑存盤,
reward_signal_num_update:對應于每次更新程序中采樣并用于更新獎勵信號的小批量數,默認在每次主policy更新時都會更新一次獎勵信號,但為了模仿某些論文中的訓練程序,我們需要更新N次策略,然后將獎勵信號(GAIL)更新M次,此時我們可以將SAC的train_interval和num_update設定為N,將reward_signals下的reward_signal_num_update設定為M,默認其值為num_update,
buffer_init_steps訓練之前預填充經驗池的資料量,未經訓練的策略是隨機的,用隨機動作預填充對于探索十分有用,
num_update:每個訓練時間期間采樣并用于訓練的最小批量數,通常情況下,該值為1,
tau:SAC模型更新期間目標Q網路更新的快慢,因為存在Q和Target Q兩個網路,每隔一段時間需要對Target Q進行更新,推薦:0.005-0.01
strength:原始獎勵的倍乘系數,范圍根據獎勵信號變化,推薦:1.0
gamma:對應未來獎勵的折扣因子,推薦:0.8-0.995
好奇心獎勵信號:包括正向模型:采用當前已編碼的觀測值和動作,預測下一個已編碼的觀測值,逆向模型:采用agent的當前和下一個觀測值,對它們進行編碼,并使用編碼來預測觀測值之間采取的動作,正向模型的損失(預測值和實際值之間的差異)被用作內在獎勵,
encoding_size:好奇心模塊使用的編碼大小,該值足夠小可以鼓勵ICM壓縮原始的觀察值,但太小也會導致ICM學習區分輸出的行為和實際的行為,推薦:64-256
GAIL:即生成對抗模仿學習,和GANs類似,對于strength的設定取決于人的水平,人的演示很好這個值設高一點,推薦:0.01-1,
use_actions:鑒別器是根據觀察和操作進行區分,還是僅僅根據觀察值進行區分,如果希望agent模仿操作,則應該設為true,如果希望agent使用不同的操作達到相同的狀態,則設為false,設為false更加穩定,特別是演示不完美的情況下,但學習速度較慢,
use_vail:是鑒別器學習一種更籠統的表示,降低了其在鑒別方面的過擬合,使學習更加穩定,但也會增加訓練時間,如果模仿學習不成功,可以啟用這個功能,
環境引數
為了控制環境引數,可以在下方再加上一段配置:
behaviors:
BehaviorY:
# < Same as above >
# Add this section
environment_parameters:
my_environment_parameter: 3.0
然后再Unity仿真中,可以通過以下方式訪問引數:
Academy.Instance.EnvironmentParameters.GetWithDefault("my_environment_parameter", 0.0f);
為了使引數隨機,我們可以不直接提供數值,而是讓它自己采樣,下面是包含三個環境引數的示例:
behaviors:
BehaviorY:
# < Same as above >
# Add this section
environment_parameters:
mass:
sampler_type: uniform
sampler_parameters:
min_value: 0.5
max_value: 10
length:
sampler_type: multirangeuniform
sampler_parameters:
intervals: [[7, 10], [15, 20]]
scale:
sampler_type: gaussian
sampler_parameters:
mean: 2
st_dev: .3
其中uniform是統一采樣器,從給定最大值和最小值的范圍中采樣,gaussian是高斯采樣器,給定均值和標準差從正態分布中采樣,multirange_uniform是多范圍均勻采樣,根據區間的相對長度從一組區間中采用一個區間,從這個區間中統一采樣一個單浮點值,
在3DBall的第二個組態檔中有這個用法,
定義采樣器配置后,輸入回應命令可以啟用引數隨機化的訓練器配置(如下):
mlagents-learn config/ppo/3DBall_randomize.yaml --run-id=3D-Ball-randomize
Curriculum Learning
如果想啟用課程學習,需要添加一段配置:
ehaviors:
BehaviorY:
# < Same as above >
# Add this section
environment_parameters:
my_environment_parameter:
curriculum:
- name: MyFirstLesson # The '-' is important as this is a list
completion_criteria:
measure: progress
behavior: my_behavior
signal_smoothing: true
min_lesson_length: 100
threshold: 0.2
value: 0.0
- name: MySecondLesson # This is the start of the second lesson
completion_criteria:
measure: progress
behavior: my_behavior
signal_smoothing: true
min_lesson_length: 100
threshold: 0.6
require_reset: true
value:
sampler_type: uniform
sampler_parameters:
min_value: 4.0
max_value: 7.0
- name: MyLastLesson
value: 8.0
name是用戶定義的課程名稱,completion_criteria決定了需要模擬的世間,當滿足條件是課程轉到下一個lessons,value就是環境引數在課程中需要采用的值,
measure是衡量學習進度和課程進展的依據,behavior指定正在跟蹤的行為,可以有多個名稱不同的行為,每個行為處于不同的訓練點,此設定允許課程僅跟蹤其中之一,threshold確定在measure的哪里增加課程的值,
min_lesson_length指的是更改課程之前應完成的最少episode數,如果measure設定為reward,min_lesson_length將使用最后一集的平均累積獎勵來確定課程是否應該更改,必須是非負的,重要提示:與閾值比較的平均獎勵不同于記錄到控制臺的平均獎勵,例如,如果min_lesson_length是100,則在最后一100集的平均累積獎勵超過當前閾值后,課程將增加,記錄到控制臺的平均獎勵由summary_freq上面定義的引數決定,
signal_smoothing決定是否按以前的值對當前進度度量進行加權,
require_reset決定更改課程是否需要重置環境(默認:false),
一旦我們指定了我們的元課程和課程,我們就可以啟動 mlagents-learn指向包含我們課程的組態檔,PPO 將使用課程學習進行訓練,例如,要通過課程學習在 Wall Jump 環境中訓練智能體,我們可以運行:
mlagents-learn config/ppo/WallJump_curriculum.yaml --run-id=wall-jump-curriculum
后記
對于上面的命令不理解的不用著急,ML-Agents提供了一系列實體來演示大部分的功能,后面會一一開文章進行講解,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/347223.html
標籤:其他
